From 7a2fbe2c7ca74a11aeb33f88d688146a7ba9f0a2 Mon Sep 17 00:00:00 2001 From: Christian Blichmann Date: Thu, 18 Oct 2018 18:13:11 +0200 Subject: [PATCH] Sync with internal codebase Signed-off-by: Christian Blichmann --- .gitignore | 1 + CMakeLists.txt | 123 +- FindIdaSdk.cmake | 286 +- README.md | 43 +- absl.cmake | 35 +- address_references.cc | 2 +- address_references.h | 2 +- hex_codec.h => architectures.h | 27 +- base_types.cc | 12 +- base_types.h | 18 +- basic_block.cc | 2 +- basic_block.h | 2 +- binexport.cc | 65 + binexport.h | 50 + binexport2.proto | 2 +- binexport2_writer.cc | 25 +- binexport2_writer.h | 9 +- binexport_test.cc | 57 + call_graph.cc | 2 +- call_graph.h | 2 +- cctz.cmake | 23 - chain_writer.cc | 42 - chain_writer.h | 40 - cmake/CMakeLists.txt | 5 +- cmake/absl.cmake | 4 +- cmake/cctz.cmake | 23 - cmake/googletest.cmake | 5 +- cmake/openssl.cmake | 2 +- cmake/postgresql.cmake | 6 +- cmake/protobuf.cmake | 15 +- comment.cc | 12 +- comment.h | 2 +- copts.cmake | 6 +- database_writer.cc | 17 +- database_writer.h | 8 +- dump_writer.cc | 2 +- dump_writer.h | 2 +- edge.cc | 2 +- edge.h | 2 +- entry_point.cc | 2 +- entry_point.h | 2 +- expression.cc | 2 +- expression.h | 71 +- flow_analyzer.cc | 2 +- flow_analyzer.h | 2 +- flow_graph.cc | 18 +- flow_graph.h | 2 +- function.cc | 21 +- function.h | 2 +- googletest.cmake | 6 +- hash.cc | 2 +- hash.h | 2 +- hex_codec.cc | 58 - ida/arm.cc | 18 +- ida/arm.h | 2 +- ida/{begin_idasdk.h => begin_idasdk.inc} | 18 +- ida/dalvik.cc | 22 +- ida/dalvik.h | 2 +- ida/digest.cc | 38 +- ida/digest.h | 14 +- ida/{end_idasdk.h => end_idasdk.inc} | 20 +- ida/generic.cc | 12 +- ida/generic.h | 2 +- ida/log.cc | 42 +- ida/log.h | 26 +- ida/main_plugin.cc | 339 +- ida/metapc.cc | 30 +- ida/metapc.h | 2 +- ida/mips.cc | 16 +- ida/mips.h | 2 +- ida/names.cc | 76 +- ida/names.h | 7 +- ida/ppc.cc | 12 +- ida/ppc.h | 2 +- ida/pro_forward.h | 2 +- ida/types_container.cc | 24 +- ida/types_container.h | 2 +- ida/ui.cc | 6 +- ida/ui.h | 46 +- initialize_constraints_postgresql_sql.h | 2 +- initialize_indices_postgresql_sql.h | 2 +- initialize_tables_postgresql_sql.h | 2 +- instruction.cc | 9 +- instruction.h | 6 +- library_manager.cc | 2 +- library_manager.h | 2 +- maintenance_postgresql_sql.h | 2 +- nested_iterator.h | 2 +- operand.cc | 2 +- operand.h | 2 +- postgresql.cc | 2 +- postgresql.h | 2 +- query_builder.cc | 8 +- query_builder.h | 2 +- range.h | 2 +- reader/call_graph.cc | 151 + reader/call_graph.h | 113 + reader/call_graph_test.cc | 74 + reader/flow_graph.cc | 241 + reader/flow_graph.h | 165 + reader/flow_graph_test.cc | 160 + reader/graph_utility.h | 93 + reader/graph_utility_test.cc | 104 + reader/instruction.cc | 46 + reader/instruction.h | 69 + reader/instruction_test.cc | 71 + reader/reader_test_util.cc | 44 + reader/reader_test_util.h | 33 + ...efa9a2fb80fcceb5d8fd08168ea50dfd.BinExport | Bin 0 -> 2624871 bytes statistics_writer.cc | 2 +- statistics_writer.h | 2 +- stubs/base/integral_types.h | 7 +- stubs/base/logging.h | 2 +- stubs/base/macros.h | 20 + stubs/util/task/status.h | 50 +- stubs/util/task/status_macros.h | 49 + stubs/util/task/statusor.h | 27 + .../boost_parts/boost/algorithm/string.hpp | 31 - .../boost/algorithm/string/case_conv.hpp | 176 - .../boost/algorithm/string/classification.hpp | 312 -- .../boost/algorithm/string/compare.hpp | 199 - .../boost/algorithm/string/concept.hpp | 83 - .../boost/algorithm/string/config.hpp | 28 - .../boost/algorithm/string/constants.hpp | 36 - .../algorithm/string/detail/case_conv.hpp | 123 - .../string/detail/classification.hpp | 353 -- .../algorithm/string/detail/find_format.hpp | 204 - .../string/detail/find_format_all.hpp | 273 - .../string/detail/find_format_store.hpp | 89 - .../algorithm/string/detail/find_iterator.hpp | 87 - .../boost/algorithm/string/detail/finder.hpp | 639 --- .../algorithm/string/detail/formatter.hpp | 119 - .../algorithm/string/detail/predicate.hpp | 77 - .../string/detail/replace_storage.hpp | 159 - .../algorithm/string/detail/sequence.hpp | 200 - .../boost/algorithm/string/detail/trim.hpp | 95 - .../boost/algorithm/string/detail/util.hpp | 106 - .../boost/algorithm/string/erase.hpp | 844 --- .../boost/algorithm/string/find.hpp | 334 -- .../boost/algorithm/string/find_format.hpp | 287 - .../boost/algorithm/string/find_iterator.hpp | 388 -- .../boost/algorithm/string/finder.hpp | 270 - .../boost/algorithm/string/formatter.hpp | 120 - .../boost/algorithm/string/iter_find.hpp | 193 - .../boost/algorithm/string/join.hpp | 145 - .../boost/algorithm/string/predicate.hpp | 475 -- .../algorithm/string/predicate_facade.hpp | 42 - .../boost/algorithm/string/replace.hpp | 928 --- .../algorithm/string/sequence_traits.hpp | 120 - .../boost/algorithm/string/split.hpp | 163 - .../algorithm/string/std/list_traits.hpp | 68 - .../algorithm/string/std/slist_traits.hpp | 69 - .../algorithm/string/std/string_traits.hpp | 44 - .../string/std_containers_traits.hpp | 26 - .../boost/algorithm/string/trim.hpp | 398 -- .../boost/algorithm/string/yes_no_type.hpp | 33 - third_party/boost_parts/boost/align/align.hpp | 20 - .../boost_parts/boost/align/detail/align.hpp | 38 - .../boost/align/detail/align_cxx11.hpp | 22 - .../boost/align/detail/is_alignment.hpp | 29 - .../boost_parts/boost/archive/add_facet.hpp | 55 - .../boost/archive/basic_archive.hpp | 13 +- .../boost/archive/basic_binary_iprimitive.hpp | 2 +- .../boost/archive/basic_binary_oprimitive.hpp | 2 +- .../boost/archive/basic_text_iarchive.hpp | 2 +- .../boost/archive/basic_text_oprimitive.hpp | 2 - .../boost/archive/basic_xml_iarchive.hpp | 3 +- .../boost/archive/codecvt_null.hpp | 12 +- .../boost/archive/detail/common_iarchive.hpp | 3 +- .../boost/archive/detail/common_oarchive.hpp | 1 + .../boost/archive/detail/iserializer.hpp | 38 +- .../boost/archive/detail/oserializer.hpp | 25 +- .../archive/detail/utf8_codecvt_facet.hpp | 33 +- .../archive/impl/archive_serializer_map.ipp | 4 + .../archive/impl/basic_binary_iprimitive.ipp | 6 +- .../archive/impl/basic_binary_oprimitive.ipp | 2 + .../archive/impl/text_wiarchive_impl.ipp | 2 +- .../boost/archive/impl/xml_wiarchive_impl.ipp | 4 +- .../boost/archive/impl/xml_woarchive_impl.ipp | 9 +- .../archive/iterators/base64_from_binary.hpp | 2 +- .../archive/iterators/binary_from_base64.hpp | 2 +- .../boost/archive/iterators/escape.hpp | 3 +- .../archive/iterators/istream_iterator.hpp | 6 +- .../boost/archive/iterators/mb_from_wchar.hpp | 17 +- .../archive/iterators/transform_width.hpp | 1 + .../boost/archive/iterators/wchar_from_mb.hpp | 2 + .../boost/archive/shared_ptr_helper.hpp | 219 - .../boost_parts/boost/archive/wcslen.hpp | 2 + .../boost/archive/xml_wiarchive.hpp | 1 + third_party/boost_parts/boost/array.hpp | 95 +- third_party/boost_parts/boost/bind/arg.hpp | 13 +- third_party/boost_parts/boost/bind/bind.hpp | 145 +- .../boost_parts/boost/bind/bind_cc.hpp | 60 +- .../boost_parts/boost/bind/bind_mf_cc.hpp | 72 +- .../boost_parts/boost/concept_archetype.hpp | 3 +- third_party/boost_parts/boost/config.hpp | 8 +- .../boost_parts/boost/config/auto_link.hpp | 41 +- .../boost/config/compiler/borland.hpp | 14 + .../boost/config/compiler/clang.hpp | 58 +- .../boost/config/compiler/codegear.hpp | 15 + .../boost/config/compiler/comeau.hpp | 2 +- .../boost/config/compiler/common_edg.hpp | 13 + .../boost/config/compiler/compaq_cxx.hpp | 2 +- .../boost/config/compiler/cray.hpp | 38 +- .../boost/config/compiler/diab.hpp | 26 + .../boost/config/compiler/digitalmars.hpp | 13 + .../boost_parts/boost/config/compiler/gcc.hpp | 41 +- .../boost/config/compiler/gcc_xml.hpp | 15 +- .../boost/config/compiler/greenhills.hpp | 2 +- .../boost/config/compiler/hp_acc.hpp | 4 +- .../boost/config/compiler/intel.hpp | 35 +- .../boost_parts/boost/config/compiler/kai.hpp | 2 +- .../boost/config/compiler/metrowerks.hpp | 13 + .../boost_parts/boost/config/compiler/mpw.hpp | 13 + .../boost/config/compiler/nvcc.hpp | 36 +- .../boost/config/compiler/pathscale.hpp | 20 +- .../boost_parts/boost/config/compiler/pgi.hpp | 148 +- .../boost/config/compiler/sgi_mipspro.hpp | 2 +- .../boost/config/compiler/sunpro_cc.hpp | 28 +- .../boost/config/compiler/vacpp.hpp | 18 + .../boost/config/compiler/visualc.hpp | 96 +- .../boost/config/compiler/xlcpp.hpp | 23 + .../boost/config/compiler/xlcpp_zos.hpp | 169 + .../config/{ => detail}/posix_features.hpp | 0 .../{ => detail}/select_compiler_config.hpp | 62 +- .../{ => detail}/select_platform_config.hpp | 11 +- .../{ => detail}/select_stdlib_config.hpp | 5 + .../boost/config/{ => detail}/suffix.hpp | 89 +- .../boost/config/header_deprecated.hpp | 26 + .../boost/config/helper_macros.hpp | 37 + .../boost_parts/boost/config/platform/aix.hpp | 2 +- .../boost/config/platform/beos.hpp | 2 +- .../boost_parts/boost/config/platform/bsd.hpp | 2 +- .../boost/config/platform/cray.hpp | 2 +- .../boost/config/platform/cygwin.hpp | 16 +- .../boost/config/platform/haiku.hpp | 2 +- .../boost/config/platform/hpux.hpp | 2 +- .../boost/config/platform/irix.hpp | 2 +- .../boost/config/platform/linux.hpp | 9 +- .../boost/config/platform/macos.hpp | 2 +- .../boost/config/platform/qnxnto.hpp | 2 +- .../boost/config/platform/solaris.hpp | 2 +- .../boost/config/platform/symbian.hpp | 2 +- .../boost/config/platform/vxworks.hpp | 246 +- .../boost_parts/boost/config/platform/zos.hpp | 32 + .../boost/config/pragma_message.hpp | 31 + .../boost/config/stdlib/dinkumware.hpp | 66 +- .../boost/config/stdlib/libcomo.hpp | 9 + .../boost/config/stdlib/libcpp.hpp | 49 +- .../boost/config/stdlib/libstdcpp3.hpp | 80 +- .../boost/config/stdlib/modena.hpp | 9 + .../boost_parts/boost/config/stdlib/msl.hpp | 11 +- .../boost/config/stdlib/roguewave.hpp | 9 + .../boost_parts/boost/config/stdlib/sgi.hpp | 11 +- .../boost/config/stdlib/stlport.hpp | 9 + .../boost_parts/boost/config/stdlib/vacpp.hpp | 9 + .../boost/config/stdlib/xlcpp_zos.hpp | 60 + .../boost_parts/boost/config/workaround.hpp | 279 + .../boost/container/allocator_traits.hpp | 136 +- .../boost/container/container_fwd.hpp | 35 +- .../boost/container/detail/memory_util.hpp | 83 - .../boost/container/detail/mpl.hpp | 19 +- .../boost/container/detail/preprocessor.hpp | 232 - .../boost/container/detail/type_traits.hpp | 4 +- .../boost/container/detail/workaround.hpp | 27 +- .../detail/float_functions.hpp | 0 .../detail/hash_float.hpp | 10 +- .../hash => container_hash}/detail/limits.hpp | 0 .../hash => container_hash}/extensions.hpp | 134 +- .../hash => container_hash}/hash.hpp | 242 +- .../hash => container_hash}/hash_fwd.hpp | 6 +- .../boost_parts/boost/core/addressof.hpp | 310 +- .../boost_parts/boost/core/demangle.hpp | 13 +- .../boost_parts/boost/core/ignore_unused.hpp | 70 + .../boost/core/no_exceptions_support.hpp | 2 +- .../boost_parts/boost/core/pointer_traits.hpp | 233 + third_party/boost_parts/boost/core/ref.hpp | 4 +- third_party/boost_parts/boost/cstdint.hpp | 42 +- .../boost_parts/boost/current_function.hpp | 6 +- .../boost/detail/allocator_utilities.hpp | 9 +- .../boost_parts/boost/detail/atomic_count.hpp | 21 - .../boost_parts/boost/detail/interlocked.hpp | 210 - .../boost/detail/is_function_ref_tester.hpp | 136 - .../boost_parts/boost/detail/iterator.hpp | 13 + .../boost/detail/lcast_precision.hpp | 1 + .../boost/detail/numeric_traits.hpp | 128 +- .../boost/detail/ob_call_traits.hpp | 168 - .../boost/detail/ob_compressed_pair.hpp | 510 -- .../boost/detail/quick_allocator.hpp | 23 - .../boost/detail/utf8_codecvt_facet.hpp | 27 +- .../boost/detail/utf8_codecvt_facet.ipp | 22 +- .../boost_parts/boost/detail/workaround.hpp | 261 +- .../boost/dynamic_bitset/dynamic_bitset.hpp | 151 +- .../exception/detail/attribute_noreturn.hpp | 17 - .../boost_parts/boost/exception/exception.hpp | 28 +- third_party/boost_parts/boost/function.hpp | 16 +- .../function/detail/gen_maybe_include.pl | 2 + .../boost/function/detail/maybe_include.hpp | 102 + .../boost/function/function_base.hpp | 278 +- .../boost/function/function_template.hpp | 135 +- .../boost_parts/boost/functional/hash.hpp | 3 +- .../boost_parts/boost/functional/hash_fwd.hpp | 7 +- .../fusion/container/deque/deque_fwd.hpp | 3 +- .../boost/fusion/container/map/map_fwd.hpp | 3 +- .../fusion/container/vector/detail/config.hpp | 5 +- .../detail/cpp03/preprocessed/vvector10.hpp | 36 +- .../detail/cpp03/preprocessed/vvector20.hpp | 66 +- .../detail/cpp03/preprocessed/vvector30.hpp | 96 +- .../detail/cpp03/preprocessed/vvector40.hpp | 126 +- .../detail/cpp03/preprocessed/vvector50.hpp | 156 +- .../container/vector/detail/cpp03/vector.hpp | 7 +- .../detail/cpp03/vector_forward_ctor.hpp | 6 +- .../container/vector/detail/value_at_impl.hpp | 14 +- .../boost/fusion/container/vector/vector.hpp | 206 +- .../boost/fusion/support/detail/and.hpp | 39 + .../fusion/support/detail/is_mpl_sequence.hpp | 3 +- .../boost/fusion/support/is_sequence.hpp | 9 +- .../boost/graph/adjacency_iterator.hpp | 1 + .../boost/graph/adjacency_list.hpp | 25 +- .../boost/graph/buffer_concepts.hpp | 3 +- .../boost/graph/depth_first_search.hpp | 20 +- .../boost/graph/detail/adjacency_list.hpp | 45 +- .../boost_parts/boost/graph/detail/edge.hpp | 2 + .../graph/distributed/unsafe_serialize.hpp | 85 - .../boost/graph/dominator_tree.hpp | 16 +- .../boost/graph/filtered_graph.hpp | 20 + .../boost/graph/graph_concepts.hpp | 2 + .../boost/graph/named_function_params.hpp | 10 +- .../boost/graph/parallel/basic_reduce.hpp | 42 - .../graph/parallel/detail/untracked_pair.hpp | 85 - .../boost/graph/parallel/properties.hpp | 6 +- .../boost_parts/boost/graph/properties.hpp | 7 - .../boost_parts/boost/graph/reverse_graph.hpp | 7 + third_party/boost_parts/boost/integer_fwd.hpp | 3 + .../boost/intrusive/detail/config_begin.hpp | 27 +- .../has_member_function_callable_with.hpp | 141 +- .../boost/intrusive/detail/memory_util.hpp | 292 - .../boost/intrusive/detail/mpl.hpp | 20 +- .../boost/intrusive/detail/preprocessor.hpp | 52 - .../boost/intrusive/detail/workaround.hpp | 3 + .../boost/intrusive/pointer_traits.hpp | 4 +- third_party/boost_parts/boost/iterator.hpp | 20 - .../boost_parts/boost/iterator/advance.hpp | 84 + .../iterator/detail/minimum_category.hpp | 116 - .../boost/iterator/filter_iterator.hpp | 1 - .../boost/iterator/iterator_adaptor.hpp | 2 - .../boost/iterator/iterator_categories.hpp | 5 +- .../boost/iterator/iterator_concepts.hpp | 18 +- .../boost/iterator/iterator_facade.hpp | 3 +- .../boost/iterator/iterator_traits.hpp | 13 +- .../boost/iterator/reverse_iterator.hpp | 11 +- .../boost/iterator/transform_iterator.hpp | 8 +- .../boost/iterator/zip_iterator.hpp | 3 +- .../detail/converter_lexical_streams.hpp | 85 +- .../lexical_cast/detail/converter_numeric.hpp | 34 +- .../boost/math/policies/policy.hpp | 4 +- .../special_functions/detail/fp_traits.hpp | 3 +- .../boost/math/special_functions/math_fwd.hpp | 71 +- .../boost/math/special_functions/sign.hpp | 2 +- .../boost_parts/boost/math/tools/config.hpp | 21 +- .../boost_parts/boost/memory_order.hpp | 53 - .../boost_parts/boost/move/algo/move.hpp | 7 +- third_party/boost_parts/boost/move/core.hpp | 14 +- .../boost/move/detail/fwd_macros.hpp | 284 +- .../move/detail/iterator_to_raw_pointer.hpp | 59 + .../boost/move/detail/meta_utils_core.hpp | 12 + .../detail/pointer_element.hpp | 24 +- .../boost/move/detail/to_raw_pointer.hpp | 45 + .../boost/move/detail/type_traits.hpp | 58 +- .../boost/move/detail/workaround.hpp | 5 +- .../boost/mpi/cartesian_communicator.hpp | 382 ++ .../boost/mpi/collectives/all_gather.hpp | 131 +- .../boost/mpi/collectives/all_to_all.hpp | 6 +- .../boost/mpi/collectives/broadcast.hpp | 27 +- .../boost/mpi/collectives/gather.hpp | 170 +- .../boost/mpi/collectives/gatherv.hpp | 37 +- .../boost/mpi/collectives/scatter.hpp | 212 +- .../boost/mpi/collectives/scatterv.hpp | 203 +- .../boost_parts/boost/mpi/communicator.hpp | 338 +- third_party/boost_parts/boost/mpi/config.hpp | 10 +- .../boost_parts/boost/mpi/datatype.hpp | 13 + .../boost_parts/boost/mpi/detail/antiques.hpp | 40 + .../mpi/detail/binary_buffer_oprimitive.hpp | 7 +- .../mpi/detail/mpi_datatype_primitive.hpp | 21 +- .../boost_parts/boost/mpi/detail/offsets.hpp | 47 + .../boost/mpi/detail/packed_iprimitive.hpp | 6 +- .../boost/mpi/detail/packed_oprimitive.hpp | 18 +- .../boost_parts/boost/mpi/environment.hpp | 6 + .../boost_parts/boost/mpi/exception.hpp | 2 + .../boost_parts/boost/mpi/operations.hpp | 30 +- .../boost/mpi/python/serialize.hpp | 5 +- third_party/boost_parts/boost/mpl/assert.hpp | 2 +- third_party/boost_parts/boost/mpl/print.hpp | 3 + .../detail/archive_constructed.hpp | 6 +- .../boost/multi_index/detail/auto_space.hpp | 31 +- .../boost/multi_index/detail/copy_map.hpp | 29 +- .../multi_index/detail/hash_index_node.hpp | 35 +- .../detail/ignore_wstrict_aliasing.hpp | 18 + .../boost/multi_index/detail/index_base.hpp | 14 +- .../multi_index/detail/index_node_base.hpp | 6 +- .../detail/msvc_index_specifier.hpp | 69 - .../boost/multi_index/detail/prevent_eti.hpp | 60 - .../boost/multi_index/detail/promotes_arg.hpp | 10 +- .../detail/restore_wstrict_aliasing.hpp | 11 + .../multi_index/detail/safe_ctr_proxy.hpp | 105 - .../multi_index/detail/seq_index_node.hpp | 18 +- .../multi_index/detail/seq_index_ops.hpp | 6 +- .../boost/multi_index/hashed_index.hpp | 36 +- .../boost/multi_index/sequenced_index.hpp | 24 +- .../boost/multi_index_container.hpp | 90 +- third_party/boost_parts/boost/next_prior.hpp | 140 +- .../boost/numeric/conversion/cast.hpp | 2 +- .../numeric/conversion/conversion_traits.hpp | 7 - .../numeric/conversion/detail/converter.hpp | 17 +- .../conversion/detail/old_numeric_cast.hpp | 37 +- third_party/boost_parts/boost/operators.hpp | 33 +- .../detail/old_optional_implementation.hpp | 20 +- .../detail/optional_aligned_storage.hpp | 38 +- .../boost/optional/detail/optional_config.hpp | 48 +- .../detail/optional_reference_spec.hpp | 96 +- .../boost/optional/detail/optional_relops.hpp | 2 +- .../optional_trivially_copyable_base.hpp | 499 ++ .../boost_parts/boost/optional/optional.hpp | 434 +- .../boost/optional/optional_fwd.hpp | 2 +- .../boost/parameter/aux_/arg_list.hpp | 1 + .../boost/pending/container_traits.hpp | 29 - .../boost_parts/boost/pending/cstddef.hpp | 16 - .../boost/pending/integer_log2.hpp | 9 - .../boost_parts/boost/pending/lowest_bit.hpp | 2 +- third_party/boost_parts/boost/pointee.hpp | 4 +- .../boost_parts/boost/pointer_to_other.hpp | 2 +- .../boost/predef/architecture/arm.h | 7 +- .../boost/predef/architecture/parisc.h | 2 +- .../boost_parts/boost/predef/compiler/intel.h | 20 +- .../boost/predef/compiler/visualc.h | 16 +- .../boost/predef/hardware/simd/arm.h | 4 +- .../predef/hardware/simd/x86_amd/versions.h | 6 +- .../boost_parts/boost/predef/library/c.h | 1 + .../boost/predef/library/c/cloudabi.h | 53 + third_party/boost_parts/boost/predef/make.h | 4 + .../boost_parts/boost/predef/os/android.h | 4 +- .../boost_parts/boost/predef/os/bsd/free.h | 13 +- .../boost_parts/boost/predef/os/bsd/open.h | 80 + .../boost_parts/boost/predef/platform.h | 11 +- .../boost/predef/platform/cloudabi.h | 43 + .../boost_parts/boost/predef/platform/ios.h | 58 + .../boost_parts/boost/predef/platform/mingw.h | 8 +- .../boost/predef/platform/mingw32.h | 63 + .../boost/predef/platform/mingw64.h | 63 + .../boost/predef/platform/windows_desktop.h | 12 +- .../boost/predef/platform/windows_phone.h | 9 +- .../boost/predef/platform/windows_runtime.h | 18 +- .../boost/predef/platform/windows_server.h | 47 + .../boost/predef/platform/windows_store.h | 15 +- .../boost/predef/platform/windows_system.h | 47 + .../boost/predef/platform/windows_uwp.h | 60 + .../boost_parts/boost/predef/version.h | 2 +- .../boost_parts/boost/predef/version_number.h | 21 +- .../boost_parts/boost/preprocessor/cat.hpp | 2 +- .../boost/preprocessor/config/config.hpp | 24 +- .../seq/detail/binary_transform.hpp | 11 +- .../preprocessor/seq/detail/to_list_msvc.hpp | 55 + .../boost/preprocessor/seq/to_list.hpp | 12 + .../parallel/parallel_property_maps.hpp | 1 - .../boost/property_map/property_map.hpp | 31 +- third_party/boost_parts/boost/python.hpp | 1 - .../boost/python/arg_from_python.hpp | 6 +- third_party/boost_parts/boost/python/args.hpp | 11 +- .../boost_parts/boost/python/bases.hpp | 2 +- third_party/boost_parts/boost/python/cast.hpp | 11 +- .../boost_parts/boost/python/class.hpp | 16 +- .../python/converter/arg_from_python.hpp | 5 +- .../boost/python/converter/arg_to_python.hpp | 12 +- .../boost/python/converter/object_manager.hpp | 2 +- .../python/converter/pointer_type_id.hpp | 4 +- .../boost/python/converter/pyobject_type.hpp | 7 +- .../python/converter/pytype_function.hpp | 9 +- .../boost/python/converter/registered.hpp | 39 +- .../python/converter/registered_pointee.hpp | 9 +- .../python/converter/return_from_python.hpp | 2 +- .../converter/rvalue_from_python_data.hpp | 8 +- .../converter/shared_ptr_from_python.hpp | 80 +- .../python/converter/shared_ptr_to_python.hpp | 29 +- .../boost_parts/boost/python/data_members.hpp | 59 +- third_party/boost_parts/boost/python/def.hpp | 2 +- .../boost/python/default_call_policies.hpp | 6 +- .../boost/python/detail/borrowed_ptr.hpp | 3 +- .../boost/python/detail/caller.hpp | 8 +- .../boost/python/detail/config.hpp | 37 +- .../boost/python/detail/convertible.hpp | 4 +- .../boost/python/detail/cv_category.hpp | 6 +- .../boost/python/detail/dealloc.hpp | 2 +- .../boost/python/detail/decorated_type_id.hpp | 2 +- .../boost/python/detail/def_helper.hpp | 6 +- .../boost/python/detail/defaults_def.hpp | 4 +- .../boost/python/detail/defaults_gen.hpp | 4 +- .../boost/python/detail/destroy.hpp | 6 +- .../boost/python/detail/exception_handler.hpp | 2 +- .../boost/python/detail/invoke.hpp | 2 - .../boost/python/detail/is_shared_ptr.hpp | 23 + .../boost/python/detail/string_literal.hpp | 3 +- .../python/detail/translate_exception.hpp | 6 +- .../python/detail/type_list_impl_no_pts.hpp | 107 - .../boost/python/detail/type_traits.hpp | 111 + .../boost/python/detail/unwind_type.hpp | 6 +- .../boost/python/detail/value_arg.hpp | 5 +- .../python/detail/value_is_shared_ptr.hpp | 23 +- .../boost/python/detail/value_is_xxx.hpp | 9 +- .../boost/python/detail/void_ptr.hpp | 2 +- .../boost/python/detail/wrapper_base.hpp | 11 +- .../boost_parts/boost/python/errors.hpp | 2 +- third_party/boost_parts/boost/python/exec.hpp | 16 + third_party/boost_parts/boost/python/init.hpp | 8 +- .../boost_parts/boost/python/iterator.hpp | 6 +- .../boost/python/lvalue_from_pytype.hpp | 3 +- .../boost/python/make_constructor.hpp | 19 +- .../boost/python/make_function.hpp | 2 +- .../boost/python/manage_new_object.hpp | 4 +- .../boost_parts/boost/python/module_init.hpp | 22 +- .../boost_parts/boost/python/numeric.hpp | 242 - .../boost_parts/boost/python/numpy.hpp | 34 + .../boost_parts/boost/python/numpy/config.hpp | 80 + .../boost_parts/boost/python/numpy/dtype.hpp | 117 + .../boost/python/numpy/internal.hpp | 36 + .../boost/python/numpy/invoke_matching.hpp | 186 + .../boost_parts/boost/python/numpy/matrix.hpp | 84 + .../boost/python/numpy/ndarray.hpp | 313 ++ .../python/numpy/numpy_object_mgr_traits.hpp | 38 + .../boost/python/numpy/scalars.hpp | 58 + .../boost_parts/boost/python/numpy/ufunc.hpp | 206 + .../boost/python/object/class_metadata.hpp | 131 +- .../boost/python/object/forward.hpp | 11 +- .../boost/python/object/inheritance.hpp | 7 +- .../boost/python/object/instance.hpp | 8 +- .../boost/python/object/iterator.hpp | 9 +- .../boost/python/object/make_instance.hpp | 5 +- .../boost/python/object/make_ptr_instance.hpp | 16 +- .../boost/python/object/pickle_support.hpp | 2 +- .../boost/python/object/pointer_holder.hpp | 13 +- .../boost/python/object/py_function.hpp | 10 +- .../boost_parts/boost/python/object_core.hpp | 18 +- .../boost/python/opaque_pointer_converter.hpp | 7 +- .../boost_parts/boost/python/pointee.hpp | 10 +- .../boost_parts/boost/python/refcount.hpp | 2 + .../python/reference_existing_object.hpp | 4 +- .../boost_parts/boost/python/return_arg.hpp | 3 +- .../boost/python/return_by_value.hpp | 3 +- .../boost/python/return_opaque_pointer.hpp | 2 +- .../boost_parts/boost/python/signature.hpp | 4 +- .../boost_parts/boost/python/slice.hpp | 4 +- third_party/boost_parts/boost/python/str.hpp | 2 +- .../indexing/detail/indexing_suite_detail.hpp | 6 +- .../python/suite/indexing/indexing_suite.hpp | 10 +- .../boost/python/to_python_indirect.hpp | 19 +- .../boost/python/to_python_value.hpp | 50 +- .../boost_parts/boost/python/type_id.hpp | 2 +- .../boost_parts/boost/range/as_literal.hpp | 127 - .../boost_parts/boost/range/concepts.hpp | 10 +- .../boost/range/detail/as_literal.hpp | 33 - .../boost/range/detail/const_iterator.hpp | 71 - .../boost/range/detail/detail_str.hpp | 376 -- .../boost/range/detail/iterator.hpp | 78 - .../boost/range/detail/remove_extent.hpp | 157 - .../boost/range/detail/size_type.hpp | 55 - .../boost/range/detail/str_types.hpp | 38 - .../boost/range/detail/value_type.hpp | 72 - .../boost/range/detail/vc6/end.hpp | 170 - .../boost/range/iterator_range_core.hpp | 1 + .../boost/range/result_iterator.hpp | 33 - .../boost_parts/boost/range/size_type.hpp | 5 - .../boost_parts/boost/scoped_array.hpp | 3 +- third_party/boost_parts/boost/scoped_ptr.hpp | 3 +- .../boost_parts/boost/serialization/array.hpp | 152 +- .../serialization/array_optimization.hpp | 37 + .../boost/serialization/array_wrapper.hpp | 121 + .../boost/serialization/collection_traits.hpp | 79 - .../serialization/collections_load_imp.hpp | 105 - .../serialization/collections_save_imp.hpp | 82 - .../boost/serialization/detail/get_data.hpp | 59 - .../detail/is_default_constructible.hpp | 48 - .../serialization/detail/shared_count_132.hpp | 569 -- .../serialization/detail/shared_ptr_132.hpp | 478 -- .../detail/shared_ptr_nmt_132.hpp | 182 - .../detail/stack_constructor.hpp | 66 - .../boost/serialization/factory.hpp | 46 +- .../boost_parts/boost/serialization/nvp.hpp | 4 +- .../boost_parts/boost/serialization/pfto.hpp | 78 - .../boost/serialization/shared_ptr_132.hpp | 222 - .../boost/serialization/singleton.hpp | 90 +- .../boost/serialization/strong_typedef.hpp | 38 +- .../boost/serialization/vector.hpp | 227 - .../boost_parts/boost/shared_array.hpp | 2 +- third_party/boost_parts/boost/shared_ptr.hpp | 2 +- .../boost/smart_ptr/allocate_shared_array.hpp | 840 ++- .../boost/smart_ptr/bad_weak_ptr.hpp | 11 + .../smart_ptr/detail/array_allocator.hpp | 318 -- .../smart_ptr/detail/array_count_impl.hpp | 67 - .../boost/smart_ptr/detail/array_traits.hpp | 60 - .../boost/smart_ptr/detail/array_utility.hpp | 214 - .../boost/smart_ptr/detail/atomic_count.hpp | 119 - .../smart_ptr/detail/atomic_count_gcc.hpp | 72 - .../smart_ptr/detail/atomic_count_gcc_x86.hpp | 77 - .../detail/atomic_count_pthreads.hpp | 96 - .../smart_ptr/detail/atomic_count_sync.hpp | 61 - .../smart_ptr/detail/atomic_count_win32.hpp | 63 - .../smart_ptr/detail/local_counted_base.hpp | 148 + .../smart_ptr/detail/local_sp_deleter.hpp | 91 + .../boost/smart_ptr/detail/lwm_win32_cs.hpp | 37 +- .../boost/smart_ptr/detail/operator_bool.hpp | 12 +- .../smart_ptr/detail/shared_array_nmt.hpp | 151 - .../boost/smart_ptr/detail/shared_count.hpp | 80 +- .../boost/smart_ptr/detail/shared_ptr_nmt.hpp | 182 - .../smart_ptr/detail/sp_counted_base.hpp | 7 +- .../detail/sp_counted_base_acc_ia64.hpp | 1 + .../smart_ptr/detail/sp_counted_base_aix.hpp | 1 + .../detail/sp_counted_base_clang.hpp | 14 +- .../detail/sp_counted_base_cw_ppc.hpp | 1 + .../detail/sp_counted_base_gcc_ia64.hpp | 1 + .../detail/sp_counted_base_gcc_mips.hpp | 7 + .../detail/sp_counted_base_gcc_ppc.hpp | 1 + .../detail/sp_counted_base_gcc_sparc.hpp | 1 + .../detail/sp_counted_base_gcc_x86.hpp | 1 + .../smart_ptr/detail/sp_counted_base_nt.hpp | 1 + .../smart_ptr/detail/sp_counted_base_pt.hpp | 1 + .../detail/sp_counted_base_snc_ps3.hpp | 1 + .../smart_ptr/detail/sp_counted_base_spin.hpp | 1 + .../detail/sp_counted_base_std_atomic.hpp | 5 +- .../smart_ptr/detail/sp_counted_base_sync.hpp | 1 + .../detail/sp_counted_base_vacpp_ppc.hpp | 1 + .../smart_ptr/detail/sp_counted_base_w32.hpp | 1 + .../smart_ptr/detail/sp_counted_impl.hpp | 37 +- .../boost/smart_ptr/detail/sp_has_sync.hpp | 6 +- .../boost/smart_ptr/detail/sp_if_array.hpp | 34 - .../boost/smart_ptr/detail/sp_noexcept.hpp | 48 + .../boost/smart_ptr/detail/spinlock.hpp | 3 + .../boost/smart_ptr/detail/yield_k.hpp | 2 +- .../boost/smart_ptr/make_shared.hpp | 3 +- .../boost/smart_ptr/make_shared_array.hpp | 196 +- .../boost/smart_ptr/make_shared_object.hpp | 608 +- .../boost/smart_ptr/scoped_array.hpp | 26 +- .../boost/smart_ptr/scoped_ptr.hpp | 32 +- .../boost/smart_ptr/shared_array.hpp | 57 +- .../boost/smart_ptr/shared_ptr.hpp | 285 +- .../boost_parts/boost/smart_ptr/weak_ptr.hpp | 55 +- .../home/classic/core/composite/actions.hpp | 3 +- .../boost/spirit/home/classic/core/match.hpp | 14 +- .../core/primitives/impl/primitives.ipp | 6 + .../classic/core/primitives/primitives.hpp | 6 +- .../classic/core/scanner/impl/skipper.ipp | 16 +- .../boost/spirit/home/classic/version.hpp | 2 +- .../boost_parts/boost/token_functions.hpp | 651 --- .../boost_parts/boost/token_iterator.hpp | 128 - third_party/boost_parts/boost/tokenizer.hpp | 98 - .../boost/tuple/detail/tuple_basic.hpp | 16 +- .../detail/tuple_basic_no_partial_spec.hpp | 865 --- third_party/boost_parts/boost/tuple/tuple.hpp | 16 +- .../boost/tuple/tuple_comparison.hpp | 16 +- third_party/boost_parts/boost/type_index.hpp | 265 + .../boost/type_index/ctti_type_index.hpp | 213 + .../detail/compile_time_type_info.hpp | 291 + .../type_index/detail/ctti_register_class.hpp | 40 + .../type_index/detail/stl_register_class.hpp | 40 + .../boost/type_index/stl_type_index.hpp | 276 + .../boost/type_index/type_index_facade.hpp | 297 + third_party/boost_parts/boost/type_traits.hpp | 4 + .../boost/type_traits/add_const.hpp | 6 + .../boost_parts/boost/type_traits/add_cv.hpp | 6 + .../type_traits/add_lvalue_reference.hpp | 6 + .../boost/type_traits/add_pointer.hpp | 6 + .../boost/type_traits/add_reference.hpp | 7 + .../type_traits/add_rvalue_reference.hpp | 6 + .../boost/type_traits/add_volatile.hpp | 6 + .../boost/type_traits/arithmetic_traits.hpp | 20 - .../boost/type_traits/array_traits.hpp | 15 - .../type_traits/broken_compiler_spec.hpp | 117 - .../boost/type_traits/common_type.hpp | 7 + .../boost/type_traits/conditional.hpp | 8 + .../boost_parts/boost/type_traits/config.hpp | 76 - .../boost_parts/boost/type_traits/copy_cv.hpp | 6 + .../boost_parts/boost/type_traits/decay.hpp | 6 + .../type_traits/detail/bool_trait_def.hpp | 196 - .../detail/common_arithmetic_type.hpp | 6 +- .../type_traits/detail/common_type_imp.hpp | 333 -- .../boost/type_traits/detail/config.hpp | 13 +- .../type_traits/detail/cv_traits_impl.hpp | 97 - .../boost/type_traits/detail/false_result.hpp | 28 - .../detail/has_binary_operator.hpp | 85 +- .../detail/has_postfix_operator.hpp | 2 +- .../detail/has_prefix_operator.hpp | 5 +- .../boost/type_traits/detail/ice_and.hpp | 35 - .../boost/type_traits/detail/ice_eq.hpp | 36 - .../boost/type_traits/detail/ice_not.hpp | 31 - .../boost/type_traits/detail/ice_or.hpp | 34 - .../detail/is_function_ptr_helper.hpp | 472 +- .../type_traits/detail/is_likely_lambda.hpp | 94 + .../detail/is_mem_fun_pointer_impl.hpp | 1749 ++++-- .../detail/is_mem_fun_pointer_tester.hpp | 4 +- .../type_traits/detail/size_t_trait_def.hpp | 60 - .../type_traits/detail/size_t_trait_undef.hpp | 16 - .../detail/template_arity_spec.hpp | 31 - .../type_traits/detail/type_trait_def.hpp | 67 - .../type_traits/detail/type_trait_undef.hpp | 19 - .../boost/type_traits/detail/wrap.hpp | 18 - .../boost_parts/boost/type_traits/extent.hpp | 1 + .../type_traits/floating_point_promotion.hpp | 8 + .../boost/type_traits/has_equal_to.hpp | 3 + .../boost/type_traits/has_greater.hpp | 3 + .../boost/type_traits/has_greater_equal.hpp | 3 + .../boost/type_traits/has_less.hpp | 3 + .../boost/type_traits/has_less_equal.hpp | 3 + .../boost/type_traits/has_minus.hpp | 93 + .../boost/type_traits/has_minus_assign.hpp | 97 +- .../boost/type_traits/has_not_equal_to.hpp | 3 + .../boost/type_traits/has_nothrow_assign.hpp | 1 + .../type_traits/has_nothrow_constructor.hpp | 1 + .../type_traits/has_nothrow_destructor.hpp | 15 +- .../boost/type_traits/has_operator.hpp | 51 - .../boost/type_traits/has_plus_assign.hpp | 90 + .../boost/type_traits/has_trivial_assign.hpp | 1 + .../boost/type_traits/has_trivial_copy.hpp | 1 + .../type_traits/has_trivial_move_assign.hpp | 1 + .../has_trivial_move_constructor.hpp | 1 + .../boost_parts/boost/type_traits/ice.hpp | 20 - .../boost/type_traits/integral_constant.hpp | 3 +- .../boost/type_traits/integral_promotion.hpp | 6 + .../boost/type_traits/intrinsics.hpp | 3 +- .../boost/type_traits/is_abstract.hpp | 1 + .../boost/type_traits/is_array.hpp | 2 +- .../boost/type_traits/is_assignable.hpp | 13 +- .../boost/type_traits/is_complete.hpp | 90 + .../boost/type_traits/is_complex.hpp | 1 + .../boost/type_traits/is_const.hpp | 3 +- .../boost/type_traits/is_constructible.hpp | 14 +- .../boost/type_traits/is_convertible.hpp | 22 +- .../type_traits/is_default_constructible.hpp | 19 +- .../boost/type_traits/is_destructible.hpp | 13 +- .../type_traits/is_list_constructible.hpp | 48 + .../is_nothrow_move_assignable.hpp | 17 +- .../is_nothrow_move_constructible.hpp | 19 +- .../type_traits/is_nothrow_swappable.hpp | 67 + .../boost_parts/boost/type_traits/is_pod.hpp | 1 + .../boost/type_traits/is_rvalue_reference.hpp | 2 +- .../boost/type_traits/is_virtual_base_of.hpp | 2 +- .../boost/type_traits/is_volatile.hpp | 3 +- .../boost/type_traits/make_signed.hpp | 6 + .../boost/type_traits/make_unsigned.hpp | 6 + .../boost/type_traits/make_void.hpp | 52 + .../type_traits/msvc/remove_all_extents.hpp | 47 - .../boost/type_traits/msvc/remove_bounds.hpp | 43 - .../boost/type_traits/msvc/remove_const.hpp | 143 - .../boost/type_traits/msvc/remove_cv.hpp | 190 - .../boost/type_traits/msvc/remove_extent.hpp | 43 - .../boost/type_traits/msvc/remove_pointer.hpp | 42 - .../type_traits/msvc/remove_reference.hpp | 42 - .../type_traits/msvc/remove_volatile.hpp | 143 - .../boost/type_traits/msvc/typeof.hpp | 50 - .../boost_parts/boost/type_traits/promote.hpp | 6 + .../boost_parts/boost/type_traits/rank.hpp | 1 + .../boost/type_traits/remove_all_extents.hpp | 8 +- .../boost/type_traits/remove_bounds.hpp | 7 + .../boost/type_traits/remove_const.hpp | 8 +- .../boost/type_traits/remove_cv.hpp | 7 +- .../boost/type_traits/remove_cv_ref.hpp | 30 + .../boost/type_traits/remove_extent.hpp | 8 +- .../boost/type_traits/remove_pointer.hpp | 9 +- .../boost/type_traits/remove_reference.hpp | 5 + .../boost/type_traits/remove_volatile.hpp | 7 +- .../boost/type_traits/type_identity.hpp | 9 + .../boost/type_traits/type_with_alignment.hpp | 7 +- .../boost_parts/boost/typeof/decltype.hpp | 34 + .../boost/typeof/msvc/typeof_impl.hpp | 90 +- .../boost/typeof/register_fundamental.hpp | 3 +- .../boost_parts/boost/typeof/typeof.hpp | 38 +- .../boost/unordered/detail/allocate.hpp | 1128 ---- .../boost/unordered/detail/buckets.hpp | 928 --- .../boost/unordered/detail/equivalent.hpp | 686 --- .../boost/unordered/detail/extract_key.hpp | 188 - .../boost/unordered/detail/fwd.hpp | 54 +- .../boost/unordered/detail/implementation.hpp | 4952 +++++++++++++++++ .../boost/unordered/detail/map.hpp | 67 + .../boost/unordered/detail/set.hpp | 66 + .../boost/unordered/detail/table.hpp | 873 --- .../boost/unordered/detail/unique.hpp | 628 --- .../boost/unordered/detail/util.hpp | 266 - .../boost/unordered/unordered_map.hpp | 3036 ++++++---- .../boost/unordered/unordered_map_fwd.hpp | 83 +- .../boost/unordered/unordered_set.hpp | 2525 +++++---- .../boost/unordered/unordered_set_fwd.hpp | 87 +- third_party/boost_parts/boost/utility.hpp | 13 +- .../boost/utility/base_from_member.hpp | 13 +- .../boost/utility/compare_pointees.hpp | 12 +- .../detail/in_place_factory_prefix.hpp | 36 - .../detail/in_place_factory_suffix.hpp | 23 - .../utility/detail/result_of_iterate.hpp | 31 +- .../boost/utility/in_place_factory.hpp | 88 - .../boost_parts/boost/utility/result_of.hpp | 64 +- third_party/boost_parts/boost/version.hpp | 4 +- third_party/boost_parts/boost/weak_ptr.hpp | 2 +- third_party/boost_parts/update-boost.sh | 2 +- tools/CMakeLists.txt | 6 +- tools/binexport2dump.cc | 52 +- type_system.cc | 2 +- type_system.h | 2 +- types.h | 2 +- types_container.h | 2 +- util.cmake | 2 +- filesystem_util.cc => util/filesystem.cc | 200 +- filesystem_util.h => util/filesystem.h | 43 +- .../filesystem_test.cc | 32 +- util/format.cc | 65 + util/format.h | 50 + util/format_test.cc | 44 + timer.h => util/timer.h | 8 +- timer_test.cc => util/timer_test.cc | 4 +- version.h.in | 2 +- virtual_memory.cc | 2 +- virtual_memory.h | 2 +- virtual_memory_test.cc | 206 + writer.h | 2 +- x86_nop.cc | 2 +- x86_nop.h | 2 +- 821 files changed, 28266 insertions(+), 33844 deletions(-) rename hex_codec.h => architectures.h (53%) create mode 100644 binexport.cc create mode 100644 binexport.h create mode 100644 binexport_test.cc delete mode 100644 cctz.cmake delete mode 100644 chain_writer.cc delete mode 100644 chain_writer.h delete mode 100644 cmake/cctz.cmake delete mode 100644 hex_codec.cc rename ida/{begin_idasdk.h => begin_idasdk.inc} (62%) rename ida/{end_idasdk.h => end_idasdk.inc} (66%) create mode 100644 reader/call_graph.cc create mode 100644 reader/call_graph.h create mode 100644 reader/call_graph_test.cc create mode 100644 reader/flow_graph.cc create mode 100644 reader/flow_graph.h create mode 100644 reader/flow_graph_test.cc create mode 100644 reader/graph_utility.h create mode 100644 reader/graph_utility_test.cc create mode 100644 reader/instruction.cc create mode 100644 reader/instruction.h create mode 100644 reader/instruction_test.cc create mode 100644 reader/reader_test_util.cc create mode 100644 reader/reader_test_util.h create mode 100644 reader/testdata/0000500ed9f688a309ee2176462eb978efa9a2fb80fcceb5d8fd08168ea50dfd.BinExport create mode 100644 stubs/base/macros.h create mode 100644 stubs/util/task/status_macros.h create mode 100644 stubs/util/task/statusor.h delete mode 100644 third_party/boost_parts/boost/algorithm/string.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/case_conv.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/classification.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/compare.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/concept.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/config.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/constants.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/detail/case_conv.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/detail/classification.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/detail/find_format.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/detail/find_format_all.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/detail/find_format_store.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/detail/find_iterator.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/detail/finder.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/detail/formatter.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/detail/predicate.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/detail/replace_storage.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/detail/sequence.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/detail/trim.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/detail/util.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/erase.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/find.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/find_format.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/find_iterator.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/finder.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/formatter.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/iter_find.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/join.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/predicate.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/predicate_facade.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/replace.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/sequence_traits.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/split.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/std/list_traits.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/std/slist_traits.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/std/string_traits.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/std_containers_traits.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/trim.hpp delete mode 100644 third_party/boost_parts/boost/algorithm/string/yes_no_type.hpp delete mode 100644 third_party/boost_parts/boost/align/align.hpp delete mode 100644 third_party/boost_parts/boost/align/detail/align.hpp delete mode 100644 third_party/boost_parts/boost/align/detail/align_cxx11.hpp delete mode 100644 third_party/boost_parts/boost/align/detail/is_alignment.hpp delete mode 100644 third_party/boost_parts/boost/archive/add_facet.hpp delete mode 100644 third_party/boost_parts/boost/archive/shared_ptr_helper.hpp create mode 100644 third_party/boost_parts/boost/config/compiler/diab.hpp create mode 100644 third_party/boost_parts/boost/config/compiler/xlcpp_zos.hpp rename third_party/boost_parts/boost/config/{ => detail}/posix_features.hpp (100%) rename third_party/boost_parts/boost/config/{ => detail}/select_compiler_config.hpp (75%) rename third_party/boost_parts/boost/config/{ => detail}/select_platform_config.hpp (94%) rename third_party/boost_parts/boost/config/{ => detail}/select_stdlib_config.hpp (94%) rename third_party/boost_parts/boost/config/{ => detail}/suffix.hpp (94%) create mode 100644 third_party/boost_parts/boost/config/header_deprecated.hpp create mode 100644 third_party/boost_parts/boost/config/helper_macros.hpp create mode 100644 third_party/boost_parts/boost/config/platform/zos.hpp create mode 100644 third_party/boost_parts/boost/config/pragma_message.hpp create mode 100644 third_party/boost_parts/boost/config/stdlib/xlcpp_zos.hpp create mode 100644 third_party/boost_parts/boost/config/workaround.hpp delete mode 100644 third_party/boost_parts/boost/container/detail/memory_util.hpp delete mode 100644 third_party/boost_parts/boost/container/detail/preprocessor.hpp rename third_party/boost_parts/boost/{functional/hash => container_hash}/detail/float_functions.hpp (100%) rename third_party/boost_parts/boost/{functional/hash => container_hash}/detail/hash_float.hpp (96%) rename third_party/boost_parts/boost/{functional/hash => container_hash}/detail/limits.hpp (100%) rename third_party/boost_parts/boost/{functional/hash => container_hash}/extensions.hpp (68%) rename third_party/boost_parts/boost/{functional/hash => container_hash}/hash.hpp (71%) rename third_party/boost_parts/boost/{functional/hash => container_hash}/hash_fwd.hpp (93%) create mode 100644 third_party/boost_parts/boost/core/ignore_unused.hpp create mode 100644 third_party/boost_parts/boost/core/pointer_traits.hpp delete mode 100644 third_party/boost_parts/boost/detail/atomic_count.hpp delete mode 100644 third_party/boost_parts/boost/detail/interlocked.hpp delete mode 100644 third_party/boost_parts/boost/detail/is_function_ref_tester.hpp delete mode 100644 third_party/boost_parts/boost/detail/ob_call_traits.hpp delete mode 100644 third_party/boost_parts/boost/detail/ob_compressed_pair.hpp delete mode 100644 third_party/boost_parts/boost/detail/quick_allocator.hpp delete mode 100644 third_party/boost_parts/boost/exception/detail/attribute_noreturn.hpp create mode 100644 third_party/boost_parts/boost/fusion/support/detail/and.hpp delete mode 100644 third_party/boost_parts/boost/graph/distributed/unsafe_serialize.hpp delete mode 100644 third_party/boost_parts/boost/graph/parallel/basic_reduce.hpp delete mode 100644 third_party/boost_parts/boost/graph/parallel/detail/untracked_pair.hpp delete mode 100644 third_party/boost_parts/boost/intrusive/detail/memory_util.hpp delete mode 100644 third_party/boost_parts/boost/intrusive/detail/preprocessor.hpp delete mode 100644 third_party/boost_parts/boost/iterator.hpp create mode 100644 third_party/boost_parts/boost/iterator/advance.hpp delete mode 100644 third_party/boost_parts/boost/iterator/detail/minimum_category.hpp delete mode 100644 third_party/boost_parts/boost/memory_order.hpp create mode 100644 third_party/boost_parts/boost/move/detail/iterator_to_raw_pointer.hpp rename third_party/boost_parts/boost/{intrusive => move}/detail/pointer_element.hpp (87%) create mode 100644 third_party/boost_parts/boost/move/detail/to_raw_pointer.hpp create mode 100644 third_party/boost_parts/boost/mpi/cartesian_communicator.hpp create mode 100644 third_party/boost_parts/boost/mpi/detail/antiques.hpp create mode 100644 third_party/boost_parts/boost/mpi/detail/offsets.hpp create mode 100644 third_party/boost_parts/boost/multi_index/detail/ignore_wstrict_aliasing.hpp delete mode 100644 third_party/boost_parts/boost/multi_index/detail/msvc_index_specifier.hpp delete mode 100644 third_party/boost_parts/boost/multi_index/detail/prevent_eti.hpp create mode 100644 third_party/boost_parts/boost/multi_index/detail/restore_wstrict_aliasing.hpp delete mode 100644 third_party/boost_parts/boost/multi_index/detail/safe_ctr_proxy.hpp create mode 100644 third_party/boost_parts/boost/optional/detail/optional_trivially_copyable_base.hpp delete mode 100644 third_party/boost_parts/boost/pending/cstddef.hpp delete mode 100644 third_party/boost_parts/boost/pending/integer_log2.hpp create mode 100644 third_party/boost_parts/boost/predef/library/c/cloudabi.h create mode 100644 third_party/boost_parts/boost/predef/platform/cloudabi.h create mode 100644 third_party/boost_parts/boost/predef/platform/ios.h create mode 100644 third_party/boost_parts/boost/predef/platform/mingw32.h create mode 100644 third_party/boost_parts/boost/predef/platform/mingw64.h create mode 100644 third_party/boost_parts/boost/predef/platform/windows_server.h create mode 100644 third_party/boost_parts/boost/predef/platform/windows_system.h create mode 100644 third_party/boost_parts/boost/predef/platform/windows_uwp.h create mode 100644 third_party/boost_parts/boost/preprocessor/seq/detail/to_list_msvc.hpp create mode 100644 third_party/boost_parts/boost/python/detail/is_shared_ptr.hpp delete mode 100644 third_party/boost_parts/boost/python/detail/type_list_impl_no_pts.hpp create mode 100644 third_party/boost_parts/boost/python/detail/type_traits.hpp delete mode 100644 third_party/boost_parts/boost/python/numeric.hpp create mode 100644 third_party/boost_parts/boost/python/numpy.hpp create mode 100644 third_party/boost_parts/boost/python/numpy/config.hpp create mode 100644 third_party/boost_parts/boost/python/numpy/dtype.hpp create mode 100644 third_party/boost_parts/boost/python/numpy/internal.hpp create mode 100644 third_party/boost_parts/boost/python/numpy/invoke_matching.hpp create mode 100644 third_party/boost_parts/boost/python/numpy/matrix.hpp create mode 100644 third_party/boost_parts/boost/python/numpy/ndarray.hpp create mode 100644 third_party/boost_parts/boost/python/numpy/numpy_object_mgr_traits.hpp create mode 100644 third_party/boost_parts/boost/python/numpy/scalars.hpp create mode 100644 third_party/boost_parts/boost/python/numpy/ufunc.hpp delete mode 100644 third_party/boost_parts/boost/range/as_literal.hpp delete mode 100644 third_party/boost_parts/boost/range/detail/as_literal.hpp delete mode 100644 third_party/boost_parts/boost/range/detail/const_iterator.hpp delete mode 100644 third_party/boost_parts/boost/range/detail/detail_str.hpp delete mode 100644 third_party/boost_parts/boost/range/detail/iterator.hpp delete mode 100644 third_party/boost_parts/boost/range/detail/remove_extent.hpp delete mode 100644 third_party/boost_parts/boost/range/detail/size_type.hpp delete mode 100644 third_party/boost_parts/boost/range/detail/str_types.hpp delete mode 100644 third_party/boost_parts/boost/range/detail/value_type.hpp delete mode 100644 third_party/boost_parts/boost/range/detail/vc6/end.hpp delete mode 100644 third_party/boost_parts/boost/range/result_iterator.hpp create mode 100644 third_party/boost_parts/boost/serialization/array_optimization.hpp create mode 100644 third_party/boost_parts/boost/serialization/array_wrapper.hpp delete mode 100644 third_party/boost_parts/boost/serialization/collection_traits.hpp delete mode 100644 third_party/boost_parts/boost/serialization/collections_load_imp.hpp delete mode 100644 third_party/boost_parts/boost/serialization/collections_save_imp.hpp delete mode 100644 third_party/boost_parts/boost/serialization/detail/get_data.hpp delete mode 100644 third_party/boost_parts/boost/serialization/detail/is_default_constructible.hpp delete mode 100644 third_party/boost_parts/boost/serialization/detail/shared_count_132.hpp delete mode 100644 third_party/boost_parts/boost/serialization/detail/shared_ptr_132.hpp delete mode 100644 third_party/boost_parts/boost/serialization/detail/shared_ptr_nmt_132.hpp delete mode 100644 third_party/boost_parts/boost/serialization/detail/stack_constructor.hpp delete mode 100644 third_party/boost_parts/boost/serialization/pfto.hpp delete mode 100644 third_party/boost_parts/boost/serialization/shared_ptr_132.hpp delete mode 100644 third_party/boost_parts/boost/serialization/vector.hpp delete mode 100644 third_party/boost_parts/boost/smart_ptr/detail/array_allocator.hpp delete mode 100644 third_party/boost_parts/boost/smart_ptr/detail/array_count_impl.hpp delete mode 100644 third_party/boost_parts/boost/smart_ptr/detail/array_traits.hpp delete mode 100644 third_party/boost_parts/boost/smart_ptr/detail/array_utility.hpp delete mode 100644 third_party/boost_parts/boost/smart_ptr/detail/atomic_count.hpp delete mode 100644 third_party/boost_parts/boost/smart_ptr/detail/atomic_count_gcc.hpp delete mode 100644 third_party/boost_parts/boost/smart_ptr/detail/atomic_count_gcc_x86.hpp delete mode 100644 third_party/boost_parts/boost/smart_ptr/detail/atomic_count_pthreads.hpp delete mode 100644 third_party/boost_parts/boost/smart_ptr/detail/atomic_count_sync.hpp delete mode 100644 third_party/boost_parts/boost/smart_ptr/detail/atomic_count_win32.hpp create mode 100644 third_party/boost_parts/boost/smart_ptr/detail/local_counted_base.hpp create mode 100644 third_party/boost_parts/boost/smart_ptr/detail/local_sp_deleter.hpp delete mode 100644 third_party/boost_parts/boost/smart_ptr/detail/shared_array_nmt.hpp delete mode 100644 third_party/boost_parts/boost/smart_ptr/detail/shared_ptr_nmt.hpp delete mode 100644 third_party/boost_parts/boost/smart_ptr/detail/sp_if_array.hpp create mode 100644 third_party/boost_parts/boost/smart_ptr/detail/sp_noexcept.hpp delete mode 100644 third_party/boost_parts/boost/token_functions.hpp delete mode 100644 third_party/boost_parts/boost/token_iterator.hpp delete mode 100644 third_party/boost_parts/boost/tokenizer.hpp delete mode 100644 third_party/boost_parts/boost/tuple/detail/tuple_basic_no_partial_spec.hpp create mode 100644 third_party/boost_parts/boost/type_index.hpp create mode 100644 third_party/boost_parts/boost/type_index/ctti_type_index.hpp create mode 100644 third_party/boost_parts/boost/type_index/detail/compile_time_type_info.hpp create mode 100644 third_party/boost_parts/boost/type_index/detail/ctti_register_class.hpp create mode 100644 third_party/boost_parts/boost/type_index/detail/stl_register_class.hpp create mode 100644 third_party/boost_parts/boost/type_index/stl_type_index.hpp create mode 100644 third_party/boost_parts/boost/type_index/type_index_facade.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/arithmetic_traits.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/array_traits.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/broken_compiler_spec.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/config.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/detail/bool_trait_def.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/detail/common_type_imp.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/detail/cv_traits_impl.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/detail/false_result.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/detail/ice_and.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/detail/ice_eq.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/detail/ice_not.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/detail/ice_or.hpp create mode 100644 third_party/boost_parts/boost/type_traits/detail/is_likely_lambda.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/detail/size_t_trait_def.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/detail/size_t_trait_undef.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/detail/template_arity_spec.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/detail/type_trait_def.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/detail/type_trait_undef.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/detail/wrap.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/has_operator.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/ice.hpp create mode 100644 third_party/boost_parts/boost/type_traits/is_complete.hpp create mode 100644 third_party/boost_parts/boost/type_traits/is_list_constructible.hpp create mode 100644 third_party/boost_parts/boost/type_traits/is_nothrow_swappable.hpp create mode 100644 third_party/boost_parts/boost/type_traits/make_void.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/msvc/remove_all_extents.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/msvc/remove_bounds.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/msvc/remove_const.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/msvc/remove_cv.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/msvc/remove_extent.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/msvc/remove_pointer.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/msvc/remove_reference.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/msvc/remove_volatile.hpp delete mode 100644 third_party/boost_parts/boost/type_traits/msvc/typeof.hpp create mode 100644 third_party/boost_parts/boost/type_traits/remove_cv_ref.hpp create mode 100644 third_party/boost_parts/boost/typeof/decltype.hpp delete mode 100644 third_party/boost_parts/boost/unordered/detail/allocate.hpp delete mode 100644 third_party/boost_parts/boost/unordered/detail/buckets.hpp delete mode 100644 third_party/boost_parts/boost/unordered/detail/equivalent.hpp delete mode 100644 third_party/boost_parts/boost/unordered/detail/extract_key.hpp create mode 100644 third_party/boost_parts/boost/unordered/detail/implementation.hpp create mode 100644 third_party/boost_parts/boost/unordered/detail/map.hpp create mode 100644 third_party/boost_parts/boost/unordered/detail/set.hpp delete mode 100644 third_party/boost_parts/boost/unordered/detail/table.hpp delete mode 100644 third_party/boost_parts/boost/unordered/detail/unique.hpp delete mode 100644 third_party/boost_parts/boost/unordered/detail/util.hpp delete mode 100644 third_party/boost_parts/boost/utility/detail/in_place_factory_prefix.hpp delete mode 100644 third_party/boost_parts/boost/utility/detail/in_place_factory_suffix.hpp delete mode 100644 third_party/boost_parts/boost/utility/in_place_factory.hpp rename filesystem_util.cc => util/filesystem.cc (56%) rename filesystem_util.h => util/filesystem.h (61%) rename filesystem_util_test.cc => util/filesystem_test.cc (66%) create mode 100644 util/format.cc create mode 100644 util/format.h create mode 100644 util/format_test.cc rename timer.h => util/timer.h (84%) rename timer_test.cc => util/timer_test.cc (92%) create mode 100644 virtual_memory_test.cc diff --git a/.gitignore b/.gitignore index 96554f95..f6cf801c 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ third_party/protobuf/* # Build artifacts build_linux/* build_msvc/* +build_mac/* third_party/zynamics/binexport # Auto-generated diff --git a/CMakeLists.txt b/CMakeLists.txt index 9dff01d6..097be29f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2011-2017 Google Inc. All Rights Reserved. +# Copyright 2011-2018 Google LLC. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -33,7 +33,6 @@ find_package(IdaSdk REQUIRED) find_package(OpenSSL 1.0.2 REQUIRED) find_package(PostgreSQL 9.5 REQUIRED) find_package(Protobuf 3.0.0 REQUIRED) -include(cctz.cmake) include(googletest.cmake) include(absl.cmake) @@ -73,8 +72,6 @@ target_include_directories(binexport_base INTERFACE ${PROJECT_SOURCE_DIR}/stubs ${PROJECT_BINARY_DIR}/src_include ${PROJECT_BINARY_DIR}/gen_include - ${absl_src_dir} - ${cctz_src_dir}/include ${Boost_INCLUDE_DIR} ${PostgreSQL_INCLUDE_DIRS} ${Protobuf_INCLUDE_DIRS} @@ -83,29 +80,31 @@ target_link_libraries(binexport_base INTERFACE ${Protobuf_LIBRARIES} # Same as protobuf::libprotobuf ) -# Interface library to be used by all tests +# Interface library to be used by tests that don't need data files add_library(binexport_test INTERFACE) target_link_libraries(binexport_test INTERFACE gtest_main + gmock ) # BinExport format version 2 proto library protobuf_generate_cpp(binexport2_proto binexport2_proto_h binexport2.proto) -add_library(binexport_proto STATIC - ${binexport2_proto_h} - ${binexport2_proto} -) -target_link_libraries(binexport_proto PUBLIC - binexport_base -) # Utility library code shared with BinDiff add_library(binexport_shared STATIC - filesystem_util.cc - timer.h + ${binexport2_proto_h} + ${binexport2_proto} + binexport.cc + binexport.h + util/format.cc + util/format.h + util/timer.h + util/filesystem.cc + util/filesystem.h ) target_link_libraries(binexport_shared PUBLIC absl::strings + absl::time binexport_base ) if(WIN32) @@ -114,45 +113,35 @@ if(WIN32) ) endif() add_executable(binexport_shared_test - filesystem_util_test.cc - timer_test.cc + util/filesystem_test.cc + util/format_test.cc + util/timer_test.cc ) target_link_libraries(binexport_shared_test PUBLIC binexport_test binexport_shared ) -add_test(BinExportTests binexport_shared_test) +add_test(BinExportSharedTests binexport_shared_test) # binexport2dump tool add_subdirectory(tools) # Code shared with the BinDiff plugin -add_library(binexport_plugin_shared STATIC +add_ida_library(binexport_plugin_shared STATIC hash.cc hash.h - hex_codec.cc - hex_codec.h ida/digest.cc ida/digest.h ida/log.cc ida/log.h ) -target_compile_definitions(binexport_plugin_shared PUBLIC - ${IdaSdk_PLATFORM} - __IDP__ - USE_DANGEROUS_FUNCTIONS - USE_STANDARD_FILE_FUNCTIONS) -target_include_directories(binexport_plugin_shared PUBLIC - ${IdaSdk_INCLUDE_DIRS} -) -target_link_libraries(binexport_plugin_shared PUBLIC +ida_target_link_libraries(binexport_plugin_shared PUBLIC absl::time binexport_base - OpenSSL::Crypto ) -set(binexport_plugin_name binexport${RELEASE}) -add_ida_plugin(${binexport_plugin_name} EA64 +set(binexport_plugin_name binexport${binexport_VERSION_MAJOR}) +add_ida_plugin(${binexport_plugin_name} address_references.cc address_references.h base_types.cc @@ -163,8 +152,6 @@ add_ida_plugin(${binexport_plugin_name} EA64 binexport2_writer.h call_graph.cc call_graph.h - chain_writer.cc - chain_writer.h comment.cc comment.h database_writer.cc @@ -226,15 +213,6 @@ add_ida_plugin(${binexport_plugin_name} EA64 x86_nop.cc x86_nop.h ) -set(binexport_libraries ${IdaSdk_LIBRARIES} - absl::strings - absl::time - binexport_proto - binexport_shared - binexport_plugin_shared - ${PostgreSQL_LIBRARIES} - # OpenSSL must come after PostgreSQL - OpenSSL::SSL) if(WIN32) list(APPEND binexport_libraries crypt32.lib secur32.lib @@ -242,19 +220,54 @@ if(WIN32) ws2_32.lib wldap32.lib) endif() -target_link_libraries(${binexport_plugin_name}${_plx} - ${binexport_libraries} -) -target_link_libraries(${binexport_plugin_name}${_plx64} +ida_target_link_libraries(${binexport_plugin_name} + absl::strings + absl::time + absl::optional + absl::bad_optional_access + binexport_shared + binexport_plugin_shared + ${PostgreSQL_LIBRARIES} + # OpenSSL must come after PostgreSQL + OpenSSL::SSL ${binexport_libraries} ) -set_target_properties( - ${binexport_plugin_name}${_plx} - ${binexport_plugin_name}${_plx64} +set_ida_target_properties(${binexport_plugin_name} PROPERTIES POSITION_INDEPENDENT_CODE ON ) -install(TARGETS ${binexport_plugin_name}${_plx} - ${binexport_plugin_name}${_plx64} - ARCHIVE DESTINATION binexport-prefix - RUNTIME DESTINATION binexport-prefix - LIBRARY DESTINATION binexport-prefix) +ida_install(TARGETS ${binexport_plugin_name} + ARCHIVE DESTINATION binexport-prefix + RUNTIME DESTINATION binexport-prefix + LIBRARY DESTINATION binexport-prefix) + +# Experimental BinExport reader library +add_library(binexport_reader STATIC + reader/call_graph.cc + reader/call_graph.h + reader/flow_graph.cc + reader/flow_graph.h + reader/graph_utility.h + reader/instruction.cc + reader/instruction.h +) +target_link_libraries(binexport_reader PUBLIC + absl::strings + binexport_shared +) +add_executable(binexport_reader_test + reader/call_graph_test.cc + reader/flow_graph_test.cc + reader/graph_utility_test.cc + reader/instruction_test.cc + reader/reader_test_util.cc + reader/reader_test_util.h +) +target_link_libraries(binexport_reader_test PUBLIC + gtest + gmock + binexport_reader +) +add_test( + NAME BinExportReaderTests + COMMAND binexport_reader_test ${PROJECT_SOURCE_DIR}/reader +) diff --git a/FindIdaSdk.cmake b/FindIdaSdk.cmake index 3ad4939c..d60ae8f0 100644 --- a/FindIdaSdk.cmake +++ b/FindIdaSdk.cmake @@ -1,4 +1,4 @@ -# Copyright 2011-2017 Google Inc. All Rights Reserved. +# Copyright 2011-2018 Google LLC. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ # FindIdaSdk # ---------- # -# Locates and configures the IDA Pro SDK. +# Locates and configures the IDA Pro SDK. Only support version 7.0 or hight. # # Use this module by invoking find_package with the form: # @@ -33,37 +33,36 @@ # # IdaSdk_ROOT_DIR - Preferred installation prefix # -# Starting with IDA 7.0 SDK, all builds are 64-bit by default. For -# compatibility with 6.95, which is 32-bit, users can tell this module to -# configure the build using these variables: +# Example (this assumes Windows): # -# IdaSdk_COMPILE_32BIT - Always compile 32-bit binaries -# IdaSdk_LEGACY_FILE_EXTENSIONS - For IDA up until 6.95, use the special -# platform-specific file extensions -# (plx/pmc/plw etc.). -# -# Example: -# -# set(IdaSdk_COMPILE_32BIT ON) -# set(IdaSdk_LEGACY_FILE_EXTENSIONS ON) # find_package(IdaSdk REQUIRED) # include_directories(${IdaSdk_INCLUDE_DIRS}) # -# # Builds target plugin32.plx -# add_ida_plugin(plugin32 myplugin.cc) -# # Builds targets plugin.plx and plugin.plx64 -# add_ida_plugin(plugin EA64 myplugin.cc) -# # Builds target plugin64.plx64 -# add_ida_plugin(plugin64 NOEA32 EA64 myplugin.cc) +# # Builds targets plugin.dll and plugin64.dll +# add_ida_plugin(plugin myplugin.cc) +# # Builds target plugin64.dll +# add_ida_plugin(plugin NOEA32 myplugin.cc) +# # Builds target plugin.dll +# add_ida_plugin(plugin NOEA64 myplugin.cc) +# +# Builds targets ldr.dll and ldr64.dll +# add_ida_loader(ldr myloader.cc) +# +# For platform-agnostic build files, the variables _so, and _so64 are +# available (and map to .dll, .so, .dylib as necessary): # -# Builds targets ldr.llx and ldr64.llx64 -# add_ida_loader(ldr EA64 myloader.cc) +# add_ida_plugin(plugin myplugin.cc) +# target_link_libraries(plugin${_so} ssl) +# target_link_libraries(plugin${_so64} ssl) # -# For platform-agnostic build files, the variables _plx, _plx64, _llx and -# _llx64 are available: -# add_ida_plugin(plugin EA64 myplugin.cc) -# target_link_libraries(plugin${_plx} ssl) -# target_link_libraries(plugin${_plx64} ssl) +# To avoid the duplication above, these functions, which mimic the built-in +# ones, are also defined: +# +# add_ida_library( NOEA64|NOEA64 ...) <=> add_libary() +# ida_target_link_libraries(...) <=> target_link_libraries() +# ida_target_include_directories(...) <=> target_include_directories() +# set_ida_target_properties(...) <=> set_target_properties() +# ida_install(...) <=> install() include(CMakeParseArguments) include(FindPackageHandleStandardArgs) @@ -83,124 +82,195 @@ find_package_handle_standard_args( FAIL_MESSAGE "IDA SDK not found, try setting IdaSdk_ROOT_DIR") # Define some platform specific variables for later use. -if(NOT IdaSdk_LEGACY_FILE_EXTENSIONS) - set(_plx ${CMAKE_SHARED_LIBRARY_SUFFIX}) - set(_plx64 64${CMAKE_SHARED_LIBRARY_SUFFIX}) # An additional "64" - set(_llx ${CMAKE_SHARED_LIBRARY_SUFFIX}) - set(_llx64 64${CMAKE_SHARED_LIBRARY_SUFFIX}) # An additional "64" -endif() +set(_so ${CMAKE_SHARED_LIBRARY_SUFFIX}) +set(_so64 64${CMAKE_SHARED_LIBRARY_SUFFIX}) # An additional "64" +# _plx, _plx64, _llx, _llx64 are kept to stay compatible with older +# CMakeLists.txt files. +set(_plx ${CMAKE_SHARED_LIBRARY_SUFFIX}) +set(_plx64 64${CMAKE_SHARED_LIBRARY_SUFFIX}) # An additional "64" +set(_llx ${CMAKE_SHARED_LIBRARY_SUFFIX}) +set(_llx64 64${CMAKE_SHARED_LIBRARY_SUFFIX}) # An additional "64" if(APPLE) set(IdaSdk_PLATFORM __MAC__) - if(IdaSdk_LEGACY_FILE_EXTENSIONS) - set(_plx .pmc) - set(_plx64 .pmc64) # No extra "64" - set(_llx .lmc) - set(_llx64 64.lmc64) # An additional "64" - endif() elseif(UNIX) set(IdaSdk_PLATFORM __LINUX__) - if(IdaSdk_LEGACY_FILE_EXTENSIONS) - set(_plx .plx) - set(_plx64 .plx64) # No extra "64" - set(_llx .llx) - set(_llx64 64.llx64) # An additional "64" - endif() + set(_ida_compile_options -m64) elseif(WIN32) set(IdaSdk_PLATFORM __NT__) - if(IdaSdk_LEGACY_FILE_EXTENSIONS) - set(_plx .plw) - set(_plx64 .p64) # No extra "64" - set(_llx .ldw) - set(_llx64 64.l64) # An additional "64" - endif() else() message(FATAL_ERROR "Unsupported system type: ${CMAKE_SYSTEM_NAME}") endif() -function(_ida_plugin name ea64 link_script) # ARGN contains sources - # Define a module with the specified sources. - add_library(${name} MODULE ${ARGN}) - - # Support for 64-bit addresses. - if(ea64) - target_compile_definitions(${name} PUBLIC __EA64__) +function(_ida_common_target_settings t ea64) + if(ea64) # Support for 64-bit addresses. + target_compile_definitions(${t} PUBLIC __EA64__) endif() + # Add the necessary __IDP__ define and allow to use "dangerous" and standard + # file functions. + target_compile_definitions(${t} PUBLIC ${IdaSdk_PLATFORM} + __X64__ + __IDP__ + USE_DANGEROUS_FUNCTIONS + USE_STANDARD_FILE_FUNCTIONS) + target_include_directories(${t} PUBLIC ${IdaSdk_INCLUDE_DIRS}) +endfunction() - # Build 64-bit by default. - if(NOT IdaSdk_COMPILE_32BIT) - target_compile_definitions(${name} PUBLIC __X64__) +function(_ida_plugin name ea64 link_script) # ARGN contains sources + if(ea64) + set(t ${name}${_so64}) + else() + set(t ${name}${_so}) endif() - # Add the necessary __IDP__ define and allow to use "dangerous" and standard - # file functions. - target_compile_definitions(${name} PUBLIC - ${IdaSdk_PLATFORM} - __IDP__ - USE_DANGEROUS_FUNCTIONS - USE_STANDARD_FILE_FUNCTIONS) + # Define a module with the specified sources. + add_library(${t} MODULE ${ARGN}) + _ida_common_target_settings(${t} ${ea64}) - set_target_properties(${name} PROPERTIES PREFIX "" SUFFIX "") + set_target_properties(${t} PROPERTIES PREFIX "" SUFFIX "") if(UNIX) - if(NOT IdaSdk_COMPILE_32BIT) - set(_ida_cflag -m64) - else() - set(_ida_cflag -m32) - endif() - # Always use the linker script needed for IDA. - target_compile_options(${name} PUBLIC ${_ida_cflag}) + target_compile_options(${t} PUBLIC ${_ida_compile_options}) if(APPLE) - target_link_libraries(${name} ${_ida_cflag} - -Wl,-flat_namespace - -Wl,-undefined,warning - -Wl,-exported_symbol,_PLUGIN) + target_link_libraries(${t} ${_ida_compile_options} + -Wl,-flat_namespace + -Wl,-undefined,warning + -Wl,-exported_symbol,_PLUGIN) else() - set(script_flag ) - target_link_libraries(${name} - ${_ida_cflag} -Wl,--version-script ${IdaSdk_DIR}/${link_script}) + # Always use the linker script needed for IDA. + target_link_libraries(${t} ${_ida_compile_options} + -Wl,--version-script ${IdaSdk_DIR}/${link_script}) endif() # For qrefcnt_obj_t in ida.hpp - target_compile_options(${name} PUBLIC -Wno-non-virtual-dtor) + # TODO(cblichmann): This belongs in an interface library instead. + target_compile_options(${t} PUBLIC -Wno-non-virtual-dtor) elseif(WIN32) - if(NOT IdaSdk_COMPILE_32BIT) - set(_ida_prefix x64) - else() - set(_ida_prefix x86) - endif() if(ea64) - set(IdaSdk_LIBRARY ${IdaSdk_DIR}/lib/${_ida_prefix}_win_vc_64/ida.lib) + target_link_libraries(${t} ${IdaSdk_DIR}/lib/x64_win_vc_64/ida.lib) else() - set(IdaSdk_LIBRARY ${IdaSdk_DIR}/lib/${_ida_prefix}_win_vc_32/ida.lib) + target_link_libraries(${t} ${IdaSdk_DIR}/lib/x64_win_vc_32/ida.lib) endif() - target_link_libraries(${name} ${IdaSdk_LIBRARY}) + endif() +endfunction() + +macro(_ida_check_bitness) + if(opt_NOEA32 AND opt_NOEA64) + message(FATAL_ERROR "NOEA32 and NOEA64 cannot be used at the same time") + endif() +endmacro() + +function(_ida_library name ea64) + if(ea64) + set(t ${name}_ea32) + else() + set(t ${name}_ea64) + endif() + + # Define the actual library. + add_library(${t} ${ARGN}) + _ida_common_target_settings(${t} ${ea64}) +endfunction() + +function(add_ida_library name) + cmake_parse_arguments(PARSE_ARGV 1 opt "NOEA32;NOEA64" "" "") + _ida_check_bitness(opt_NOEA32 opt_NOEA64) + + if(NOT DEFINED(opt_NOEA32)) + _ida_library(${name} FALSE ${opt_UNPARSED_ARGUMENTS}) + endif() + if(NOT DEFINED(opt_NOEA64)) + _ida_library(${name} TRUE ${opt_UNPARSED_ARGUMENTS}) endif() endfunction() function(add_ida_plugin name) - set(options NOEA32 EA64) - cmake_parse_arguments(add_ida_plugin "${options}" "" "" ${ARGN}) + cmake_parse_arguments(PARSE_ARGV 1 opt "NOEA32;NOEA64" "" "") + _ida_check_bitness(opt_NOEA32 opt_NOEA64) - if(NOT DEFINED(add_ida_plugin_NOEA32)) - _ida_plugin(${name}${_plx} FALSE plugins/plugin.script - ${add_ida_plugin_UNPARSED_ARGUMENTS}) + if(NOT opt_NOEA32) + _ida_plugin(${name} FALSE plugins/plugin.script ${opt_UNPARSED_ARGUMENTS}) endif() - if(add_ida_plugin_EA64) - _ida_plugin(${name}${_plx64} TRUE plugins/plugin.script - ${add_ida_plugin_UNPARSED_ARGUMENTS}) + if(NOT opt_NOEA64) + _ida_plugin(${name} TRUE plugins/plugin.script ${opt_UNPARSED_ARGUMENTS}) endif() endfunction() function(add_ida_loader name) - set(options NOEA32 EA64) - cmake_parse_arguments(add_ida_loader "${options}" "" "" ${ARGN}) + cmake_parse_arguments(PARSE_ARGV 1 opt "NOEA32;NOEA64" "" "") + _ida_check_bitness(opt_NOEA32 opt_NOEA64) - if(NOT DEFINED(add_ida_loader_NOEA32)) - _ida_plugin(${name}${_llx} FALSE ldr/ldr.script - ${add_ida_loader_UNPARSED_ARGUMENTS}) + if(NOT opt_NOEA32) + _ida_plugin(${name} FALSE ldr/ldr.script ${opt_UNPARSED_ARGUMENTS}) endif() - if(add_ida_loader_EA64) - _ida_plugin(${name}${_llx64} TRUE ldr/ldr.script - ${add_ida_loader_UNPARSED_ARGUMENTS}) + if(NOT opt_NOEA64) + _ida_plugin(${name} TRUE ldr/ldr.script ${opt_UNPARSED_ARGUMENTS}) endif() endfunction() +function(ida_target_link_libraries name) + foreach(item IN LISTS ARGN) + if(TARGET ${item}_ea32) + list(APPEND args ${item}_ea32) + elseif(TARGET ${item}_ea64) + list(APPEND args ${item}_ea64) + else() + list(APPEND args ${item}) + endif() + endforeach() + foreach(target ${name}${_so} + ${name}${_so64} + ${name}_ea32 + ${name}_ea64) + if(TARGET ${target}) + target_link_libraries(${target} ${args}) + set(added TRUE) + endif() + endforeach() + if (NOT added) + message(FATAL_ERROR "No such target: ${name}") + endif() +endfunction() + +function(ida_target_include_directories name) + foreach(target ${name}${_so} + ${name}${_so64} + ${name}_ea32 + ${name}_ea64) + if(TARGET ${target}) + target_include_directories(${target} ${ARGN}) + set(added TRUE) + endif() + endforeach() + if (NOT added) + message(FATAL_ERROR "No such target: ${name}") + endif() +endfunction() + +function(set_ida_target_properties name) + foreach(target ${name}${_so} + ${name}${_so64} + ${name}_ea32 + ${name}_ea64) + if(TARGET ${target}) + set_target_properties(${target} ${ARGN}) + set(added TRUE) + endif() + endforeach() + if (NOT added) + message(FATAL_ERROR "No such target: ${name}") + endif() +endfunction() + +function(ida_install) + foreach(item IN LISTS ARGN) + if(TARGET ${item}${_so} AND TARGET ${item}${_so64}) + list(APPEND args ${item}${_so} ${item}${_so64}) + elseif(TARGET ${item}${_so}) + list(APPEND args ${item}${_so}) + elseif(TARGET ${item}${_so64}) + list(APPEND args ${item}${_so64}) + else() + list(APPEND args ${item}) + endif() + endforeach() + install(${args}) +endfunction() diff --git a/README.md b/README.md index 47df958d..82938ddc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # BinExport [![Build Status](https://api.travis-ci.org/google/binexport.svg?branch=master)](https://travis-ci.org/google/binexport) [![Coverity Scan Build Status](https://scan.coverity.com/projects/8977/badge.svg)](https://scan.coverity.com/projects/google-binexport) -Copyright 2011-2017 Google Inc. +Copyright 2011-2018 Google LLC. Disclaimer: This is not an official Google product (experimental or otherwise), it is just code that happens to be owned by Google. @@ -106,12 +106,12 @@ The BinExport plugin registers the IDC functions below. The function names are versioned in order to support side-by-side installation of different versions (i.e. BinDiff's BinExport 8). -| IDC Function name | Exports to | Arguments | -| ---------------------- | -------------------- | -------------------------------------------- | -| BinExport2Sql10 | PostgreSQL database | host, port, database, schema, user, password | -| BinExport2Diff10 | Protocol Buffer | filename | -| BinExport2Text10 | Text file dump | filename | -| BinExport2Statistics10 | Statistics text file | filename | +| IDC Function name | Exports to | Arguments | +| ------------------- | -------------------- | -------------------------------------------- | +| BinExportSql | PostgreSQL database | host, port, database, schema, user, password | +| BinExportDiff | Protocol Buffer | filename | +| BinExportText | Text file dump | filename | +| BinExportStatistics | Statistics text file | filename | BinExport also supports exporting to a database via the `RunPlugin()` IDC function: @@ -136,7 +136,7 @@ The option flags are the same as IDC (listed above). import idaapi idc_lang = idaapi.find_extlang_by_name("idc") idaapi.run_statements( - 'BinExport2Sql10("{}", {}, "{}", "{}", "{}", "{}")'.format( + 'BinExportSql("{}", {}, "{}", "{}", "{}", "{}")'.format( "host", 5432, "database", "public", "user", "pass"), idc_lang) ``` @@ -145,16 +145,16 @@ idaapi.run_statements( BinExport defines the following plugin options, that can be specified on IDA's command line: -| Option | Description | -| -------------------------------- | ----------------------------------------------- | -| `-OExporterHost:` | Database server to connect to | -| `-OExporterPort:` | Port to connect to. PostgreSQL default is 5432. | -| `-OExporterUser:` | User name | -| `-OExporterPassword:` | Password | -| `-OExporterDatabase:` | Database to use | -| `-OExporterSchema:` | Database schema. BinNavi only uses "public". | -| `-OExporterLogFile:` | Log messages to a file | -| `-OExporterAlsoLogToStdErr:TRUE` | If specified, also log to standard error | +| Option | Description | +| --------------------------------- | ----------------------------------------------- | +| `-OBinExportHost:` | Database server to connect to | +| `-OBinExportPort:` | Port to connect to. PostgreSQL default is 5432. | +| `-OBinExportUser:` | User name | +| `-OBinExportPassword:` | Password | +| `-OBinExportDatabase:` | Database to use | +| `-OBinExportSchema:` | Database schema. BinNavi only uses "public". | +| `-OBinExportLogFile:` | Log messages to a file | +| `-OBinExportAlsoLogToStdErr:TRUE` | If specified, also log to standard error | Note that these options must come before any files. @@ -165,7 +165,7 @@ Note that these options must come before any files. As we support exporting into PostgreSQL databases as well as a Protocol Buffer based format, there are quite a few dependencies to satisfy: -* Boost 1.55.0 or higher (a partial copy of 1.61.0 ships in +* Boost 1.61.0 or higher (a partial copy of 1.61.0 ships in `third_party/boost_parts`) * [CMake](https://cmake.org/download/) 3.7.2 or higher * GCC 4.8 or a recent version of Clang on Linux/macOS. On Windows, use the @@ -182,7 +182,8 @@ based format, there are quite a few dependencies to satisfy: #### Prerequisites -The preferred build environment is Ubuntu 14.04 LTS (64-bit Intel). +The preferred build environment is Ubuntu 14.04 LTS (64-bit Intel). Debian +Testing (version 10, "Buster") is also supported. This should install all the necessary packages: @@ -362,7 +363,7 @@ if not exist build_msvc mkdir build_msvc cd build_msvc cmake ../cmake -DIdaSdk_ROOT_DIR=%cd%\..\third_party\idasdk ^ -G "Visual Studio 15 2017 Win64" -cmake --build . --config Release -- /clp:NoSummary;ForceNoAlign /v:minimal +cmake --build . --config Release --install -- /clp:NoSummary;ForceNoAlign /v:minimal ``` For Visual Studio 2015 replace the `-G` argument with `"Visual Studio 14 2015 diff --git a/absl.cmake b/absl.cmake index 960f1120..e74dd099 100644 --- a/absl.cmake +++ b/absl.cmake @@ -1,4 +1,4 @@ -# Copyright 2011-2017 Google Inc. All Rights Reserved. +# Copyright 2011-2018 Google LLC. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -18,4 +18,35 @@ find_path(absl_src_dir HINTS ${ABSL_ROOT_DIR} PATHS ${PROJECT_BINARY_DIR}/absl ) -add_subdirectory(${absl_src_dir}) +add_subdirectory(${absl_src_dir} ${PROJECT_BINARY_DIR}/absl + EXCLUDE_FROM_ALL) + +if(WIN32) + foreach(target absl_base + absl_algorithm + absl_container + absl_debugging + absl_hash + absl_memory + absl_meta + absl_numeric + absl_strings + absl_synchronization + absl_time + absl_utility) + if(MSVC) + target_compile_options(${target} PRIVATE + /wd4005 # macro-redefinition + /wd4068 # unknown pragma + /wd4244 # conversion from 'type1' to 'type2' + /wd4267 # conversion from 'size_t' to 'type2' + /wd4800 # force value to bool 'true' or 'false' (performance warning) + ) + endif() + target_compile_definitions(${target} PRIVATE + /DNOMINMAX + /DWIN32_LEAN_AND_MEAN=1 + /D_CRT_SECURE_NO_WARNINGS + ) + endforeach() +endif() diff --git a/address_references.cc b/address_references.cc index a83a38fd..d8f183c3 100644 --- a/address_references.cc +++ b/address_references.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/address_references.h b/address_references.h index 2074ed79..7dafe6b5 100644 --- a/address_references.h +++ b/address_references.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/hex_codec.h b/architectures.h similarity index 53% rename from hex_codec.h rename to architectures.h index 3259608c..860b5508 100644 --- a/hex_codec.h +++ b/architectures.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,15 +12,22 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef THIRD_PARTY_ZYNAMICS_BINEXPORT_HEX_CODEC_H_ -#define THIRD_PARTY_ZYNAMICS_BINEXPORT_HEX_CODEC_H_ +#ifndef THIRD_PARTY_ZYNAMICS_BINEXPORT_ARCHITECTURES_H_ +#define THIRD_PARTY_ZYNAMICS_BINEXPORT_ARCHITECTURES_H_ -#include "third_party/zynamics/binexport/types.h" +namespace security { +namespace binexport { -// Fast encoding/decoding of big hex strings. -// TODO(cblichmann): Replace this with Abseil's -// BytesToHexString()/HexStringToBytes(). -string EncodeHex(const string& line); -string DecodeHex(const string& line); +enum class Architecture { + kArm, + kAArch64, + kDex, + kMsil, + kX86Arch32, + kX86Arch64, +}; -#endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_HEX_CODEC_H_ +} // namespace binexport +} // namespace security + +#endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_ARCHITECTURES_H_ diff --git a/base_types.cc b/base_types.cc index 315a3007..27d14835 100644 --- a/base_types.cc +++ b/base_types.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -33,12 +33,12 @@ bool SortMemberTypes(const MemberType* lhs, const MemberType* rhs) { // The database sequences need to start with one. // Otherwise the initialization in BinNavi can fail. -unsigned int BaseType::NextTypeId() { - static unsigned int type_id = 1; +uint32 BaseType::NextTypeId() { + static uint32 type_id = 1; return type_id++; } -unsigned int BaseType::GetId() const { +uint32 BaseType::GetId() const { return id_; } @@ -140,8 +140,8 @@ const MemberType* BaseType::ResolveMember(const BaseType* base_type, return IsWithinMember(*cit, offset) ? *cit : nullptr; } -unsigned int MemberType::NextTypeId() { - static unsigned int member_id = 1; +uint32 MemberType::NextTypeId() { + static uint32 member_id = 1; return member_id++; } diff --git a/base_types.h b/base_types.h index 9493658e..d697ad24 100644 --- a/base_types.h +++ b/base_types.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -49,12 +49,12 @@ class BaseType { pointer_(nullptr), category_(kAtomic) {} - typedef std::vector BaseTypes; - typedef std::vector MemberTypes; - typedef std::vector MemberIds; + using BaseTypes = std::vector; + using MemberTypes = std::vector; + using MemberIds = std::vector; // Returns the database id of this base type. - unsigned int GetId() const; + uint32 GetId() const; void SetName(const string& name); const string& GetName() const; @@ -78,7 +78,7 @@ class BaseType { static const MemberType* ResolveMember(const BaseType* base_type, int offset); private: - unsigned int id_; + uint32 id_; // The name of this type. string name_; // The size of this type in bits. @@ -92,7 +92,7 @@ class BaseType { // own the MemberType instances. Instead, the types container owns them. MemberTypes members_; TypeCategory category_; - static unsigned int NextTypeId(); + static uint32 NextTypeId(); }; // Represents an element of a compound type. @@ -110,7 +110,7 @@ struct MemberType { num_elements(DB_NULL_VALUE) {} // The corresponding id in the database. - unsigned int id; + uint32 id; // The name of the member. string name; // The type of this member. @@ -130,7 +130,7 @@ struct MemberType { int num_elements; private: - static unsigned int NextTypeId(); + static uint32 NextTypeId(); }; #endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_BASE_TYPES_H_ diff --git a/basic_block.cc b/basic_block.cc index 4252ee1e..3e9dfd3b 100644 --- a/basic_block.cc +++ b/basic_block.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/basic_block.h b/basic_block.h index be62bb1a..8a1c1fdc 100644 --- a/basic_block.h +++ b/basic_block.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/binexport.cc b/binexport.cc new file mode 100644 index 00000000..c64c36b4 --- /dev/null +++ b/binexport.cc @@ -0,0 +1,65 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +#include "base/logging.h" +#include "third_party/zynamics/binexport/binexport.h" + +namespace security { +namespace binexport { + +Address GetInstructionAddress(const BinExport2& proto, int index) { + // Either the instruction has an address stored directly or we keep iterating + // previous instructions until we find one that does, adding the correct + // offset. This assumes that there will always be a previous instruction with + // an absolute address. + const BinExport2::Instruction* instruction = &proto.instruction(index); + if (instruction->has_address()) { + return instruction->address(); + } + int delta = 0; + for (--index; index >= 0; --index) { + instruction = &proto.instruction(index); + delta += instruction->raw_bytes().size(); + if (instruction->has_address()) { + return instruction->address() + delta; + } + } + LOG(QFATAL) << "Invalid instruction index"; + return 0; // Not reached. +} + +std::vector
GetAllInstructionAddresses(const BinExport2& proto) { + std::vector
result; + if (proto.instruction_size() == 0) { + return result; + } + QCHECK(proto.instruction(0).has_address()); + result.reserve(proto.instruction_size()); + Address address = 0; + Address next_address = 0; + for (const auto& instruction : proto.instruction()) { + if (instruction.has_address()) { + address = instruction.address(); + next_address = address + instruction.raw_bytes().size(); + } else { + address = next_address; + next_address += instruction.raw_bytes().size(); + } + result.push_back(address); + } + return result; +} + +} // namespace binexport +} // namespace security diff --git a/binexport.h b/binexport.h new file mode 100644 index 00000000..cb2e9f02 --- /dev/null +++ b/binexport.h @@ -0,0 +1,50 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +// This file provide a set of commonly used utility functions to work with +// BinExport2 protos. + +#ifndef THIRD_PARTY_ZYNAMICS_BINEXPORT_BINEXPORT_H_ +#define THIRD_PARTY_ZYNAMICS_BINEXPORT_BINEXPORT_H_ + +#include + +#include "third_party/zynamics/binexport/binexport2.pb.h" +#include "third_party/zynamics/binexport/types.h" + +namespace security { + +// This namespace collects functions that work directly with BinExport2 protocol +// buffers, similar to a class with just static methods. +namespace binexport { + +// Returns the address for an instruction. Takes care of instructions without an +// address (that are part of a continuous run of instructions, for example). +// Aborts the process with a fatal error, if no address can be found for the +// instruction. Note that this should note happen with well-formed BinExport2 +// protos. If the specified index is out of bounds, the behavior is undefined. +Address GetInstructionAddress(const BinExport2& proto, int index); + +// Like above, but returns the addresses for all instructions in a BinExport2 +// proto. This function is more efficient than calling GetInstructionAddress() +// repeatedly in a loop. The trade-off is that the returned vector will store +// all addresses, unlike the BinExport2 proto itself which only stores the +// beginning of continuous instruction runs. +std::vector
GetAllInstructionAddresses(const BinExport2& proto); + +} // namespace binexport + +} // namespace security + +#endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_BINEXPORT_H_ diff --git a/binexport2.proto b/binexport2.proto index 8290eaef..c5419957 100644 --- a/binexport2.proto +++ b/binexport2.proto @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/binexport2_writer.cc b/binexport2_writer.cc index 2bbfd629..51d03a98 100644 --- a/binexport2_writer.cc +++ b/binexport2_writer.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -389,10 +389,10 @@ void WriteFlowGraphs(const FlowGraph& flow_graph, BinExport2* proto) { proto_flow_graph->mutable_edge()->Reserve(function.GetEdges().size()); for (const FlowGraphEdge& edge : function.GetEdges()) { BinExport2::FlowGraph::Edge* proto_edge = proto_flow_graph->add_edge(); - const BasicBlock* source = - CHECK_NOTNULL(function.GetBasicBlockForAddress(edge.source)); - const BasicBlock* target = - CHECK_NOTNULL(function.GetBasicBlockForAddress(edge.target)); + const BasicBlock* source = function.GetBasicBlockForAddress(edge.source); + CHECK(source != nullptr); + const BasicBlock* target = function.GetBasicBlockForAddress(edge.target); + CHECK(target != nullptr); proto_edge->set_source_basic_block_index(source->id()); proto_edge->set_target_basic_block_index(target->id()); @@ -535,7 +535,8 @@ void WriteCallGraph(const CallGraph& call_graph, const FlowGraph& flow_graph, proto_call_graph->mutable_edge()->Reserve(call_graph.GetEdges().size()); for (const EdgeInfo& edge : call_graph.GetEdges()) { BinExport2::CallGraph::Edge* proto_edge(proto_call_graph->add_edge()); - const uint64 source_address(CHECK_NOTNULL(edge.function_)->GetEntryPoint()); + CHECK(edge.function_ != nullptr); + const uint64 source_address(edge.function_->GetEntryPoint()); const uint64 target_address(edge.target_); proto_edge->set_source_vertex_index( GetVertexIndex(*proto_call_graph, source_address)); @@ -577,7 +578,7 @@ void WriteStrings( } string content; - // TODO(timkornau): Add support for UTF16 strings. + // TODO(timkornau): Add support for UCS-2 strings. if (reference.kind_ != TYPE_DATA_STRING) { continue; } @@ -649,10 +650,10 @@ void WriteComments( std::make_pair(comment.address_, 0)); QCHECK(instruction != instruction_indices.end()); proto_comment->set_instruction_index(instruction->second); - // TODO(user) Fill these properly once we actually have - // operand/expression comments. - // proto_comment->set_instruction_operand_index(0); - // proto_comment->set_operand_expression_index(0); + // TODO(cblichmann): Fill these properly once we actually have + // operand/expression comments. + // proto_comment->set_instruction_operand_index(0); + // proto_comment->set_operand_expression_index(0); proto_comment->set_string_table_index(new_comment.first->second); } } @@ -754,7 +755,7 @@ util::Status WriteProtoToFile(const string& filename, BinExport2* proto) { if (!proto->SerializeToOstream(&stream)) { return util::Status( - util::error::UNKNOWN, + absl::StatusCode::kUnknown, absl::StrCat("Error serializing data to: '", filename, "'.")); } return util::OkStatus(); diff --git a/binexport2_writer.h b/binexport2_writer.h index 9a176fe0..b2d51059 100644 --- a/binexport2_writer.h +++ b/binexport2_writer.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -23,10 +23,9 @@ class BinExport2Writer : public Writer { public: // Note: This writer expects executable_hash to be hex encoded, not the raw // bytes of the digest. - explicit BinExport2Writer(const string& result_filename, - const string& executable_filename, - const string& executable_hash, - const string& architecture); + BinExport2Writer(const string& result_filename, + const string& executable_filename, + const string& executable_hash, const string& architecture); util::Status Write(const CallGraph& call_graph, const FlowGraph& flow_graph, const Instructions& instructions, diff --git a/binexport_test.cc b/binexport_test.cc new file mode 100644 index 00000000..31bc55f8 --- /dev/null +++ b/binexport_test.cc @@ -0,0 +1,57 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +#include "third_party/zynamics/binexport/binexport.h" + +#include +#include + +using ::testing::Eq; + +namespace security { +namespace binexport { +namespace { + +Address AddInstruction(Address start_address, int8 size, BinExport2* proto) { + auto* instruction = proto->add_instruction(); + if (start_address != 0) { + instruction->set_address(start_address); + } + instruction->mutable_raw_bytes()->resize(size, 'A'); + return start_address + size; +} + +TEST(BinExportTest, TestInstructionAddress) { + BinExport2 proto; + AddInstruction(/*start_address=*/0x10000000, /*size=*/4, &proto); + AddInstruction(/*start_address=*/0, /*size=*/8, &proto); + AddInstruction(/*start_address=*/0, /*size=*/4, &proto); + AddInstruction(/*start_address=*/0, /*size=*/8, &proto); + AddInstruction(/*start_address=*/0x10000100, /*size=*/4, &proto); + AddInstruction(/*start_address=*/0, /*size=*/8, &proto); + AddInstruction(/*start_address=*/0, /*size=*/4, &proto); + AddInstruction(/*start_address=*/0, /*size=*/8, &proto); + AddInstruction(/*start_address=*/0x20000000, /*size=*/4, &proto); + AddInstruction(/*start_address=*/0x20000004, /*size=*/4, &proto); + AddInstruction(/*start_address=*/0x20000008, /*size=*/4, &proto); + + EXPECT_THAT(GetInstructionAddress(proto, 0), Eq(0x10000000)); + EXPECT_THAT(GetInstructionAddress(proto, 3), Eq(0x10000010)); + EXPECT_THAT(GetInstructionAddress(proto, 7), Eq(0x10000110)); + EXPECT_THAT(GetInstructionAddress(proto, 9), Eq(0x20000004)); +} + +} // namespace +} // namespace binexport +} // namespace security diff --git a/call_graph.cc b/call_graph.cc index 4f5ed58d..8cefa3fd 100644 --- a/call_graph.cc +++ b/call_graph.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/call_graph.h b/call_graph.h index 111b7522..e9dd80a5 100644 --- a/call_graph.h +++ b/call_graph.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/cctz.cmake b/cctz.cmake deleted file mode 100644 index e62e4528..00000000 --- a/cctz.cmake +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright 2011-2017 Google Inc. All Rights Reserved. -# -# 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. - -# CCTZ needed by Abseil's time library -find_path(cctz_src_dir - include/cctz/civil_time.h - HINTS ${CCTZ_ROOT_DIR} - PATHS ${PROJECT_BINARY_DIR}/cctz -) -set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) -set(BUILD_TESTING OFF CACHE BOOL "" FORCE) -add_subdirectory(${cctz_src_dir}) diff --git a/chain_writer.cc b/chain_writer.cc deleted file mode 100644 index 2a2f672a..00000000 --- a/chain_writer.cc +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. -// -// 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. - -#include "third_party/zynamics/binexport/chain_writer.h" - -ChainWriter::Writers& ChainWriter::GetWriters() { return writers_; } - -void ChainWriter::Clear() { Writers().swap(writers_); } - -void ChainWriter::AddWriter(std::shared_ptr writer) { - writers_.push_back(writer); -} - -util::Status ChainWriter::Write(const CallGraph& call_graph, - const FlowGraph& flow_graph, - const Instructions& instructions, - const AddressReferences& address_references, - const TypeSystem* type_system, - const AddressSpace& address_space) { - bool success = true; - for (auto& writer : writers_) { - if (!writer->Write(call_graph, flow_graph, instructions, address_references, - type_system, address_space) - .ok()) { - success = false; - } - } - return success ? ::util::OkStatus() - : util::Status(util::error::UNKNOWN, - "At least one of the chained writers failed."); -} diff --git a/chain_writer.h b/chain_writer.h deleted file mode 100644 index 0a0abb97..00000000 --- a/chain_writer.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. -// -// 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. - -#ifndef THIRD_PARTY_ZYNAMICS_BINEXPORT_CHAIN_WRITER_H_ -#define THIRD_PARTY_ZYNAMICS_BINEXPORT_CHAIN_WRITER_H_ - -#include -#include - -#include "third_party/zynamics/binexport/writer.h" - -class ChainWriter : public Writer { - public: - typedef std::vector> Writers; - - void AddWriter(std::shared_ptr writer); - Writers& GetWriters(); - void Clear(); - util::Status Write(const CallGraph& call_graph, const FlowGraph& flow_graph, - const Instructions& instructions, - const AddressReferences& address_references, - const TypeSystem* type_system, - const AddressSpace& address_space) override; - - private: - Writers writers_; -}; - -#endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_CHAIN_WRITER_H_ diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index f5831735..bb610e4c 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2011-2017 Google Inc. All Rights Reserved. +# Copyright 2011-2018 Google LLC. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -21,7 +21,6 @@ list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR} include(ExternalProject) include(absl.cmake) -include(cctz.cmake) include(googletest.cmake) include(openssl.cmake) include(postgresql.cmake) # Depends on openssl @@ -33,7 +32,6 @@ string(REPLACE ";" "^^" CMAKE_PREFIX_PATH_ALT_SEP "${CMAKE_PREFIX_PATH}") ExternalProject_Add(binexport DEPENDS absl - cctz googletest openssl postgresql @@ -44,7 +42,6 @@ ExternalProject_Add(binexport CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH_ALT_SEP}" "-DABSL_ROOT_DIR=${CMAKE_CURRENT_BINARY_DIR}/absl" - "-DCCTZ_ROOT_DIR=${CMAKE_CURRENT_BINARY_DIR}/cctz" "-DGOOGLETEST_ROOT_DIR=${CMAKE_CURRENT_BINARY_DIR}/googletest" "-DIdaSdk_DIR=${IdaSdk_ROOT_DIR}" "-DBUILD_TESTING=OFF" diff --git a/cmake/absl.cmake b/cmake/absl.cmake index b55f75c6..674435e4 100644 --- a/cmake/absl.cmake +++ b/cmake/absl.cmake @@ -1,4 +1,4 @@ -# Copyright 2011-2017 Google Inc. All Rights Reserved. +# Copyright 2011-2018 Google LLC. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ ExternalProject_Add(absl GIT_REPOSITORY https://github.com/abseil/abseil-cpp.git - GIT_TAG 99b92c87365aa3af68f3cc7818efb6126985fe4c + GIT_TAG f21d187b80e3b7f08fb279775ea9c8b48c636030 SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/absl # Just use CMake to clone into directory CONFIGURE_COMMAND "" diff --git a/cmake/cctz.cmake b/cmake/cctz.cmake deleted file mode 100644 index 25155c21..00000000 --- a/cmake/cctz.cmake +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright 2011-2017 Google Inc. All Rights Reserved. -# -# 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. - -ExternalProject_Add(cctz - GIT_REPOSITORY https://github.com/google/cctz.git - GIT_TAG a59b930afc821e5f5a0b868dfee56482075db185 - SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/cctz - # Just use CMake to clone into directory - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" -) diff --git a/cmake/googletest.cmake b/cmake/googletest.cmake index 92c108bf..fb332355 100644 --- a/cmake/googletest.cmake +++ b/cmake/googletest.cmake @@ -1,4 +1,4 @@ -# Copyright 2011-2017 Google Inc. All Rights Reserved. +# Copyright 2011-2018 Google LLC. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,7 +14,8 @@ ExternalProject_Add(googletest GIT_REPOSITORY https://github.com/google/googletest.git - GIT_TAG release-1.8.0 + # Snapshot from 2018-01-29, includes VS 2017 fixes + GIT_TAG 798cc4a78a51677a50be0faa1a530197ada435a2 SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/googletest # Just use CMake to clone into directory CONFIGURE_COMMAND "" diff --git a/cmake/openssl.cmake b/cmake/openssl.cmake index f3d2bec3..a3cd0c36 100644 --- a/cmake/openssl.cmake +++ b/cmake/openssl.cmake @@ -1,4 +1,4 @@ -# Copyright 2011-2017 Google Inc. All Rights Reserved. +# Copyright 2011-2018 Google LLC. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/cmake/postgresql.cmake b/cmake/postgresql.cmake index b403b568..895481ce 100644 --- a/cmake/postgresql.cmake +++ b/cmake/postgresql.cmake @@ -1,4 +1,4 @@ -# Copyright 2011-2017 Google Inc. All Rights Reserved. +# Copyright 2011-2018 Google LLC. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -85,8 +85,8 @@ endif() ExternalProject_Add(postgresql DEPENDS openssl - URL https://ftp.postgresql.org/pub/source/v9.6.1/postgresql-9.6.1.tar.bz2 - URL_HASH SHA256=e5101e0a49141fc12a7018c6dad594694d3a3325f5ab71e93e0e51bd94e51fcd + URL https://ftp.postgresql.org/pub/source/v9.6.6/postgresql-9.6.6.tar.gz + URL_HASH SHA256=53e1cd5fdff5f45415ae9d5b645177275265a3e800c86becbb94ce183a3a5061 PREFIX ${postgresql_dir} CONFIGURE_COMMAND ${POSTGRESQL_CONFIGURE_COMMAND} BUILD_COMMAND ${POSTGRESQL_BUILD_COMMAND} diff --git a/cmake/protobuf.cmake b/cmake/protobuf.cmake index 8aa33624..fbe4bb03 100644 --- a/cmake/protobuf.cmake +++ b/cmake/protobuf.cmake @@ -1,4 +1,4 @@ -# Copyright 2011-2017 Google Inc. All Rights Reserved. +# Copyright 2011-2018 Google LLC. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -25,12 +25,13 @@ ExternalProject_Add(protobuf -Dprotobuf_BUILD_SHARED_LIBS=OFF -Dprotobuf_WITH_ZLIB=OFF ) +set(_pb_stubs_src "/src/google/protobuf/stubs") +set(_pb_stubs_inst "/include/google/protobuf/stubs") ExternalProject_Add_Step(protobuf copy-stub-headers COMMAND - "${CMAKE_COMMAND}" -E copy - "/src/google/protobuf/stubs/stringprintf.h" - "/include/google/protobuf/stubs/" && - "${CMAKE_COMMAND}" -E copy - "/src/google/protobuf/stubs/strutil.h" - "/include/google/protobuf/stubs/" DEPENDEES install) + "${CMAKE_COMMAND}" -E copy "${_pb_stubs_src}/status_macros.h" "${_pb_stubs_inst}/" && + "${CMAKE_COMMAND}" -E copy "${_pb_stubs_src}/statusor.h" "${_pb_stubs_inst}/" && + "${CMAKE_COMMAND}" -E copy "${_pb_stubs_src}/stringprintf.h" "${_pb_stubs_inst}/" && + "${CMAKE_COMMAND}" -E copy "${_pb_stubs_src}/strutil.h" "${_pb_stubs_inst}/" + DEPENDEES install) ExternalProject_Get_Property(protobuf INSTALL_DIR) list(APPEND CMAKE_PREFIX_PATH ${INSTALL_DIR}) diff --git a/comment.cc b/comment.cc index 1a6ba493..95f2fcb9 100644 --- a/comment.cc +++ b/comment.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -14,10 +14,9 @@ #include "third_party/zynamics/binexport/comment.h" -#include - #include "base/logging.h" #include "third_party/absl/strings/str_cat.h" +#include "third_party/zynamics/binexport/util/format.h" bool SortComments(const Comment& lhs, const Comment& rhs) { if (lhs.address_ == rhs.address_) { @@ -37,8 +36,9 @@ Comment::Comment(Address address, size_t operand_num, const string* comment, repeatable_(repeatable), type_(type) { if (comment && comment->size() >= 4096) { - LOG(INFO) << "Excessively long comment at " - << absl::StrCat(absl::Hex(address, absl::kZeroPad8)) << ", " - << comment->size() << " bytes: " << *comment; + LOG(INFO) << absl::StrCat("Excessively long comment at ", + security::binexport::FormatAddress(address), ", ", + comment->size(), ": ", comment->substr(0, 128), + "..."); } } diff --git a/comment.h b/comment.h index 0a479033..0ae809c7 100644 --- a/comment.h +++ b/comment.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/copts.cmake b/copts.cmake index b90a78ef..9cb928cc 100644 --- a/copts.cmake +++ b/copts.cmake @@ -1,4 +1,4 @@ -# Copyright 2011-2017 Google Inc. All Rights Reserved. +# Copyright 2011-2018 Google LLC. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -12,6 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +set(CMAKE_CXX_STANDARD_REQUIRED TRUE) +set(CMAKE_CXX_STANDARD 11) + set(CMAKE_SKIP_BUILD_RPATH TRUE) set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) @@ -42,7 +45,6 @@ endif() if(UNIX) add_compile_options(-Wno-deprecated) - list(APPEND CMAKE_CXX_FLAGS --std=c++11) elseif(WIN32) add_definitions( # Do not define min/max macros which collide with std::min()/std::max() diff --git a/database_writer.cc b/database_writer.cc index 7f22f353..a89327ac 100644 --- a/database_writer.cc +++ b/database_writer.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -21,13 +21,13 @@ #include #include "base/logging.h" +#include "third_party/absl/strings/escaping.h" #include "third_party/absl/strings/str_cat.h" #include "third_party/absl/strings/str_replace.h" #include "third_party/absl/strings/str_split.h" #include "third_party/zynamics/binexport/base_types.h" #include "third_party/zynamics/binexport/call_graph.h" #include "third_party/zynamics/binexport/flow_graph.h" -#include "third_party/zynamics/binexport/hex_codec.h" #include "third_party/zynamics/binexport/initialize_constraints_postgresql_sql.h" #include "third_party/zynamics/binexport/initialize_indices_postgresql_sql.h" #include "third_party/zynamics/binexport/initialize_tables_postgresql_sql.h" @@ -38,13 +38,6 @@ namespace { -string EncodeHash(const string& hash) { - if (hash.size() <= 20) { - return EncodeHex(hash); - } - return hash; -} - // Creates a string representation for the base type id of the corresponding // stack frame of the given function. Returns "null" if no such stack frame // exists. @@ -232,8 +225,8 @@ void DatabaseWriter::PrepareDatabase(const string& md5, const string& sha1, "$5::varchar, $6::int, $7::varchar, $8::varchar, '', NOW())", Parameters() << static_cast(module_id_) << module_name << architecture << static_cast(base_address) - << program_version_ << static_cast(kDbVersion) - << EncodeHash(md5) << EncodeHash(sha1)); + << program_version_ << static_cast(kDbVersion) << md5 + << sha1); } void DatabaseWriter::InsertAddressComments(const CallGraph& call_graph) { @@ -356,7 +349,7 @@ void DatabaseWriter::InsertFlowGraphs(const CallGraph& call_graph, instruction_query << "(" << static_cast(instruction.GetAddress()) << "," << database_.EscapeLiteral(mnemonic) << ",decode('" - << EncodeHex(instruction.GetBytes()) << "','hex')" + << absl::BytesToHexString(instruction.GetBytes()) << "','hex')" << ")," << kFlushQuery; int operand_sequence = 0; diff --git a/database_writer.h b/database_writer.h index 72c21d3a..9ee03bad 100644 --- a/database_writer.h +++ b/database_writer.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -25,14 +25,14 @@ class CallGraph; class DatabaseWriter : public Writer { public: - typedef enum { + enum InternalStatement { INIT_TABLES, INIT_CONSTRAINTS, INIT_INDICES, MAINTENANCE, - } InternalStatement; + }; - typedef std::map AddressSpaceIds; + using AddressSpaceIds = std::map; DatabaseWriter(const string& schema, const string& module_name, int module_id, const string& md5, const string& sha1, diff --git a/dump_writer.cc b/dump_writer.cc index b7b9f187..9da33eb7 100644 --- a/dump_writer.cc +++ b/dump_writer.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/dump_writer.h b/dump_writer.h index 251ce182..1bbc990e 100644 --- a/dump_writer.h +++ b/dump_writer.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/edge.cc b/edge.cc index 12e96099..47327293 100644 --- a/edge.cc +++ b/edge.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/edge.h b/edge.h index baa28838..05c67d72 100644 --- a/edge.h +++ b/edge.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/entry_point.cc b/entry_point.cc index 195cbbeb..6a5e91d0 100644 --- a/entry_point.cc +++ b/entry_point.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/entry_point.h b/entry_point.h index 54e22e08..39bda3cd 100644 --- a/entry_point.h +++ b/entry_point.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/expression.cc b/expression.cc index 7f3ddad0..478fa217 100644 --- a/expression.cc +++ b/expression.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/expression.h b/expression.h index 84d5a29d..9d9fc5fe 100644 --- a/expression.h +++ b/expression.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -22,6 +22,8 @@ #include #include +#include "third_party/absl/strings/str_cat.h" +#include "third_party/absl/strings/string_view.h" #include "third_party/zynamics/binexport/types.h" #pragma pack(push, 1) @@ -69,6 +71,73 @@ class Expression { static void EmptyCache(); static const ExpressionCache& GetExpressions(); + class Builder { + public: + explicit Builder(Expression::Type type) : type_(type) {} + + Builder& AtPosition(uint16 position) { + position_ = position; + return *this; + } + + Builder& SetRelocatable(bool relocatable) { + relocatable_ = relocatable; + return *this; + } + + Builder& WithParent(Expression* parent) { + parent_ = parent; + return *this; + } + + static Builder Operator(absl::string_view symbol) { + return Builder(Expression::TYPE_OPERATOR).SetSymbol(symbol); + } + + static Builder Register(absl::string_view symbol) { + return Builder(Expression::TYPE_REGISTER).SetSymbol(symbol); + } + + static Builder ImmediateInt(uint64 immediate) { + return Builder(Expression::TYPE_IMMEDIATE_INT).SetImmediate(immediate); + } + + static Builder SizePrefix(absl::string_view size_prefix) { + return Builder(Expression::TYPE_SIZEPREFIX).SetSymbol(size_prefix); + } + + static Builder SizePrefix(int size_in_bits) { + return SizePrefix(absl::StrCat("b", size_in_bits / 8)); + } + + static Builder Dereference() { + return Builder(Expression::TYPE_DEREFERENCE).SetSymbol("["); + } + + Expression* Build() { + return Expression::Create(parent_, std::move(symbol_), immediate_, type_, + position_, relocatable_); + } + + private: + Builder SetSymbol(absl::string_view symbol) { + symbol_ = string(symbol); + return *this; + } + + Builder SetImmediate(uint64 immediate) { + immediate_ = immediate; + return *this; + } + + string symbol_ = ""; + uint64 immediate_ = 0; + uint16 position_ = 0; + bool relocatable_ = false; + Expression::Type type_; + Expression* parent_ = nullptr; + }; + private: // The constructor is private for two reasons: // - We want to make sure expressions can only be created on the heap. diff --git a/flow_analyzer.cc b/flow_analyzer.cc index 2e7d8370..cfc2face 100644 --- a/flow_analyzer.cc +++ b/flow_analyzer.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/flow_analyzer.h b/flow_analyzer.h index d479de6b..3134ab50 100644 --- a/flow_analyzer.h +++ b/flow_analyzer.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/flow_graph.cc b/flow_graph.cc index 5f33c55d..6d6f6fde 100644 --- a/flow_graph.cc +++ b/flow_graph.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -75,11 +75,9 @@ void FlowGraph::MarkOrphanInstructions(Instructions* instructions) const { LOG(WARNING) << absl::StrCat( absl::Hex(instruction.GetAddress(), absl::kZeroPad8), " is reachable from function ", - absl::StrCat( - absl::Hex(function.second->GetEntryPoint(), absl::kZeroPad8)), + absl::Hex(function.second->GetEntryPoint(), absl::kZeroPad8), " basic block ", - absl::StrCat( - absl::Hex(basic_block->GetEntryPoint(), absl::kZeroPad8)), + absl::Hex(basic_block->GetEntryPoint(), absl::kZeroPad8), " but invalid!"); continue; } @@ -360,7 +358,7 @@ void FlowGraph::CreateBasicBlocks(Instructions* instructions, } // Add the new synthetic edges. - std::copy(new_edges.begin(), new_edges.end(), std::back_inserter(edges_)); + edges_.insert(edges_.end(), new_edges.begin(), new_edges.end()); std::sort(edges_.begin(), edges_.end()); } @@ -481,12 +479,14 @@ void FlowGraph::FinalizeFunctions(CallGraph* call_graph) { [](const FlowGraphEdge& edge, Address address) { return edge.source < address; }); + uint64 dropped_edges = 0; for (; edge != edges_.end() && edge->source == source_address; ++edge) { if (!BasicBlock::Find(edge->target)) { - LOG(INFO) << absl::StrCat( + DLOG(INFO) << absl::StrCat( "Dropping edge ", absl::Hex(edge->source, absl::kZeroPad8), " -> ", absl::Hex(edge->target, absl::kZeroPad8), " because the target address is invalid."); + ++dropped_edges; continue; } if (done_edges.insert(*edge).second) { @@ -494,6 +494,10 @@ void FlowGraph::FinalizeFunctions(CallGraph* call_graph) { address_stack.push(edge->target); } } + LOG_IF(INFO, dropped_edges > 0) << absl::StrCat( + "Dropped ", dropped_edges, + " edges because the target address is invalid (current basic block ", + absl::Hex(address, absl::kZeroPad8), ")."); } if (function_basic_blocks.size() >= kMaxFunctionBasicBlocks || function->GetEdges().size() >= kMaxFunctionEdges || diff --git a/flow_graph.h b/flow_graph.h index cb6dd492..ec0abc4d 100644 --- a/flow_graph.h +++ b/flow_graph.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/function.cc b/function.cc index 2c2ca509..19cd4dd7 100644 --- a/function.cc +++ b/function.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ #include // NOLINT #include // NOLINT +#include // NOLINT #include // NOLINT #include "base/logging.h" @@ -243,15 +244,14 @@ void Function::FixEdges() { void Function::GetBackEdges( std::vector* back_edges) const { - typedef boost::compressed_sparse_row_graph< + using LocalGraph = boost::compressed_sparse_row_graph< boost::bidirectionalS, boost::property, - boost::property> LocalGraph; - typedef boost::graph_traits::vertex_descriptor LocalVertex; - typedef std::pair LocalEdge; - typedef std::vector LocalEdges; + boost::property>; + using LocalVertex = boost::graph_traits::vertex_descriptor; + using LocalEdge = std::pair; back_edges->clear(); - LocalEdges local_edges; + std::vector local_edges; local_edges.reserve(edges_.size()); for (const auto& edge : edges_) { auto source_index = GetBasicBlockIndexForAddress(edge.source); @@ -262,15 +262,16 @@ void Function::GetBackEdges( basic_blocks_[target_index]->GetEntryPoint() == edge.target); local_edges.emplace_back(source_index, target_index); } - // TODO(user) Use edges_are_sorted (they are, after all, already sorted - // by source index) + // TODO(cblichmann): Use edges_are_sorted (they are, after all, already sorted + // by source index). const LocalGraph graph(boost::edges_are_unsorted_multi_pass, local_edges.begin(), local_edges.end(), basic_blocks_.size()); std::vector dominator_nodes( num_vertices(graph), boost::graph_traits::null_vertex()); boost::lengauer_tarjan_dominator_tree( - graph, + // Need boost::filtered_graph<> to satisfy Boost.Graph concept. + boost::make_filtered_graph(graph, boost::keep_all()), boost::vertex(GetBasicBlockIndexForAddress(GetEntryPoint()), graph), make_iterator_property_map(dominator_nodes.begin(), get(boost::vertex_index, graph))); diff --git a/function.h b/function.h index 53e8a265..8c5b57e1 100644 --- a/function.h +++ b/function.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/googletest.cmake b/googletest.cmake index a59aeefa..0d40ec77 100644 --- a/googletest.cmake +++ b/googletest.cmake @@ -1,4 +1,4 @@ -# Copyright 2011-2017 Google Inc. All Rights Reserved. +# Copyright 2011-2018 Google LLC. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -19,4 +19,6 @@ find_path(googletest_src_dir PATHS ${PROJECT_BINARY_DIR}/googletest ) set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) -add_subdirectory(${googletest_src_dir} EXCLUDE_FROM_ALL) +message("${googletest_src_dir}") +add_subdirectory(${googletest_src_dir} ${PROJECT_BINARY_DIR}/googletest + EXCLUDE_FROM_ALL) diff --git a/hash.cc b/hash.cc index 9fbcd0d5..a2570789 100644 --- a/hash.cc +++ b/hash.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/hash.h b/hash.h index d58b65d7..df835853 100644 --- a/hash.h +++ b/hash.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/hex_codec.cc b/hex_codec.cc deleted file mode 100644 index 36f995d9..00000000 --- a/hex_codec.cc +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. -// -// 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. - -#include "third_party/zynamics/binexport/hex_codec.h" - -#include - -string EncodeHex(const string& line) { - static const char kLookup[] = "0123456789ABCDEF"; - - if (line.empty()) { - return string(); - } - string result; - result.resize(line.size() * 2); - for (int i = 0, j = 0, end = line.size(); i < end; ++i) { - auto c = line[i]; - result[j++] = kLookup[(c & 0xF0) >> 4]; - result[j++] = kLookup[c & 0x0F]; - } - return result; -} - -string DecodeHex(const string& line) { - static const uint8 kLookup[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, // 0123456789 - 0, 0, 0, 0, 0, 0, 0, // :;<=>?@ (gap) - 10, 11, 12, 13, 14, 15, // ABCDEF - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // GHIJKLMNOPQRS (gap) - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // TUVWXYZ[/]^_` (gap) - 10, 11, 12, 13, 14, 15 // abcdef - }; - - if (line.empty()) { - return string(); - } - string result; - result.resize(line.size() >> 1); - for (int i = 0, j = 0, end = line.size(); i < end;) { - auto& c = result[j++]; - c = kLookup[line[i++]] << 4; - c |= kLookup[line[i++]]; - } - return result; -} diff --git a/ida/arm.cc b/ida/arm.cc index 3ab8be25..a3238959 100644 --- a/ida/arm.cc +++ b/ida/arm.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -17,13 +17,13 @@ #include #include -#include "third_party/zynamics/binexport/ida/begin_idasdk.h" // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include "third_party/zynamics/binexport/ida/end_idasdk.h" // NOLINT +#include "third_party/zynamics/binexport/ida/begin_idasdk.inc" // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include "third_party/zynamics/binexport/ida/end_idasdk.inc" // NOLINT #include "base/logging.h" #include "third_party/absl/strings/str_cat.h" @@ -832,7 +832,7 @@ Instruction ParseInstructionIdaArm(const insn_t& instruction, if (instruction.itype == ARM_vcvt || instruction.itype == ARM_vcvtr || instruction.itype == ARM_vcvtb || instruction.itype == ARM_vcvtt) { - switch (neon_datatype_t(instruction.Op1.specflag1)) { + switch (neon_datatype_t(instruction.ops[0].specflag1)) { case 0x0: break; // DT_NONE = 0, case 0x1: diff --git a/ida/arm.h b/ida/arm.h index 0c7a54a3..2ed7400d 100644 --- a/ida/arm.h +++ b/ida/arm.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/ida/begin_idasdk.h b/ida/begin_idasdk.inc similarity index 62% rename from ida/begin_idasdk.h rename to ida/begin_idasdk.inc index 9ba803df..5f84bfb2 100644 --- a/ida/begin_idasdk.h +++ b/ida/begin_idasdk.inc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -13,11 +13,14 @@ // limitations under the License. // Allow to safely include IDA's pro.h. In order to work, any IDA Pro header -// must be included between includes of begin_idasdk.h (this file) and -// end_idasdk.h (which undoes the preprocessor changes from this file). - -#ifndef THIRD_PARTY_ZYNAMICS_BINEXPORT_IDA_IDASDK_BEGIN_H_ -#define THIRD_PARTY_ZYNAMICS_BINEXPORT_IDA_IDASDK_BEGIN_H_ +// must be included between includes of begin_idasdk.inc (this file) and +// end_idasdk.inc (which undoes the preprocessor changes from this file). +// +// Note: There is no header guard in this file, we rely on the one in IDA's +// pro.h to provide the basic types IDA plugins need. Other than that, +// we do want to support the case where IDA plugin code includes other +// headers that need to include IDA headers. Using include guards here +// would prevent that. // Alias IDA-specific integer types which conflict with the ones defined by // Protocol Buffers/Abseil. @@ -33,6 +36,5 @@ #define int128 ida_int128 #define uint128 ida_uint128 +// Now include the problematic header, end_idasdk.inc will clean up again. #include - -#endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_IDA_IDASDK_BEGIN_H_ diff --git a/ida/dalvik.cc b/ida/dalvik.cc index 85264e09..59b8cbb3 100644 --- a/ida/dalvik.cc +++ b/ida/dalvik.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -18,16 +18,16 @@ #include #include -#include "third_party/zynamics/binexport/ida/begin_idasdk.h" // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include "third_party/zynamics/binexport/ida/end_idasdk.h" // NOLINT +#include "third_party/zynamics/binexport/ida/begin_idasdk.inc" // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include "third_party/zynamics/binexport/ida/end_idasdk.inc" // NOLINT #include "base/logging.h" #include "third_party/absl/strings/str_cat.h" diff --git a/ida/dalvik.h b/ida/dalvik.h index 8d7052a3..5f858b0b 100644 --- a/ida/dalvik.h +++ b/ida/dalvik.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/ida/digest.cc b/ida/digest.cc index 852be535..1c76164d 100644 --- a/ida/digest.cc +++ b/ida/digest.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -14,21 +14,33 @@ #include "third_party/zynamics/binexport/ida/digest.h" -#include -#include +#include "third_party/zynamics/binexport/ida/begin_idasdk.inc" // NOLINT +#include // NOLINT +#include "third_party/zynamics/binexport/ida/end_idasdk.inc" // NOLINT #include "base/integral_types.h" +#include "third_party/absl/strings/ascii.h" +#include "third_party/absl/strings/escaping.h" +#include "util/task/status.h" -string Md5(const string& data) { - string digest(MD5_DIGEST_LENGTH, '\0'); - MD5(reinterpret_cast(data.data()), data.size(), - reinterpret_cast(&digest[0])); - return digest; +util::StatusOr GetInputFileSha256() { + constexpr int kBinarySha256Length = 32; + unsigned char hash[kBinarySha256Length]; + if (!retrieve_input_file_sha256(hash)) { + return util::Status{absl::StatusCode::kInternal, + "Failed to load SHA256 hash of input file"}; + } + return absl::AsciiStrToLower(absl::BytesToHexString(absl::string_view( + reinterpret_cast(hash), kBinarySha256Length))); } -string Sha1(const string& data) { - string digest(SHA_DIGEST_LENGTH, '\0'); - SHA1(reinterpret_cast(data.data()), data.size(), - reinterpret_cast(&digest[0])); - return digest; +util::StatusOr GetInputFileMd5() { + constexpr int kBinaryMd5Length = 16; + unsigned char hash[kBinaryMd5Length]; + if (!retrieve_input_file_md5(hash)) { + return util::Status{absl::StatusCode::kInternal, + "Failed to load SHA256 hash of input file"}; + } + return absl::AsciiStrToLower(absl::BytesToHexString(absl::string_view( + reinterpret_cast(hash), kBinaryMd5Length))); } diff --git a/ida/digest.h b/ida/digest.h index bbe3a7ad..e1216701 100644 --- a/ida/digest.h +++ b/ida/digest.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -16,8 +16,16 @@ #define THIRD_PARTY_ZYNAMICS_BINEXPORT_IDA_DIGEST_H_ #include "third_party/zynamics/binexport/types.h" +#include "util/task/statusor.h" + +// Returns the lowercase hex string of the SHA256 hash of the original input +// file for the current IDB. +util::StatusOr GetInputFileSha256(); + +// Returns the MD5 hash of the original input file for the current IDB. Like +// GetInputFileSha256(), the result is a lowercase hex string. This function +// exists to support the legacy MD5 field in the BinExport database schema. +util::StatusOr GetInputFileMd5(); -string Md5(const string& data); -string Sha1(const string& data); #endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_IDA_DIGEST_H_ diff --git a/ida/end_idasdk.h b/ida/end_idasdk.inc similarity index 66% rename from ida/end_idasdk.h rename to ida/end_idasdk.inc index 39ea3010..8ce14de0 100644 --- a/ida/end_idasdk.h +++ b/ida/end_idasdk.inc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,11 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Forward header to safely include IDA's pro.h. In order to work, this must be -// included before including any IDA Pro headers. - -#ifndef THIRD_PARTY_ZYNAMICS_BINEXPORT_IDA_IDASDK_END_H_ -#define THIRD_PARTY_ZYNAMICS_BINEXPORT_IDA_IDASDK_END_H_ +// Companion header to begin_idasdk.inc. In order to work, this must be +// included after including any IDA Pro headers. #undef uint128 #undef int128 @@ -30,4 +27,13 @@ #undef sint8 #undef int8 -#endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_IDA_IDASDK_END_H_ +// Undefine the operand shortcuts Op1-Op8, as those pollute the global +// namespace. +#undef Op8 +#undef Op7 +#undef Op6 +#undef Op5 +#undef Op4 +#undef Op3 +#undef Op2 +#undef Op1 diff --git a/ida/generic.cc b/ida/generic.cc index 19cde59a..f3ded355 100644 --- a/ida/generic.cc +++ b/ida/generic.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -16,11 +16,11 @@ #include -#include "third_party/zynamics/binexport/ida/begin_idasdk.h" // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include "third_party/zynamics/binexport/ida/end_idasdk.h" // NOLINT +#include "third_party/zynamics/binexport/ida/begin_idasdk.inc" // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include "third_party/zynamics/binexport/ida/end_idasdk.inc" // NOLINT #include "third_party/absl/strings/ascii.h" #include "third_party/absl/strings/string_view.h" diff --git a/ida/generic.h b/ida/generic.h index 41de9ec5..8da7e76d 100644 --- a/ida/generic.h +++ b/ida/generic.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/ida/log.cc b/ida/log.cc index f342c0f3..3b2692f7 100644 --- a/ida/log.cc +++ b/ida/log.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -19,11 +19,13 @@ #include #include #include +#include +#include #include // NOLINT -#include "third_party/zynamics/binexport/ida/begin_idasdk.h" // NOLINT -#include // NOLINT -#include "third_party/zynamics/binexport/ida/end_idasdk.h" // NOLINT +#include "third_party/zynamics/binexport/ida/begin_idasdk.inc" // NOLINT +#include // NOLINT +#include "third_party/zynamics/binexport/ida/end_idasdk.inc" // NOLINT #include "base/logging.h" #include "third_party/absl/strings/str_cat.h" @@ -34,7 +36,7 @@ namespace { static LogHandler* g_old_log_handler = nullptr; static FILE* g_log_file = nullptr; -static LoggingOptions g_logging_options; +static auto* g_logging_options = new LoggingOptions{}; class IdaExecutor : public exec_request_t { public: @@ -67,7 +69,7 @@ const char* const LogLevelToCStr(LogLevel level) { // Logs a single log message. Should be executed on the IDA main thread. void LogLine(LogLevel level, const char* filename, int line, const string& message) { - if (g_logging_options.alsologtostderr() || g_log_file != nullptr) { + if (g_logging_options->alsologtostderr || g_log_file != nullptr) { // Filename always has Unix path separators, so this works on Windows, too. const char* basename = strrchr(filename, '/'); if (*basename != '\0') { @@ -75,16 +77,18 @@ void LogLine(LogLevel level, const char* filename, int line, } // Prepare log line - char thread_id[8]{}; - std::snprintf(thread_id, sizeof(thread_id), "%7u", - std::this_thread::get_id()); - string formatted = - absl::StrCat(LogLevelToCStr(level), - absl::FormatTime("%m%d %T" /* "0125 16:09:42.992535" */, - absl::Now(), absl::LocalTimeZone()), - thread_id, "[", basename, ":", line, "] ", message); - - if (g_logging_options.alsologtostderr()) { + std::ostringstream thread_id; + enum { kThreadIdWidth = 7 }; + thread_id << std::setw(kThreadIdWidth) << std::setfill(' ') + << std::this_thread::get_id(); + string formatted = absl::StrCat( + LogLevelToCStr(level), + absl::FormatTime("%m%d %R:%E6S" /* "0125 16:09:42.992535" */, + absl::Now(), absl::LocalTimeZone()), + " ", thread_id.str().substr(0, kThreadIdWidth), " ", basename, ":", + line, "] ", message, "\n"); + + if (g_logging_options->alsologtostderr) { fputs(formatted.c_str(), stderr); fflush(stderr); } @@ -109,9 +113,9 @@ void IdaLogHandler(LogLevel level, const char* filename, int line, bool InitLogging(const LoggingOptions& options) { ShutdownLogging(); - g_logging_options = options; - if (!g_logging_options.log_filename().empty()) { - const char* log_filename = g_logging_options.log_filename().c_str(); + *g_logging_options = options; + if (!g_logging_options->log_filename.empty()) { + const char* log_filename = g_logging_options->log_filename.c_str(); g_log_file = fopen(log_filename, "a"); if (!g_log_file) { msg("Could not open log file: \"%s\": %s\n", log_filename, diff --git a/ida/log.h b/ida/log.h index 305aa152..21e9dfa7 100644 --- a/ida/log.h +++ b/ida/log.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -17,23 +17,19 @@ #include "third_party/zynamics/binexport/types.h" -class LoggingOptions { - public: - LoggingOptions() = default; - - void set_alsologtostderr(bool value) { alsologtostderr_ = value; } - - bool alsologtostderr() const { return alsologtostderr_; } - - void set_log_filename(const string& filename) { - log_filename_ = filename; +struct LoggingOptions { + LoggingOptions& set_alsologtostderr(bool value) { + alsologtostderr = value; + return *this; } - const string& log_filename() const { return log_filename_; } + LoggingOptions& set_log_filename(const string& filename) { + log_filename = filename; + return *this; + } - private: - bool alsologtostderr_ = false; - string log_filename_; + bool alsologtostderr = false; + string log_filename; }; // Initializes logging. Not thread safe. diff --git a/ida/main_plugin.cc b/ida/main_plugin.cc index 1c793f14..74727494 100644 --- a/ida/main_plugin.cc +++ b/ida/main_plugin.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,78 +12,62 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "third_party/zynamics/binexport/ida/begin_idasdk.h" // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include "third_party/zynamics/binexport/ida/end_idasdk.h" // NOLINT +#include "third_party/zynamics/binexport/ida/begin_idasdk.inc" // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include "third_party/zynamics/binexport/ida/end_idasdk.inc" // NOLINT #include "base/logging.h" +#include "third_party/absl/base/attributes.h" #include "third_party/absl/strings/ascii.h" +#include "third_party/absl/strings/escaping.h" #include "third_party/absl/strings/numbers.h" #include "third_party/absl/strings/str_cat.h" #include "third_party/absl/time/time.h" #include "third_party/zynamics/binexport/binexport2_writer.h" #include "third_party/zynamics/binexport/call_graph.h" -#include "third_party/zynamics/binexport/chain_writer.h" #include "third_party/zynamics/binexport/database_writer.h" #include "third_party/zynamics/binexport/dump_writer.h" #include "third_party/zynamics/binexport/entry_point.h" -#include "third_party/zynamics/binexport/filesystem_util.h" +#include "third_party/zynamics/binexport/util/filesystem.h" #include "third_party/zynamics/binexport/flow_analyzer.h" #include "third_party/zynamics/binexport/flow_graph.h" -#include "third_party/zynamics/binexport/hex_codec.h" +#include "third_party/zynamics/binexport/util/format.h" #include "third_party/zynamics/binexport/ida/digest.h" #include "third_party/zynamics/binexport/ida/log.h" #include "third_party/zynamics/binexport/ida/names.h" #include "third_party/zynamics/binexport/ida/ui.h" #include "third_party/zynamics/binexport/instruction.h" #include "third_party/zynamics/binexport/statistics_writer.h" -#include "third_party/zynamics/binexport/timer.h" +#include "third_party/zynamics/binexport/util/timer.h" #include "third_party/zynamics/binexport/version.h" #include "third_party/zynamics/binexport/virtual_memory.h" +namespace security { +namespace binexport { namespace { string GetArgument(const char* name) { const char* option = - get_plugin_options(absl::StrCat("Exporter", name).c_str()); + get_plugin_options(absl::StrCat("BinExport", name).c_str()); + if (option == nullptr) { + // Try old name as well. + get_plugin_options(absl::StrCat("Exporter", name).c_str()); + } return option ? option : ""; } -static const char kBinExportSql[] = "BinExport2Sql" BINEXPORT_RELEASE; -static const char kBinExportDiff[] = "BinExport2Diff" BINEXPORT_RELEASE; -static const char kBinExportText[] = "BinExport2Text" BINEXPORT_RELEASE; -static const char kBinExportStatistics[] = - "BinExport2Statistics" BINEXPORT_RELEASE; -static const char kName[] = "BinExport " BINEXPORT_RELEASE; -static const char kCopyright[] = - "(c)2004-2011 zynamics GmbH, (c)2011-2017 Google Inc."; -static const char kComment[] = - "Export to SQL RE-DB, BinDiff binary or text dump"; -static const char kHotKey[] = ""; - -enum ExportMode { kDatabase = 1, kBinary = 2, kText = 3, kStatistics = 4 }; - -string GetDataForHash() { - string data; - for (segment_t* segment = get_first_seg(); - segment != 0 && data.size() < (32 << 20 /* 32 MiB */); - segment = get_next_seg(segment->start_ea)) { - // Truncate segments longer than 1MB so we don't produce too long a string. - for (ea_t address = segment->start_ea; - address < std::min(segment->end_ea, segment->start_ea + (1 << 20)); - ++address) { - if (get_flags(address)) { - // check whether address is loaded - data += get_byte(address); - } - } - } - return data; -} +constexpr char kName[] = "BinExport " BINEXPORT_RELEASE; +constexpr char kCopyright[] = + "(c)2004-2011 zynamics GmbH, (c)2011-2018 Google LLC."; +constexpr char kComment[] = "Export to SQL RE-DB, BinDiff binary or text dump"; +constexpr char kHotKey[] = ""; + +enum class ExportMode { kSql = 1, kBinary = 2, kText = 3, kStatistics = 4 }; string GetDefaultName(ExportMode mode) { string new_extension; @@ -97,14 +81,14 @@ string GetDefaultName(ExportMode mode) { case ExportMode::kStatistics: new_extension = ".statistics"; break; - case ExportMode::kDatabase: + case ExportMode::kSql: // No extension for database export. break; } return ReplaceFileExtension(GetModuleName(), new_extension); } -void ExportDatabase(ChainWriter& writer) { +void ExportIdb(Writer* writer) { LOG(INFO) << GetModuleName() << ": starting export"; WaitBox wait_box("exporting database..."); Timer<> timer; @@ -134,34 +118,41 @@ void ExportDatabase(ChainWriter& writer) { Instructions instructions; FlowGraph flow_graph; CallGraph call_graph; - AnalyzeFlowIda(&entry_points, &modules, &writer, &instructions, &flow_graph, + AnalyzeFlowIda(&entry_points, &modules, writer, &instructions, &flow_graph, &call_graph); LOG(INFO) << absl::StrCat( GetModuleName(), ": exported ", flow_graph.GetFunctions().size(), " functions with ", instructions.size(), " instructions in ", - absl::FormatDuration(absl::Seconds(timer.elapsed()))); + HumanReadableDuration(timer.elapsed())); } -int ExportDatabase(const string& schema_name, - const string& connection_string) { - ChainWriter writer; +int ExportSql(absl::string_view schema_name, + absl::string_view connection_string) { try { - const string data(GetDataForHash()); - auto database_writer(std::make_shared( - schema_name /* Database */, GetModuleName(), 0 /* Module id */, - EncodeHex(Md5(data)), EncodeHex(Sha1(data)), GetArchitectureName(), - GetImageBase(), kName /* Version string */, - !connection_string.empty() ? connection_string - : GetArgument("ConnectionString"))); + auto sha256_or = GetInputFileSha256(); + auto md5_or = GetInputFileMd5(); + if (!sha256_or.ok() || !md5_or.ok()) { + throw std::runtime_error{"Failed to load input file hashes"}; + } + DatabaseWriter writer{string(schema_name) /* Database */, + GetModuleName(), + /*module_id=*/0, + md5_or.ValueOrDie(), + sha256_or.ValueOrDie(), + GetArchitectureName().value(), + GetImageBase(), + kName /* Version string */, + !connection_string.empty() + ? string(connection_string) + : GetArgument("ConnectionString")}; int query_size = 0; - database_writer->set_query_size( + writer.set_query_size( absl::SimpleAtoi(GetArgument("QuerySize"), &query_size) ? query_size : 32 << 20 /* 32 MiB */); - writer.AddWriter(database_writer); - ExportDatabase(writer); + ExportIdb(&writer); } catch (const std::exception& error) { LOG(INFO) << "Error exporting: " << error.what(); warning("Error exporting: %s\n", error.what()); @@ -176,11 +167,13 @@ int ExportDatabase(const string& schema_name, int ExportBinary(const string& filename) { try { - const string hash = Sha1(GetDataForHash()); - ChainWriter writer; - writer.AddWriter(std::make_shared( - filename, GetModuleName(), EncodeHex(hash), GetArchitectureName())); - ExportDatabase(writer); + auto sha256_or = GetInputFileSha256(); + if (!sha256_or.ok()) { + throw std::runtime_error{sha256_or.status().error_message()}; + } + BinExport2Writer writer{filename, GetModuleName(), sha256_or.ValueOrDie(), + GetArchitectureName().value()}; + ExportIdb(&writer); } catch (const std::exception& error) { LOG(INFO) << "Error exporting: " << error.what(); warning("Error exporting: %s\n", error.what()); @@ -196,7 +189,7 @@ int ExportBinary(const string& filename) { void idaapi ButtonBinaryExport(TWidget** /* fields */, int) { const auto name(GetDefaultName(ExportMode::kBinary)); const char* filename = ask_file( - /*for_saving=*/true, name.c_str(), + /*for_saving=*/true, name.c_str(), "%s", absl::StrCat("FILTER BinExport v2 files|*.BinExport|All files|", kAllFilesFilter, "\nExport to BinExport v2") .c_str()); @@ -214,10 +207,9 @@ void idaapi ButtonBinaryExport(TWidget** /* fields */, int) { int ExportText(const string& filename) { try { - std::ofstream file(filename.c_str()); - ChainWriter writer; - writer.AddWriter(std::make_shared(file)); - ExportDatabase(writer); + std::ofstream file(filename); + DumpWriter writer{file}; + ExportIdb(&writer); } catch (const std::exception& error) { LOG(INFO) << "Error exporting: " << error.what(); warning("Error exporting: %s\n", error.what()); @@ -233,7 +225,7 @@ int ExportText(const string& filename) { void idaapi ButtonTextExport(TWidget** /* fields */, int) { const auto name = GetDefaultName(ExportMode::kText); const char* filename = ask_file( - /*for_saving=*/true, name.c_str(), + /*for_saving=*/true, name.c_str(), "%s", absl::StrCat("FILTER Text files|*.txt|All files|", kAllFilesFilter, "\nExport to Text") .c_str()); @@ -251,10 +243,9 @@ void idaapi ButtonTextExport(TWidget** /* fields */, int) { int ExportStatistics(const string& filename) { try { - std::ofstream file(filename.c_str()); - ChainWriter writer; - writer.AddWriter(std::make_shared(file)); - ExportDatabase(writer); + std::ofstream file(filename); + StatisticsWriter writer{file}; + ExportIdb(&writer); } catch (const std::exception& error) { LOG(INFO) << "Error exporting: " << error.what(); warning("Error exporting: %s\n", error.what()); @@ -270,7 +261,7 @@ int ExportStatistics(const string& filename) { void idaapi ButtonStatisticsExport(TWidget** /* fields */, int) { const auto name = GetDefaultName(ExportMode::kStatistics); const char* filename = ask_file( - /*for_saving=*/true, name.c_str(), + /*for_saving=*/true, name.c_str(), "%s", absl::StrCat("FILTER BinExport Statistics|*.statistics|All files|", kAllFilesFilter, "\nExport Statistics") .c_str()); @@ -292,8 +283,8 @@ const char* GetDialog() { "BUTTON YES Close\n" // This is actually the OK button "BUTTON CANCEL NONE\n" "HELP\n" - "See https://github.com/google/binexport/blob/master/README.md for " - "details on how to build/install/use this plugin.\n" + "See https://github.com/google/binexport/ for details on how to " + "build/install and use this plugin.\n" "ENDHELP\n", kName, "\n\n\n" @@ -304,13 +295,11 @@ const char* GetDialog() { } int DoExport(ExportMode mode, string name, - const string& connection_string) { + absl::string_view connection_string) { if (name.empty()) { - try { - name = GetTempDirectory("BinExport", true); - } catch (...) { - name = absl::StrCat(".", kPathSeparator); - } + auto temp_or = GetOrCreateTempDirectory("BinExport"); + name = + temp_or.ok() ? temp_or.ValueOrDie() : absl::StrCat(".", kPathSeparator); } if (IsDirectory(name) && connection_string.empty()) { name = JoinPath(name, GetDefaultName(mode)); @@ -318,8 +307,8 @@ int DoExport(ExportMode mode, string name, Instruction::SetBitness(GetArchitectureBitness()); switch (mode) { - case ExportMode::kDatabase: - return ExportDatabase(name, connection_string); + case ExportMode::kSql: + return ExportSql(name, connection_string); case ExportMode::kBinary: return ExportBinary(name); case ExportMode::kText: @@ -327,75 +316,128 @@ int DoExport(ExportMode mode, string name, case ExportMode::kStatistics: return ExportStatistics(name); default: - LOG(INFO) << "Error: Invalid export: " << mode; + LOG(INFO) << "Error: Invalid export mode: " << static_cast(mode); return -1; } } -error_t idaapi IdcBinExport2Diff(idc_value_t* argument, idc_value_t*) { - return DoExport(ExportMode::kBinary, string(argument[0].c_str()), - /* connection_string = */ ""); +error_t idaapi IdcBinExportBinary(idc_value_t* argument, idc_value_t*) { + return DoExport(ExportMode::kBinary, argument[0].c_str(), + /*connection_string=*/""); } -static const char kBinExport2DiffIdcArgs[] = {VT_STR, 0}; -static const ext_idcfunc_t kBinExport2DiffIdcFunc = { - "BinExport2Diff", IdcBinExport2Diff, kBinExport2DiffIdcArgs, nullptr, 0, +static const char kBinExportBinaryIdcArgs[] = {VT_STR, 0}; +static const ext_idcfunc_t kBinExportBinaryIdcFunc = { + "BinExportBinary", IdcBinExportBinary, kBinExportBinaryIdcArgs, nullptr, 0, EXTFUN_BASE}; -error_t idaapi IdcBinExport2Text(idc_value_t* argument, idc_value_t*) { - return DoExport(ExportMode::kText, string(argument[0].c_str()), - /* connection_string = */ ""); +error_t idaapi IdcBinExportText(idc_value_t* argument, idc_value_t*) { + return DoExport(ExportMode::kText, argument[0].c_str(), + /*connection_string=*/""); } -static const char kBinExport2TextIdcArgs[] = {VT_STR, 0}; -static const ext_idcfunc_t kBinExport2TextIdcFunc = { - "BinExport2Text", IdcBinExport2Text, kBinExport2TextIdcArgs, nullptr, 0, +static const char kBinExportTextIdcArgs[] = {VT_STR, 0}; +static const ext_idcfunc_t kBinExportTextIdcFunc = { + "BinExportText", IdcBinExportText, kBinExportTextIdcArgs, nullptr, 0, EXTFUN_BASE}; -error_t idaapi IdcBinExport2Statistics(idc_value_t* argument, idc_value_t*) { - return DoExport(ExportMode::kStatistics, string(argument[0].c_str()), - /* connection_string = */ ""); +error_t idaapi IdcBinExportStatistics(idc_value_t* argument, idc_value_t*) { + return DoExport(ExportMode::kStatistics, argument[0].c_str(), + /*connection_string=*/""); } -static const char kBinExport2StatisticsIdcArgs[] = {VT_STR, 0}; -static const ext_idcfunc_t kBinExport2StatisticsIdcFunc = { - "BinExport2Statistics", - IdcBinExport2Statistics, - kBinExport2StatisticsIdcArgs, +static const char kBinExportStatisticsIdcArgs[] = {VT_STR, 0}; +static const ext_idcfunc_t kBinExportStatisticsIdcFunc = { + "BinExportStatistics", + IdcBinExportStatistics, + kBinExportStatisticsIdcArgs, nullptr, 0, EXTFUN_BASE}; -error_t idaapi IdcBinExport2Sql(idc_value_t* argument, idc_value_t*) { +error_t idaapi IdcBinExportSql(idc_value_t* argument, idc_value_t*) { if (argument[0].vtype != VT_STR || argument[1].vtype != VT_LONG || argument[2].vtype != VT_STR || argument[3].vtype != VT_STR || argument[4].vtype != VT_STR || argument[5].vtype != VT_STR) { - LOG(INFO) << "Error (BinExport2Sql): required arguments are missing or " + LOG(INFO) << "Error (BinExportSql): required arguments are missing or " "have the wrong type."; LOG(INFO) << "Usage:"; - LOG(INFO) - << " BinExport2Sql('host', port, 'database', 'schema', 'user', " - "'password')"; + LOG(INFO) << " BinExportSql('host', port, 'database', 'schema', 'user', " + "'password')"; return -1; } string connection_string = absl::StrCat( "host='", argument[0].c_str(), "' port='", argument[1].num, "' dbname='", argument[2].c_str(), "' user='", argument[4].c_str(), "' password='", argument[5].c_str(), "'"); - if (DoExport(ExportMode::kDatabase, argument[3].c_str(), connection_string) == + if (DoExport(ExportMode::kSql, argument[3].c_str(), connection_string) == -1) { return -1; } return eOk; } -static const char kBinExport2SqlIdcArgs[] = {VT_STR /* Host */, - VT_LONG /* Port */, - VT_STR /* Database */, - VT_STR /* Schema */, - VT_STR /* User */, - VT_STR /* Password */, - 0}; -static const ext_idcfunc_t kBinExport2SqlIdcFunc = { - "BinExport2Sql", IdcBinExport2Sql, kBinExport2SqlIdcArgs, nullptr, 0, +static const char kBinExportSqlIdcArgs[] = {VT_STR /* Host */, + VT_LONG /* Port */, + VT_STR /* Database */, + VT_STR /* Schema */, + VT_STR /* User */, + VT_STR /* Password */, + 0}; +static const ext_idcfunc_t kBinExportSqlIdcFunc = { + "BinExportSql", IdcBinExportSql, kBinExportSqlIdcArgs, nullptr, 0, EXTFUN_BASE}; +// Builds a database connection string from the plugin arguments given on the +// command-line. +// Note: This function does not escape any of the strings it gets passed in. +string GetConnectionStringFromArguments() { + // See section 32.1.1.1. ("Keyword/Value Connection Strings") at + // https://www.postgresql.org/docs/9.6/static/libpq-connect.html + return absl::StrCat("host='", GetArgument("Host"), "' user='", + GetArgument("User"), "' password='", + GetArgument("Password"), "' port='", GetArgument("Port"), + "' dbname='" + GetArgument("Database") + "'"); +} + +ssize_t idaapi UiHook(void*, int event_id, va_list arguments) { + if (event_id != ui_ready_to_run) { + return 0; + } + + Instruction::SetBitness(GetArchitectureBitness()); + + // If IDA was invoked with -OBinExportAutoAction:, wait for auto + // analysis to finish, then invoke the requested action and exit. + const string auto_action = absl::AsciiStrToUpper(GetArgument("AutoAction")); + if (auto_action.empty()) { + return 0; + } + auto_wait(); + + if (auto_action == absl::AsciiStrToUpper(kBinExportSqlIdcFunc.name)) { + DoExport(ExportMode::kSql, GetArgument("Schema"), + GetConnectionStringFromArguments()); + } else if (auto_action == + absl::AsciiStrToUpper(kBinExportBinaryIdcFunc.name)) { + DoExport(ExportMode::kBinary, GetArgument("Module"), + /*connection_string=*/""); + } else if (auto_action == absl::AsciiStrToUpper(kBinExportTextIdcFunc.name)) { + DoExport(ExportMode::kText, GetArgument("Module"), + /*connection_string=*/""); + } else if (auto_action == + absl::AsciiStrToUpper(kBinExportStatisticsIdcFunc.name)) { + DoExport(ExportMode::kStatistics, GetArgument("Module"), + /*connection_string=*/""); + } else { + LOG(INFO) << "Invalid argument for AutoAction: " << auto_action; + } + + // Do not save the database on exit. This simply deletes the unpacked database + // and prevents IDA >= 7.1 from segfaulting if '-A' is specified at the same + // time. + set_database_flag(DBFL_KILL); + qexit(0); + + return 0; // Not reached +} + int idaapi PluginInit() { LoggingOptions options; options.set_alsologtostderr( @@ -413,19 +455,23 @@ int idaapi PluginInit() { << "), " << kCopyright; addon_info_t addon_info; - addon_info.cb = sizeof(addon_info_t); addon_info.id = "com.google.binexport"; addon_info.name = kName; addon_info.producer = "Google"; - addon_info.version = BINEXPORT_RELEASE " @ " BINEXPORT_REVISION; + addon_info.version = BINEXPORT_RELEASE " @" BINEXPORT_REVISION; addon_info.url = "https://github.com/google/binexport"; addon_info.freeform = kCopyright; register_addon(&addon_info); - if (!add_idc_func(kBinExport2DiffIdcFunc) || - !add_idc_func(kBinExport2TextIdcFunc) || - !add_idc_func(kBinExport2StatisticsIdcFunc) || - !add_idc_func(kBinExport2SqlIdcFunc)) { + if (!hook_to_notification_point(HT_UI, UiHook, /*user_data=*/nullptr)) { + LOG(INFO) << "Internal error: hook_to_notification_point() failed"; + return PLUGIN_SKIP; + } + + if (!add_idc_func(kBinExportSqlIdcFunc) || + !add_idc_func(kBinExportBinaryIdcFunc) || + !add_idc_func(kBinExportTextIdcFunc) || + !add_idc_func(kBinExportStatisticsIdcFunc)) { LOG(INFO) << "Error registering IDC extension, skipping BinExport plugin"; return PLUGIN_SKIP; } @@ -434,6 +480,7 @@ int idaapi PluginInit() { } void idaapi PluginTerminate() { + unhook_from_notification_point(HT_UI, UiHook, /*user_data=*/nullptr); ShutdownLogging(); } @@ -443,21 +490,15 @@ bool idaapi PluginRun(size_t argument) { return false; } - try { - GetArchitectureName(); - } catch (const std::exception&) { - LOG(INFO) << "Warning: Exporting for unknown CPU architecture (Id: " - << ph.id << ", " << GetArchitectureBitness() << "-bit)"; - } + LOG_IF(INFO, !GetArchitectureName()) + << "Warning: Exporting for unknown CPU architecture (Id: " << ph.id + << ", " << GetArchitectureBitness() << "-bit)"; try { if (argument) { string connection_string; string module; if (!GetArgument("Host").empty()) { - connection_string = - "host='" + GetArgument("Host") + "' user='" + GetArgument("User") + - "' password='" + GetArgument("Password") + "' port='" + - GetArgument("Port") + "' dbname='" + GetArgument("Database") + "'"; + connection_string = GetConnectionStringFromArguments(); module = GetArgument("Schema"); } else { module = GetArgument("Module"); @@ -476,17 +517,17 @@ bool idaapi PluginRun(size_t argument) { } } // namespace +} // namespace binexport +} // namespace security -extern "C" { plugin_t PLUGIN = { IDP_INTERFACE_VERSION, - PLUGIN_FIX, // Plugin flags - PluginInit, // Initialize - PluginTerminate, // Terminate - PluginRun, // Invoke plugin - kComment, // Statusline text - nullptr, // Multi-line help about the plugin, unused - kName, // Preferred short name of the plugin. - kHotKey // Preferred hotkey to run the plugin. + PLUGIN_FIX, // Plugin flags + security::binexport::PluginInit, // Initialize + security::binexport::PluginTerminate, // Terminate + security::binexport::PluginRun, // Invoke plugin + security::binexport::kComment, // Statusline text + nullptr, // Multi-line help about the plugin, unused + security::binexport::kName, // Preferred short name of the plugin. + security::binexport::kHotKey // Preferred hotkey to run the plugin. }; -} // extern "C" diff --git a/ida/metapc.cc b/ida/metapc.cc index f4c6ea66..a46f1f86 100644 --- a/ida/metapc.cc +++ b/ida/metapc.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -18,11 +18,11 @@ #include #include -#include "third_party/zynamics/binexport/ida/begin_idasdk.h" // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include "third_party/zynamics/binexport/ida/end_idasdk.h" // NOLINT +#include "third_party/zynamics/binexport/ida/begin_idasdk.inc" // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include "third_party/zynamics/binexport/ida/end_idasdk.inc" // NOLINT #include "base/logging.h" #include "third_party/absl/strings/str_cat.h" @@ -35,9 +35,9 @@ namespace { bool IsStringInstruction(const string& mnemonic) { - static std::set instructions = {"ins", "outs", "movs", "cmps", - "stos", "lods", "scas"}; - return instructions.find(mnemonic.substr(0, 4)) != instructions.end(); + static auto* instructions = new std::set{ + "ins", "outs", "movs", "cmps", "stos", "lods", "scas"}; + return instructions->find(mnemonic.substr(0, 4)) != instructions->end(); } string GetSegmentSelector(const op_t& operand) { @@ -90,11 +90,10 @@ string GetExtendedRegisterName(const op_t& operand) { // mov ax, word ss:[edx + 16] size_t GetSibOperandSize(Address address) { const segment_t* segment = getseg(static_cast(address)); - // fucking IDA: 0 = 16, 1 = 32, 2 = 64 + // IDA: 0 = 16, 1 = 32, 2 = 64 return (16 << segment->bitness) >> 3; } -// Warning: this function uses the global cmd! string GetSibBase(const insn_t& instruction, const op_t& operand) { const size_t opsize = GetSibOperandSize(instruction.ea); string name = GetRegisterName(x86_base(instruction, operand), opsize); @@ -106,9 +105,7 @@ string GetSibBase(const insn_t& instruction, const op_t& operand) { return name; } -string GetSibIndex( - const insn_t& instruction, - const op_t& operand) { // @warning: this function uses the global cmd! +string GetSibIndex(const insn_t& instruction, const op_t& operand) { const int index = x86_index(instruction, operand); size_t opsize = GetSibOperandSize(instruction.ea); if (opsize <= 1) { @@ -153,9 +150,8 @@ void HandlePhraseExpression(Expressions* expressions, FlowGraph* flow_graph, base = "di"; break; case 6: - base = "sword (@bug!)"; - break; // @bug: this should probably be a value retrieved from - // somewhere + base = "bp"; + break; case 7: base = "bx"; break; diff --git a/ida/metapc.h b/ida/metapc.h index a384e8c4..64a964a5 100644 --- a/ida/metapc.h +++ b/ida/metapc.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/ida/mips.cc b/ida/mips.cc index 7c5b2afa..76338337 100644 --- a/ida/mips.cc +++ b/ida/mips.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -17,13 +17,13 @@ #include #include -#include "third_party/zynamics/binexport/ida/begin_idasdk.h" // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include "third_party/zynamics/binexport/ida/end_idasdk.h" // NOLINT +#include "third_party/zynamics/binexport/ida/begin_idasdk.inc" // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include "third_party/zynamics/binexport/ida/end_idasdk.inc" // NOLINT #include "base/logging.h" #include "third_party/absl/strings/str_cat.h" diff --git a/ida/mips.h b/ida/mips.h index dae19302..523759ea 100644 --- a/ida/mips.h +++ b/ida/mips.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/ida/names.cc b/ida/names.cc index 92d340a4..6f04cd88 100644 --- a/ida/names.cc +++ b/ida/names.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -20,18 +20,18 @@ #include #include -#include "third_party/zynamics/binexport/ida/begin_idasdk.h" // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include "third_party/zynamics/binexport/ida/end_idasdk.h" // NOLINT +#include "third_party/zynamics/binexport/ida/begin_idasdk.inc" // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include "third_party/zynamics/binexport/ida/end_idasdk.inc" // NOLINT #include "base/logging.h" #include "third_party/absl/strings/ascii.h" @@ -40,9 +40,10 @@ #include "third_party/zynamics/binexport/address_references.h" #include "third_party/zynamics/binexport/base_types.h" #include "third_party/zynamics/binexport/call_graph.h" -#include "third_party/zynamics/binexport/filesystem_util.h" +#include "third_party/zynamics/binexport/util/filesystem.h" #include "third_party/zynamics/binexport/flow_analyzer.h" #include "third_party/zynamics/binexport/flow_graph.h" +#include "third_party/zynamics/binexport/util/format.h" #include "third_party/zynamics/binexport/ida/arm.h" #include "third_party/zynamics/binexport/ida/dalvik.h" #include "third_party/zynamics/binexport/ida/generic.h" @@ -50,12 +51,14 @@ #include "third_party/zynamics/binexport/ida/mips.h" #include "third_party/zynamics/binexport/ida/ppc.h" #include "third_party/zynamics/binexport/ida/types_container.h" -#include "third_party/zynamics/binexport/timer.h" +#include "third_party/zynamics/binexport/util/timer.h" #include "third_party/zynamics/binexport/type_system.h" #include "third_party/zynamics/binexport/virtual_memory.h" #include "third_party/zynamics/binexport/writer.h" #include "third_party/zynamics/binexport/x86_nop.h" +using security::binexport::HumanReadableDuration; + enum Architecture { kX86 = 0, kArm, @@ -107,7 +110,7 @@ Architecture GetArchitecture() { return kGeneric; } -string GetArchitectureName() { +absl::optional GetArchitectureName() { string architecture; switch (GetArchitecture()) { case kX86: @@ -129,15 +132,12 @@ string GetArchitectureName() { architecture = "GENERIC"; break; default: - throw std::runtime_error("unsupported processor"); - } - if (inf.is_64bit()) { - architecture += "-64"; - } else if (inf.is_32bit()) { - architecture += "-32"; - } else { - architecture += "-32"; + return {}; } + // This is not strictly correct, i.e. for 16-bit archs and also for 128-bit + // archs, but is what IDA supports. This needs to be changed if IDA introduces + // is_128bit(). + absl::StrAppend(&architecture, inf.is_64bit() ? "-64" : "-32"); return architecture; } @@ -850,8 +850,8 @@ void AnalyzeFlowIda(EntryPoints* entry_points, const ModuleMap* modules, const auto writing_time = absl::Seconds(timer.elapsed()); LOG(INFO) << absl::StrCat( - GetModuleName(), ": ", absl::FormatDuration(processing_time), - " processing, ", absl::FormatDuration(writing_time), " writing"); + GetModuleName(), ": ", HumanReadableDuration(processing_time), + " processing, ", HumanReadableDuration(writing_time), " writing"); } void GetRegularComments(Address address, Comments* comments) { @@ -874,23 +874,25 @@ void GetRegularComments(Address address, Comments* comments) { void GetEnumComments(Address address, Comments* comments) { // @bug: there is an get_enum_cmt // function in IDA as well! - unsigned char serial; + uint8 serial; if (is_enum0(get_flags(address))) { - if (int id = get_enum_id(&serial, address, 0) != BADNODE) { + int id = get_enum_id(&serial, address, 0); + if (id != BADNODE) { qstring ida_name(get_enum_name(id)); - comments->emplace_back(address, 0, - CallGraph::CacheString(string( - ida_name.c_str(), ida_name.length())), - Comment::ENUM, false); + comments->emplace_back( + address, 0, + CallGraph::CacheString(string(ida_name.c_str(), ida_name.length())), + Comment::ENUM, false); } } if (is_enum1(get_flags(address))) { - if (int id = get_enum_id(&serial, address, 1) != BADNODE) { + int id = get_enum_id(&serial, address, 1); + if (id != BADNODE) { qstring ida_name(get_enum_name(id)); - comments->emplace_back(address, 1, - CallGraph::CacheString(string( - ida_name.c_str(), ida_name.length())), - Comment::ENUM, false); + comments->emplace_back( + address, 1, + CallGraph::CacheString(string(ida_name.c_str(), ida_name.length())), + Comment::ENUM, false); } } } diff --git a/ida/names.h b/ida/names.h index fd3019a4..057443b8 100644 --- a/ida/names.h +++ b/ida/names.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ #include #include +#include "third_party/absl/types/optional.h" #include "third_party/zynamics/binexport/comment.h" #include "third_party/zynamics/binexport/entry_point.h" #include "third_party/zynamics/binexport/instruction.h" @@ -56,7 +57,9 @@ Name GetName(Address address, Address immediate, uint8 operand_num, bool user_names_only); string GetName(Address address, bool user_names_only); string GetModuleName(); -string GetArchitectureName(); + +absl::optional GetArchitectureName(); + int GetArchitectureBitness(); string GetSizePrefix(const size_t size_in_bytes); diff --git a/ida/ppc.cc b/ida/ppc.cc index 93757f93..f0726be0 100644 --- a/ida/ppc.cc +++ b/ida/ppc.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -18,11 +18,11 @@ #include #include -#include "third_party/zynamics/binexport/ida/begin_idasdk.h" // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include "third_party/zynamics/binexport/ida/end_idasdk.h" // NOLINT +#include "third_party/zynamics/binexport/ida/begin_idasdk.inc" // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include "third_party/zynamics/binexport/ida/end_idasdk.inc" // NOLINT #include "base/logging.h" #include "third_party/absl/strings/str_cat.h" diff --git a/ida/ppc.h b/ida/ppc.h index 20b14493..abc6f537 100644 --- a/ida/ppc.h +++ b/ida/ppc.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/ida/pro_forward.h b/ida/pro_forward.h index 902ed7c5..484fcc68 100644 --- a/ida/pro_forward.h +++ b/ida/pro_forward.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/ida/types_container.cc b/ida/types_container.cc index 33e7e0db..8c0dd143 100644 --- a/ida/types_container.cc +++ b/ida/types_container.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -16,15 +16,15 @@ #include -#include "third_party/zynamics/binexport/ida/begin_idasdk.h" // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include // NOLINT -#include "third_party/zynamics/binexport/ida/end_idasdk.h" // NOLINT +#include "third_party/zynamics/binexport/ida/begin_idasdk.inc" // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include "third_party/zynamics/binexport/ida/end_idasdk.inc" // NOLINT #include "base/logging.h" #include "third_party/absl/strings/str_cat.h" @@ -575,8 +575,8 @@ TypesContainer::TypeReference IdaTypesContainer::CreateStackReference( } const BaseType* base_type = GetStackFrame(function->start_ea); if (!base_type) { - LOG(INFO) << absl::StrCat("Stack frame corrupted, function: ", - absl::Hex(function->start_ea, absl::kZeroPad8)); + DLOG(INFO) << absl::StrCat("Stack frame corrupted, function: ", + absl::Hex(function->start_ea, absl::kZeroPad8)); return TypeReference::CreateEmptyReference(); } diff --git a/ida/types_container.h b/ida/types_container.h index a7e65bb0..83c7aedd 100644 --- a/ida/types_container.h +++ b/ida/types_container.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/ida/ui.cc b/ida/ui.cc index 8740d81a..632532fc 100644 --- a/ida/ui.cc +++ b/ida/ui.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,10 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "third_party/zynamics/binexport/ida/begin_idasdk.h" // NOLINT -#include // NOLINT -#include "third_party/zynamics/binexport/ida/end_idasdk.h" // NOLINT - #include "third_party/zynamics/binexport/ida/ui.h" #include "third_party/zynamics/binexport/types.h" diff --git a/ida/ui.h b/ida/ui.h index ae9e1389..fab99cb6 100644 --- a/ida/ui.h +++ b/ida/ui.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,9 +15,14 @@ #ifndef THIRD_PARTY_ZYNAMICS_BINEXPORT_IDA_UI_H_ #define THIRD_PARTY_ZYNAMICS_BINEXPORT_IDA_UI_H_ +#include "third_party/zynamics/binexport/ida/begin_idasdk.inc" // NOLINT +#include // NOLINT +#include // NOLINT +#include "third_party/zynamics/binexport/ida/end_idasdk.inc" // NOLINT + #include "third_party/absl/strings/string_view.h" -// Small RAII class that displays an wait message for long-running actions. +// Small RAII class that displays a wait message for long-running actions. class WaitBox { public: enum Cancellable { kNoCancel, kCancellable }; @@ -34,4 +39,41 @@ class WaitBox { bool cancellable_; }; +// Base class using CRTP that makes working with UI actions easier. +// Example usage: +// class MyAction : public ActionHandler { +// int idaapi activate(action_activation_ctx*) override { +// msg("Hello from MyAction!\n"); +// return false; // Do not refresh +// } +// }; +// Then in plugin init: +// register_action(MyAction::MakeActionDesc("plugin:myaction", "Say Hello", +// /*shortcut=*/"", /*tooltip=*/"", +// /*icon=*/-1): +// attach_action_to_menu("File/QuickStart", "plugin:myaction", SETMENU_APP); +// +template +class ActionHandler : public action_handler_t { + public: + // Creates a new action description for this action handler class. + static action_desc_t MakeActionDesc(const char* name, const char* label, + const char* shortcut, const char* tooltip, + int icon) { + return ACTION_DESC_LITERAL(name, label, T::GetInstance(), shortcut, tooltip, + icon); + } + + private: + static T* GetInstance() { + static auto* instance = new T(); + return instance; + } + + action_state_t idaapi update(action_update_ctx_t* context) override { + // Return a sensible default + return AST_ENABLE_FOR_IDB; + } +}; + #endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_IDA_UI_H_ diff --git a/initialize_constraints_postgresql_sql.h b/initialize_constraints_postgresql_sql.h index 2724a070..ef23aa1a 100644 --- a/initialize_constraints_postgresql_sql.h +++ b/initialize_constraints_postgresql_sql.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/initialize_indices_postgresql_sql.h b/initialize_indices_postgresql_sql.h index 6d2ab70b..30b3e626 100644 --- a/initialize_indices_postgresql_sql.h +++ b/initialize_indices_postgresql_sql.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/initialize_tables_postgresql_sql.h b/initialize_tables_postgresql_sql.h index 97d58881..92f4708e 100644 --- a/initialize_tables_postgresql_sql.h +++ b/initialize_tables_postgresql_sql.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/instruction.cc b/instruction.cc index fe19da31..cf5c61f5 100644 --- a/instruction.cc +++ b/instruction.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -42,7 +42,8 @@ typedef std::vector> Tree; // checked for their sign. void RenderExpression(std::ostream* stream, const TreeNode& node, int substitution_id, const string& substitution) { - const auto& expression = *CHECK_NOTNULL(node.expression); + CHECK(node.expression != nullptr); + const auto& expression = *node.expression; if (expression.GetId() == substitution_id) { *stream << substitution; return; @@ -450,7 +451,7 @@ void Instruction::SetExported(bool exported) { } } -void Instruction::SetFlag(unsigned char flag, bool value) { +void Instruction::SetFlag(uint8 flag, bool value) { if (value) { (*flags_)[address_] |= flag; } else { @@ -458,7 +459,7 @@ void Instruction::SetFlag(unsigned char flag, bool value) { } } -bool Instruction::HasFlag(unsigned char flag) const { +bool Instruction::HasFlag(uint8 flag) const { return ((*flags_)[address_] & flag) != 0; } diff --git a/instruction.h b/instruction.h index 14575d48..1d1ca53f 100644 --- a/instruction.h +++ b/instruction.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -113,8 +113,8 @@ class Instruction { bool IsExported() const; static bool IsExported(Address address); void SetExported(bool exported); - void SetFlag(unsigned char flag, bool value); - bool HasFlag(unsigned char flag) const; + void SetFlag(uint8 flag, bool value); + bool HasFlag(uint8 flag) const; private: const string* mnemonic_; // 4|8 + overhead in stringcache diff --git a/library_manager.cc b/library_manager.cc index 6caa7b03..8b2b1684 100644 --- a/library_manager.cc +++ b/library_manager.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/library_manager.h b/library_manager.h index 77c8e057..83a8cc8b 100644 --- a/library_manager.h +++ b/library_manager.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/maintenance_postgresql_sql.h b/maintenance_postgresql_sql.h index ab8cc76b..13d1d73a 100644 --- a/maintenance_postgresql_sql.h +++ b/maintenance_postgresql_sql.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/nested_iterator.h b/nested_iterator.h index de4474f3..89b3c1ca 100644 --- a/nested_iterator.h +++ b/nested_iterator.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/operand.cc b/operand.cc index e19ca49d..dbd6cfdd 100644 --- a/operand.cc +++ b/operand.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/operand.h b/operand.h index 42d6e7ff..5d2f9c21 100644 --- a/operand.h +++ b/operand.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/postgresql.cc b/postgresql.cc index c0810653..2c2d4a04 100644 --- a/postgresql.cc +++ b/postgresql.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/postgresql.h b/postgresql.h index 2e6bfd62..a41bc119 100644 --- a/postgresql.h +++ b/postgresql.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/query_builder.cc b/query_builder.cc index a19252c7..be14f6b9 100644 --- a/query_builder.cc +++ b/query_builder.cc @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -43,11 +43,10 @@ QueryBuilder& operator<<(QueryBuilder& builder, const Terminator&) { // Buffer overrun, create new query. builder.database_->Execute( builder.current_query_.str() - .substr(0, - static_cast(builder.last_flush_position_) - 1) + .substr(0, static_cast(builder.last_flush_position_) - 1) .c_str()); string query = builder.current_query_.str().substr( - static_cast(builder.last_flush_position_)); + static_cast(builder.last_flush_position_)); builder.current_query_.str(""); builder.current_query_ << builder.base_query_ << query; builder.last_flush_position_ = builder.current_query_.tellp(); @@ -66,4 +65,3 @@ QueryBuilder& operator<<(QueryBuilder& builder, int64 value) { builder.current_query_ << value; return builder; } - diff --git a/query_builder.h b/query_builder.h index 8b87a4d3..a59a56d1 100644 --- a/query_builder.h +++ b/query_builder.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/range.h b/range.h index eb1c6b61..91daedc9 100644 --- a/range.h +++ b/range.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/reader/call_graph.cc b/reader/call_graph.cc new file mode 100644 index 00000000..259971c6 --- /dev/null +++ b/reader/call_graph.cc @@ -0,0 +1,151 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +#include "third_party/zynamics/binexport/reader/call_graph.h" + +#include +#include +#include + +#include "base/logging.h" +#include "third_party/absl/memory/memory.h" +#include "third_party/absl/strings/str_cat.h" +#include "third_party/zynamics/binexport/reader/graph_utility.h" + +namespace security { +namespace binexport { + +CallGraph::Vertex CallGraph::GetVertex(Address address) const { + return security::binexport::GetVertex(*this, address); +} + +void AssignVertexProperties( + const std::vector& vertex_properties, + CallGraph::Graph* graph) { + CallGraph::VertexIterator vertices_it; + CallGraph::VertexIterator vertices_end; + CallGraph::Graph& graph_ref = *graph; + int j = 0; + for (boost::tie(vertices_it, vertices_end) = boost::vertices(*graph); + vertices_it != vertices_end; ++vertices_it, ++j) { + graph_ref[*vertices_it] = vertex_properties[j]; + } +} + +void VertexPropertyFromVertexProto(const BinExport2::CallGraph::Vertex& vertex, + const BinExport2& proto, + CallGraph::VertexProperty* vertex_property) { + vertex_property->address = vertex.address(); + vertex_property->flags = 0; + if (vertex.has_demangled_name()) { + vertex_property->demangled_name = vertex.demangled_name(); + vertex_property->flags |= CallGraph::kVertexName; + vertex_property->flags |= CallGraph::kVertexDemangledName; + } + if (vertex.has_mangled_name()) { + vertex_property->name = vertex.mangled_name(); + vertex_property->flags |= CallGraph::kVertexName; + } + if (!(vertex_property->flags & CallGraph::kVertexName)) { + vertex_property->name = absl::StrCat("sub_", absl::Hex(vertex.address())); + } + if (vertex.has_module_index()) { + vertex_property->module_name = proto.module(vertex.module_index()).name(); + } + switch (vertex.type()) { + case BinExport2::CallGraph::Vertex::NORMAL: + break; + case BinExport2::CallGraph::Vertex::LIBRARY: + vertex_property->flags |= CallGraph::kVertexLibrary; + if (vertex.has_library_index()) { + vertex_property->library_name = + proto.library(vertex.library_index()).name(); + } + break; + case BinExport2::CallGraph::Vertex::THUNK: + vertex_property->flags |= CallGraph::kVertexThunk; + break; + case BinExport2::CallGraph::Vertex::IMPORTED: + vertex_property->flags |= CallGraph::kVertexImported; + break; + case BinExport2::CallGraph::Vertex::INVALID: + vertex_property->flags |= CallGraph::kVertexInvalid; + break; + } +} + +bool CallGraph::IsValidEntryPoint(Address address) const { + return IsValidEntryPoint(GetVertex(address)); +} + +bool CallGraph::IsValidEntryPoint(Vertex vertex) const { + constexpr uint32 is_valid_function_mask = + kVertexLibrary | kVertexThunk | kVertexImported | kVertexInvalid; + if (vertex == VertexTypeTraits::kInvalidVertex) { + return false; + } + const uint32 function_flags = graph()[vertex].flags; + return (function_flags & is_valid_function_mask) == 0; +} + +std::unique_ptr CallGraph::FromBinExport2Proto( + const BinExport2& proto) { + const BinExport2::CallGraph& call_graph_proto(proto.call_graph()); + std::vector vertex_properties; + vertex_properties.reserve(call_graph_proto.vertex_size()); + std::vector
vertex_addresses; + vertex_addresses.reserve(call_graph_proto.vertex_size()); + + for (const auto& vertex : call_graph_proto.vertex()) { + VertexProperty vertex_property; + VertexPropertyFromVertexProto(vertex, proto, &vertex_property); + vertex_properties.push_back(vertex_property); + vertex_addresses.push_back(vertex_property.address); + } + QCHECK(std::is_sorted(vertex_addresses.begin(), vertex_addresses.end())) + << "CallGraph nodes not sorted by address"; + + // Find corresponding edge index for source and target address. + std::vector> edges; + edges.reserve(call_graph_proto.edge_size()); + for (const auto& edge : call_graph_proto.edge()) { + const Address source_address = + call_graph_proto.vertex(edge.source_vertex_index()).address(); + const Address target_address = + call_graph_proto.vertex(edge.target_vertex_index()).address(); + const auto source = std::lower_bound( + vertex_addresses.begin(), vertex_addresses.end(), source_address); + const auto target = std::lower_bound( + vertex_addresses.begin(), vertex_addresses.end(), target_address); + if (source != vertex_addresses.end() && target != vertex_addresses.end()) { + edges.emplace_back(source - vertex_addresses.begin(), + target - vertex_addresses.begin()); + } + } + + auto call_graph = absl::make_unique(); + call_graph->graph_ = + Graph(boost::edges_are_unsorted_multi_pass, edges.begin(), edges.end(), + call_graph_proto.vertex_size()); + + AssignVertexProperties(vertex_properties, &call_graph->graph_); + return call_graph; +} + +Address CallGraph::GetAddress(Vertex vertex) const { + return graph_[vertex].address; +} + +} // namespace binexport +} // namespace security diff --git a/reader/call_graph.h b/reader/call_graph.h new file mode 100644 index 00000000..1b5aea4d --- /dev/null +++ b/reader/call_graph.h @@ -0,0 +1,113 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +// A class to convert and store a BinExport::Callgraph protocol buffer into a +// Boost compressed sparse row graph. + +#ifndef THIRD_PARTY_ZYNAMICS_BINEXPORT_READER_CALL_GRAPH_H_ +#define THIRD_PARTY_ZYNAMICS_BINEXPORT_READER_CALL_GRAPH_H_ + +#include +#include + +#include // NOLINT + +#include "base/integral_types.h" +#include "base/macros.h" +#include "third_party/zynamics/binexport/binexport2.pb.h" +#include "third_party/zynamics/binexport/types.h" + +namespace security { +namespace binexport { + +class CallGraph { + public: + CallGraph() = default; + + CallGraph(const CallGraph&) = delete; + CallGraph& operator=(const CallGraph&) = delete; + + struct VertexProperty { + Address address; // Function address. + string name; // Function name. + string demangled_name; // Demangled function name. + uint32 flags; // Function flags. + string library_name; // Library name. + string module_name; // Module name. + + VertexProperty(Address address, const string& name, + const string& demangled_name, uint32 flags, + const string& library_name, const string& module_name) + : address(address), + name(name), + demangled_name(demangled_name), + flags(flags), + library_name(library_name), + module_name(module_name) {} + VertexProperty() : VertexProperty(0, "", "", 0, "", "") {} + }; + + enum { // vertex flags + kVertexLibrary = 1 << 0, // Library function. + kVertexThunk = 1 << 1, // Thunk function, e.g trampoline, + kVertexImported = 1 << 2, // Imported functions, e.g without code. + kVertexInvalid = 1 << 3, // Invalid function. + kVertexName = 1 << 4, // Has a non auto generated name. + kVertexDemangledName = 1 << 5, // Has a C++ demangled name. + }; + + using Graph = boost::compressed_sparse_row_graph< + boost::bidirectionalS, // Iterate in and out edges. + VertexProperty, // The information per vertex. + boost::no_property, // The information per edge. + boost::no_property, // Use no graph properties. + uint32, // Index type for vertices. + uint32>; // Index type for edges. + + using Vertex = boost::graph_traits::vertex_descriptor; + using VertexIterator = boost::graph_traits::vertex_iterator; + using Edge = boost::graph_traits::edge_descriptor; + using EdgeIterator = boost::graph_traits::edge_iterator; + using OutEdgeIterator = boost::graph_traits::out_edge_iterator; + using InEdgeIterator = boost::graph_traits::in_edge_iterator; + using AdjacencyIterator = boost::graph_traits::adjacency_iterator; + + // Factory method to read and initialize a call graph from a BinExport2 + // protocol buffer. + static std::unique_ptr FromBinExport2Proto( + const BinExport2& proto); + + const Graph& graph() const { return graph_; } + + // Get the address of a vertex. + Address GetAddress(Vertex vertex) const; + + // Returns true if the input corresponds to a valid non-library, + // non-thunk, non-imported function. The overload taking an Address + // CHECK-fails if the address does not correspond to a vertex in the + // callgraph. + bool IsValidEntryPoint(Address address) const; + bool IsValidEntryPoint(Vertex vertex) const; + + // Get a vertex by its address. + Vertex GetVertex(Address address) const; + + private: + Graph graph_; +}; + +} // namespace binexport +} // namespace security + +#endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_READER_CALL_GRAPH_H_ diff --git a/reader/call_graph_test.cc b/reader/call_graph_test.cc new file mode 100644 index 00000000..11b86279 --- /dev/null +++ b/reader/call_graph_test.cc @@ -0,0 +1,74 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +// Tests the functionality of the CallGraph class. + +#include "third_party/zynamics/binexport/reader/call_graph.h" + +#include "base/logging.h" +#include +#include +#include "third_party/absl/strings/str_cat.h" +#include "third_party/zynamics/binexport/reader/graph_utility.h" +#include "third_party/zynamics/binexport/reader/reader_test_util.h" + +namespace security { +namespace binexport { +namespace { + +using ::testing::Eq; + +static constexpr char kBinExport2Item[] = + "0000500ed9f688a309ee2176462eb978efa9a2fb80fcceb5d8fd08168ea50dfd." + "BinExport"; + +class CallGraphTest : public testing::Test { + protected: + void SetUp() override { + QCHECK_OK(GetBinExportProtoForTesting(kBinExport2Item, &proto_)); + call_graph_ = CallGraph::FromBinExport2Proto(proto_); + } + + std::unique_ptr call_graph_; + BinExport2 proto_; +}; + +TEST_F(CallGraphTest, ReadValidData) { + EXPECT_THAT(boost::num_vertices(call_graph_->graph()), + Eq(proto_.call_graph().vertex_size())); + EXPECT_THAT(boost::num_edges(call_graph_->graph()), + Eq(proto_.call_graph().edge_size())); +} + +TEST_F(CallGraphTest, ValidateVertex) { + int counter = 0; + for (const auto& vertex : proto_.call_graph().vertex()) { + if (IsValidVertex(call_graph_->GetVertex(vertex.address()))) { + ++counter; + } + } + EXPECT_THAT(counter, Eq(proto_.call_graph().vertex_size())); +} + +TEST_F(CallGraphTest, GetVertexGetAddress) { + for (const auto& vertex : proto_.call_graph().vertex()) { + const auto address = vertex.address(); + EXPECT_THAT(call_graph_->GetAddress(call_graph_->GetVertex(address)), + Eq(address)); + } +} + +} // namespace +} // namespace binexport +} // namespace security diff --git a/reader/flow_graph.cc b/reader/flow_graph.cc new file mode 100644 index 00000000..a15456a8 --- /dev/null +++ b/reader/flow_graph.cc @@ -0,0 +1,241 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +#include "third_party/zynamics/binexport/reader/flow_graph.h" + +#include +#include +#include + +#include // NOLINT + +#include "base/logging.h" +#include "third_party/absl/memory/memory.h" +#include "third_party/zynamics/binexport/reader/graph_utility.h" +#include "third_party/zynamics/binexport/types.h" + +namespace security { +namespace binexport { +namespace { + +absl::optional GetSupportedArchitecture(const BinExport2& proto) { + const string& architecture = proto.meta_information().architecture_name(); + if (architecture == "arm") { + return Architecture::kArm; + } + if (architecture == "aarch64") { + return Architecture::kAArch64; + } + if (architecture == "dex") { + return Architecture::kDex; + } + if (architecture == "msil") { + return Architecture::kMsil; + } + if (architecture == "x86-32") { + return Architecture::kX86Arch32; + } + if (architecture == "x86-64") { + return Architecture::kX86Arch64; + } + return absl::nullopt; +} + +uint32 GetEdgeTypeFromProto(BinExport2::FlowGraph::Edge::Type type) { + switch (type) { + case BinExport2::FlowGraph::Edge::CONDITION_TRUE: + return FlowGraph::kEdgeTrue; + case BinExport2::FlowGraph::Edge::CONDITION_FALSE: + return FlowGraph::kEdgeFalse; + case BinExport2::FlowGraph::Edge::UNCONDITIONAL: + return FlowGraph::kEdgeUnconditional; + case BinExport2::FlowGraph::Edge::SWITCH: + return FlowGraph::kEdgeSwitch; + default: + LOG(QFATAL) << "Invalid edge type: " << type; + } +} + +void EdgesFromEdgeProto( + const BinExport2& proto, const BinExport2::FlowGraph& flow_graph_proto, + const std::vector
& addresses, + const std::vector& instruction_addresses, + std::vector>* edges, + std::vector* edge_properties) { + for (const auto& edge : flow_graph_proto.edge()) { + const Address source_address = + instruction_addresses[proto.basic_block(edge.source_basic_block_index()) + .instruction_index(0) + .begin_index()]; + const Address target_address = + instruction_addresses[proto.basic_block(edge.target_basic_block_index()) + .instruction_index(0) + .begin_index()]; + const auto source = + std::lower_bound(addresses.begin(), addresses.end(), source_address); + const auto target = + std::lower_bound(addresses.begin(), addresses.end(), target_address); + if (source != addresses.end() && target != addresses.end()) { + edges->emplace_back(source - addresses.begin(), + target - addresses.begin()); + FlowGraph::EdgeProperty edge_property; + edge_property.flags |= GetEdgeTypeFromProto(edge.type()); + if (edge.is_back_edge()) { + edge_property.flags |= FlowGraph::kEdgeLoop; + } + edge_properties->push_back(edge_property); + } + } +} + +void AssignVertexProperties( + const std::vector& vertex_properties, + FlowGraph::Graph* graph) { + FlowGraph::VertexIterator vertices_it; + FlowGraph::VertexIterator vertices_end; + FlowGraph::Graph& graph_ref = *graph; + int j = 0; + for (boost::tie(vertices_it, vertices_end) = boost::vertices(*graph); + vertices_it != vertices_end; ++vertices_it, ++j) { + graph_ref[*vertices_it] = vertex_properties[j]; + } +} + +void AssignEdgeProperties( + const std::vector& edge_properties, + FlowGraph::Graph* graph) { + FlowGraph::EdgeIterator edges_it; + FlowGraph::EdgeIterator edges_end; + FlowGraph::Graph& graph_ref = *graph; + int j = 0; + for (boost::tie(edges_it, edges_end) = boost::edges(*graph); + edges_it != edges_end; ++edges_it, ++j) { + graph_ref[*edges_it] = edge_properties[j]; + } +} + +} // namespace + +FlowGraph::FlowGraph() : entry_point_address_(0) {} + +FlowGraph::Vertex FlowGraph::GetVertex(Address address) const { + return security::binexport::GetVertex(*this, address); +} + +std::unique_ptr FlowGraph::FromBinExport2Proto( + const BinExport2& proto, const BinExport2::FlowGraph& flow_graph_proto, + const std::vector
& instruction_addresses) { + auto flow_graph = absl::make_unique(); + int entry_instruction_index = + proto.basic_block(flow_graph_proto.entry_basic_block_index()) + .instruction_index(0) + .begin_index(); + flow_graph->entry_point_address_ = + instruction_addresses[entry_instruction_index]; + + std::vector vertices; + vertices.reserve(flow_graph_proto.basic_block_index_size()); + std::vector
addresses; + addresses.reserve(flow_graph_proto.basic_block_index_size()); + + for (int basic_block_index : flow_graph_proto.basic_block_index()) { + const BinExport2::BasicBlock& basic_block_proto( + proto.basic_block(basic_block_index)); + VertexProperty vertex_property; + vertex_property.instruction_start = flow_graph->instructions_.size(); + QCHECK(basic_block_proto.instruction_index_size()); + for (const auto& instruction_interval : + basic_block_proto.instruction_index()) { + const int instruction_end_index(instruction_interval.has_end_index() + ? instruction_interval.end_index() + : instruction_interval.begin_index() + + 1); + for (int instruction_index = instruction_interval.begin_index(); + instruction_index < instruction_end_index; ++instruction_index) { + const auto& instruction_proto(proto.instruction(instruction_index)); + Address instruction_address = instruction_addresses[instruction_index]; + const string& mnemonic( + proto.mnemonic(instruction_proto.mnemonic_index()).name()); + flow_graph->instructions_.emplace_back(instruction_address, mnemonic); + + auto& instruction = flow_graph->instructions_.back(); + instruction.set_operands({instruction_proto.operand_index().begin(), + instruction_proto.operand_index().end()}); + instruction.set_call_targets({instruction_proto.call_target().begin(), + instruction_proto.call_target().end()}); + } + } + addresses.push_back( + flow_graph->instructions_[vertex_property.instruction_start].address()); + vertices.push_back(vertex_property); + } + + CHECK(std::is_sorted(addresses.begin(), addresses.end())) + << "Flow graph nodes not sorted by address."; + + std::vector> edges; + edges.reserve(flow_graph_proto.edge_size()); + std::vector edge_properties; + edge_properties.reserve(flow_graph_proto.edge_size()); + EdgesFromEdgeProto(proto, flow_graph_proto, addresses, instruction_addresses, + &edges, &edge_properties); + flow_graph->graph_ = Graph(boost::edges_are_unsorted_multi_pass, + edges.begin(), edges.end(), addresses.size()); + flow_graph->architecture_ = GetSupportedArchitecture(proto); + AssignVertexProperties(vertices, &flow_graph->graph_); + AssignEdgeProperties(edge_properties, &flow_graph->graph_); + return flow_graph; +} + +size_t FlowGraph::GetVertexCount() const { return num_vertices(graph_); } +size_t FlowGraph::GetEdgeCount() const { return num_edges(graph_); } +size_t FlowGraph::GetInstructionCount() const { return instructions_.size(); } + +Address FlowGraph::GetAddress(Vertex vertex) const { + return GetInstructions(vertex).first->address(); +} + +std::pair +FlowGraph::GetInstructions(Vertex vertex) const { + return {instructions_.begin() + graph_[vertex].instruction_start, + GetVertexCount() != vertex + 1 + ? instructions_.begin() + graph_[vertex + 1].instruction_start + : instructions_.end()}; +} + +bool FlowGraph::IsExitNode(Vertex vertex) const { + if (boost::out_degree(vertex, graph_)) { + // Basic block has outgoing flow edges - it cannot possibly be an exit node. + return false; + } + + Instructions::const_iterator instructions_it, instructions_end; + boost::tie(instructions_it, instructions_end) = GetInstructions(vertex); + if (instructions_it == instructions_end) { + // Basic block doesn't have any instructions. + return true; + } + + // TODO(b/114701180) - if last instruction is call to a known function, this + // is an exit node (optimized tail call pattern). + + // If last instruction is a jump to unknown location, this is probably + // unrecognized switch pattern (or similar) - return false. Otherwise true. + const Instruction& last_instruction = *(--instructions_end); + return !IsJumpInstruction(last_instruction, architecture_); +} + +} // namespace binexport +} // namespace security diff --git a/reader/flow_graph.h b/reader/flow_graph.h new file mode 100644 index 00000000..2df448f6 --- /dev/null +++ b/reader/flow_graph.h @@ -0,0 +1,165 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +// A class to convert and store a BinExport::Flowgraph protocol buffer in a +// Boost graph. + +#ifndef THIRD_PARTY_ZYNAMICS_BINEXPORT_READER_FLOW_GRAPH_H_ +#define THIRD_PARTY_ZYNAMICS_BINEXPORT_READER_FLOW_GRAPH_H_ + +#include +#include +#include +#include + +#include //NOLINT +#include // NOLINT + +#include "base/integral_types.h" +#include "base/macros.h" +#include "third_party/absl/types/optional.h" +#include "third_party/zynamics/binexport/binexport2.pb.h" +#include "third_party/zynamics/binexport/reader/instruction.h" +#include "third_party/zynamics/binexport/types.h" +#include "third_party/zynamics/binexport/architectures.h" + +namespace security { +namespace binexport { + +class FlowGraph { + public: + FlowGraph(); + + FlowGraph(const FlowGraph&) = delete; + FlowGraph& operator=(const FlowGraph&) = delete; + + // TODO(cblichmann): Future extension point: This should be a template + // argument. BinDiff has VertexInfo with different fields. + struct VertexProperty { + VertexProperty() = default; + + // Start index of instructions in instruction vector. + uint32 instruction_start = std::numeric_limits::max(); + }; + + enum EdgeType { + kEdgeUnconditional = 1 << 0, // unconditional edge. + kEdgeTrue = 1 << 1, // conditional jump true case. + kEdgeFalse = 1 << 2, // conditional jump false case. + kEdgeSwitch = 1 << 3, // switch jump edge. + kEdgeLoop = 1 << 4, // loop back edge (as in Lengauer-Tarjan). + }; + + struct EdgeProperty { + EdgeProperty() = default; + + uint32 flags = 0; + }; + + using Graph = boost::compressed_sparse_row_graph< + boost::bidirectionalS, // Iterate in and out edges. + VertexProperty, // The information per vertex. + EdgeProperty, // The information per edge. + boost::no_property, // Use no graph properties. + uint32, // Index type for vertices. + uint32>; // Index type for edges. + + using Vertex = boost::graph_traits::vertex_descriptor; + using VertexIterator = boost::graph_traits::vertex_iterator; + using Edge = boost::graph_traits::edge_descriptor; + using EdgeIterator = boost::graph_traits::edge_iterator; + using OutEdgeIterator = boost::graph_traits::out_edge_iterator; + using InEdgeIterator = boost::graph_traits::in_edge_iterator; + using AdjacencyIterator = boost::graph_traits::adjacency_iterator; + + using UndirectedGraph = + boost::adjacency_list; + + // Factory method to read and initialize a flow graph (BinExport2). + static std::unique_ptr FromBinExport2Proto( + const BinExport2& proto, const BinExport2::FlowGraph& flow_graph_proto, + const std::vector& instruction_addresses); + + // Returns the graph of this flow graph. + const Graph& graph() const { return graph_; } + + // Returns the entry point address of the flow graph. + const Address& entry_point_address() const { return entry_point_address_; } + + // Returns the start address of the given vertex. + Address GetAddress(Vertex vertex) const; + + // Returns the instructions for the given vertex. + std::pair + GetInstructions(Vertex vertex) const; + + // Computes the call targets for the given vertex. + template + void GetCallTargets(Vertex vertex, OutputIterator call_targets) const; + + // Returns true if vertex is an exit node from a function. This usually + // happens when block doesn't have any outgoing flow edges, but there are + // exceptions - like when block ends with unrecognised jump to register. + bool IsExitNode(Vertex vertex) const; + + // Returns the number of vertices in this flow graph. + size_t GetVertexCount() const; + + // Returns the number of edges of this flow graph. + size_t GetEdgeCount() const; + + // Returns the number of instruction in this flow graph. + size_t GetInstructionCount() const; + + // Returns the instructions in this flow graph. + const Instructions& instructions() const { return instructions_; } + + // Returns the vertex with the given address. + Vertex GetVertex(Address address) const; + + private: + // Boost graph representing the structure of the flow graph. + Graph graph_; + + // Entry point address for this flow graph. Each flow graph only has a single + // entry point. + Address entry_point_address_; + + // Instructions of this flow graph. Instructions are stored for the whole flow + // graph rather than keeping a list for each graph vertex. To access + // instructions for a single vertex use the FlowGraph::GetInstructions(Vertex + // vertex) function. + Instructions instructions_; + + // Architecture of instructions in this flow graph. + absl::optional architecture_; +}; + +template +void FlowGraph::GetCallTargets(Vertex vertex, + OutputIterator call_targets) const { + Instructions::const_iterator it; + Instructions::const_iterator end; + for (std::tie(it, end) = GetInstructions(vertex); it != end; ++it) { + for (const auto& target : it->call_targets()) { + *call_targets++ = target; + } + } +} + +} // namespace binexport +} // namespace security + +#endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_READER_FLOW_GRAPH_H_ diff --git a/reader/flow_graph_test.cc b/reader/flow_graph_test.cc new file mode 100644 index 00000000..e6fb2cbe --- /dev/null +++ b/reader/flow_graph_test.cc @@ -0,0 +1,160 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +#include "third_party/zynamics/binexport/reader/flow_graph.h" + +#include +#include +#include "base/logging.h" +#include "third_party/absl/strings/str_cat.h" +#include "third_party/zynamics/binexport/binexport.h" +#include "third_party/zynamics/binexport/reader/graph_utility.h" +#include "third_party/zynamics/binexport/reader/instruction.h" +#include "third_party/zynamics/binexport/reader/reader_test_util.h" + +namespace security { +namespace binexport { +namespace { + +using ::testing::Eq; + +static constexpr char kBinExport2Item[] = + "0000500ed9f688a309ee2176462eb978efa9a2fb80fcceb5d8fd08168ea50dfd." + "BinExport"; + +class FlowGraphTest : public testing::Test { + protected: + void SetUp() override { + QCHECK_OK(GetBinExportProtoForTesting(kBinExport2Item, &proto_)); + flow_graph_ = FlowGraph::FromBinExport2Proto( + proto_, proto_.flow_graph(0), + binexport::GetAllInstructionAddresses(proto_)); + } + + std::unique_ptr flow_graph_; + BinExport2 proto_; +}; + +// Tests if the setup produced a valid flow graph representation. The test is +// checking if the FromProto function produced a valid output for the protocol +// buffer specified in the setup method. If the parsing and conversion has been +// successful the test is successful. +TEST_F(FlowGraphTest, ReadValidData) { + EXPECT_EQ(proto_.flow_graph(0).edge_size(), flow_graph_->GetEdgeCount()); + EXPECT_EQ(proto_.flow_graph(0).basic_block_index_size(), + flow_graph_->GetVertexCount()); + int proto_instruction_count = 0; + for (int basic_block_index : proto_.flow_graph(0).basic_block_index()) { + const auto& basic_block_proto(proto_.basic_block(basic_block_index)); + for (const auto& instruction_interval : + basic_block_proto.instruction_index()) { + const int instruction_end_index(instruction_interval.has_end_index() + ? instruction_interval.end_index() + : instruction_interval.begin_index() + + 1); + proto_instruction_count += + instruction_end_index - instruction_interval.begin_index(); + } + } + EXPECT_EQ(proto_instruction_count, flow_graph_->GetInstructionCount()); + + FlowGraph::Graph graph = flow_graph_->graph(); + EXPECT_EQ(proto_.flow_graph(0).basic_block_index_size(), + boost::num_vertices(graph)); + EXPECT_EQ(proto_.flow_graph(0).edge_size(), boost::num_edges(graph)); +} + +// Tests the GetInstruction method. If GetInstruction method provides access to +// the instructions from the specified protocol buffer, and the instructions +// match the instructions specified the test is successful. +TEST_F(FlowGraphTest, GetInstructions) { + // Reproduce test data with the following queries: + /* gqui print \ + basic_block[0], instruction[0], instruction[1], instruction[2], \ + instruction[3], instruction[4], mnemonic[0], mnemonic[9], mnemonic[49] \ + from \ + rawproto:security/zynamics/dejadis/testdata/0000500ed9f688a309ee2176462eb978efa9a2fb80fcceb5d8fd08168ea50dfd.BinExport2 + */ + FlowGraph::Vertex vertex = flow_graph_->GetVertex(0x322152); + int counter = 0; + for (Instructions::const_iterator it = + flow_graph_->GetInstructions(vertex).first; + it != flow_graph_->GetInstructions(vertex).second; ++it) { + switch (it->address()) { + case 0x322152: + EXPECT_EQ("pushad", it->mnemonic()); + break; + case 0x322152 + 1: + EXPECT_EQ("mov", it->mnemonic()); + break; + case 0x322152 + 1 + 5: + EXPECT_EQ("mov", it->mnemonic()); + break; + case 0x322152 + 1 + 5 + 5: + EXPECT_EQ("lea", it->mnemonic()); + break; + case 0x322152 + 1 + 5 + 5 + 4: + EXPECT_EQ("mov", it->mnemonic()); + break; + default: + // Should never happen. + EXPECT_TRUE(false); + } + ++counter; + } + EXPECT_EQ(5, counter); +} + +// Tests that the FromBinExport2Proto method correctly populates Instruction +// call targets. If the total number of call targets matches the expected +// number of call targets, the test is successful. +TEST_F(FlowGraphTest, GetCallTargets) { + const auto& flow_graph(FlowGraph::FromBinExport2Proto( + proto_, proto_.flow_graph(1), + binexport::GetAllInstructionAddresses(proto_))); + const auto& vertex = flow_graph->GetVertex(0x003221BE); + LOG(INFO) << vertex; + std::vector
call_targets; + flow_graph->GetCallTargets(vertex, std::back_inserter(call_targets)); + EXPECT_THAT(call_targets.size(), Eq(9)); +} + +// Tests that the FromBinExport2Proto method correctly populates Instruction +// call targets for a non-final vertex in a flow graph with multiple vertices +// with call targets. If the total number of call targets matches the expected +// number of call targets, the test is successful. +TEST_F(FlowGraphTest, GetCallTargetsMultiple) { + const auto& flow_graph(FlowGraph::FromBinExport2Proto( + proto_, proto_.flow_graph(2), + binexport::GetAllInstructionAddresses(proto_))); + const auto& vertex = flow_graph->GetVertex(0x00322310); + LOG(INFO) << vertex; + std::vector
call_targets; + flow_graph->GetCallTargets(vertex, std::back_inserter(call_targets)); + EXPECT_THAT(call_targets.size(), Eq(6)); +} + +// Tests if IsValidVertex returns false for a vertex not present in the graph. +TEST_F(FlowGraphTest, GetVertexInvalidAddress) { + EXPECT_FALSE(IsValidVertex(flow_graph_->GetVertex(0x003221BE))); +} + +// Tests if IsValidVertex returns true for a vertex present in the graph. +TEST_F(FlowGraphTest, GetVertexGoodAddress) { + EXPECT_TRUE(IsValidVertex(flow_graph_->GetVertex(0x322152))); +} + +} // namespace +} // namespace binexport +} // namespace security diff --git a/reader/graph_utility.h b/reader/graph_utility.h new file mode 100644 index 00000000..de597916 --- /dev/null +++ b/reader/graph_utility.h @@ -0,0 +1,93 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +// Utility class for graph related algorithms. + +#ifndef THIRD_PARTY_ZYNAMICS_BINEXPORT_READER_GRAPH_UTILITY_H_ +#define THIRD_PARTY_ZYNAMICS_BINEXPORT_READER_GRAPH_UTILITY_H_ + +#include // NOLINT + +#include "base/integral_types.h" +#include "third_party/zynamics/binexport/types.h" + +namespace security { +namespace binexport { + +struct EdgeDegrees { + uint32 source_in_degree; + uint32 source_out_degree; + uint32 target_in_degree; + uint32 target_out_degree; +}; + +template +struct VertexTypeTraits {}; + +// This is the specialization for the types FlowGraph::Vertex and +// CallGraph::Vertex. Both of them are just a typedef and therefore no real type +// in the type system. They are currently of type uint32. This is safe as when +// underlying code changes there is no specialization for this type in place. +template <> +struct VertexTypeTraits { + static const uint32 kInvalidVertex = kuint32max; +}; + +template +bool IsValidVertex(const Vertex& vertex) { + return vertex != VertexTypeTraits::kInvalidVertex; +} + +// Gets a Graph::Vertex by its address. Complexity of the search is O(log(n)). +// This code is heavily borrowed from std::lower_bound. But using it would +// require a comparator which keeps state. +template +typename Graph::Vertex GetVertex(const Graph& graph, Address address) { + typename Graph::Vertex first = 0; + typename Graph::Vertex last = boost::num_vertices(graph.graph()); + typename Graph::Vertex count = last; + while (count > 0) { + typename Graph::Vertex count2 = count / 2; + typename Graph::Vertex mid = first + count2; + if (graph.GetAddress(mid) < address) { + first = ++mid; + count -= count2 + 1; + } else { + count = count2; + } + } + + if ((first != last) && (graph.GetAddress(first) == address)) { + return first; + } + return VertexTypeTraits::kInvalidVertex; +} + +// Collects the in and out degree of the edges source and target vertex, and +// passes them as EdgeDegree struct to the caller. +template +EdgeDegrees GetEdgeDegrees(const typename Graph::Graph& graph, + const typename Graph::Edge& edge) { + typename Graph::Vertex source = boost::source(edge, graph); + typename Graph::Vertex target = boost::target(edge, graph); + EdgeDegrees edge_vector{ + boost::in_degree(source, graph), boost::out_degree(source, graph), + boost::in_degree(target, graph), boost::out_degree(target, graph)}; + return edge_vector; +} + +} // namespace binexport +} // namespace security + +#endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_READER_GRAPH_UTILITY_H_ diff --git a/reader/graph_utility_test.cc b/reader/graph_utility_test.cc new file mode 100644 index 00000000..acac9652 --- /dev/null +++ b/reader/graph_utility_test.cc @@ -0,0 +1,104 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +#include "third_party/zynamics/binexport/reader/graph_utility.h" + +#include +#include + +#include // NOLINT + +#include +#include + +namespace security { +namespace binexport { + +class GraphUtilityTest : public testing::Test { + protected: + const std::vector
addresses_{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 16, 18, 19}; + + typedef std::pair edge; + const std::vector edges_{ + {0, 1}, {1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6}, {5, 7}, + {5, 8}, {5, 9}, {6, 10}, {7, 10}, {8, 10}, {9, 10}, {10, 11}, + {11, 12}, {12, 13}, {13, 14}, {14, 15}, {14, 15}, {15, 16}, {16, 17}, + {17, 18}, {18, 19}, {1, 18}, {17, 2}}; + + // [0]->[1]->[2]->[3]->[4]->[5]->[6]->[10]->[11]->[12]->[13]->[14]->[15] + // ^ ^ +-->[7]----^ +----^| + // | | +-->[8]----^ | + // | | +-->[9]----^ | + // | +---------------------------------------------+ | + // +-------------------------------------------+ | | + // [19]<-[18]<-[17]<-[16]<-+ + // [20] <- alone to test if the graph hashing works if a vertex is not + // connected by any edge. + + struct VertexInfo { + Address address; + }; + + public: + struct EdgeProperty { + uint32 flags; + }; + + typedef boost::compressed_sparse_row_graph Graph; + + Graph graph_; + + typedef boost::graph_traits::vertex_descriptor Vertex; + typedef boost::graph_traits::edge_descriptor Edge; + typedef boost::graph_traits::edge_iterator EdgeIterator; + typedef boost::graph_traits::out_edge_iterator OutEdgeIterator; + typedef boost::graph_traits::in_edge_iterator InEdgeIterator; + typedef boost::graph_traits::adjacency_iterator AdjacencyIterator; + + typedef boost::property_map::type + VertexIndexMap; + + typedef boost::adjacency_list UndirectedGraph; + + protected: + void SetUp() override { + graph_ = Graph(boost::edges_are_unsorted_multi_pass, edges_.begin(), + edges_.end(), addresses_.size()); + typedef boost::graph_traits::vertex_iterator VertexIterator; + VertexIterator vertices_it, vertices_end; + int j = 0; + for (boost::tie(vertices_it, vertices_end) = boost::vertices(graph_); + vertices_it != vertices_end; ++vertices_it, ++j) { + graph_[j].address = addresses_.at(j); + } + } +}; + +TEST_F(GraphUtilityTest, GetEdgeVector) { + const std::pair edge_pair( + boost::edge(Vertex(5), Vertex(6), graph_)); + const EdgeDegrees edge_vector = + GetEdgeDegrees(graph_, edge_pair.first); + EXPECT_EQ(edge_vector.source_in_degree, 1); + EXPECT_EQ(edge_vector.source_out_degree, 4); + EXPECT_EQ(edge_vector.target_in_degree, 1); + EXPECT_EQ(edge_vector.target_out_degree, 1); +} + +} // namespace binexport +} // namespace security diff --git a/reader/instruction.cc b/reader/instruction.cc new file mode 100644 index 00000000..0f79e96e --- /dev/null +++ b/reader/instruction.cc @@ -0,0 +1,46 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +#include "third_party/zynamics/binexport/reader/instruction.h" + +namespace security { +namespace binexport { + +Instruction::Instruction(Address address, const string& mnemonic) + : address_(address), mnemonic_(mnemonic) {} + +void Instruction::set_operands(const std::vector& operand_indices) { + operand_indices_ = operand_indices; +} + +const Instruction* GetInstruction(const Instructions& instructions, + const Address instruction_address) { + for (const auto& instruction : instructions) { + if (instruction.address() == instruction_address) { + return &instruction; + } + } + return nullptr; +} + +bool IsJumpInstruction(const Instruction& instruction, + absl::optional architecture) { + // TODO(b/114701180): Implement this function, at least for ARM and AArch64. + // TODO(xmsm): false is a good default, but should we return it for + // unsupported architectures, or signal an error instead? + return false; +} + +} // namespace binexport +} // namespace security diff --git a/reader/instruction.h b/reader/instruction.h new file mode 100644 index 00000000..306378b2 --- /dev/null +++ b/reader/instruction.h @@ -0,0 +1,69 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +// This class provides storage for instruction information. It is targeted +// towards the instructions stored in a BinExport::Flowgraph::Vertex, where +// operands are stored as a string. + +#ifndef THIRD_PARTY_ZYNAMICS_BINEXPORT_READER_INSTRUCTION_H_ +#define THIRD_PARTY_ZYNAMICS_BINEXPORT_READER_INSTRUCTION_H_ + +#include +#include + +#include "third_party/absl/types/optional.h" +#include "third_party/zynamics/binexport/types.h" +#include "third_party/zynamics/binexport/architectures.h" + +namespace security { +namespace binexport { + +class Instruction { + public: + Instruction(Address address, const string& mnemonic); + const string& mnemonic() const { return mnemonic_; } + Address address() const { return address_; } + const std::vector& operands() const { return operand_indices_; } + void set_operands(const std::vector& operand_indices); + + using CallTargets = std::vector
; + + const CallTargets& call_targets() const { return call_targets_; } + void set_call_targets(const CallTargets& targets) { call_targets_ = targets; } + + private: + Address address_; + string mnemonic_; + + // Operand indices from the BinExport2 protocol buffer they where loaded from. + std::vector operand_indices_; + + // If this is a call instruction, contains potential call targets. + CallTargets call_targets_; +}; + +typedef std::vector Instructions; + +const Instruction* GetInstruction(const Instructions& instructions, + const Address instruction_address); + +// Is this a jump instruction in a given architecture. Returns false for +// unsupported architectures. +bool IsJumpInstruction(const Instruction& instruction, + absl::optional); + +} // namespace binexport +} // namespace security + +#endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_READER_INSTRUCTION_H_ diff --git a/reader/instruction_test.cc b/reader/instruction_test.cc new file mode 100644 index 00000000..0ec91870 --- /dev/null +++ b/reader/instruction_test.cc @@ -0,0 +1,71 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +// Tests the functionality of the Instruction class. + +#include "third_party/zynamics/binexport/reader/instruction.h" + +#include +#include +#include "third_party/zynamics/binexport/binexport.h" + +namespace security { +namespace binexport { +namespace { + +TEST(InstructionTest, FindInstructionValid) { + const std::vector instructions{{10000000, "mnemonic0"}, + {10001000, "mnemonic1"}, + {10002000, "mnemonic2"}, + {10003000, "mnemonic3"}, + {10004000, "mnemonic4"}}; + EXPECT_EQ(&instructions[2], GetInstruction(instructions, 10002000)); +} + +TEST(InstructionTest, FindInstructionInvalid) { + const std::vector instructions{{10000000, "mnemonic0"}, + {10001000, "mnemonic1"}, + {10002000, "mnemonic2"}, + {10003000, "mnemonic3"}, + {10004000, "mnemonic4"}}; + EXPECT_EQ(nullptr, GetInstruction(instructions, 12345678)); +} + +TEST(InstructionTest, GetInstructionAddresses) { + const int kNumInstructions = 51; + std::vector instructions(kNumInstructions); + for (int i = 0; i * i < kNumInstructions; ++i) { + instructions[i * i].set_address(100 * i); + } + for (int i = 0; i < kNumInstructions; ++i) { + instructions[i].set_raw_bytes("\5\4"); + } + + BinExport2 binexport_proto; + std::copy( + instructions.begin(), instructions.end(), + RepeatedPtrFieldBackInserter(binexport_proto.mutable_instruction())); + + std::vector
addresses = + binexport::GetAllInstructionAddresses(binexport_proto); + for (int i = 0; i * i < 51; ++i) { + for (int j = i * i; j < (i + 1) * (i + 1) && j < kNumInstructions; ++j) { + EXPECT_EQ(100 * i + (j - i * i) * 2, addresses[j]); + } + } +} + +} // namespace +} // namespace binexport +} // namespace security diff --git a/reader/reader_test_util.cc b/reader/reader_test_util.cc new file mode 100644 index 00000000..954dedf7 --- /dev/null +++ b/reader/reader_test_util.cc @@ -0,0 +1,44 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +#include "third_party/zynamics/binexport/reader/reader_test_util.h" + +#include + +#include // NOLINT +#include // NOLINT + +#include "third_party/zynamics/binexport/util/filesystem.h" +#include "third_party/zynamics/binexport/types.h" +#include "third_party/absl/strings/str_cat.h" +#include "util/task/status.h" + +namespace security { +namespace binexport { + +static string* g_test_srcdir{}; + +util::Status GetBinExportProtoForTesting(absl::string_view filename, + BinExport2* proto) { + string testfile = JoinPath(*g_test_srcdir, "testdata", filename); + std::ifstream stream(testfile.c_str(), std::ios::in | std::ios::binary); + if (!proto->ParseFromIstream(&stream)) { + return util::Status(util::error::FAILED_PRECONDITION, + absl::StrCat("Could not parse test file: ", testfile)); + } + return util::OkStatus(); +} + +} // namespace binexport +} // namespace security diff --git a/reader/reader_test_util.h b/reader/reader_test_util.h new file mode 100644 index 00000000..186f461e --- /dev/null +++ b/reader/reader_test_util.h @@ -0,0 +1,33 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +#ifndef THIRD_PARTY_ZYNAMICS_BINEXPORT_READER_READER_TEST_UTIL_H_ +#define THIRD_PARTY_ZYNAMICS_BINEXPORT_READER_READER_TEST_UTIL_H_ + +#include "third_party/absl/strings/string_view.h" +#include "third_party/zynamics/binexport/binexport2.pb.h" +#include "util/task/status.h" + +namespace security { +namespace binexport { + +// Reads a BinExport2 proto from the testdata directory. The filename is +// relative to that directory. +util::Status GetBinExportProtoForTesting(absl::string_view filename, + BinExport2* proto); + +} // namespace binexport +} // namespace security + +#endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_READER_READER_TEST_UTIL_H_ diff --git a/reader/testdata/0000500ed9f688a309ee2176462eb978efa9a2fb80fcceb5d8fd08168ea50dfd.BinExport b/reader/testdata/0000500ed9f688a309ee2176462eb978efa9a2fb80fcceb5d8fd08168ea50dfd.BinExport new file mode 100644 index 0000000000000000000000000000000000000000..a8b75307b543356c35232ee881b210e7f8261947 GIT binary patch literal 2624871 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∓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

?5! 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ⓈdRYy)kQIvRK5|}p-*faH!JjA-j?AVZ8 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 z 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%0APnxIA6r)_#P6(+corOQ@jsj|nE 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

  • 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Ξ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 m=h@kj`@_w4M@Jrv+-1p!oaO$Gd^mD +// Import macros +#define GG_LONGLONG GOOGLE_LONGLONG +#define GG_ULONGLONG GOOGLE_ULONGLONG +#define GG_LL_FORMAT GOOGLE_LL_FORMAT + // Map names from the Protocol Buffers stubs into the global namespace. using ::google::protobuf::int16; using ::google::protobuf::int32; diff --git a/stubs/base/logging.h b/stubs/base/logging.h index c8c883bf..c28c6a11 100644 --- a/stubs/base/logging.h +++ b/stubs/base/logging.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/stubs/base/macros.h b/stubs/base/macros.h new file mode 100644 index 00000000..00a7e6de --- /dev/null +++ b/stubs/base/macros.h @@ -0,0 +1,20 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +#ifndef THIRD_PARTY_ZYNAMICS_BINEXPORT_BASE_MACROS_H_ +#define THIRD_PARTY_ZYNAMICS_BINEXPORT_BASE_MACROS_H_ + +#include "third_party/absl/base/macros.h" + +#endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_BASE_MACROS_H_ diff --git a/stubs/util/task/status.h b/stubs/util/task/status.h index dab5146c..5d3b177f 100644 --- a/stubs/util/task/status.h +++ b/stubs/util/task/status.h @@ -1,4 +1,4 @@ -// Copyright 2011-2017 Google Inc. All Rights Reserved. +// Copyright 2011-2018 Google LLC. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -17,17 +17,49 @@ #include -namespace google { -namespace protobuf { +namespace absl { + +// A struct that provides identical syntax to Abseil's enum class. +struct StatusCode { + StatusCode() = delete; + static constexpr auto kOk = ::google::protobuf::util::error::OK; + static constexpr auto kCancelled = ::google::protobuf::util::error::CANCELLED; + static constexpr auto kUnknown = ::google::protobuf::util::error::UNKNOWN; + static constexpr auto kInvalidArgument = + ::google::protobuf::util::error::INVALID_ARGUMENT; + static constexpr auto kDeadlineExceeded = + ::google::protobuf::util::error::DEADLINE_EXCEEDED; + static constexpr auto kNotFound = ::google::protobuf::util::error::NOT_FOUND; + static constexpr auto kAlreadyExists = + ::google::protobuf::util::error::ALREADY_EXISTS; + static constexpr auto kPermissionDenied = + ::google::protobuf::util::error::PERMISSION_DENIED; + static constexpr auto kResourceExhausted = + ::google::protobuf::util::error::RESOURCE_EXHAUSTED; + static constexpr auto kFailedPrecondition = + ::google::protobuf::util::error::FAILED_PRECONDITION; + static constexpr auto kAborted = ::google::protobuf::util::error::ABORTED; + static constexpr auto kOutOfRange = + ::google::protobuf::util::error::OUT_OF_RANGE; + static constexpr auto kUnimplemented = + ::google::protobuf::util::error::UNIMPLEMENTED; + static constexpr auto kInternal = ::google::protobuf::util::error::INTERNAL; + static constexpr auto kUnavailable = + ::google::protobuf::util::error::UNAVAILABLE; + static constexpr auto kDataLoss = ::google::protobuf::util::error::DATA_LOSS; + static constexpr auto kUnauthenticated = + ::google::protobuf::util::error::UNAUTHENTICATED; +}; + +} // namespace absl + namespace util { -inline Status OkStatus() { return Status(); } +// Map the namespace from the Protocol Buffers. +using namespace ::google::protobuf::util; // NOLINT(build/namespaces) -} // namespace util -} // namespace protobuf -} // namespace google +inline Status OkStatus() { return Status{}; } -// Map the namespace from the Protocol Buffers stubs to the global namespace. -namespace util = ::google::protobuf::util; // NOLINT(build/namespaces) +} // namespace util #endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_UTIL_TASK_STATUS_H_ diff --git a/stubs/util/task/status_macros.h b/stubs/util/task/status_macros.h new file mode 100644 index 00000000..e5d5e0a6 --- /dev/null +++ b/stubs/util/task/status_macros.h @@ -0,0 +1,49 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +#ifndef THIRD_PARTY_ZYNAMICS_BINEXPORT_UTIL_TASK_STATUS_MACROS_H_ +#define THIRD_PARTY_ZYNAMICS_BINEXPORT_UTIL_TASK_STATUS_MACROS_H_ + +#include + +namespace util { + +// Map the namespace from the Protocol Buffers. +using namespace ::google::protobuf::util; // NOLINT(build/namespaces) + +} // namespace util + +// To be able to use the macros, Status needs to be visible (bug in +// Protobuf's status_macros.h). +namespace security { +namespace bindiff { +using ::util::Status; +} // namespace bindiff +namespace binexport { +using ::util::Status; +} // namespace binexport +} // namespace security + +// To be able to use the macros, Status needs to be visible (bug in +// status_macros.h). +namespace security { +namespace bindiff { +using ::google::protobuf::util::Status; +} // namespace bindiff +namespace binexport { +using ::google::protobuf::util::Status; +} // namespace binexport +} // namespace security + +#endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_UTIL_TASK_STATUS_MACROS_H_ diff --git a/stubs/util/task/statusor.h b/stubs/util/task/statusor.h new file mode 100644 index 00000000..84e37ec9 --- /dev/null +++ b/stubs/util/task/statusor.h @@ -0,0 +1,27 @@ +// Copyright 2011-2018 Google LLC. All Rights Reserved. +// +// 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. + +#ifndef THIRD_PARTY_ZYNAMICS_BINEXPORT_UTIL_TASK_STATUSOR_H_ +#define THIRD_PARTY_ZYNAMICS_BINEXPORT_UTIL_TASK_STATUSOR_H_ + +#include + +namespace util { + +// Map the namespace from the Protocol Buffers. +using namespace ::google::protobuf::util; // NOLINT(build/namespaces) + +} // namespace util + +#endif // THIRD_PARTY_ZYNAMICS_BINEXPORT_UTIL_TASK_STATUSOR_H_ diff --git a/third_party/boost_parts/boost/algorithm/string.hpp b/third_party/boost_parts/boost/algorithm/string.hpp deleted file mode 100644 index 07715173..00000000 --- a/third_party/boost_parts/boost/algorithm/string.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// Boost string_algo library string_algo.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-2004. -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/ for updates, documentation, and revision history. - -#ifndef BOOST_STRING_ALGO_HPP -#define BOOST_STRING_ALGO_HPP - -/*! \file - Cumulative include for string_algo library -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#endif // BOOST_STRING_ALGO_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/case_conv.hpp b/third_party/boost_parts/boost/algorithm/string/case_conv.hpp deleted file mode 100644 index 683340b8..00000000 --- a/third_party/boost_parts/boost/algorithm/string/case_conv.hpp +++ /dev/null @@ -1,176 +0,0 @@ -// Boost string_algo library case_conv.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_CASE_CONV_HPP -#define BOOST_STRING_CASE_CONV_HPP - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -/*! \file - Defines sequence case-conversion algorithms. - Algorithms convert each element in the input sequence to the - desired case using provided locales. -*/ - -namespace boost { - namespace algorithm { - -// to_lower -----------------------------------------------// - - //! Convert to lower case - /*! - Each element of the input sequence is converted to lower - case. The result is a copy of the input converted to lower case. - It is returned as a sequence or copied to the output iterator. - - \param Output An output iterator to which the result will be copied - \param Input An input range - \param Loc A locale used for conversion - \return - An output iterator pointing just after the last inserted character or - a copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - - */ - template - inline OutputIteratorT - to_lower_copy( - OutputIteratorT Output, - const RangeT& Input, - const std::locale& Loc=std::locale()) - { - return ::boost::algorithm::detail::transform_range_copy( - Output, - ::boost::as_literal(Input), - ::boost::algorithm::detail::to_lowerF< - typename range_value::type >(Loc)); - } - - //! Convert to lower case - /*! - \overload - */ - template - inline SequenceT to_lower_copy( - const SequenceT& Input, - const std::locale& Loc=std::locale()) - { - return ::boost::algorithm::detail::transform_range_copy( - Input, - ::boost::algorithm::detail::to_lowerF< - typename range_value::type >(Loc)); - } - - //! Convert to lower case - /*! - Each element of the input sequence is converted to lower - case. The input sequence is modified in-place. - - \param Input A range - \param Loc a locale used for conversion - */ - template - inline void to_lower( - WritableRangeT& Input, - const std::locale& Loc=std::locale()) - { - ::boost::algorithm::detail::transform_range( - ::boost::as_literal(Input), - ::boost::algorithm::detail::to_lowerF< - typename range_value::type >(Loc)); - } - -// to_upper -----------------------------------------------// - - //! Convert to upper case - /*! - Each element of the input sequence is converted to upper - case. The result is a copy of the input converted to upper case. - It is returned as a sequence or copied to the output iterator - - \param Output An output iterator to which the result will be copied - \param Input An input range - \param Loc A locale used for conversion - \return - An output iterator pointing just after the last inserted character or - a copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template - inline OutputIteratorT - to_upper_copy( - OutputIteratorT Output, - const RangeT& Input, - const std::locale& Loc=std::locale()) - { - return ::boost::algorithm::detail::transform_range_copy( - Output, - ::boost::as_literal(Input), - ::boost::algorithm::detail::to_upperF< - typename range_value::type >(Loc)); - } - - //! Convert to upper case - /*! - \overload - */ - template - inline SequenceT to_upper_copy( - const SequenceT& Input, - const std::locale& Loc=std::locale()) - { - return ::boost::algorithm::detail::transform_range_copy( - Input, - ::boost::algorithm::detail::to_upperF< - typename range_value::type >(Loc)); - } - - //! Convert to upper case - /*! - Each element of the input sequence is converted to upper - case. The input sequence is modified in-place. - - \param Input An input range - \param Loc a locale used for conversion - */ - template - inline void to_upper( - WritableRangeT& Input, - const std::locale& Loc=std::locale()) - { - ::boost::algorithm::detail::transform_range( - ::boost::as_literal(Input), - ::boost::algorithm::detail::to_upperF< - typename range_value::type >(Loc)); - } - - } // namespace algorithm - - // pull names to the boost namespace - using algorithm::to_lower; - using algorithm::to_lower_copy; - using algorithm::to_upper; - using algorithm::to_upper_copy; - -} // namespace boost - -#endif // BOOST_STRING_CASE_CONV_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/classification.hpp b/third_party/boost_parts/boost/algorithm/string/classification.hpp deleted file mode 100644 index ca43602d..00000000 --- a/third_party/boost_parts/boost/algorithm/string/classification.hpp +++ /dev/null @@ -1,312 +0,0 @@ -// Boost string_algo library classification.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_CLASSIFICATION_HPP -#define BOOST_STRING_CLASSIFICATION_HPP - -#include -#include -#include -#include -#include -#include - - -/*! \file - Classification predicates are included in the library to give - some more convenience when using algorithms like \c trim() and \c all(). - They wrap functionality of STL classification functions ( e.g. \c std::isspace() ) - into generic functors. -*/ - -namespace boost { - namespace algorithm { - -// classification functor generator -------------------------------------// - - //! is_classified predicate - /*! - Construct the \c is_classified predicate. This predicate holds if the input is - of specified \c std::ctype category. - - \param Type A \c std::ctype category - \param Loc A locale used for classification - \return An instance of the \c is_classified predicate - */ - inline detail::is_classifiedF - is_classified(std::ctype_base::mask Type, const std::locale& Loc=std::locale()) - { - return detail::is_classifiedF(Type, Loc); - } - - //! is_space predicate - /*! - Construct the \c is_classified predicate for the \c ctype_base::space category. - - \param Loc A locale used for classification - \return An instance of the \c is_classified predicate - */ - inline detail::is_classifiedF - is_space(const std::locale& Loc=std::locale()) - { - return detail::is_classifiedF(std::ctype_base::space, Loc); - } - - //! is_alnum predicate - /*! - Construct the \c is_classified predicate for the \c ctype_base::alnum category. - - \param Loc A locale used for classification - \return An instance of the \c is_classified predicate - */ - inline detail::is_classifiedF - is_alnum(const std::locale& Loc=std::locale()) - { - return detail::is_classifiedF(std::ctype_base::alnum, Loc); - } - - //! is_alpha predicate - /*! - Construct the \c is_classified predicate for the \c ctype_base::alpha category. - - \param Loc A locale used for classification - \return An instance of the \c is_classified predicate - */ - inline detail::is_classifiedF - is_alpha(const std::locale& Loc=std::locale()) - { - return detail::is_classifiedF(std::ctype_base::alpha, Loc); - } - - //! is_cntrl predicate - /*! - Construct the \c is_classified predicate for the \c ctype_base::cntrl category. - - \param Loc A locale used for classification - \return An instance of the \c is_classified predicate - */ - inline detail::is_classifiedF - is_cntrl(const std::locale& Loc=std::locale()) - { - return detail::is_classifiedF(std::ctype_base::cntrl, Loc); - } - - //! is_digit predicate - /*! - Construct the \c is_classified predicate for the \c ctype_base::digit category. - - \param Loc A locale used for classification - \return An instance of the \c is_classified predicate - */ - inline detail::is_classifiedF - is_digit(const std::locale& Loc=std::locale()) - { - return detail::is_classifiedF(std::ctype_base::digit, Loc); - } - - //! is_graph predicate - /*! - Construct the \c is_classified predicate for the \c ctype_base::graph category. - - \param Loc A locale used for classification - \return An instance of the \c is_classified predicate - */ - inline detail::is_classifiedF - is_graph(const std::locale& Loc=std::locale()) - { - return detail::is_classifiedF(std::ctype_base::graph, Loc); - } - - //! is_lower predicate - /*! - Construct the \c is_classified predicate for the \c ctype_base::lower category. - - \param Loc A locale used for classification - \return An instance of \c is_classified predicate - */ - inline detail::is_classifiedF - is_lower(const std::locale& Loc=std::locale()) - { - return detail::is_classifiedF(std::ctype_base::lower, Loc); - } - - //! is_print predicate - /*! - Construct the \c is_classified predicate for the \c ctype_base::print category. - - \param Loc A locale used for classification - \return An instance of the \c is_classified predicate - */ - inline detail::is_classifiedF - is_print(const std::locale& Loc=std::locale()) - { - return detail::is_classifiedF(std::ctype_base::print, Loc); - } - - //! is_punct predicate - /*! - Construct the \c is_classified predicate for the \c ctype_base::punct category. - - \param Loc A locale used for classification - \return An instance of the \c is_classified predicate - */ - inline detail::is_classifiedF - is_punct(const std::locale& Loc=std::locale()) - { - return detail::is_classifiedF(std::ctype_base::punct, Loc); - } - - //! is_upper predicate - /*! - Construct the \c is_classified predicate for the \c ctype_base::upper category. - - \param Loc A locale used for classification - \return An instance of the \c is_classified predicate - */ - inline detail::is_classifiedF - is_upper(const std::locale& Loc=std::locale()) - { - return detail::is_classifiedF(std::ctype_base::upper, Loc); - } - - //! is_xdigit predicate - /*! - Construct the \c is_classified predicate for the \c ctype_base::xdigit category. - - \param Loc A locale used for classification - \return An instance of the \c is_classified predicate - */ - inline detail::is_classifiedF - is_xdigit(const std::locale& Loc=std::locale()) - { - return detail::is_classifiedF(std::ctype_base::xdigit, Loc); - } - - //! is_any_of predicate - /*! - Construct the \c is_any_of predicate. The predicate holds if the input - is included in the specified set of characters. - - \param Set A set of characters to be recognized - \return An instance of the \c is_any_of predicate - */ - template - inline detail::is_any_ofF< - BOOST_STRING_TYPENAME range_value::type> - is_any_of( const RangeT& Set ) - { - iterator_range::type> lit_set(boost::as_literal(Set)); - return detail::is_any_ofF::type>(lit_set); - } - - //! is_from_range predicate - /*! - Construct the \c is_from_range predicate. The predicate holds if the input - is included in the specified range. (i.e. From <= Ch <= To ) - - \param From The start of the range - \param To The end of the range - \return An instance of the \c is_from_range predicate - */ - template - inline detail::is_from_rangeF is_from_range(CharT From, CharT To) - { - return detail::is_from_rangeF(From,To); - } - - // predicate combinators ---------------------------------------------------// - - //! predicate 'and' composition predicate - /*! - Construct the \c class_and predicate. This predicate can be used - to logically combine two classification predicates. \c class_and holds, - if both predicates return true. - - \param Pred1 The first predicate - \param Pred2 The second predicate - \return An instance of the \c class_and predicate - */ - template - inline detail::pred_andF - operator&&( - const predicate_facade& Pred1, - const predicate_facade& Pred2 ) - { - // Doing the static_cast with the pointer instead of the reference - // is a workaround for some compilers which have problems with - // static_cast's of template references, i.e. CW8. /grafik/ - return detail::pred_andF( - *static_cast(&Pred1), - *static_cast(&Pred2) ); - } - - //! predicate 'or' composition predicate - /*! - Construct the \c class_or predicate. This predicate can be used - to logically combine two classification predicates. \c class_or holds, - if one of the predicates return true. - - \param Pred1 The first predicate - \param Pred2 The second predicate - \return An instance of the \c class_or predicate - */ - template - inline detail::pred_orF - operator||( - const predicate_facade& Pred1, - const predicate_facade& Pred2 ) - { - // Doing the static_cast with the pointer instead of the reference - // is a workaround for some compilers which have problems with - // static_cast's of template references, i.e. CW8. /grafik/ - return detail::pred_orF( - *static_cast(&Pred1), - *static_cast(&Pred2)); - } - - //! predicate negation operator - /*! - Construct the \c class_not predicate. This predicate represents a negation. - \c class_or holds if of the predicates return false. - - \param Pred The predicate to be negated - \return An instance of the \c class_not predicate - */ - template - inline detail::pred_notF - operator!( const predicate_facade& Pred ) - { - // Doing the static_cast with the pointer instead of the reference - // is a workaround for some compilers which have problems with - // static_cast's of template references, i.e. CW8. /grafik/ - return detail::pred_notF(*static_cast(&Pred)); - } - - } // namespace algorithm - - // pull names to the boost namespace - using algorithm::is_classified; - using algorithm::is_space; - using algorithm::is_alnum; - using algorithm::is_alpha; - using algorithm::is_cntrl; - using algorithm::is_digit; - using algorithm::is_graph; - using algorithm::is_lower; - using algorithm::is_upper; - using algorithm::is_print; - using algorithm::is_punct; - using algorithm::is_xdigit; - using algorithm::is_any_of; - using algorithm::is_from_range; - -} // namespace boost - -#endif // BOOST_STRING_PREDICATE_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/compare.hpp b/third_party/boost_parts/boost/algorithm/string/compare.hpp deleted file mode 100644 index 734303a9..00000000 --- a/third_party/boost_parts/boost/algorithm/string/compare.hpp +++ /dev/null @@ -1,199 +0,0 @@ -// Boost string_algo library compare.hpp header file -------------------------// - -// Copyright Pavol Droba 2002-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) - -// See http://www.boost.org/ for updates, documentation, and revision history. - -#ifndef BOOST_STRING_COMPARE_HPP -#define BOOST_STRING_COMPARE_HPP - -#include -#include - -/*! \file - Defines element comparison predicates. Many algorithms in this library can - take an additional argument with a predicate used to compare elements. - This makes it possible, for instance, to have case insensitive versions - of the algorithms. -*/ - -namespace boost { - namespace algorithm { - - // is_equal functor -----------------------------------------------// - - //! is_equal functor - /*! - Standard STL equal_to only handle comparison between arguments - of the same type. This is a less restrictive version which wraps operator ==. - */ - struct is_equal - { - //! Function operator - /*! - Compare two operands for equality - */ - template< typename T1, typename T2 > - bool operator()( const T1& Arg1, const T2& Arg2 ) const - { - return Arg1==Arg2; - } - }; - - //! case insensitive version of is_equal - /*! - Case insensitive comparison predicate. Comparison is done using - specified locales. - */ - struct is_iequal - { - //! Constructor - /*! - \param Loc locales used for comparison - */ - is_iequal( const std::locale& Loc=std::locale() ) : - m_Loc( Loc ) {} - - //! Function operator - /*! - Compare two operands. Case is ignored. - */ - template< typename T1, typename T2 > - bool operator()( const T1& Arg1, const T2& Arg2 ) const - { - #if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL) - return std::toupper(Arg1)==std::toupper(Arg2); - #else - return std::toupper(Arg1,m_Loc)==std::toupper(Arg2,m_Loc); - #endif - } - - private: - std::locale m_Loc; - }; - - // is_less functor -----------------------------------------------// - - //! is_less functor - /*! - Convenient version of standard std::less. Operation is templated, therefore it is - not required to specify the exact types upon the construction - */ - struct is_less - { - //! Functor operation - /*! - Compare two operands using > operator - */ - template< typename T1, typename T2 > - bool operator()( const T1& Arg1, const T2& Arg2 ) const - { - return Arg1 - bool operator()( const T1& Arg1, const T2& Arg2 ) const - { - #if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL) - return std::toupper(Arg1)(Arg1,m_Loc)(Arg2,m_Loc); - #endif - } - - private: - std::locale m_Loc; - }; - - // is_not_greater functor -----------------------------------------------// - - //! is_not_greater functor - /*! - Convenient version of standard std::not_greater_to. Operation is templated, therefore it is - not required to specify the exact types upon the construction - */ - struct is_not_greater - { - //! Functor operation - /*! - Compare two operands using > operator - */ - template< typename T1, typename T2 > - bool operator()( const T1& Arg1, const T2& Arg2 ) const - { - return Arg1<=Arg2; - } - }; - - - //! case insensitive version of is_not_greater - /*! - Case insensitive comparison predicate. Comparison is done using - specified locales. - */ - struct is_not_igreater - { - //! Constructor - /*! - \param Loc locales used for comparison - */ - is_not_igreater( const std::locale& Loc=std::locale() ) : - m_Loc( Loc ) {} - - //! Function operator - /*! - Compare two operands. Case is ignored. - */ - template< typename T1, typename T2 > - bool operator()( const T1& Arg1, const T2& Arg2 ) const - { - #if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL) - return std::toupper(Arg1)<=std::toupper(Arg2); - #else - return std::toupper(Arg1,m_Loc)<=std::toupper(Arg2,m_Loc); - #endif - } - - private: - std::locale m_Loc; - }; - - - } // namespace algorithm - - // pull names to the boost namespace - using algorithm::is_equal; - using algorithm::is_iequal; - using algorithm::is_less; - using algorithm::is_iless; - using algorithm::is_not_greater; - using algorithm::is_not_igreater; - -} // namespace boost - - -#endif // BOOST_STRING_COMPARE_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/concept.hpp b/third_party/boost_parts/boost/algorithm/string/concept.hpp deleted file mode 100644 index 17e83495..00000000 --- a/third_party/boost_parts/boost/algorithm/string/concept.hpp +++ /dev/null @@ -1,83 +0,0 @@ -// Boost string_algo library concept.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_CONCEPT_HPP -#define BOOST_STRING_CONCEPT_HPP - -#include -#include -#include -#include - -/*! \file - Defines concepts used in string_algo library -*/ - -namespace boost { - namespace algorithm { - - //! Finder concept - /*! - Defines the Finder concept. Finder is a functor which selects - an arbitrary part of a string. Search is performed on - the range specified by starting and ending iterators. - - Result of the find operation must be convertible to iterator_range. - */ - template - struct FinderConcept - { - private: - typedef iterator_range range; - public: - void constraints() - { - // Operation - r=(*pF)(i,i); - } - private: - range r; - IteratorT i; - FinderT* pF; - }; // Finder_concept - - - //! Formatter concept - /*! - Defines the Formatter concept. Formatter is a functor, which - takes a result from a finder operation and transforms it - in a specific way. - - Result must be a container supported by container_traits, - or a reference to it. - */ - template - struct FormatterConcept - { - public: - void constraints() - { - // Operation - ::boost::begin((*pFo)( (*pF)(i,i) )); - ::boost::end((*pFo)( (*pF)(i,i) )); - } - private: - IteratorT i; - FinderT* pF; - FormatterT *pFo; - }; // FormatterConcept; - - } // namespace algorithm -} // namespace boost - - - - -#endif // BOOST_STRING_CONCEPT_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/config.hpp b/third_party/boost_parts/boost/algorithm/string/config.hpp deleted file mode 100644 index 559750ac..00000000 --- a/third_party/boost_parts/boost/algorithm/string/config.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// Boost string_algo library config.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_CONFIG_HPP -#define BOOST_STRING_CONFIG_HPP - -#include -#include - -#ifdef BOOST_STRING_DEDUCED_TYPENAME -# error "macro already defined!" -#endif - -#define BOOST_STRING_TYPENAME BOOST_DEDUCED_TYPENAME - -// Metrowerks workaround -#if BOOST_WORKAROUND(__MWERKS__, <= 0x3003) // 8.x -#pragma parse_func_templ off -#endif - -#endif // BOOST_STRING_CONFIG_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/constants.hpp b/third_party/boost_parts/boost/algorithm/string/constants.hpp deleted file mode 100644 index 6ed70eff..00000000 --- a/third_party/boost_parts/boost/algorithm/string/constants.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// Boost string_algo library constants.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_CONSTANTS_HPP -#define BOOST_STRING_CONSTANTS_HPP - -namespace boost { - namespace algorithm { - - //! Token compression mode - /*! - Specifies token compression mode for the token_finder. - */ - enum token_compress_mode_type - { - token_compress_on, //!< Compress adjacent tokens - token_compress_off //!< Do not compress adjacent tokens - }; - - } // namespace algorithm - - // pull the names to the boost namespace - using algorithm::token_compress_on; - using algorithm::token_compress_off; - -} // namespace boost - -#endif // BOOST_STRING_CONSTANTS_HPP - diff --git a/third_party/boost_parts/boost/algorithm/string/detail/case_conv.hpp b/third_party/boost_parts/boost/algorithm/string/detail/case_conv.hpp deleted file mode 100644 index 42621c74..00000000 --- a/third_party/boost_parts/boost/algorithm/string/detail/case_conv.hpp +++ /dev/null @@ -1,123 +0,0 @@ -// Boost string_algo library string_funct.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_CASE_CONV_DETAIL_HPP -#define BOOST_STRING_CASE_CONV_DETAIL_HPP - -#include -#include -#include - -#include - -namespace boost { - namespace algorithm { - namespace detail { - -// case conversion functors -----------------------------------------------// - -#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) -#pragma warning(push) -#pragma warning(disable:4512) //assignment operator could not be generated -#endif - - // a tolower functor - template - struct to_lowerF : public std::unary_function - { - // Constructor - to_lowerF( const std::locale& Loc ) : m_Loc( &Loc ) {} - - // Operation - CharT operator ()( CharT Ch ) const - { - #if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL) - return std::tolower( static_cast::type> ( Ch )); - #else - return std::tolower( Ch, *m_Loc ); - #endif - } - private: - const std::locale* m_Loc; - }; - - // a toupper functor - template - struct to_upperF : public std::unary_function - { - // Constructor - to_upperF( const std::locale& Loc ) : m_Loc( &Loc ) {} - - // Operation - CharT operator ()( CharT Ch ) const - { - #if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL) - return std::toupper( static_cast::type> ( Ch )); - #else - return std::toupper( Ch, *m_Loc ); - #endif - } - private: - const std::locale* m_Loc; - }; - -#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) -#pragma warning(pop) -#endif - -// algorithm implementation ------------------------------------------------------------------------- - - // Transform a range - template - OutputIteratorT transform_range_copy( - OutputIteratorT Output, - const RangeT& Input, - FunctorT Functor) - { - return std::transform( - ::boost::begin(Input), - ::boost::end(Input), - Output, - Functor); - } - - // Transform a range (in-place) - template - void transform_range( - const RangeT& Input, - FunctorT Functor) - { - std::transform( - ::boost::begin(Input), - ::boost::end(Input), - ::boost::begin(Input), - Functor); - } - - template - inline SequenceT transform_range_copy( - const RangeT& Input, - FunctorT Functor) - { - return SequenceT( - ::boost::make_transform_iterator( - ::boost::begin(Input), - Functor), - ::boost::make_transform_iterator( - ::boost::end(Input), - Functor)); - } - - } // namespace detail - } // namespace algorithm -} // namespace boost - - -#endif // BOOST_STRING_CASE_CONV_DETAIL_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/detail/classification.hpp b/third_party/boost_parts/boost/algorithm/string/detail/classification.hpp deleted file mode 100644 index 704d9d20..00000000 --- a/third_party/boost_parts/boost/algorithm/string/detail/classification.hpp +++ /dev/null @@ -1,353 +0,0 @@ -// Boost string_algo library classification.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_CLASSIFICATION_DETAIL_HPP -#define BOOST_STRING_CLASSIFICATION_DETAIL_HPP - -#include -#include -#include -#include - -#include -#include - -#include -#include - -namespace boost { - namespace algorithm { - namespace detail { - -// classification functors -----------------------------------------------// - - // is_classified functor - struct is_classifiedF : - public predicate_facade - { - // Boost.ResultOf support - typedef bool result_type; - - // Constructor from a locale - is_classifiedF(std::ctype_base::mask Type, std::locale const & Loc = std::locale()) : - m_Type(Type), m_Locale(Loc) {} - // Operation - template - bool operator()( CharT Ch ) const - { - return std::use_facet< std::ctype >(m_Locale).is( m_Type, Ch ); - } - - #if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x582) && !defined(_USE_OLD_RW_STL) - template<> - bool operator()( char const Ch ) const - { - return std::use_facet< std::ctype >(m_Locale).is( m_Type, Ch ); - } - #endif - - private: - std::ctype_base::mask m_Type; - std::locale m_Locale; - }; - - - // is_any_of functor - /* - returns true if the value is from the specified set - */ - template - struct is_any_ofF : - public predicate_facade > - { - private: - // set cannot operate on const value-type - typedef typename ::boost::remove_const::type set_value_type; - - public: - // Boost.ResultOf support - typedef bool result_type; - - // Constructor - template - is_any_ofF( const RangeT& Range ) : m_Size(0) - { - // Prepare storage - m_Storage.m_dynSet=0; - - std::size_t Size=::boost::distance(Range); - m_Size=Size; - set_value_type* Storage=0; - - if(use_fixed_storage(m_Size)) - { - // Use fixed storage - Storage=&m_Storage.m_fixSet[0]; - } - else - { - // Use dynamic storage - m_Storage.m_dynSet=new set_value_type[m_Size]; - Storage=m_Storage.m_dynSet; - } - - // Use fixed storage - ::std::copy(::boost::begin(Range), ::boost::end(Range), Storage); - ::std::sort(Storage, Storage+m_Size); - } - - // Copy constructor - is_any_ofF(const is_any_ofF& Other) : m_Size(Other.m_Size) - { - // Prepare storage - m_Storage.m_dynSet=0; - const set_value_type* SrcStorage=0; - set_value_type* DestStorage=0; - - if(use_fixed_storage(m_Size)) - { - // Use fixed storage - DestStorage=&m_Storage.m_fixSet[0]; - SrcStorage=&Other.m_Storage.m_fixSet[0]; - } - else - { - // Use dynamic storage - m_Storage.m_dynSet=new set_value_type[m_Size]; - DestStorage=m_Storage.m_dynSet; - SrcStorage=Other.m_Storage.m_dynSet; - } - - // Use fixed storage - ::std::memcpy(DestStorage, SrcStorage, sizeof(set_value_type)*m_Size); - } - - // Destructor - ~is_any_ofF() - { - if(!use_fixed_storage(m_Size) && m_Storage.m_dynSet!=0) - { - delete [] m_Storage.m_dynSet; - } - } - - // Assignment - is_any_ofF& operator=(const is_any_ofF& Other) - { - // Handle self assignment - if(this==&Other) return *this; - - // Prepare storage - const set_value_type* SrcStorage; - set_value_type* DestStorage; - - if(use_fixed_storage(Other.m_Size)) - { - // Use fixed storage - DestStorage=&m_Storage.m_fixSet[0]; - SrcStorage=&Other.m_Storage.m_fixSet[0]; - - // Delete old storage if was present - if(!use_fixed_storage(m_Size) && m_Storage.m_dynSet!=0) - { - delete [] m_Storage.m_dynSet; - } - - // Set new size - m_Size=Other.m_Size; - } - else - { - // Other uses dynamic storage - SrcStorage=Other.m_Storage.m_dynSet; - - // Check what kind of storage are we using right now - if(use_fixed_storage(m_Size)) - { - // Using fixed storage, allocate new - set_value_type* pTemp=new set_value_type[Other.m_Size]; - DestStorage=pTemp; - m_Storage.m_dynSet=pTemp; - m_Size=Other.m_Size; - } - else - { - // Using dynamic storage, check if can reuse - if(m_Storage.m_dynSet!=0 && m_Size>=Other.m_Size && m_Size - bool operator()( Char2T Ch ) const - { - const set_value_type* Storage= - (use_fixed_storage(m_Size)) - ? &m_Storage.m_fixSet[0] - : m_Storage.m_dynSet; - - return ::std::binary_search(Storage, Storage+m_Size, Ch); - } - private: - // check if the size is eligible for fixed storage - static bool use_fixed_storage(std::size_t size) - { - return size<=sizeof(set_value_type*)*2; - } - - - private: - // storage - // The actual used storage is selected on the type - union - { - set_value_type* m_dynSet; - set_value_type m_fixSet[sizeof(set_value_type*)*2]; - } - m_Storage; - - // storage size - ::std::size_t m_Size; - }; - - // is_from_range functor - /* - returns true if the value is from the specified range. - (i.e. x>=From && x>=To) - */ - template - struct is_from_rangeF : - public predicate_facade< is_from_rangeF > - { - // Boost.ResultOf support - typedef bool result_type; - - // Constructor - is_from_rangeF( CharT From, CharT To ) : m_From(From), m_To(To) {} - - // Operation - template - bool operator()( Char2T Ch ) const - { - return ( m_From <= Ch ) && ( Ch <= m_To ); - } - - private: - CharT m_From; - CharT m_To; - }; - - // class_and composition predicate - template - struct pred_andF : - public predicate_facade< pred_andF > - { - public: - - // Boost.ResultOf support - typedef bool result_type; - - // Constructor - pred_andF( Pred1T Pred1, Pred2T Pred2 ) : - m_Pred1(Pred1), m_Pred2(Pred2) {} - - // Operation - template - bool operator()( CharT Ch ) const - { - return m_Pred1(Ch) && m_Pred2(Ch); - } - - private: - Pred1T m_Pred1; - Pred2T m_Pred2; - }; - - // class_or composition predicate - template - struct pred_orF : - public predicate_facade< pred_orF > - { - public: - // Boost.ResultOf support - typedef bool result_type; - - // Constructor - pred_orF( Pred1T Pred1, Pred2T Pred2 ) : - m_Pred1(Pred1), m_Pred2(Pred2) {} - - // Operation - template - bool operator()( CharT Ch ) const - { - return m_Pred1(Ch) || m_Pred2(Ch); - } - - private: - Pred1T m_Pred1; - Pred2T m_Pred2; - }; - - // class_not composition predicate - template< typename PredT > - struct pred_notF : - public predicate_facade< pred_notF > - { - public: - // Boost.ResultOf support - typedef bool result_type; - - // Constructor - pred_notF( PredT Pred ) : m_Pred(Pred) {} - - // Operation - template - bool operator()( CharT Ch ) const - { - return !m_Pred(Ch); - } - - private: - PredT m_Pred; - }; - - } // namespace detail - } // namespace algorithm -} // namespace boost - - -#endif // BOOST_STRING_CLASSIFICATION_DETAIL_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/detail/find_format.hpp b/third_party/boost_parts/boost/algorithm/string/detail/find_format.hpp deleted file mode 100644 index b3987502..00000000 --- a/third_party/boost_parts/boost/algorithm/string/detail/find_format.hpp +++ /dev/null @@ -1,204 +0,0 @@ -// Boost string_algo library find_format.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_FIND_FORMAT_DETAIL_HPP -#define BOOST_STRING_FIND_FORMAT_DETAIL_HPP - -#include -#include -#include -#include -#include -#include - -namespace boost { - namespace algorithm { - namespace detail { - -// find_format_copy (iterator variant) implementation -------------------------------// - - template< - typename OutputIteratorT, - typename InputT, - typename FormatterT, - typename FindResultT, - typename FormatResultT > - inline OutputIteratorT find_format_copy_impl2( - OutputIteratorT Output, - const InputT& Input, - FormatterT Formatter, - const FindResultT& FindResult, - const FormatResultT& FormatResult ) - { - typedef find_format_store< - BOOST_STRING_TYPENAME - range_const_iterator::type, - FormatterT, - FormatResultT > store_type; - - // Create store for the find result - store_type M( FindResult, FormatResult, Formatter ); - - if ( !M ) - { - // Match not found - return original sequence - Output = std::copy( ::boost::begin(Input), ::boost::end(Input), Output ); - return Output; - } - - // Copy the beginning of the sequence - Output = std::copy( ::boost::begin(Input), ::boost::begin(M), Output ); - // Format find result - // Copy formatted result - Output = std::copy( ::boost::begin(M.format_result()), ::boost::end(M.format_result()), Output ); - // Copy the rest of the sequence - Output = std::copy( M.end(), ::boost::end(Input), Output ); - - return Output; - } - - template< - typename OutputIteratorT, - typename InputT, - typename FormatterT, - typename FindResultT > - inline OutputIteratorT find_format_copy_impl( - OutputIteratorT Output, - const InputT& Input, - FormatterT Formatter, - const FindResultT& FindResult ) - { - if( ::boost::algorithm::detail::check_find_result(Input, FindResult) ) { - return ::boost::algorithm::detail::find_format_copy_impl2( - Output, - Input, - Formatter, - FindResult, - Formatter(FindResult) ); - } else { - return std::copy( ::boost::begin(Input), ::boost::end(Input), Output ); - } - } - - -// find_format_copy implementation --------------------------------------------------// - - template< - typename InputT, - typename FormatterT, - typename FindResultT, - typename FormatResultT > - inline InputT find_format_copy_impl2( - const InputT& Input, - FormatterT Formatter, - const FindResultT& FindResult, - const FormatResultT& FormatResult) - { - typedef find_format_store< - BOOST_STRING_TYPENAME - range_const_iterator::type, - FormatterT, - FormatResultT > store_type; - - // Create store for the find result - store_type M( FindResult, FormatResult, Formatter ); - - if ( !M ) - { - // Match not found - return original sequence - return InputT( Input ); - } - - InputT Output; - // Copy the beginning of the sequence - boost::algorithm::detail::insert( Output, ::boost::end(Output), ::boost::begin(Input), M.begin() ); - // Copy formatted result - boost::algorithm::detail::insert( Output, ::boost::end(Output), M.format_result() ); - // Copy the rest of the sequence - boost::algorithm::detail::insert( Output, ::boost::end(Output), M.end(), ::boost::end(Input) ); - - return Output; - } - - template< - typename InputT, - typename FormatterT, - typename FindResultT > - inline InputT find_format_copy_impl( - const InputT& Input, - FormatterT Formatter, - const FindResultT& FindResult) - { - if( ::boost::algorithm::detail::check_find_result(Input, FindResult) ) { - return ::boost::algorithm::detail::find_format_copy_impl2( - Input, - Formatter, - FindResult, - Formatter(FindResult) ); - } else { - return Input; - } - } - - // replace implementation ----------------------------------------------------// - - template< - typename InputT, - typename FormatterT, - typename FindResultT, - typename FormatResultT > - inline void find_format_impl2( - InputT& Input, - FormatterT Formatter, - const FindResultT& FindResult, - const FormatResultT& FormatResult) - { - typedef find_format_store< - BOOST_STRING_TYPENAME - range_iterator::type, - FormatterT, - FormatResultT > store_type; - - // Create store for the find result - store_type M( FindResult, FormatResult, Formatter ); - - if ( !M ) - { - // Search not found - return original sequence - return; - } - - // Replace match - ::boost::algorithm::detail::replace( Input, M.begin(), M.end(), M.format_result() ); - } - - template< - typename InputT, - typename FormatterT, - typename FindResultT > - inline void find_format_impl( - InputT& Input, - FormatterT Formatter, - const FindResultT& FindResult) - { - if( ::boost::algorithm::detail::check_find_result(Input, FindResult) ) { - ::boost::algorithm::detail::find_format_impl2( - Input, - Formatter, - FindResult, - Formatter(FindResult) ); - } - } - - } // namespace detail - } // namespace algorithm -} // namespace boost - -#endif // BOOST_STRING_FIND_FORMAT_DETAIL_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/detail/find_format_all.hpp b/third_party/boost_parts/boost/algorithm/string/detail/find_format_all.hpp deleted file mode 100644 index 52930c83..00000000 --- a/third_party/boost_parts/boost/algorithm/string/detail/find_format_all.hpp +++ /dev/null @@ -1,273 +0,0 @@ -// Boost string_algo library find_format_all.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_FIND_FORMAT_ALL_DETAIL_HPP -#define BOOST_STRING_FIND_FORMAT_ALL_DETAIL_HPP - -#include -#include -#include -#include -#include -#include - -namespace boost { - namespace algorithm { - namespace detail { - -// find_format_all_copy (iterator variant) implementation ---------------------------// - - template< - typename OutputIteratorT, - typename InputT, - typename FinderT, - typename FormatterT, - typename FindResultT, - typename FormatResultT > - inline OutputIteratorT find_format_all_copy_impl2( - OutputIteratorT Output, - const InputT& Input, - FinderT Finder, - FormatterT Formatter, - const FindResultT& FindResult, - const FormatResultT& FormatResult ) - { - typedef BOOST_STRING_TYPENAME - range_const_iterator::type input_iterator_type; - - typedef find_format_store< - input_iterator_type, - FormatterT, - FormatResultT > store_type; - - // Create store for the find result - store_type M( FindResult, FormatResult, Formatter ); - - // Initialize last match - input_iterator_type LastMatch=::boost::begin(Input); - - // Iterate through all matches - while( M ) - { - // Copy the beginning of the sequence - Output = std::copy( LastMatch, M.begin(), Output ); - // Copy formatted result - Output = std::copy( ::boost::begin(M.format_result()), ::boost::end(M.format_result()), Output ); - - // Proceed to the next match - LastMatch=M.end(); - M=Finder( LastMatch, ::boost::end(Input) ); - } - - // Copy the rest of the sequence - Output = std::copy( LastMatch, ::boost::end(Input), Output ); - - return Output; - } - - template< - typename OutputIteratorT, - typename InputT, - typename FinderT, - typename FormatterT, - typename FindResultT > - inline OutputIteratorT find_format_all_copy_impl( - OutputIteratorT Output, - const InputT& Input, - FinderT Finder, - FormatterT Formatter, - const FindResultT& FindResult ) - { - if( ::boost::algorithm::detail::check_find_result(Input, FindResult) ) { - return ::boost::algorithm::detail::find_format_all_copy_impl2( - Output, - Input, - Finder, - Formatter, - FindResult, - Formatter(FindResult) ); - } else { - return std::copy( ::boost::begin(Input), ::boost::end(Input), Output ); - } - } - - // find_format_all_copy implementation ----------------------------------------------// - - template< - typename InputT, - typename FinderT, - typename FormatterT, - typename FindResultT, - typename FormatResultT > - inline InputT find_format_all_copy_impl2( - const InputT& Input, - FinderT Finder, - FormatterT Formatter, - const FindResultT& FindResult, - const FormatResultT& FormatResult) - { - typedef BOOST_STRING_TYPENAME - range_const_iterator::type input_iterator_type; - - typedef find_format_store< - input_iterator_type, - FormatterT, - FormatResultT > store_type; - - // Create store for the find result - store_type M( FindResult, FormatResult, Formatter ); - - // Initialize last match - input_iterator_type LastMatch=::boost::begin(Input); - - // Output temporary - InputT Output; - - // Iterate through all matches - while( M ) - { - // Copy the beginning of the sequence - boost::algorithm::detail::insert( Output, ::boost::end(Output), LastMatch, M.begin() ); - // Copy formatted result - boost::algorithm::detail::insert( Output, ::boost::end(Output), M.format_result() ); - - // Proceed to the next match - LastMatch=M.end(); - M=Finder( LastMatch, ::boost::end(Input) ); - } - - // Copy the rest of the sequence - ::boost::algorithm::detail::insert( Output, ::boost::end(Output), LastMatch, ::boost::end(Input) ); - - return Output; - } - - template< - typename InputT, - typename FinderT, - typename FormatterT, - typename FindResultT > - inline InputT find_format_all_copy_impl( - const InputT& Input, - FinderT Finder, - FormatterT Formatter, - const FindResultT& FindResult) - { - if( ::boost::algorithm::detail::check_find_result(Input, FindResult) ) { - return ::boost::algorithm::detail::find_format_all_copy_impl2( - Input, - Finder, - Formatter, - FindResult, - Formatter(FindResult) ); - } else { - return Input; - } - } - - // find_format_all implementation ------------------------------------------------// - - template< - typename InputT, - typename FinderT, - typename FormatterT, - typename FindResultT, - typename FormatResultT > - inline void find_format_all_impl2( - InputT& Input, - FinderT Finder, - FormatterT Formatter, - FindResultT FindResult, - FormatResultT FormatResult) - { - typedef BOOST_STRING_TYPENAME - range_iterator::type input_iterator_type; - typedef find_format_store< - input_iterator_type, - FormatterT, - FormatResultT > store_type; - - // Create store for the find result - store_type M( FindResult, FormatResult, Formatter ); - - // Instantiate replacement storage - std::deque< - BOOST_STRING_TYPENAME range_value::type> Storage; - - // Initialize replacement iterators - input_iterator_type InsertIt=::boost::begin(Input); - input_iterator_type SearchIt=::boost::begin(Input); - - while( M ) - { - // process the segment - InsertIt=process_segment( - Storage, - Input, - InsertIt, - SearchIt, - M.begin() ); - - // Adjust search iterator - SearchIt=M.end(); - - // Copy formatted replace to the storage - ::boost::algorithm::detail::copy_to_storage( Storage, M.format_result() ); - - // Find range for a next match - M=Finder( SearchIt, ::boost::end(Input) ); - } - - // process the last segment - InsertIt=::boost::algorithm::detail::process_segment( - Storage, - Input, - InsertIt, - SearchIt, - ::boost::end(Input) ); - - if ( Storage.empty() ) - { - // Truncate input - ::boost::algorithm::detail::erase( Input, InsertIt, ::boost::end(Input) ); - } - else - { - // Copy remaining data to the end of input - ::boost::algorithm::detail::insert( Input, ::boost::end(Input), Storage.begin(), Storage.end() ); - } - } - - template< - typename InputT, - typename FinderT, - typename FormatterT, - typename FindResultT > - inline void find_format_all_impl( - InputT& Input, - FinderT Finder, - FormatterT Formatter, - FindResultT FindResult) - { - if( ::boost::algorithm::detail::check_find_result(Input, FindResult) ) { - ::boost::algorithm::detail::find_format_all_impl2( - Input, - Finder, - Formatter, - FindResult, - Formatter(FindResult) ); - } - } - - } // namespace detail - } // namespace algorithm -} // namespace boost - -#endif // BOOST_STRING_FIND_FORMAT_ALL_DETAIL_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/detail/find_format_store.hpp b/third_party/boost_parts/boost/algorithm/string/detail/find_format_store.hpp deleted file mode 100644 index b9f4a88d..00000000 --- a/third_party/boost_parts/boost/algorithm/string/detail/find_format_store.hpp +++ /dev/null @@ -1,89 +0,0 @@ -// Boost string_algo library find_format_store.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_FIND_FORMAT_STORE_DETAIL_HPP -#define BOOST_STRING_FIND_FORMAT_STORE_DETAIL_HPP - -#include -#include - -namespace boost { - namespace algorithm { - namespace detail { - -// temporary format and find result storage --------------------------------// - -#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) -#pragma warning(push) -#pragma warning(disable:4512) //assignment operator could not be generated -#endif - template< - typename ForwardIteratorT, - typename FormatterT, - typename FormatResultT > - class find_format_store : - public iterator_range - { - public: - // typedefs - typedef iterator_range base_type; - typedef FormatterT formatter_type; - typedef FormatResultT format_result_type; - - public: - // Construction - find_format_store( - const base_type& FindResult, - const format_result_type& FormatResult, - const formatter_type& Formatter ) : - base_type(FindResult), - m_FormatResult(FormatResult), - m_Formatter(Formatter) {} - - // Assignment - template< typename FindResultT > - find_format_store& operator=( FindResultT FindResult ) - { - iterator_range::operator=(FindResult); - if( !this->empty() ) { - m_FormatResult=m_Formatter(FindResult); - } - - return *this; - } - - // Retrieve format result - const format_result_type& format_result() - { - return m_FormatResult; - } - - private: - format_result_type m_FormatResult; - const formatter_type& m_Formatter; - }; - - template - bool check_find_result(InputT&, FindResultT& FindResult) - { - typedef BOOST_STRING_TYPENAME - range_const_iterator::type input_iterator_type; - iterator_range ResultRange(FindResult); - return !ResultRange.empty(); - } - -#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) -#pragma warning(pop) -#endif - } // namespace detail - } // namespace algorithm -} // namespace boost - -#endif // BOOST_STRING_FIND_FORMAT_STORE_DETAIL_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/detail/find_iterator.hpp b/third_party/boost_parts/boost/algorithm/string/detail/find_iterator.hpp deleted file mode 100644 index 9b78a0f7..00000000 --- a/third_party/boost_parts/boost/algorithm/string/detail/find_iterator.hpp +++ /dev/null @@ -1,87 +0,0 @@ -// Boost string_algo library find_iterator.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_FIND_ITERATOR_DETAIL_HPP -#define BOOST_STRING_FIND_ITERATOR_DETAIL_HPP - -#include -#include -#include -#include -#include - -namespace boost { - namespace algorithm { - namespace detail { - -// find_iterator base -----------------------------------------------// - - // Find iterator base - template - class find_iterator_base - { - protected: - // typedefs - typedef IteratorT input_iterator_type; - typedef iterator_range match_type; - typedef function2< - match_type, - input_iterator_type, - input_iterator_type> finder_type; - - protected: - // Protected construction/destruction - - // Default constructor - find_iterator_base() {}; - // Copy construction - find_iterator_base( const find_iterator_base& Other ) : - m_Finder(Other.m_Finder) {} - - // Constructor - template - find_iterator_base( FinderT Finder, int ) : - m_Finder(Finder) {} - - // Destructor - ~find_iterator_base() {} - - // Find operation - match_type do_find( - input_iterator_type Begin, - input_iterator_type End ) const - { - if (!m_Finder.empty()) - { - return m_Finder(Begin,End); - } - else - { - return match_type(End,End); - } - } - - // Check - bool is_null() const - { - return m_Finder.empty(); - } - - private: - // Finder - finder_type m_Finder; - }; - - } // namespace detail - } // namespace algorithm -} // namespace boost - - -#endif // BOOST_STRING_FIND_ITERATOR_DETAIL_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/detail/finder.hpp b/third_party/boost_parts/boost/algorithm/string/detail/finder.hpp deleted file mode 100644 index a2a95821..00000000 --- a/third_party/boost_parts/boost/algorithm/string/detail/finder.hpp +++ /dev/null @@ -1,639 +0,0 @@ -// Boost string_algo library finder.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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) - -// See http://www.boost.org/ for updates, documentation, and revision history. - -#ifndef BOOST_STRING_FINDER_DETAIL_HPP -#define BOOST_STRING_FINDER_DETAIL_HPP - -#include -#include -#include - -#include -#include -#include -#include -#include - -namespace boost { - namespace algorithm { - namespace detail { - - -// find first functor -----------------------------------------------// - - // find a subsequence in the sequence ( functor ) - /* - Returns a pair marking the subsequence in the sequence. - If the find fails, functor returns - */ - template - struct first_finderF - { - typedef SearchIteratorT search_iterator_type; - - // Construction - template< typename SearchT > - first_finderF( const SearchT& Search, PredicateT Comp ) : - m_Search(::boost::begin(Search), ::boost::end(Search)), m_Comp(Comp) {} - first_finderF( - search_iterator_type SearchBegin, - search_iterator_type SearchEnd, - PredicateT Comp ) : - m_Search(SearchBegin, SearchEnd), m_Comp(Comp) {} - - // Operation - template< typename ForwardIteratorT > - iterator_range - operator()( - ForwardIteratorT Begin, - ForwardIteratorT End ) const - { - typedef iterator_range result_type; - typedef ForwardIteratorT input_iterator_type; - - // Outer loop - for(input_iterator_type OuterIt=Begin; - OuterIt!=End; - ++OuterIt) - { - // Sanity check - if( boost::empty(m_Search) ) - return result_type( End, End ); - - input_iterator_type InnerIt=OuterIt; - search_iterator_type SubstrIt=m_Search.begin(); - for(; - InnerIt!=End && SubstrIt!=m_Search.end(); - ++InnerIt,++SubstrIt) - { - if( !( m_Comp(*InnerIt,*SubstrIt) ) ) - break; - } - - // Substring matching succeeded - if ( SubstrIt==m_Search.end() ) - return result_type( OuterIt, InnerIt ); - } - - return result_type( End, End ); - } - - private: - iterator_range m_Search; - PredicateT m_Comp; - }; - -// find last functor -----------------------------------------------// - - // find the last match a subsequence in the sequence ( functor ) - /* - Returns a pair marking the subsequence in the sequence. - If the find fails, returns - */ - template - struct last_finderF - { - typedef SearchIteratorT search_iterator_type; - typedef first_finderF< - search_iterator_type, - PredicateT> first_finder_type; - - // Construction - template< typename SearchT > - last_finderF( const SearchT& Search, PredicateT Comp ) : - m_Search(::boost::begin(Search), ::boost::end(Search)), m_Comp(Comp) {} - last_finderF( - search_iterator_type SearchBegin, - search_iterator_type SearchEnd, - PredicateT Comp ) : - m_Search(SearchBegin, SearchEnd), m_Comp(Comp) {} - - // Operation - template< typename ForwardIteratorT > - iterator_range - operator()( - ForwardIteratorT Begin, - ForwardIteratorT End ) const - { - typedef iterator_range result_type; - - if( boost::empty(m_Search) ) - return result_type( End, End ); - - typedef BOOST_STRING_TYPENAME boost::detail:: - iterator_traits::iterator_category category; - - return findit( Begin, End, category() ); - } - - private: - // forward iterator - template< typename ForwardIteratorT > - iterator_range - findit( - ForwardIteratorT Begin, - ForwardIteratorT End, - std::forward_iterator_tag ) const - { - typedef iterator_range result_type; - - first_finder_type first_finder( - m_Search.begin(), m_Search.end(), m_Comp ); - - result_type M=first_finder( Begin, End ); - result_type Last=M; - - while( M ) - { - Last=M; - M=first_finder( ::boost::end(M), End ); - } - - return Last; - } - - // bidirectional iterator - template< typename ForwardIteratorT > - iterator_range - findit( - ForwardIteratorT Begin, - ForwardIteratorT End, - std::bidirectional_iterator_tag ) const - { - typedef iterator_range result_type; - typedef ForwardIteratorT input_iterator_type; - - // Outer loop - for(input_iterator_type OuterIt=End; - OuterIt!=Begin; ) - { - input_iterator_type OuterIt2=--OuterIt; - - input_iterator_type InnerIt=OuterIt2; - search_iterator_type SubstrIt=m_Search.begin(); - for(; - InnerIt!=End && SubstrIt!=m_Search.end(); - ++InnerIt,++SubstrIt) - { - if( !( m_Comp(*InnerIt,*SubstrIt) ) ) - break; - } - - // Substring matching succeeded - if( SubstrIt==m_Search.end() ) - return result_type( OuterIt2, InnerIt ); - } - - return result_type( End, End ); - } - - private: - iterator_range m_Search; - PredicateT m_Comp; - }; - -// find n-th functor -----------------------------------------------// - - // find the n-th match of a subsequence in the sequence ( functor ) - /* - Returns a pair marking the subsequence in the sequence. - If the find fails, returns - */ - template - struct nth_finderF - { - typedef SearchIteratorT search_iterator_type; - typedef first_finderF< - search_iterator_type, - PredicateT> first_finder_type; - typedef last_finderF< - search_iterator_type, - PredicateT> last_finder_type; - - // Construction - template< typename SearchT > - nth_finderF( - const SearchT& Search, - int Nth, - PredicateT Comp) : - m_Search(::boost::begin(Search), ::boost::end(Search)), - m_Nth(Nth), - m_Comp(Comp) {} - nth_finderF( - search_iterator_type SearchBegin, - search_iterator_type SearchEnd, - int Nth, - PredicateT Comp) : - m_Search(SearchBegin, SearchEnd), - m_Nth(Nth), - m_Comp(Comp) {} - - // Operation - template< typename ForwardIteratorT > - iterator_range - operator()( - ForwardIteratorT Begin, - ForwardIteratorT End ) const - { - if(m_Nth>=0) - { - return find_forward(Begin, End, m_Nth); - } - else - { - return find_backward(Begin, End, -m_Nth); - } - - } - - private: - // Implementation helpers - template< typename ForwardIteratorT > - iterator_range - find_forward( - ForwardIteratorT Begin, - ForwardIteratorT End, - unsigned int N) const - { - typedef iterator_range result_type; - - // Sanity check - if( boost::empty(m_Search) ) - return result_type( End, End ); - - // Instantiate find functor - first_finder_type first_finder( - m_Search.begin(), m_Search.end(), m_Comp ); - - result_type M( Begin, Begin ); - - for( unsigned int n=0; n<=N; ++n ) - { - // find next match - M=first_finder( ::boost::end(M), End ); - - if ( !M ) - { - // Subsequence not found, return - return M; - } - } - - return M; - } - - template< typename ForwardIteratorT > - iterator_range - find_backward( - ForwardIteratorT Begin, - ForwardIteratorT End, - unsigned int N) const - { - typedef iterator_range result_type; - - // Sanity check - if( boost::empty(m_Search) ) - return result_type( End, End ); - - // Instantiate find functor - last_finder_type last_finder( - m_Search.begin(), m_Search.end(), m_Comp ); - - result_type M( End, End ); - - for( unsigned int n=1; n<=N; ++n ) - { - // find next match - M=last_finder( Begin, ::boost::begin(M) ); - - if ( !M ) - { - // Subsequence not found, return - return M; - } - } - - return M; - } - - - private: - iterator_range m_Search; - int m_Nth; - PredicateT m_Comp; - }; - -// find head/tail implementation helpers ---------------------------// - - template - iterator_range - find_head_impl( - ForwardIteratorT Begin, - ForwardIteratorT End, - unsigned int N, - std::forward_iterator_tag ) - { - typedef ForwardIteratorT input_iterator_type; - typedef iterator_range result_type; - - input_iterator_type It=Begin; - for( - unsigned int Index=0; - Index - iterator_range - find_head_impl( - ForwardIteratorT Begin, - ForwardIteratorT End, - unsigned int N, - std::random_access_iterator_tag ) - { - typedef iterator_range result_type; - - if ( (End<=Begin) || ( static_cast(End-Begin) < N ) ) - return result_type( Begin, End ); - - return result_type(Begin,Begin+N); - } - - // Find head implementation - template - iterator_range - find_head_impl( - ForwardIteratorT Begin, - ForwardIteratorT End, - unsigned int N ) - { - typedef BOOST_STRING_TYPENAME boost::detail:: - iterator_traits::iterator_category category; - - return ::boost::algorithm::detail::find_head_impl( Begin, End, N, category() ); - } - - template< typename ForwardIteratorT > - iterator_range - find_tail_impl( - ForwardIteratorT Begin, - ForwardIteratorT End, - unsigned int N, - std::forward_iterator_tag ) - { - typedef ForwardIteratorT input_iterator_type; - typedef iterator_range result_type; - - unsigned int Index=0; - input_iterator_type It=Begin; - input_iterator_type It2=Begin; - - // Advance It2 by N increments - for( Index=0; Index - iterator_range - find_tail_impl( - ForwardIteratorT Begin, - ForwardIteratorT End, - unsigned int N, - std::bidirectional_iterator_tag ) - { - typedef ForwardIteratorT input_iterator_type; - typedef iterator_range result_type; - - input_iterator_type It=End; - for( - unsigned int Index=0; - Index - iterator_range - find_tail_impl( - ForwardIteratorT Begin, - ForwardIteratorT End, - unsigned int N, - std::random_access_iterator_tag ) - { - typedef iterator_range result_type; - - if ( (End<=Begin) || ( static_cast(End-Begin) < N ) ) - return result_type( Begin, End ); - - return result_type( End-N, End ); - } - - // Operation - template< typename ForwardIteratorT > - iterator_range - find_tail_impl( - ForwardIteratorT Begin, - ForwardIteratorT End, - unsigned int N ) - { - typedef BOOST_STRING_TYPENAME boost::detail:: - iterator_traits::iterator_category category; - - return ::boost::algorithm::detail::find_tail_impl( Begin, End, N, category() ); - } - - - -// find head functor -----------------------------------------------// - - - // find a head in the sequence ( functor ) - /* - This functor find a head of the specified range. For - a specified N, the head is a subsequence of N starting - elements of the range. - */ - struct head_finderF - { - // Construction - head_finderF( int N ) : m_N(N) {} - - // Operation - template< typename ForwardIteratorT > - iterator_range - operator()( - ForwardIteratorT Begin, - ForwardIteratorT End ) const - { - if(m_N>=0) - { - return ::boost::algorithm::detail::find_head_impl( Begin, End, m_N ); - } - else - { - iterator_range Res= - ::boost::algorithm::detail::find_tail_impl( Begin, End, -m_N ); - - return ::boost::make_iterator_range(Begin, Res.begin()); - } - } - - private: - int m_N; - }; - -// find tail functor -----------------------------------------------// - - - // find a tail in the sequence ( functor ) - /* - This functor find a tail of the specified range. For - a specified N, the head is a subsequence of N starting - elements of the range. - */ - struct tail_finderF - { - // Construction - tail_finderF( int N ) : m_N(N) {} - - // Operation - template< typename ForwardIteratorT > - iterator_range - operator()( - ForwardIteratorT Begin, - ForwardIteratorT End ) const - { - if(m_N>=0) - { - return ::boost::algorithm::detail::find_tail_impl( Begin, End, m_N ); - } - else - { - iterator_range Res= - ::boost::algorithm::detail::find_head_impl( Begin, End, -m_N ); - - return ::boost::make_iterator_range(Res.end(), End); - } - } - - private: - int m_N; - }; - -// find token functor -----------------------------------------------// - - // find a token in a sequence ( functor ) - /* - This find functor finds a token specified be a predicate - in a sequence. It is equivalent of std::find algorithm, - with an exception that it return range instead of a single - iterator. - - If bCompress is set to true, adjacent matching tokens are - concatenated into one match. - */ - template< typename PredicateT > - struct token_finderF - { - // Construction - token_finderF( - PredicateT Pred, - token_compress_mode_type eCompress=token_compress_off ) : - m_Pred(Pred), m_eCompress(eCompress) {} - - // Operation - template< typename ForwardIteratorT > - iterator_range - operator()( - ForwardIteratorT Begin, - ForwardIteratorT End ) const - { - typedef iterator_range result_type; - - ForwardIteratorT It=std::find_if( Begin, End, m_Pred ); - - if( It==End ) - { - return result_type( End, End ); - } - else - { - ForwardIteratorT It2=It; - - if( m_eCompress==token_compress_on ) - { - // Find first non-matching character - while( It2!=End && m_Pred(*It2) ) ++It2; - } - else - { - // Advance by one position - ++It2; - } - - return result_type( It, It2 ); - } - } - - private: - PredicateT m_Pred; - token_compress_mode_type m_eCompress; - }; - -// find range functor -----------------------------------------------// - - // find a range in the sequence ( functor ) - /* - This functor actually does not perform any find operation. - It always returns given iterator range as a result. - */ - template - struct range_finderF - { - typedef ForwardIterator1T input_iterator_type; - typedef iterator_range result_type; - - // Construction - range_finderF( - input_iterator_type Begin, - input_iterator_type End ) : m_Range(Begin, End) {} - - range_finderF(const iterator_range& Range) : - m_Range(Range) {} - - // Operation - template< typename ForwardIterator2T > - iterator_range - operator()( - ForwardIterator2T, - ForwardIterator2T ) const - { -#if BOOST_WORKAROUND( __MWERKS__, <= 0x3003 ) - return iterator_range(this->m_Range); -#else - return m_Range; -#endif - } - - private: - iterator_range m_Range; - }; - - - } // namespace detail - } // namespace algorithm -} // namespace boost - -#endif // BOOST_STRING_FINDER_DETAIL_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/detail/formatter.hpp b/third_party/boost_parts/boost/algorithm/string/detail/formatter.hpp deleted file mode 100644 index c071822f..00000000 --- a/third_party/boost_parts/boost/algorithm/string/detail/formatter.hpp +++ /dev/null @@ -1,119 +0,0 @@ -// Boost string_algo library formatter.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_FORMATTER_DETAIL_HPP -#define BOOST_STRING_FORMATTER_DETAIL_HPP - - -#include -#include -#include -#include - -#include - -// generic replace functors -----------------------------------------------// - -namespace boost { - namespace algorithm { - namespace detail { - -// const format functor ----------------------------------------------------// - - // constant format functor - template - struct const_formatF - { - private: - typedef BOOST_STRING_TYPENAME - range_const_iterator::type format_iterator; - typedef iterator_range result_type; - - public: - // Construction - const_formatF(const RangeT& Format) : - m_Format(::boost::begin(Format), ::boost::end(Format)) {} - - // Operation -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) - template - result_type& operator()(const Range2T&) - { - return m_Format; - } -#endif - - template - const result_type& operator()(const Range2T&) const - { - return m_Format; - } - - private: - result_type m_Format; - }; - -// identity format functor ----------------------------------------------------// - - // identity format functor - template - struct identity_formatF - { - // Operation - template< typename Range2T > - const RangeT& operator()(const Range2T& Replace) const - { - return RangeT(::boost::begin(Replace), ::boost::end(Replace)); - } - }; - -// empty format functor ( used by erase ) ------------------------------------// - - // empty format functor - template< typename CharT > - struct empty_formatF - { - template< typename ReplaceT > - empty_container operator()(const ReplaceT&) const - { - return empty_container(); - } - }; - -// dissect format functor ----------------------------------------------------// - - // dissect format functor - template - struct dissect_formatF - { - public: - // Construction - dissect_formatF(FinderT Finder) : - m_Finder(Finder) {} - - // Operation - template - inline iterator_range< - BOOST_STRING_TYPENAME range_const_iterator::type> - operator()(const RangeT& Replace) const - { - return m_Finder(::boost::begin(Replace), ::boost::end(Replace)); - } - - private: - FinderT m_Finder; - }; - - - } // namespace detail - } // namespace algorithm -} // namespace boost - -#endif // BOOST_STRING_FORMATTER_DETAIL_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/detail/predicate.hpp b/third_party/boost_parts/boost/algorithm/string/detail/predicate.hpp deleted file mode 100644 index 5acf3cc6..00000000 --- a/third_party/boost_parts/boost/algorithm/string/detail/predicate.hpp +++ /dev/null @@ -1,77 +0,0 @@ -// Boost string_algo library predicate.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_PREDICATE_DETAIL_HPP -#define BOOST_STRING_PREDICATE_DETAIL_HPP - -#include -#include - -namespace boost { - namespace algorithm { - namespace detail { - -// ends_with predicate implementation ----------------------------------// - - template< - typename ForwardIterator1T, - typename ForwardIterator2T, - typename PredicateT> - inline bool ends_with_iter_select( - ForwardIterator1T Begin, - ForwardIterator1T End, - ForwardIterator2T SubBegin, - ForwardIterator2T SubEnd, - PredicateT Comp, - std::bidirectional_iterator_tag) - { - ForwardIterator1T it=End; - ForwardIterator2T pit=SubEnd; - for(;it!=Begin && pit!=SubBegin;) - { - if( !(Comp(*(--it),*(--pit))) ) - return false; - } - - return pit==SubBegin; - } - - template< - typename ForwardIterator1T, - typename ForwardIterator2T, - typename PredicateT> - inline bool ends_with_iter_select( - ForwardIterator1T Begin, - ForwardIterator1T End, - ForwardIterator2T SubBegin, - ForwardIterator2T SubEnd, - PredicateT Comp, - std::forward_iterator_tag) - { - if ( SubBegin==SubEnd ) - { - // empty subsequence check - return true; - } - - iterator_range Result - =last_finder( - ::boost::make_iterator_range(SubBegin, SubEnd), - Comp)(Begin, End); - - return !Result.empty() && Result.end()==End; - } - - } // namespace detail - } // namespace algorithm -} // namespace boost - - -#endif // BOOST_STRING_PREDICATE_DETAIL_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/detail/replace_storage.hpp b/third_party/boost_parts/boost/algorithm/string/detail/replace_storage.hpp deleted file mode 100644 index db35e4c5..00000000 --- a/third_party/boost_parts/boost/algorithm/string/detail/replace_storage.hpp +++ /dev/null @@ -1,159 +0,0 @@ -// Boost string_algo library replace_storage.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_REPLACE_STORAGE_DETAIL_HPP -#define BOOST_STRING_REPLACE_STORAGE_DETAIL_HPP - -#include -#include -#include -#include -#include - -namespace boost { - namespace algorithm { - namespace detail { - -// storage handling routines -----------------------------------------------// - - template< typename StorageT, typename OutputIteratorT > - inline OutputIteratorT move_from_storage( - StorageT& Storage, - OutputIteratorT DestBegin, - OutputIteratorT DestEnd ) - { - OutputIteratorT OutputIt=DestBegin; - - while( !Storage.empty() && OutputIt!=DestEnd ) - { - *OutputIt=Storage.front(); - Storage.pop_front(); - ++OutputIt; - } - - return OutputIt; - } - - template< typename StorageT, typename WhatT > - inline void copy_to_storage( - StorageT& Storage, - const WhatT& What ) - { - Storage.insert( Storage.end(), ::boost::begin(What), ::boost::end(What) ); - } - - -// process segment routine -----------------------------------------------// - - template< bool HasStableIterators > - struct process_segment_helper - { - // Optimized version of process_segment for generic sequence - template< - typename StorageT, - typename InputT, - typename ForwardIteratorT > - ForwardIteratorT operator()( - StorageT& Storage, - InputT& /*Input*/, - ForwardIteratorT InsertIt, - ForwardIteratorT SegmentBegin, - ForwardIteratorT SegmentEnd ) - { - // Copy data from the storage until the beginning of the segment - ForwardIteratorT It=::boost::algorithm::detail::move_from_storage( Storage, InsertIt, SegmentBegin ); - - // 3 cases are possible : - // a) Storage is empty, It==SegmentBegin - // b) Storage is empty, It!=SegmentBegin - // c) Storage is not empty - - if( Storage.empty() ) - { - if( It==SegmentBegin ) - { - // Case a) everything is grand, just return end of segment - return SegmentEnd; - } - else - { - // Case b) move the segment backwards - return std::copy( SegmentBegin, SegmentEnd, It ); - } - } - else - { - // Case c) -> shift the segment to the left and keep the overlap in the storage - while( It!=SegmentEnd ) - { - // Store value into storage - Storage.push_back( *It ); - // Get the top from the storage and put it here - *It=Storage.front(); - Storage.pop_front(); - - // Advance - ++It; - } - - return It; - } - } - }; - - template<> - struct process_segment_helper< true > - { - // Optimized version of process_segment for list-like sequence - template< - typename StorageT, - typename InputT, - typename ForwardIteratorT > - ForwardIteratorT operator()( - StorageT& Storage, - InputT& Input, - ForwardIteratorT InsertIt, - ForwardIteratorT SegmentBegin, - ForwardIteratorT SegmentEnd ) - - { - // Call replace to do the job - ::boost::algorithm::detail::replace( Input, InsertIt, SegmentBegin, Storage ); - // Empty the storage - Storage.clear(); - // Iterators were not changed, simply return the end of segment - return SegmentEnd; - } - }; - - // Process one segment in the replace_all algorithm - template< - typename StorageT, - typename InputT, - typename ForwardIteratorT > - inline ForwardIteratorT process_segment( - StorageT& Storage, - InputT& Input, - ForwardIteratorT InsertIt, - ForwardIteratorT SegmentBegin, - ForwardIteratorT SegmentEnd ) - { - return - process_segment_helper< - has_stable_iterators::value>()( - Storage, Input, InsertIt, SegmentBegin, SegmentEnd ); - } - - - } // namespace detail - } // namespace algorithm -} // namespace boost - -#endif // BOOST_STRING_REPLACE_STORAGE_DETAIL_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/detail/sequence.hpp b/third_party/boost_parts/boost/algorithm/string/detail/sequence.hpp deleted file mode 100644 index dc474091..00000000 --- a/third_party/boost_parts/boost/algorithm/string/detail/sequence.hpp +++ /dev/null @@ -1,200 +0,0 @@ -// Boost string_algo library sequence.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_DETAIL_SEQUENCE_HPP -#define BOOST_STRING_DETAIL_SEQUENCE_HPP - -#include -#include -#include -#include -#include - -#include - -namespace boost { - namespace algorithm { - namespace detail { - -// insert helpers -------------------------------------------------// - - template< typename InputT, typename ForwardIteratorT > - inline void insert( - InputT& Input, - BOOST_STRING_TYPENAME InputT::iterator At, - ForwardIteratorT Begin, - ForwardIteratorT End ) - { - Input.insert( At, Begin, End ); - } - - template< typename InputT, typename InsertT > - inline void insert( - InputT& Input, - BOOST_STRING_TYPENAME InputT::iterator At, - const InsertT& Insert ) - { - ::boost::algorithm::detail::insert( Input, At, ::boost::begin(Insert), ::boost::end(Insert) ); - } - -// erase helper ---------------------------------------------------// - - // Erase a range in the sequence - /* - Returns the iterator pointing just after the erase subrange - */ - template< typename InputT > - inline typename InputT::iterator erase( - InputT& Input, - BOOST_STRING_TYPENAME InputT::iterator From, - BOOST_STRING_TYPENAME InputT::iterator To ) - { - return Input.erase( From, To ); - } - -// replace helper implementation ----------------------------------// - - // Optimized version of replace for generic sequence containers - // Assumption: insert and erase are expensive - template< bool HasConstTimeOperations > - struct replace_const_time_helper - { - template< typename InputT, typename ForwardIteratorT > - void operator()( - InputT& Input, - BOOST_STRING_TYPENAME InputT::iterator From, - BOOST_STRING_TYPENAME InputT::iterator To, - ForwardIteratorT Begin, - ForwardIteratorT End ) - { - // Copy data to the container ( as much as possible ) - ForwardIteratorT InsertIt=Begin; - BOOST_STRING_TYPENAME InputT::iterator InputIt=From; - for(; InsertIt!=End && InputIt!=To; InsertIt++, InputIt++ ) - { - *InputIt=*InsertIt; - } - - if ( InsertIt!=End ) - { - // Replace sequence is longer, insert it - Input.insert( InputIt, InsertIt, End ); - } - else - { - if ( InputIt!=To ) - { - // Replace sequence is shorter, erase the rest - Input.erase( InputIt, To ); - } - } - } - }; - - template<> - struct replace_const_time_helper< true > - { - // Const-time erase and insert methods -> use them - template< typename InputT, typename ForwardIteratorT > - void operator()( - InputT& Input, - BOOST_STRING_TYPENAME InputT::iterator From, - BOOST_STRING_TYPENAME InputT::iterator To, - ForwardIteratorT Begin, - ForwardIteratorT End ) - { - BOOST_STRING_TYPENAME InputT::iterator At=Input.erase( From, To ); - if ( Begin!=End ) - { - if(!Input.empty()) - { - Input.insert( At, Begin, End ); - } - else - { - Input.insert( Input.begin(), Begin, End ); - } - } - } - }; - - // No native replace method - template< bool HasNative > - struct replace_native_helper - { - template< typename InputT, typename ForwardIteratorT > - void operator()( - InputT& Input, - BOOST_STRING_TYPENAME InputT::iterator From, - BOOST_STRING_TYPENAME InputT::iterator To, - ForwardIteratorT Begin, - ForwardIteratorT End ) - { - replace_const_time_helper< - boost::mpl::and_< - has_const_time_insert, - has_const_time_erase >::value >()( - Input, From, To, Begin, End ); - } - }; - - // Container has native replace method - template<> - struct replace_native_helper< true > - { - template< typename InputT, typename ForwardIteratorT > - void operator()( - InputT& Input, - BOOST_STRING_TYPENAME InputT::iterator From, - BOOST_STRING_TYPENAME InputT::iterator To, - ForwardIteratorT Begin, - ForwardIteratorT End ) - { - Input.replace( From, To, Begin, End ); - } - }; - -// replace helper -------------------------------------------------// - - template< typename InputT, typename ForwardIteratorT > - inline void replace( - InputT& Input, - BOOST_STRING_TYPENAME InputT::iterator From, - BOOST_STRING_TYPENAME InputT::iterator To, - ForwardIteratorT Begin, - ForwardIteratorT End ) - { - replace_native_helper< has_native_replace::value >()( - Input, From, To, Begin, End ); - } - - template< typename InputT, typename InsertT > - inline void replace( - InputT& Input, - BOOST_STRING_TYPENAME InputT::iterator From, - BOOST_STRING_TYPENAME InputT::iterator To, - const InsertT& Insert ) - { - if(From!=To) - { - ::boost::algorithm::detail::replace( Input, From, To, ::boost::begin(Insert), ::boost::end(Insert) ); - } - else - { - ::boost::algorithm::detail::insert( Input, From, ::boost::begin(Insert), ::boost::end(Insert) ); - } - } - - } // namespace detail - } // namespace algorithm -} // namespace boost - - -#endif // BOOST_STRING_DETAIL_SEQUENCE_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/detail/trim.hpp b/third_party/boost_parts/boost/algorithm/string/detail/trim.hpp deleted file mode 100644 index 1233e49d..00000000 --- a/third_party/boost_parts/boost/algorithm/string/detail/trim.hpp +++ /dev/null @@ -1,95 +0,0 @@ -// Boost string_algo library trim.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_TRIM_DETAIL_HPP -#define BOOST_STRING_TRIM_DETAIL_HPP - -#include -#include - -namespace boost { - namespace algorithm { - namespace detail { - -// trim iterator helper -----------------------------------------------// - - template< typename ForwardIteratorT, typename PredicateT > - inline ForwardIteratorT trim_end_iter_select( - ForwardIteratorT InBegin, - ForwardIteratorT InEnd, - PredicateT IsSpace, - std::forward_iterator_tag ) - { - ForwardIteratorT TrimIt=InBegin; - - for( ForwardIteratorT It=InBegin; It!=InEnd; ++It ) - { - if ( !IsSpace(*It) ) - { - TrimIt=It; - ++TrimIt; - } - } - - return TrimIt; - } - - template< typename ForwardIteratorT, typename PredicateT > - inline ForwardIteratorT trim_end_iter_select( - ForwardIteratorT InBegin, - ForwardIteratorT InEnd, - PredicateT IsSpace, - std::bidirectional_iterator_tag ) - { - for( ForwardIteratorT It=InEnd; It!=InBegin; ) - { - if ( !IsSpace(*(--It)) ) - return ++It; - } - - return InBegin; - } - // Search for first non matching character from the beginning of the sequence - template< typename ForwardIteratorT, typename PredicateT > - inline ForwardIteratorT trim_begin( - ForwardIteratorT InBegin, - ForwardIteratorT InEnd, - PredicateT IsSpace ) - { - ForwardIteratorT It=InBegin; - for(; It!=InEnd; ++It ) - { - if (!IsSpace(*It)) - return It; - } - - return It; - } - - // Search for first non matching character from the end of the sequence - template< typename ForwardIteratorT, typename PredicateT > - inline ForwardIteratorT trim_end( - ForwardIteratorT InBegin, - ForwardIteratorT InEnd, - PredicateT IsSpace ) - { - typedef BOOST_STRING_TYPENAME boost::detail:: - iterator_traits::iterator_category category; - - return ::boost::algorithm::detail::trim_end_iter_select( InBegin, InEnd, IsSpace, category() ); - } - - - } // namespace detail - } // namespace algorithm -} // namespace boost - - -#endif // BOOST_STRING_TRIM_DETAIL_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/detail/util.hpp b/third_party/boost_parts/boost/algorithm/string/detail/util.hpp deleted file mode 100644 index cf4a8b1c..00000000 --- a/third_party/boost_parts/boost/algorithm/string/detail/util.hpp +++ /dev/null @@ -1,106 +0,0 @@ -// Boost string_algo library util.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_UTIL_DETAIL_HPP -#define BOOST_STRING_UTIL_DETAIL_HPP - -#include -#include -#include - -namespace boost { - namespace algorithm { - namespace detail { - -// empty container -----------------------------------------------// - - // empty_container - /* - This class represents always empty container, - containing elements of type CharT. - - It is supposed to be used in a const version only - */ - template< typename CharT > - struct empty_container - { - typedef empty_container type; - typedef CharT value_type; - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - typedef const value_type& reference; - typedef const value_type& const_reference; - typedef const value_type* iterator; - typedef const value_type* const_iterator; - - - // Operations - const_iterator begin() const - { - return reinterpret_cast(0); - } - - const_iterator end() const - { - return reinterpret_cast(0); - } - - bool empty() const - { - return false; - } - - size_type size() const - { - return 0; - } - }; - -// bounded copy algorithm -----------------------------------------------// - - // Bounded version of the std::copy algorithm - template - inline OutputIteratorT bounded_copy( - InputIteratorT First, - InputIteratorT Last, - OutputIteratorT DestFirst, - OutputIteratorT DestLast ) - { - InputIteratorT InputIt=First; - OutputIteratorT OutputIt=DestFirst; - for(; InputIt!=Last && OutputIt!=DestLast; InputIt++, OutputIt++ ) - { - *OutputIt=*InputIt; - } - - return OutputIt; - } - -// iterator range utilities -----------------------------------------// - - // copy range functor - template< - typename SeqT, - typename IteratorT=BOOST_STRING_TYPENAME SeqT::const_iterator > - struct copy_iterator_rangeF : - public std::unary_function< iterator_range, SeqT > - { - SeqT operator()( const iterator_range& Range ) const - { - return copy_range(Range); - } - }; - - } // namespace detail - } // namespace algorithm -} // namespace boost - - -#endif // BOOST_STRING_UTIL_DETAIL_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/erase.hpp b/third_party/boost_parts/boost/algorithm/string/erase.hpp deleted file mode 100644 index 68837909..00000000 --- a/third_party/boost_parts/boost/algorithm/string/erase.hpp +++ /dev/null @@ -1,844 +0,0 @@ -// Boost string_algo library erase.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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) - -// See http://www.boost.org/ for updates, documentation, and revision history. - -#ifndef BOOST_STRING_ERASE_HPP -#define BOOST_STRING_ERASE_HPP - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -/*! \file - Defines various erase algorithms. Each algorithm removes - part(s) of the input according to a searching criteria. -*/ - -namespace boost { - namespace algorithm { - -// erase_range -------------------------------------------------------// - - //! Erase range algorithm - /*! - Remove the given range from the input. The result is a modified copy of - the input. It is returned as a sequence or copied to the output iterator. - - \param Output An output iterator to which the result will be copied - \param Input An input sequence - \param SearchRange A range in the input to be removed - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template - inline OutputIteratorT erase_range_copy( - OutputIteratorT Output, - const RangeT& Input, - const iterator_range< - BOOST_STRING_TYPENAME - range_const_iterator::type>& SearchRange ) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::range_finder(SearchRange), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase range algorithm - /*! - \overload - */ - template - inline SequenceT erase_range_copy( - const SequenceT& Input, - const iterator_range< - BOOST_STRING_TYPENAME - range_const_iterator::type>& SearchRange ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::range_finder(SearchRange), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase range algorithm - /*! - Remove the given range from the input. - The input sequence is modified in-place. - - \param Input An input sequence - \param SearchRange A range in the input to be removed - */ - template - inline void erase_range( - SequenceT& Input, - const iterator_range< - BOOST_STRING_TYPENAME - range_iterator::type>& SearchRange ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::range_finder(SearchRange), - ::boost::algorithm::empty_formatter(Input) ); - } - -// erase_first --------------------------------------------------------// - - //! Erase first algorithm - /*! - Remove the first occurrence of the substring from the input. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param Search A substring to be searched for - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T> - inline OutputIteratorT erase_first_copy( - OutputIteratorT Output, - const Range1T& Input, - const Range2T& Search ) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::first_finder(Search), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase first algorithm - /*! - \overload - */ - template - inline SequenceT erase_first_copy( - const SequenceT& Input, - const RangeT& Search ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::first_finder(Search), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase first algorithm - /*! - Remove the first occurrence of the substring from the input. - The input sequence is modified in-place. - - \param Input An input string - \param Search A substring to be searched for. - */ - template - inline void erase_first( - SequenceT& Input, - const RangeT& Search ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::first_finder(Search), - ::boost::algorithm::empty_formatter(Input) ); - } - -// erase_first ( case insensitive ) ------------------------------------// - - //! Erase first algorithm ( case insensitive ) - /*! - Remove the first occurrence of the substring from the input. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - Searching is case insensitive. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param Search A substring to be searched for - \param Loc A locale used for case insensitive comparison - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T> - inline OutputIteratorT ierase_first_copy( - OutputIteratorT Output, - const Range1T& Input, - const Range2T& Search, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::first_finder(Search, is_iequal(Loc)), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase first algorithm ( case insensitive ) - /*! - \overload - */ - template - inline SequenceT ierase_first_copy( - const SequenceT& Input, - const RangeT& Search, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::first_finder(Search, is_iequal(Loc)), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase first algorithm ( case insensitive ) - /*! - Remove the first occurrence of the substring from the input. - The input sequence is modified in-place. Searching is case insensitive. - - \param Input An input string - \param Search A substring to be searched for - \param Loc A locale used for case insensitive comparison - */ - template - inline void ierase_first( - SequenceT& Input, - const RangeT& Search, - const std::locale& Loc=std::locale() ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::first_finder(Search, is_iequal(Loc)), - ::boost::algorithm::empty_formatter(Input) ); - } - -// erase_last --------------------------------------------------------// - - //! Erase last algorithm - /*! - Remove the last occurrence of the substring from the input. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param Search A substring to be searched for. - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T> - inline OutputIteratorT erase_last_copy( - OutputIteratorT Output, - const Range1T& Input, - const Range2T& Search ) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::last_finder(Search), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase last algorithm - /*! - \overload - */ - template - inline SequenceT erase_last_copy( - const SequenceT& Input, - const RangeT& Search ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::last_finder(Search), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase last algorithm - /*! - Remove the last occurrence of the substring from the input. - The input sequence is modified in-place. - - \param Input An input string - \param Search A substring to be searched for - */ - template - inline void erase_last( - SequenceT& Input, - const RangeT& Search ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::last_finder(Search), - ::boost::algorithm::empty_formatter(Input) ); - } - -// erase_last ( case insensitive ) ------------------------------------// - - //! Erase last algorithm ( case insensitive ) - /*! - Remove the last occurrence of the substring from the input. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - Searching is case insensitive. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param Search A substring to be searched for - \param Loc A locale used for case insensitive comparison - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T> - inline OutputIteratorT ierase_last_copy( - OutputIteratorT Output, - const Range1T& Input, - const Range2T& Search, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::last_finder(Search, is_iequal(Loc)), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase last algorithm ( case insensitive ) - /*! - \overload - */ - template - inline SequenceT ierase_last_copy( - const SequenceT& Input, - const RangeT& Search, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::last_finder(Search, is_iequal(Loc)), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase last algorithm ( case insensitive ) - /*! - Remove the last occurrence of the substring from the input. - The input sequence is modified in-place. Searching is case insensitive. - - \param Input An input string - \param Search A substring to be searched for - \param Loc A locale used for case insensitive comparison - */ - template - inline void ierase_last( - SequenceT& Input, - const RangeT& Search, - const std::locale& Loc=std::locale() ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::last_finder(Search, is_iequal(Loc)), - ::boost::algorithm::empty_formatter(Input) ); - } - -// erase_nth --------------------------------------------------------------------// - - //! Erase nth algorithm - /*! - Remove the Nth occurrence of the substring in the input. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param Search A substring to be searched for - \param Nth An index of the match to be replaced. The index is 0-based. - For negative N, matches are counted from the end of string. - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T> - inline OutputIteratorT erase_nth_copy( - OutputIteratorT Output, - const Range1T& Input, - const Range2T& Search, - int Nth ) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::nth_finder(Search, Nth), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase nth algorithm - /*! - \overload - */ - template - inline SequenceT erase_nth_copy( - const SequenceT& Input, - const RangeT& Search, - int Nth ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::nth_finder(Search, Nth), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase nth algorithm - /*! - Remove the Nth occurrence of the substring in the input. - The input sequence is modified in-place. - - \param Input An input string - \param Search A substring to be searched for. - \param Nth An index of the match to be replaced. The index is 0-based. - For negative N, matches are counted from the end of string. - */ - template - inline void erase_nth( - SequenceT& Input, - const RangeT& Search, - int Nth ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::nth_finder(Search, Nth), - ::boost::algorithm::empty_formatter(Input) ); - } - -// erase_nth ( case insensitive ) ---------------------------------------------// - - //! Erase nth algorithm ( case insensitive ) - /*! - Remove the Nth occurrence of the substring in the input. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - Searching is case insensitive. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param Search A substring to be searched for. - \param Nth An index of the match to be replaced. The index is 0-based. - For negative N, matches are counted from the end of string. - \param Loc A locale used for case insensitive comparison - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T> - inline OutputIteratorT ierase_nth_copy( - OutputIteratorT Output, - const Range1T& Input, - const Range2T& Search, - int Nth, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc)), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase nth algorithm - /*! - \overload - */ - template - inline SequenceT ierase_nth_copy( - const SequenceT& Input, - const RangeT& Search, - int Nth, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc)), - empty_formatter(Input) ); - } - - //! Erase nth algorithm - /*! - Remove the Nth occurrence of the substring in the input. - The input sequence is modified in-place. Searching is case insensitive. - - \param Input An input string - \param Search A substring to be searched for. - \param Nth An index of the match to be replaced. The index is 0-based. - For negative N, matches are counted from the end of string. - \param Loc A locale used for case insensitive comparison - */ - template - inline void ierase_nth( - SequenceT& Input, - const RangeT& Search, - int Nth, - const std::locale& Loc=std::locale() ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc)), - ::boost::algorithm::empty_formatter(Input) ); - } - - -// erase_all --------------------------------------------------------// - - //! Erase all algorithm - /*! - Remove all the occurrences of the string from the input. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - - - \param Output An output iterator to which the result will be copied - \param Input An input sequence - \param Search A substring to be searched for. - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T> - inline OutputIteratorT erase_all_copy( - OutputIteratorT Output, - const Range1T& Input, - const Range2T& Search ) - { - return ::boost::algorithm::find_format_all_copy( - Output, - Input, - ::boost::algorithm::first_finder(Search), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase all algorithm - /*! - \overload - */ - template - inline SequenceT erase_all_copy( - const SequenceT& Input, - const RangeT& Search ) - { - return ::boost::algorithm::find_format_all_copy( - Input, - ::boost::algorithm::first_finder(Search), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase all algorithm - /*! - Remove all the occurrences of the string from the input. - The input sequence is modified in-place. - - \param Input An input string - \param Search A substring to be searched for. - */ - template - inline void erase_all( - SequenceT& Input, - const RangeT& Search ) - { - ::boost::algorithm::find_format_all( - Input, - ::boost::algorithm::first_finder(Search), - ::boost::algorithm::empty_formatter(Input) ); - } - -// erase_all ( case insensitive ) ------------------------------------// - - //! Erase all algorithm ( case insensitive ) - /*! - Remove all the occurrences of the string from the input. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - Searching is case insensitive. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param Search A substring to be searched for - \param Loc A locale used for case insensitive comparison - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T> - inline OutputIteratorT ierase_all_copy( - OutputIteratorT Output, - const Range1T& Input, - const Range2T& Search, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::find_format_all_copy( - Output, - Input, - ::boost::algorithm::first_finder(Search, is_iequal(Loc)), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase all algorithm ( case insensitive ) - /*! - \overload - */ - template - inline SequenceT ierase_all_copy( - const SequenceT& Input, - const RangeT& Search, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::find_format_all_copy( - Input, - ::boost::algorithm::first_finder(Search, is_iequal(Loc)), - ::boost::algorithm::empty_formatter(Input) ); - } - - //! Erase all algorithm ( case insensitive ) - /*! - Remove all the occurrences of the string from the input. - The input sequence is modified in-place. Searching is case insensitive. - - \param Input An input string - \param Search A substring to be searched for. - \param Loc A locale used for case insensitive comparison - */ - template - inline void ierase_all( - SequenceT& Input, - const RangeT& Search, - const std::locale& Loc=std::locale() ) - { - ::boost::algorithm::find_format_all( - Input, - ::boost::algorithm::first_finder(Search, is_iequal(Loc)), - ::boost::algorithm::empty_formatter(Input) ); - } - -// erase_head --------------------------------------------------------------------// - - //! Erase head algorithm - /*! - Remove the head from the input. The head is a prefix of a sequence of given size. - If the sequence is shorter then required, the whole string is - considered to be the head. The result is a modified copy of the input. - It is returned as a sequence or copied to the output iterator. - - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param N Length of the head. - For N>=0, at most N characters are extracted. - For N<0, size(Input)-|N| characters are extracted. - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename RangeT> - inline OutputIteratorT erase_head_copy( - OutputIteratorT Output, - const RangeT& Input, - int N ) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::head_finder(N), - ::boost::algorithm::empty_formatter( Input ) ); - } - - //! Erase head algorithm - /*! - \overload - */ - template - inline SequenceT erase_head_copy( - const SequenceT& Input, - int N ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::head_finder(N), - ::boost::algorithm::empty_formatter( Input ) ); - } - - //! Erase head algorithm - /*! - Remove the head from the input. The head is a prefix of a sequence of given size. - If the sequence is shorter then required, the whole string is - considered to be the head. The input sequence is modified in-place. - - \param Input An input string - \param N Length of the head - For N>=0, at most N characters are extracted. - For N<0, size(Input)-|N| characters are extracted. - */ - template - inline void erase_head( - SequenceT& Input, - int N ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::head_finder(N), - ::boost::algorithm::empty_formatter( Input ) ); - } - -// erase_tail --------------------------------------------------------------------// - - //! Erase tail algorithm - /*! - Remove the tail from the input. The tail is a suffix of a sequence of given size. - If the sequence is shorter then required, the whole string is - considered to be the tail. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param N Length of the tail. - For N>=0, at most N characters are extracted. - For N<0, size(Input)-|N| characters are extracted. - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename RangeT> - inline OutputIteratorT erase_tail_copy( - OutputIteratorT Output, - const RangeT& Input, - int N ) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::tail_finder(N), - ::boost::algorithm::empty_formatter( Input ) ); - } - - //! Erase tail algorithm - /*! - \overload - */ - template - inline SequenceT erase_tail_copy( - const SequenceT& Input, - int N ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::tail_finder(N), - ::boost::algorithm::empty_formatter( Input ) ); - } - - //! Erase tail algorithm - /*! - Remove the tail from the input. The tail is a suffix of a sequence of given size. - If the sequence is shorter then required, the whole string is - considered to be the tail. The input sequence is modified in-place. - - \param Input An input string - \param N Length of the tail - For N>=0, at most N characters are extracted. - For N<0, size(Input)-|N| characters are extracted. - */ - template - inline void erase_tail( - SequenceT& Input, - int N ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::tail_finder(N), - ::boost::algorithm::empty_formatter( Input ) ); - } - - } // namespace algorithm - - // pull names into the boost namespace - using algorithm::erase_range_copy; - using algorithm::erase_range; - using algorithm::erase_first_copy; - using algorithm::erase_first; - using algorithm::ierase_first_copy; - using algorithm::ierase_first; - using algorithm::erase_last_copy; - using algorithm::erase_last; - using algorithm::ierase_last_copy; - using algorithm::ierase_last; - using algorithm::erase_nth_copy; - using algorithm::erase_nth; - using algorithm::ierase_nth_copy; - using algorithm::ierase_nth; - using algorithm::erase_all_copy; - using algorithm::erase_all; - using algorithm::ierase_all_copy; - using algorithm::ierase_all; - using algorithm::erase_head_copy; - using algorithm::erase_head; - using algorithm::erase_tail_copy; - using algorithm::erase_tail; - -} // namespace boost - - -#endif // BOOST_ERASE_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/find.hpp b/third_party/boost_parts/boost/algorithm/string/find.hpp deleted file mode 100644 index f2c2926b..00000000 --- a/third_party/boost_parts/boost/algorithm/string/find.hpp +++ /dev/null @@ -1,334 +0,0 @@ -// Boost string_algo library find.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_FIND_HPP -#define BOOST_STRING_FIND_HPP - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -/*! \file - Defines a set of find algorithms. The algorithms are searching - for a substring of the input. The result is given as an \c iterator_range - delimiting the substring. -*/ - -namespace boost { - namespace algorithm { - -// Generic find -----------------------------------------------// - - //! Generic find algorithm - /*! - Search the input using the given finder. - - \param Input A string which will be searched. - \param Finder Finder object used for searching. - \return - An \c iterator_range delimiting the match. - Returned iterator is either \c RangeT::iterator or - \c RangeT::const_iterator, depending on the constness of - the input parameter. - */ - template - inline iterator_range< - BOOST_STRING_TYPENAME range_iterator::type> - find( - RangeT& Input, - const FinderT& Finder) - { - iterator_range::type> lit_input(::boost::as_literal(Input)); - - return Finder(::boost::begin(lit_input),::boost::end(lit_input)); - } - -// find_first -----------------------------------------------// - - //! Find first algorithm - /*! - Search for the first occurrence of the substring in the input. - - \param Input A string which will be searched. - \param Search A substring to be searched for. - \return - An \c iterator_range delimiting the match. - Returned iterator is either \c RangeT::iterator or - \c RangeT::const_iterator, depending on the constness of - the input parameter. - - \note This function provides the strong exception-safety guarantee - */ - template - inline iterator_range< - BOOST_STRING_TYPENAME range_iterator::type> - find_first( - Range1T& Input, - const Range2T& Search) - { - return ::boost::algorithm::find(Input, ::boost::algorithm::first_finder(Search)); - } - - //! Find first algorithm ( case insensitive ) - /*! - Search for the first occurrence of the substring in the input. - Searching is case insensitive. - - \param Input A string which will be searched. - \param Search A substring to be searched for. - \param Loc A locale used for case insensitive comparison - \return - An \c iterator_range delimiting the match. - Returned iterator is either \c Range1T::iterator or - \c Range1T::const_iterator, depending on the constness of - the input parameter. - - \note This function provides the strong exception-safety guarantee - */ - template - inline iterator_range< - BOOST_STRING_TYPENAME range_iterator::type> - ifind_first( - Range1T& Input, - const Range2T& Search, - const std::locale& Loc=std::locale()) - { - return ::boost::algorithm::find(Input, ::boost::algorithm::first_finder(Search,is_iequal(Loc))); - } - -// find_last -----------------------------------------------// - - //! Find last algorithm - /*! - Search for the last occurrence of the substring in the input. - - \param Input A string which will be searched. - \param Search A substring to be searched for. - \return - An \c iterator_range delimiting the match. - Returned iterator is either \c Range1T::iterator or - \c Range1T::const_iterator, depending on the constness of - the input parameter. - - \note This function provides the strong exception-safety guarantee - */ - template - inline iterator_range< - BOOST_STRING_TYPENAME range_iterator::type> - find_last( - Range1T& Input, - const Range2T& Search) - { - return ::boost::algorithm::find(Input, ::boost::algorithm::last_finder(Search)); - } - - //! Find last algorithm ( case insensitive ) - /*! - Search for the last match a string in the input. - Searching is case insensitive. - - \param Input A string which will be searched. - \param Search A substring to be searched for. - \param Loc A locale used for case insensitive comparison - \return - An \c iterator_range delimiting the match. - Returned iterator is either \c Range1T::iterator or - \c Range1T::const_iterator, depending on the constness of - the input parameter. - - \note This function provides the strong exception-safety guarantee - */ - template - inline iterator_range< - BOOST_STRING_TYPENAME range_iterator::type> - ifind_last( - Range1T& Input, - const Range2T& Search, - const std::locale& Loc=std::locale()) - { - return ::boost::algorithm::find(Input, ::boost::algorithm::last_finder(Search, is_iequal(Loc))); - } - -// find_nth ----------------------------------------------------------------------// - - //! Find n-th algorithm - /*! - Search for the n-th (zero-indexed) occurrence of the substring in the - input. - - \param Input A string which will be searched. - \param Search A substring to be searched for. - \param Nth An index (zero-indexed) of the match to be found. - For negative N, the matches are counted from the end of string. - \return - An \c iterator_range delimiting the match. - Returned iterator is either \c Range1T::iterator or - \c Range1T::const_iterator, depending on the constness of - the input parameter. - */ - template - inline iterator_range< - BOOST_STRING_TYPENAME range_iterator::type> - find_nth( - Range1T& Input, - const Range2T& Search, - int Nth) - { - return ::boost::algorithm::find(Input, ::boost::algorithm::nth_finder(Search,Nth)); - } - - //! Find n-th algorithm ( case insensitive ). - /*! - Search for the n-th (zero-indexed) occurrence of the substring in the - input. Searching is case insensitive. - - \param Input A string which will be searched. - \param Search A substring to be searched for. - \param Nth An index (zero-indexed) of the match to be found. - For negative N, the matches are counted from the end of string. - \param Loc A locale used for case insensitive comparison - \return - An \c iterator_range delimiting the match. - Returned iterator is either \c Range1T::iterator or - \c Range1T::const_iterator, depending on the constness of - the input parameter. - - - \note This function provides the strong exception-safety guarantee - */ - template - inline iterator_range< - BOOST_STRING_TYPENAME range_iterator::type> - ifind_nth( - Range1T& Input, - const Range2T& Search, - int Nth, - const std::locale& Loc=std::locale()) - { - return ::boost::algorithm::find(Input, ::boost::algorithm::nth_finder(Search,Nth,is_iequal(Loc))); - } - -// find_head ----------------------------------------------------------------------// - - //! Find head algorithm - /*! - Get the head of the input. Head is a prefix of the string of the - given size. If the input is shorter then required, whole input is considered - to be the head. - - \param Input An input string - \param N Length of the head - For N>=0, at most N characters are extracted. - For N<0, at most size(Input)-|N| characters are extracted. - \return - An \c iterator_range delimiting the match. - Returned iterator is either \c Range1T::iterator or - \c Range1T::const_iterator, depending on the constness of - the input parameter. - - \note This function provides the strong exception-safety guarantee - */ - template - inline iterator_range< - BOOST_STRING_TYPENAME range_iterator::type> - find_head( - RangeT& Input, - int N) - { - return ::boost::algorithm::find(Input, ::boost::algorithm::head_finder(N)); - } - -// find_tail ----------------------------------------------------------------------// - - //! Find tail algorithm - /*! - Get the tail of the input. Tail is a suffix of the string of the - given size. If the input is shorter then required, whole input is considered - to be the tail. - - \param Input An input string - \param N Length of the tail. - For N>=0, at most N characters are extracted. - For N<0, at most size(Input)-|N| characters are extracted. - \return - An \c iterator_range delimiting the match. - Returned iterator is either \c RangeT::iterator or - \c RangeT::const_iterator, depending on the constness of - the input parameter. - - - \note This function provides the strong exception-safety guarantee - */ - template - inline iterator_range< - BOOST_STRING_TYPENAME range_iterator::type> - find_tail( - RangeT& Input, - int N) - { - return ::boost::algorithm::find(Input, ::boost::algorithm::tail_finder(N)); - } - -// find_token --------------------------------------------------------------------// - - //! Find token algorithm - /*! - Look for a given token in the string. Token is a character that matches the - given predicate. - If the "token compress mode" is enabled, adjacent tokens are considered to be one match. - - \param Input A input string. - \param Pred A unary predicate to identify a token - \param eCompress Enable/Disable compressing of adjacent tokens - \return - An \c iterator_range delimiting the match. - Returned iterator is either \c RangeT::iterator or - \c RangeT::const_iterator, depending on the constness of - the input parameter. - - \note This function provides the strong exception-safety guarantee - */ - template - inline iterator_range< - BOOST_STRING_TYPENAME range_iterator::type> - find_token( - RangeT& Input, - PredicateT Pred, - token_compress_mode_type eCompress=token_compress_off) - { - return ::boost::algorithm::find(Input, ::boost::algorithm::token_finder(Pred, eCompress)); - } - - } // namespace algorithm - - // pull names to the boost namespace - using algorithm::find; - using algorithm::find_first; - using algorithm::ifind_first; - using algorithm::find_last; - using algorithm::ifind_last; - using algorithm::find_nth; - using algorithm::ifind_nth; - using algorithm::find_head; - using algorithm::find_tail; - using algorithm::find_token; - -} // namespace boost - - -#endif // BOOST_STRING_FIND_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/find_format.hpp b/third_party/boost_parts/boost/algorithm/string/find_format.hpp deleted file mode 100644 index 0e84a4ee..00000000 --- a/third_party/boost_parts/boost/algorithm/string/find_format.hpp +++ /dev/null @@ -1,287 +0,0 @@ -// Boost string_algo library find_format.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_FIND_FORMAT_HPP -#define BOOST_STRING_FIND_FORMAT_HPP - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -/*! \file - Defines generic replace algorithms. Each algorithm replaces - part(s) of the input. The part to be replaced is looked up using a Finder object. - Result of finding is then used by a Formatter object to generate the replacement. -*/ - -namespace boost { - namespace algorithm { - -// generic replace -----------------------------------------------------------------// - - //! Generic replace algorithm - /*! - Use the Finder to search for a substring. Use the Formatter to format - this substring and replace it in the input. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - - \param Output An output iterator to which the result will be copied - \param Input An input sequence - \param Finder A Finder object used to search for a match to be replaced - \param Formatter A Formatter object used to format a match - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename RangeT, - typename FinderT, - typename FormatterT> - inline OutputIteratorT find_format_copy( - OutputIteratorT Output, - const RangeT& Input, - FinderT Finder, - FormatterT Formatter ) - { - // Concept check - BOOST_CONCEPT_ASSERT(( - FinderConcept< - FinderT, - BOOST_STRING_TYPENAME range_const_iterator::type> - )); - BOOST_CONCEPT_ASSERT(( - FormatterConcept< - FormatterT, - FinderT,BOOST_STRING_TYPENAME range_const_iterator::type> - )); - - iterator_range::type> lit_input(::boost::as_literal(Input)); - - return detail::find_format_copy_impl( - Output, - lit_input, - Formatter, - Finder( ::boost::begin(lit_input), ::boost::end(lit_input) ) ); - } - - //! Generic replace algorithm - /*! - \overload - */ - template< - typename SequenceT, - typename FinderT, - typename FormatterT> - inline SequenceT find_format_copy( - const SequenceT& Input, - FinderT Finder, - FormatterT Formatter ) - { - // Concept check - BOOST_CONCEPT_ASSERT(( - FinderConcept< - FinderT, - BOOST_STRING_TYPENAME range_const_iterator::type> - )); - BOOST_CONCEPT_ASSERT(( - FormatterConcept< - FormatterT, - FinderT,BOOST_STRING_TYPENAME range_const_iterator::type> - )); - - return detail::find_format_copy_impl( - Input, - Formatter, - Finder(::boost::begin(Input), ::boost::end(Input))); - } - - //! Generic replace algorithm - /*! - Use the Finder to search for a substring. Use the Formatter to format - this substring and replace it in the input. The input is modified in-place. - - \param Input An input sequence - \param Finder A Finder object used to search for a match to be replaced - \param Formatter A Formatter object used to format a match - */ - template< - typename SequenceT, - typename FinderT, - typename FormatterT> - inline void find_format( - SequenceT& Input, - FinderT Finder, - FormatterT Formatter) - { - // Concept check - BOOST_CONCEPT_ASSERT(( - FinderConcept< - FinderT, - BOOST_STRING_TYPENAME range_const_iterator::type> - )); - BOOST_CONCEPT_ASSERT(( - FormatterConcept< - FormatterT, - FinderT,BOOST_STRING_TYPENAME range_const_iterator::type> - )); - - detail::find_format_impl( - Input, - Formatter, - Finder(::boost::begin(Input), ::boost::end(Input))); - } - - -// find_format_all generic ----------------------------------------------------------------// - - //! Generic replace all algorithm - /*! - Use the Finder to search for a substring. Use the Formatter to format - this substring and replace it in the input. Repeat this for all matching - substrings. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - - \param Output An output iterator to which the result will be copied - \param Input An input sequence - \param Finder A Finder object used to search for a match to be replaced - \param Formatter A Formatter object used to format a match - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename RangeT, - typename FinderT, - typename FormatterT> - inline OutputIteratorT find_format_all_copy( - OutputIteratorT Output, - const RangeT& Input, - FinderT Finder, - FormatterT Formatter) - { - // Concept check - BOOST_CONCEPT_ASSERT(( - FinderConcept< - FinderT, - BOOST_STRING_TYPENAME range_const_iterator::type> - )); - BOOST_CONCEPT_ASSERT(( - FormatterConcept< - FormatterT, - FinderT,BOOST_STRING_TYPENAME range_const_iterator::type> - )); - - iterator_range::type> lit_input(::boost::as_literal(Input)); - - return detail::find_format_all_copy_impl( - Output, - lit_input, - Finder, - Formatter, - Finder(::boost::begin(lit_input), ::boost::end(lit_input))); - } - - //! Generic replace all algorithm - /*! - \overload - */ - template< - typename SequenceT, - typename FinderT, - typename FormatterT > - inline SequenceT find_format_all_copy( - const SequenceT& Input, - FinderT Finder, - FormatterT Formatter ) - { - // Concept check - BOOST_CONCEPT_ASSERT(( - FinderConcept< - FinderT, - BOOST_STRING_TYPENAME range_const_iterator::type> - )); - BOOST_CONCEPT_ASSERT(( - FormatterConcept< - FormatterT, - FinderT,BOOST_STRING_TYPENAME range_const_iterator::type> - )); - - return detail::find_format_all_copy_impl( - Input, - Finder, - Formatter, - Finder( ::boost::begin(Input), ::boost::end(Input) ) ); - } - - //! Generic replace all algorithm - /*! - Use the Finder to search for a substring. Use the Formatter to format - this substring and replace it in the input. Repeat this for all matching - substrings.The input is modified in-place. - - \param Input An input sequence - \param Finder A Finder object used to search for a match to be replaced - \param Formatter A Formatter object used to format a match - */ - template< - typename SequenceT, - typename FinderT, - typename FormatterT > - inline void find_format_all( - SequenceT& Input, - FinderT Finder, - FormatterT Formatter ) - { - // Concept check - BOOST_CONCEPT_ASSERT(( - FinderConcept< - FinderT, - BOOST_STRING_TYPENAME range_const_iterator::type> - )); - BOOST_CONCEPT_ASSERT(( - FormatterConcept< - FormatterT, - FinderT,BOOST_STRING_TYPENAME range_const_iterator::type> - )); - - detail::find_format_all_impl( - Input, - Finder, - Formatter, - Finder(::boost::begin(Input), ::boost::end(Input))); - - } - - } // namespace algorithm - - // pull the names to the boost namespace - using algorithm::find_format_copy; - using algorithm::find_format; - using algorithm::find_format_all_copy; - using algorithm::find_format_all; - -} // namespace boost - - -#endif // BOOST_STRING_FIND_FORMAT_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/find_iterator.hpp b/third_party/boost_parts/boost/algorithm/string/find_iterator.hpp deleted file mode 100644 index 5a52d92e..00000000 --- a/third_party/boost_parts/boost/algorithm/string/find_iterator.hpp +++ /dev/null @@ -1,388 +0,0 @@ -// Boost string_algo library find_iterator.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-2004. -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/ for updates, documentation, and revision history. - -#ifndef BOOST_STRING_FIND_ITERATOR_HPP -#define BOOST_STRING_FIND_ITERATOR_HPP - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -/*! \file - Defines find iterator classes. Find iterator repeatedly applies a Finder - to the specified input string to search for matches. Dereferencing - the iterator yields the current match or a range between the last and the current - match depending on the iterator used. -*/ - -namespace boost { - namespace algorithm { - -// find_iterator -----------------------------------------------// - - //! find_iterator - /*! - Find iterator encapsulates a Finder and allows - for incremental searching in a string. - Each increment moves the iterator to the next match. - - Find iterator is a readable forward traversal iterator. - - Dereferencing the iterator yields an iterator_range delimiting - the current match. - */ - template - class find_iterator : - public iterator_facade< - find_iterator, - const iterator_range, - forward_traversal_tag >, - private detail::find_iterator_base - { - private: - // facade support - friend class ::boost::iterator_core_access; - - private: - // typedefs - - typedef detail::find_iterator_base base_type; - typedef BOOST_STRING_TYPENAME - base_type::input_iterator_type input_iterator_type; - typedef BOOST_STRING_TYPENAME - base_type::match_type match_type; - - public: - //! Default constructor - /*! - Construct null iterator. All null iterators are equal. - - \post eof()==true - */ - find_iterator() {} - - //! Copy constructor - /*! - Construct a copy of the find_iterator - */ - find_iterator( const find_iterator& Other ) : - base_type(Other), - m_Match(Other.m_Match), - m_End(Other.m_End) {} - - //! Constructor - /*! - Construct new find_iterator for a given finder - and a range. - */ - template - find_iterator( - IteratorT Begin, - IteratorT End, - FinderT Finder ) : - detail::find_iterator_base(Finder,0), - m_Match(Begin,Begin), - m_End(End) - { - increment(); - } - - //! Constructor - /*! - Construct new find_iterator for a given finder - and a range. - */ - template - find_iterator( - RangeT& Col, - FinderT Finder ) : - detail::find_iterator_base(Finder,0) - { - iterator_range::type> lit_col(::boost::as_literal(Col)); - m_Match=::boost::make_iterator_range(::boost::begin(lit_col), ::boost::begin(lit_col)); - m_End=::boost::end(lit_col); - - increment(); - } - - private: - // iterator operations - - // dereference - const match_type& dereference() const - { - return m_Match; - } - - // increment - void increment() - { - m_Match=this->do_find(m_Match.end(),m_End); - } - - // comparison - bool equal( const find_iterator& Other ) const - { - bool bEof=eof(); - bool bOtherEof=Other.eof(); - - return bEof || bOtherEof ? bEof==bOtherEof : - ( - m_Match==Other.m_Match && - m_End==Other.m_End - ); - } - - public: - // operations - - //! Eof check - /*! - Check the eof condition. Eof condition means that - there is nothing more to be searched i.e. find_iterator - is after the last match. - */ - bool eof() const - { - return - this->is_null() || - ( - m_Match.begin() == m_End && - m_Match.end() == m_End - ); - } - - private: - // Attributes - match_type m_Match; - input_iterator_type m_End; - }; - - //! find iterator construction helper - /*! - * Construct a find iterator to iterate through the specified string - */ - template - inline find_iterator< - BOOST_STRING_TYPENAME range_iterator::type> - make_find_iterator( - RangeT& Collection, - FinderT Finder) - { - return find_iterator::type>( - Collection, Finder); - } - -// split iterator -----------------------------------------------// - - //! split_iterator - /*! - Split iterator encapsulates a Finder and allows - for incremental searching in a string. - Unlike the find iterator, split iterator iterates - through gaps between matches. - - Find iterator is a readable forward traversal iterator. - - Dereferencing the iterator yields an iterator_range delimiting - the current match. - */ - template - class split_iterator : - public iterator_facade< - split_iterator, - const iterator_range, - forward_traversal_tag >, - private detail::find_iterator_base - { - private: - // facade support - friend class ::boost::iterator_core_access; - - private: - // typedefs - - typedef detail::find_iterator_base base_type; - typedef BOOST_STRING_TYPENAME - base_type::input_iterator_type input_iterator_type; - typedef BOOST_STRING_TYPENAME - base_type::match_type match_type; - - public: - //! Default constructor - /*! - Construct null iterator. All null iterators are equal. - - \post eof()==true - */ - split_iterator() : - m_Next(), - m_End(), - m_bEof(true) - {} - - //! Copy constructor - /*! - Construct a copy of the split_iterator - */ - split_iterator( const split_iterator& Other ) : - base_type(Other), - m_Match(Other.m_Match), - m_Next(Other.m_Next), - m_End(Other.m_End), - m_bEof(Other.m_bEof) - {} - - //! Constructor - /*! - Construct new split_iterator for a given finder - and a range. - */ - template - split_iterator( - IteratorT Begin, - IteratorT End, - FinderT Finder ) : - detail::find_iterator_base(Finder,0), - m_Match(Begin,Begin), - m_Next(Begin), - m_End(End), - m_bEof(false) - { - // force the correct behavior for empty sequences and yield at least one token - if(Begin!=End) - { - increment(); - } - } - //! Constructor - /*! - Construct new split_iterator for a given finder - and a collection. - */ - template - split_iterator( - RangeT& Col, - FinderT Finder ) : - detail::find_iterator_base(Finder,0), - m_bEof(false) - { - iterator_range::type> lit_col(::boost::as_literal(Col)); - m_Match=make_iterator_range(::boost::begin(lit_col), ::boost::begin(lit_col)); - m_Next=::boost::begin(lit_col); - m_End=::boost::end(lit_col); - - // force the correct behavior for empty sequences and yield at least one token - if(m_Next!=m_End) - { - increment(); - } - } - - - private: - // iterator operations - - // dereference - const match_type& dereference() const - { - return m_Match; - } - - // increment - void increment() - { - match_type FindMatch=this->do_find( m_Next, m_End ); - - if(FindMatch.begin()==m_End && FindMatch.end()==m_End) - { - if(m_Match.end()==m_End) - { - // Mark iterator as eof - m_bEof=true; - } - } - - m_Match=match_type( m_Next, FindMatch.begin() ); - m_Next=FindMatch.end(); - } - - // comparison - bool equal( const split_iterator& Other ) const - { - bool bEof=eof(); - bool bOtherEof=Other.eof(); - - return bEof || bOtherEof ? bEof==bOtherEof : - ( - m_Match==Other.m_Match && - m_Next==Other.m_Next && - m_End==Other.m_End - ); - } - - public: - // operations - - //! Eof check - /*! - Check the eof condition. Eof condition means that - there is nothing more to be searched i.e. find_iterator - is after the last match. - */ - bool eof() const - { - return this->is_null() || m_bEof; - } - - private: - // Attributes - match_type m_Match; - input_iterator_type m_Next; - input_iterator_type m_End; - bool m_bEof; - }; - - //! split iterator construction helper - /*! - * Construct a split iterator to iterate through the specified collection - */ - template - inline split_iterator< - BOOST_STRING_TYPENAME range_iterator::type> - make_split_iterator( - RangeT& Collection, - FinderT Finder) - { - return split_iterator::type>( - Collection, Finder); - } - - - } // namespace algorithm - - // pull names to the boost namespace - using algorithm::find_iterator; - using algorithm::make_find_iterator; - using algorithm::split_iterator; - using algorithm::make_split_iterator; - -} // namespace boost - - -#endif // BOOST_STRING_FIND_ITERATOR_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/finder.hpp b/third_party/boost_parts/boost/algorithm/string/finder.hpp deleted file mode 100644 index 93f7ec30..00000000 --- a/third_party/boost_parts/boost/algorithm/string/finder.hpp +++ /dev/null @@ -1,270 +0,0 @@ -// Boost string_algo library finder.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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) - -// See http://www.boost.org/ for updates, documentation, and revision history. - -#ifndef BOOST_STRING_FINDER_HPP -#define BOOST_STRING_FINDER_HPP - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -/*! \file - Defines Finder generators. Finder object is a functor which is able to - find a substring matching a specific criteria in the input. - Finders are used as a pluggable components for replace, find - and split facilities. This header contains generator functions - for finders provided in this library. -*/ - -namespace boost { - namespace algorithm { - -// Finder generators ------------------------------------------// - - //! "First" finder - /*! - Construct the \c first_finder. The finder searches for the first - occurrence of the string in a given input. - The result is given as an \c iterator_range delimiting the match. - - \param Search A substring to be searched for. - \param Comp An element comparison predicate - \return An instance of the \c first_finder object - */ - template - inline detail::first_finderF< - BOOST_STRING_TYPENAME range_const_iterator::type, - is_equal> - first_finder( const RangeT& Search ) - { - return - detail::first_finderF< - BOOST_STRING_TYPENAME - range_const_iterator::type, - is_equal>( ::boost::as_literal(Search), is_equal() ) ; - } - - //! "First" finder - /*! - \overload - */ - template - inline detail::first_finderF< - BOOST_STRING_TYPENAME range_const_iterator::type, - PredicateT> - first_finder( - const RangeT& Search, PredicateT Comp ) - { - return - detail::first_finderF< - BOOST_STRING_TYPENAME - range_const_iterator::type, - PredicateT>( ::boost::as_literal(Search), Comp ); - } - - //! "Last" finder - /*! - Construct the \c last_finder. The finder searches for the last - occurrence of the string in a given input. - The result is given as an \c iterator_range delimiting the match. - - \param Search A substring to be searched for. - \param Comp An element comparison predicate - \return An instance of the \c last_finder object - */ - template - inline detail::last_finderF< - BOOST_STRING_TYPENAME range_const_iterator::type, - is_equal> - last_finder( const RangeT& Search ) - { - return - detail::last_finderF< - BOOST_STRING_TYPENAME - range_const_iterator::type, - is_equal>( ::boost::as_literal(Search), is_equal() ); - } - //! "Last" finder - /*! - \overload - */ - template - inline detail::last_finderF< - BOOST_STRING_TYPENAME range_const_iterator::type, - PredicateT> - last_finder( const RangeT& Search, PredicateT Comp ) - { - return - detail::last_finderF< - BOOST_STRING_TYPENAME - range_const_iterator::type, - PredicateT>( ::boost::as_literal(Search), Comp ) ; - } - - //! "Nth" finder - /*! - Construct the \c nth_finder. The finder searches for the n-th (zero-indexed) - occurrence of the string in a given input. - The result is given as an \c iterator_range delimiting the match. - - \param Search A substring to be searched for. - \param Nth An index of the match to be find - \param Comp An element comparison predicate - \return An instance of the \c nth_finder object - */ - template - inline detail::nth_finderF< - BOOST_STRING_TYPENAME range_const_iterator::type, - is_equal> - nth_finder( - const RangeT& Search, - int Nth) - { - return - detail::nth_finderF< - BOOST_STRING_TYPENAME - range_const_iterator::type, - is_equal>( ::boost::as_literal(Search), Nth, is_equal() ) ; - } - //! "Nth" finder - /*! - \overload - */ - template - inline detail::nth_finderF< - BOOST_STRING_TYPENAME range_const_iterator::type, - PredicateT> - nth_finder( - const RangeT& Search, - int Nth, - PredicateT Comp ) - { - return - detail::nth_finderF< - BOOST_STRING_TYPENAME - range_const_iterator::type, - PredicateT>( ::boost::as_literal(Search), Nth, Comp ); - } - - //! "Head" finder - /*! - Construct the \c head_finder. The finder returns a head of a given - input. The head is a prefix of a string up to n elements in - size. If an input has less then n elements, whole input is - considered a head. - The result is given as an \c iterator_range delimiting the match. - - \param N The size of the head - \return An instance of the \c head_finder object - */ - inline detail::head_finderF - head_finder( int N ) - { - return detail::head_finderF(N); - } - - //! "Tail" finder - /*! - Construct the \c tail_finder. The finder returns a tail of a given - input. The tail is a suffix of a string up to n elements in - size. If an input has less then n elements, whole input is - considered a head. - The result is given as an \c iterator_range delimiting the match. - - \param N The size of the head - \return An instance of the \c tail_finder object - */ - inline detail::tail_finderF - tail_finder( int N ) - { - return detail::tail_finderF(N); - } - - //! "Token" finder - /*! - Construct the \c token_finder. The finder searches for a token - specified by a predicate. It is similar to std::find_if - algorithm, with an exception that it return a range of - instead of a single iterator. - - If "compress token mode" is enabled, adjacent matching tokens are - concatenated into one match. Thus the finder can be used to - search for continuous segments of characters satisfying the - given predicate. - - The result is given as an \c iterator_range delimiting the match. - - \param Pred An element selection predicate - \param eCompress Compress flag - \return An instance of the \c token_finder object - */ - template< typename PredicateT > - inline detail::token_finderF - token_finder( - PredicateT Pred, - token_compress_mode_type eCompress=token_compress_off ) - { - return detail::token_finderF( Pred, eCompress ); - } - - //! "Range" finder - /*! - Construct the \c range_finder. The finder does not perform - any operation. It simply returns the given range for - any input. - - \param Begin Beginning of the range - \param End End of the range - \param Range The range. - \return An instance of the \c range_finger object - */ - template< typename ForwardIteratorT > - inline detail::range_finderF - range_finder( - ForwardIteratorT Begin, - ForwardIteratorT End ) - { - return detail::range_finderF( Begin, End ); - } - - //! "Range" finder - /*! - \overload - */ - template< typename ForwardIteratorT > - inline detail::range_finderF - range_finder( iterator_range Range ) - { - return detail::range_finderF( Range ); - } - - } // namespace algorithm - - // pull the names to the boost namespace - using algorithm::first_finder; - using algorithm::last_finder; - using algorithm::nth_finder; - using algorithm::head_finder; - using algorithm::tail_finder; - using algorithm::token_finder; - using algorithm::range_finder; - -} // namespace boost - - -#endif // BOOST_STRING_FINDER_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/formatter.hpp b/third_party/boost_parts/boost/algorithm/string/formatter.hpp deleted file mode 100644 index de8681bc..00000000 --- a/third_party/boost_parts/boost/algorithm/string/formatter.hpp +++ /dev/null @@ -1,120 +0,0 @@ -// Boost string_algo library formatter.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_FORMATTER_HPP -#define BOOST_STRING_FORMATTER_HPP - -#include -#include -#include -#include - -#include - -/*! \file - Defines Formatter generators. Formatter is a functor which formats - a string according to given parameters. A Formatter works - in conjunction with a Finder. A Finder can provide additional information - for a specific Formatter. An example of such a cooperation is regex_finder - and regex_formatter. - - Formatters are used as pluggable components for replace facilities. - This header contains generator functions for the Formatters provided in this library. -*/ - -namespace boost { - namespace algorithm { - -// generic formatters ---------------------------------------------------------------// - - //! Constant formatter - /*! - Constructs a \c const_formatter. Const formatter always returns - the same value, regardless of the parameter. - - \param Format A predefined value used as a result for formatting - \return An instance of the \c const_formatter object. - */ - template - inline detail::const_formatF< - iterator_range< - BOOST_STRING_TYPENAME range_const_iterator::type> > - const_formatter(const RangeT& Format) - { - return detail::const_formatF< - iterator_range< - BOOST_STRING_TYPENAME range_const_iterator::type> >(::boost::as_literal(Format)); - } - - //! Identity formatter - /*! - Constructs an \c identity_formatter. Identity formatter always returns - the parameter. - - \return An instance of the \c identity_formatter object. - */ - template - inline detail::identity_formatF< - iterator_range< - BOOST_STRING_TYPENAME range_const_iterator::type> > - identity_formatter() - { - return detail::identity_formatF< - iterator_range< - BOOST_STRING_TYPENAME range_const_iterator::type> >(); - } - - //! Empty formatter - /*! - Constructs an \c empty_formatter. Empty formatter always returns an empty - sequence. - - \param Input container used to select a correct value_type for the - resulting empty_container<>. - \return An instance of the \c empty_formatter object. - */ - template - inline detail::empty_formatF< - BOOST_STRING_TYPENAME range_value::type> - empty_formatter(const RangeT&) - { - return detail::empty_formatF< - BOOST_STRING_TYPENAME range_value::type>(); - } - - //! Empty formatter - /*! - Constructs a \c dissect_formatter. Dissect formatter uses a specified finder - to extract a portion of the formatted sequence. The first finder's match is returned - as a result - - \param Finder a finder used to select a portion of the formatted sequence - \return An instance of the \c dissect_formatter object. - */ - template - inline detail::dissect_formatF< FinderT > - dissect_formatter(const FinderT& Finder) - { - return detail::dissect_formatF(Finder); - } - - - } // namespace algorithm - - // pull the names to the boost namespace - using algorithm::const_formatter; - using algorithm::identity_formatter; - using algorithm::empty_formatter; - using algorithm::dissect_formatter; - -} // namespace boost - - -#endif // BOOST_FORMATTER_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/iter_find.hpp b/third_party/boost_parts/boost/algorithm/string/iter_find.hpp deleted file mode 100644 index 10424abc..00000000 --- a/third_party/boost_parts/boost/algorithm/string/iter_find.hpp +++ /dev/null @@ -1,193 +0,0 @@ -// Boost string_algo library iter_find.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_ITER_FIND_HPP -#define BOOST_STRING_ITER_FIND_HPP - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -/*! \file - Defines generic split algorithms. Split algorithms can be - used to divide a sequence into several part according - to a given criteria. Result is given as a 'container - of containers' where elements are copies or references - to extracted parts. - - There are two algorithms provided. One iterates over matching - substrings, the other one over the gaps between these matches. -*/ - -namespace boost { - namespace algorithm { - -// iterate find ---------------------------------------------------// - - //! Iter find algorithm - /*! - This algorithm executes a given finder in iteration on the input, - until the end of input is reached, or no match is found. - Iteration is done using built-in find_iterator, so the real - searching is performed only when needed. - In each iteration new match is found and added to the result. - - \param Result A 'container container' to contain the result of search. - Both outer and inner container must have constructor taking a pair - of iterators as an argument. - Typical type of the result is - \c std::vector> - (each element of such a vector will container a range delimiting - a match). - \param Input A container which will be searched. - \param Finder A Finder object used for searching - \return A reference to the result - - \note Prior content of the result will be overwritten. - */ - template< - typename SequenceSequenceT, - typename RangeT, - typename FinderT > - inline SequenceSequenceT& - iter_find( - SequenceSequenceT& Result, - RangeT& Input, - FinderT Finder ) - { - BOOST_CONCEPT_ASSERT(( - FinderConcept< - FinderT, - BOOST_STRING_TYPENAME range_iterator::type> - )); - - iterator_range::type> lit_input(::boost::as_literal(Input)); - - typedef BOOST_STRING_TYPENAME - range_iterator::type input_iterator_type; - typedef find_iterator find_iterator_type; - typedef detail::copy_iterator_rangeF< - BOOST_STRING_TYPENAME - range_value::type, - input_iterator_type> copy_range_type; - - input_iterator_type InputEnd=::boost::end(lit_input); - - typedef transform_iterator - transform_iter_type; - - transform_iter_type itBegin= - ::boost::make_transform_iterator( - find_iterator_type( ::boost::begin(lit_input), InputEnd, Finder ), - copy_range_type()); - - transform_iter_type itEnd= - ::boost::make_transform_iterator( - find_iterator_type(), - copy_range_type()); - - SequenceSequenceT Tmp(itBegin, itEnd); - - Result.swap(Tmp); - return Result; - } - -// iterate split ---------------------------------------------------// - - //! Split find algorithm - /*! - This algorithm executes a given finder in iteration on the input, - until the end of input is reached, or no match is found. - Iteration is done using built-in find_iterator, so the real - searching is performed only when needed. - Each match is used as a separator of segments. These segments are then - returned in the result. - - \param Result A 'container container' to contain the result of search. - Both outer and inner container must have constructor taking a pair - of iterators as an argument. - Typical type of the result is - \c std::vector> - (each element of such a vector will container a range delimiting - a match). - \param Input A container which will be searched. - \param Finder A finder object used for searching - \return A reference to the result - - \note Prior content of the result will be overwritten. - */ - template< - typename SequenceSequenceT, - typename RangeT, - typename FinderT > - inline SequenceSequenceT& - iter_split( - SequenceSequenceT& Result, - RangeT& Input, - FinderT Finder ) - { - BOOST_CONCEPT_ASSERT(( - FinderConcept::type> - )); - - iterator_range::type> lit_input(::boost::as_literal(Input)); - - typedef BOOST_STRING_TYPENAME - range_iterator::type input_iterator_type; - typedef split_iterator find_iterator_type; - typedef detail::copy_iterator_rangeF< - BOOST_STRING_TYPENAME - range_value::type, - input_iterator_type> copy_range_type; - - input_iterator_type InputEnd=::boost::end(lit_input); - - typedef transform_iterator - transform_iter_type; - - transform_iter_type itBegin= - ::boost::make_transform_iterator( - find_iterator_type( ::boost::begin(lit_input), InputEnd, Finder ), - copy_range_type() ); - - transform_iter_type itEnd= - ::boost::make_transform_iterator( - find_iterator_type(), - copy_range_type() ); - - SequenceSequenceT Tmp(itBegin, itEnd); - - Result.swap(Tmp); - return Result; - } - - } // namespace algorithm - - // pull names to the boost namespace - using algorithm::iter_find; - using algorithm::iter_split; - -} // namespace boost - - -#endif // BOOST_STRING_ITER_FIND_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/join.hpp b/third_party/boost_parts/boost/algorithm/string/join.hpp deleted file mode 100644 index b871eb44..00000000 --- a/third_party/boost_parts/boost/algorithm/string/join.hpp +++ /dev/null @@ -1,145 +0,0 @@ -// Boost string_algo library join.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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) - -// See http://www.boost.org/ for updates, documentation, and revision history. - -#ifndef BOOST_STRING_JOIN_HPP -#define BOOST_STRING_JOIN_HPP - -#include -#include -#include -#include - -/*! \file - Defines join algorithm. - - Join algorithm is a counterpart to split algorithms. - It joins strings from a 'list' by adding user defined separator. - Additionally there is a version that allows simple filtering - by providing a predicate. -*/ - -namespace boost { - namespace algorithm { - -// join --------------------------------------------------------------// - - //! Join algorithm - /*! - This algorithm joins all strings in a 'list' into one long string. - Segments are concatenated by given separator. - - \param Input A container that holds the input strings. It must be a container-of-containers. - \param Separator A string that will separate the joined segments. - \return Concatenated string. - - \note This function provides the strong exception-safety guarantee - */ - template< typename SequenceSequenceT, typename Range1T> - inline typename range_value::type - join( - const SequenceSequenceT& Input, - const Range1T& Separator) - { - // Define working types - typedef typename range_value::type ResultT; - typedef typename range_const_iterator::type InputIteratorT; - - // Parse input - InputIteratorT itBegin=::boost::begin(Input); - InputIteratorT itEnd=::boost::end(Input); - - // Construct container to hold the result - ResultT Result; - - // Append first element - if(itBegin!=itEnd) - { - detail::insert(Result, ::boost::end(Result), *itBegin); - ++itBegin; - } - - for(;itBegin!=itEnd; ++itBegin) - { - // Add separator - detail::insert(Result, ::boost::end(Result), ::boost::as_literal(Separator)); - // Add element - detail::insert(Result, ::boost::end(Result), *itBegin); - } - - return Result; - } - -// join_if ----------------------------------------------------------// - - //! Conditional join algorithm - /*! - This algorithm joins all strings in a 'list' into one long string. - Segments are concatenated by given separator. Only segments that - satisfy the predicate will be added to the result. - - \param Input A container that holds the input strings. It must be a container-of-containers. - \param Separator A string that will separate the joined segments. - \param Pred A segment selection predicate - \return Concatenated string. - - \note This function provides the strong exception-safety guarantee - */ - template< typename SequenceSequenceT, typename Range1T, typename PredicateT> - inline typename range_value::type - join_if( - const SequenceSequenceT& Input, - const Range1T& Separator, - PredicateT Pred) - { - // Define working types - typedef typename range_value::type ResultT; - typedef typename range_const_iterator::type InputIteratorT; - - // Parse input - InputIteratorT itBegin=::boost::begin(Input); - InputIteratorT itEnd=::boost::end(Input); - - // Construct container to hold the result - ResultT Result; - - // Roll to the first element that will be added - while(itBegin!=itEnd && !Pred(*itBegin)) ++itBegin; - // Add this element - if(itBegin!=itEnd) - { - detail::insert(Result, ::boost::end(Result), *itBegin); - ++itBegin; - } - - for(;itBegin!=itEnd; ++itBegin) - { - if(Pred(*itBegin)) - { - // Add separator - detail::insert(Result, ::boost::end(Result), ::boost::as_literal(Separator)); - // Add element - detail::insert(Result, ::boost::end(Result), *itBegin); - } - } - - return Result; - } - - } // namespace algorithm - - // pull names to the boost namespace - using algorithm::join; - using algorithm::join_if; - -} // namespace boost - - -#endif // BOOST_STRING_JOIN_HPP - diff --git a/third_party/boost_parts/boost/algorithm/string/predicate.hpp b/third_party/boost_parts/boost/algorithm/string/predicate.hpp deleted file mode 100644 index 0879829b..00000000 --- a/third_party/boost_parts/boost/algorithm/string/predicate.hpp +++ /dev/null @@ -1,475 +0,0 @@ -// Boost string_algo library predicate.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_PREDICATE_HPP -#define BOOST_STRING_PREDICATE_HPP - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -/*! \file boost/algorithm/string/predicate.hpp - Defines string-related predicates. - The predicates determine whether a substring is contained in the input string - under various conditions: a string starts with the substring, ends with the - substring, simply contains the substring or if both strings are equal. - Additionaly the algorithm \c all() checks all elements of a container to satisfy a - condition. - - All predicates provide the strong exception guarantee. -*/ - -namespace boost { - namespace algorithm { - -// starts_with predicate -----------------------------------------------// - - //! 'Starts with' predicate - /*! - This predicate holds when the test string is a prefix of the Input. - In other words, if the input starts with the test. - When the optional predicate is specified, it is used for character-wise - comparison. - - \param Input An input sequence - \param Test A test sequence - \param Comp An element comparison predicate - \return The result of the test - - \note This function provides the strong exception-safety guarantee - */ - template - inline bool starts_with( - const Range1T& Input, - const Range2T& Test, - PredicateT Comp) - { - iterator_range::type> lit_input(::boost::as_literal(Input)); - iterator_range::type> lit_test(::boost::as_literal(Test)); - - typedef BOOST_STRING_TYPENAME - range_const_iterator::type Iterator1T; - typedef BOOST_STRING_TYPENAME - range_const_iterator::type Iterator2T; - - Iterator1T InputEnd=::boost::end(lit_input); - Iterator2T TestEnd=::boost::end(lit_test); - - Iterator1T it=::boost::begin(lit_input); - Iterator2T pit=::boost::begin(lit_test); - for(; - it!=InputEnd && pit!=TestEnd; - ++it,++pit) - { - if( !(Comp(*it,*pit)) ) - return false; - } - - return pit==TestEnd; - } - - //! 'Starts with' predicate - /*! - \overload - */ - template - inline bool starts_with( - const Range1T& Input, - const Range2T& Test) - { - return ::boost::algorithm::starts_with(Input, Test, is_equal()); - } - - //! 'Starts with' predicate ( case insensitive ) - /*! - This predicate holds when the test string is a prefix of the Input. - In other words, if the input starts with the test. - Elements are compared case insensitively. - - \param Input An input sequence - \param Test A test sequence - \param Loc A locale used for case insensitive comparison - \return The result of the test - - \note This function provides the strong exception-safety guarantee - */ - template - inline bool istarts_with( - const Range1T& Input, - const Range2T& Test, - const std::locale& Loc=std::locale()) - { - return ::boost::algorithm::starts_with(Input, Test, is_iequal(Loc)); - } - - -// ends_with predicate -----------------------------------------------// - - //! 'Ends with' predicate - /*! - This predicate holds when the test string is a suffix of the Input. - In other words, if the input ends with the test. - When the optional predicate is specified, it is used for character-wise - comparison. - - - \param Input An input sequence - \param Test A test sequence - \param Comp An element comparison predicate - \return The result of the test - - \note This function provides the strong exception-safety guarantee - */ - template - inline bool ends_with( - const Range1T& Input, - const Range2T& Test, - PredicateT Comp) - { - iterator_range::type> lit_input(::boost::as_literal(Input)); - iterator_range::type> lit_test(::boost::as_literal(Test)); - - typedef BOOST_STRING_TYPENAME - range_const_iterator::type Iterator1T; - typedef BOOST_STRING_TYPENAME boost::detail:: - iterator_traits::iterator_category category; - - return detail:: - ends_with_iter_select( - ::boost::begin(lit_input), - ::boost::end(lit_input), - ::boost::begin(lit_test), - ::boost::end(lit_test), - Comp, - category()); - } - - - //! 'Ends with' predicate - /*! - \overload - */ - template - inline bool ends_with( - const Range1T& Input, - const Range2T& Test) - { - return ::boost::algorithm::ends_with(Input, Test, is_equal()); - } - - //! 'Ends with' predicate ( case insensitive ) - /*! - This predicate holds when the test container is a suffix of the Input. - In other words, if the input ends with the test. - Elements are compared case insensitively. - - \param Input An input sequence - \param Test A test sequence - \param Loc A locale used for case insensitive comparison - \return The result of the test - - \note This function provides the strong exception-safety guarantee - */ - template - inline bool iends_with( - const Range1T& Input, - const Range2T& Test, - const std::locale& Loc=std::locale()) - { - return ::boost::algorithm::ends_with(Input, Test, is_iequal(Loc)); - } - -// contains predicate -----------------------------------------------// - - //! 'Contains' predicate - /*! - This predicate holds when the test container is contained in the Input. - When the optional predicate is specified, it is used for character-wise - comparison. - - \param Input An input sequence - \param Test A test sequence - \param Comp An element comparison predicate - \return The result of the test - - \note This function provides the strong exception-safety guarantee - */ - template - inline bool contains( - const Range1T& Input, - const Range2T& Test, - PredicateT Comp) - { - iterator_range::type> lit_input(::boost::as_literal(Input)); - iterator_range::type> lit_test(::boost::as_literal(Test)); - - if (::boost::empty(lit_test)) - { - // Empty range is contained always - return true; - } - - // Use the temporary variable to make VACPP happy - bool bResult=(::boost::algorithm::first_finder(lit_test,Comp)(::boost::begin(lit_input), ::boost::end(lit_input))); - return bResult; - } - - //! 'Contains' predicate - /*! - \overload - */ - template - inline bool contains( - const Range1T& Input, - const Range2T& Test) - { - return ::boost::algorithm::contains(Input, Test, is_equal()); - } - - //! 'Contains' predicate ( case insensitive ) - /*! - This predicate holds when the test container is contained in the Input. - Elements are compared case insensitively. - - \param Input An input sequence - \param Test A test sequence - \param Loc A locale used for case insensitive comparison - \return The result of the test - - \note This function provides the strong exception-safety guarantee - */ - template - inline bool icontains( - const Range1T& Input, - const Range2T& Test, - const std::locale& Loc=std::locale()) - { - return ::boost::algorithm::contains(Input, Test, is_iequal(Loc)); - } - -// equals predicate -----------------------------------------------// - - //! 'Equals' predicate - /*! - This predicate holds when the test container is equal to the - input container i.e. all elements in both containers are same. - When the optional predicate is specified, it is used for character-wise - comparison. - - \param Input An input sequence - \param Test A test sequence - \param Comp An element comparison predicate - \return The result of the test - - \note This is a two-way version of \c std::equal algorithm - - \note This function provides the strong exception-safety guarantee - */ - template - inline bool equals( - const Range1T& Input, - const Range2T& Test, - PredicateT Comp) - { - iterator_range::type> lit_input(::boost::as_literal(Input)); - iterator_range::type> lit_test(::boost::as_literal(Test)); - - typedef BOOST_STRING_TYPENAME - range_const_iterator::type Iterator1T; - typedef BOOST_STRING_TYPENAME - range_const_iterator::type Iterator2T; - - Iterator1T InputEnd=::boost::end(lit_input); - Iterator2T TestEnd=::boost::end(lit_test); - - Iterator1T it=::boost::begin(lit_input); - Iterator2T pit=::boost::begin(lit_test); - for(; - it!=InputEnd && pit!=TestEnd; - ++it,++pit) - { - if( !(Comp(*it,*pit)) ) - return false; - } - - return (pit==TestEnd) && (it==InputEnd); - } - - //! 'Equals' predicate - /*! - \overload - */ - template - inline bool equals( - const Range1T& Input, - const Range2T& Test) - { - return ::boost::algorithm::equals(Input, Test, is_equal()); - } - - //! 'Equals' predicate ( case insensitive ) - /*! - This predicate holds when the test container is equal to the - input container i.e. all elements in both containers are same. - Elements are compared case insensitively. - - \param Input An input sequence - \param Test A test sequence - \param Loc A locale used for case insensitive comparison - \return The result of the test - - \note This is a two-way version of \c std::equal algorithm - - \note This function provides the strong exception-safety guarantee - */ - template - inline bool iequals( - const Range1T& Input, - const Range2T& Test, - const std::locale& Loc=std::locale()) - { - return ::boost::algorithm::equals(Input, Test, is_iequal(Loc)); - } - -// lexicographical_compare predicate -----------------------------// - - //! Lexicographical compare predicate - /*! - This predicate is an overload of std::lexicographical_compare - for range arguments - - It check whether the first argument is lexicographically less - then the second one. - - If the optional predicate is specified, it is used for character-wise - comparison - - \param Arg1 First argument - \param Arg2 Second argument - \param Pred Comparison predicate - \return The result of the test - - \note This function provides the strong exception-safety guarantee - */ - template - inline bool lexicographical_compare( - const Range1T& Arg1, - const Range2T& Arg2, - PredicateT Pred) - { - iterator_range::type> lit_arg1(::boost::as_literal(Arg1)); - iterator_range::type> lit_arg2(::boost::as_literal(Arg2)); - - return std::lexicographical_compare( - ::boost::begin(lit_arg1), - ::boost::end(lit_arg1), - ::boost::begin(lit_arg2), - ::boost::end(lit_arg2), - Pred); - } - - //! Lexicographical compare predicate - /*! - \overload - */ - template - inline bool lexicographical_compare( - const Range1T& Arg1, - const Range2T& Arg2) - { - return ::boost::algorithm::lexicographical_compare(Arg1, Arg2, is_less()); - } - - //! Lexicographical compare predicate (case-insensitive) - /*! - This predicate is an overload of std::lexicographical_compare - for range arguments. - It check whether the first argument is lexicographically less - then the second one. - Elements are compared case insensitively - - - \param Arg1 First argument - \param Arg2 Second argument - \param Loc A locale used for case insensitive comparison - \return The result of the test - - \note This function provides the strong exception-safety guarantee - */ - template - inline bool ilexicographical_compare( - const Range1T& Arg1, - const Range2T& Arg2, - const std::locale& Loc=std::locale()) - { - return ::boost::algorithm::lexicographical_compare(Arg1, Arg2, is_iless(Loc)); - } - - -// all predicate -----------------------------------------------// - - //! 'All' predicate - /*! - This predicate holds it all its elements satisfy a given - condition, represented by the predicate. - - \param Input An input sequence - \param Pred A predicate - \return The result of the test - - \note This function provides the strong exception-safety guarantee - */ - template - inline bool all( - const RangeT& Input, - PredicateT Pred) - { - iterator_range::type> lit_input(::boost::as_literal(Input)); - - typedef BOOST_STRING_TYPENAME - range_const_iterator::type Iterator1T; - - Iterator1T InputEnd=::boost::end(lit_input); - for( Iterator1T It=::boost::begin(lit_input); It!=InputEnd; ++It) - { - if (!Pred(*It)) - return false; - } - - return true; - } - - } // namespace algorithm - - // pull names to the boost namespace - using algorithm::starts_with; - using algorithm::istarts_with; - using algorithm::ends_with; - using algorithm::iends_with; - using algorithm::contains; - using algorithm::icontains; - using algorithm::equals; - using algorithm::iequals; - using algorithm::all; - using algorithm::lexicographical_compare; - using algorithm::ilexicographical_compare; - -} // namespace boost - - -#endif // BOOST_STRING_PREDICATE_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/predicate_facade.hpp b/third_party/boost_parts/boost/algorithm/string/predicate_facade.hpp deleted file mode 100644 index a9753fc2..00000000 --- a/third_party/boost_parts/boost/algorithm/string/predicate_facade.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// Boost string_algo library predicate_facade.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_PREDICATE_FACADE_HPP -#define BOOST_STRING_PREDICATE_FACADE_HPP - -#include - -/* - \file boost/algorith/string/predicate_facade.hpp - This file contains predicate_facade definition. This template class is used - to identify classification predicates, so they can be combined using - composition operators. -*/ - -namespace boost { - namespace algorithm { - -// predicate facade ------------------------------------------------------// - - //! Predicate facade - /*! - This class allows to recognize classification - predicates, so that they can be combined using - composition operators. - Every classification predicate must be derived from this class. - */ - template - struct predicate_facade {}; - - } // namespace algorithm -} // namespace boost - - -#endif // BOOST_STRING_CLASSIFICATION_DETAIL_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/replace.hpp b/third_party/boost_parts/boost/algorithm/string/replace.hpp deleted file mode 100644 index 0c04e47e..00000000 --- a/third_party/boost_parts/boost/algorithm/string/replace.hpp +++ /dev/null @@ -1,928 +0,0 @@ -// Boost string_algo library replace.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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) - -// See http://www.boost.org/ for updates, documentation, and revision history. - -#ifndef BOOST_STRING_REPLACE_HPP -#define BOOST_STRING_REPLACE_HPP - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -/*! \file - Defines various replace algorithms. Each algorithm replaces - part(s) of the input according to set of searching and replace criteria. -*/ - -namespace boost { - namespace algorithm { - -// replace_range --------------------------------------------------------------------// - - //! Replace range algorithm - /*! - Replace the given range in the input string. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param SearchRange A range in the input to be substituted - \param Format A substitute string - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T> - inline OutputIteratorT replace_range_copy( - OutputIteratorT Output, - const Range1T& Input, - const iterator_range< - BOOST_STRING_TYPENAME - range_const_iterator::type>& SearchRange, - const Range2T& Format) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::range_finder(SearchRange), - ::boost::algorithm::const_formatter(Format)); - } - - //! Replace range algorithm - /*! - \overload - */ - template - inline SequenceT replace_range_copy( - const SequenceT& Input, - const iterator_range< - BOOST_STRING_TYPENAME - range_const_iterator::type>& SearchRange, - const RangeT& Format) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::range_finder(SearchRange), - ::boost::algorithm::const_formatter(Format)); - } - - //! Replace range algorithm - /*! - Replace the given range in the input string. - The input sequence is modified in-place. - - \param Input An input string - \param SearchRange A range in the input to be substituted - \param Format A substitute string - */ - template - inline void replace_range( - SequenceT& Input, - const iterator_range< - BOOST_STRING_TYPENAME - range_iterator::type>& SearchRange, - const RangeT& Format) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::range_finder(SearchRange), - ::boost::algorithm::const_formatter(Format)); - } - -// replace_first --------------------------------------------------------------------// - - //! Replace first algorithm - /*! - Replace the first match of the search substring in the input - with the format string. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param Search A substring to be searched for - \param Format A substitute string - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T, - typename Range3T> - inline OutputIteratorT replace_first_copy( - OutputIteratorT Output, - const Range1T& Input, - const Range2T& Search, - const Range3T& Format) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::first_finder(Search), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace first algorithm - /*! - \overload - */ - template - inline SequenceT replace_first_copy( - const SequenceT& Input, - const Range1T& Search, - const Range2T& Format ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::first_finder(Search), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace first algorithm - /*! - replace the first match of the search substring in the input - with the format string. The input sequence is modified in-place. - - \param Input An input string - \param Search A substring to be searched for - \param Format A substitute string - */ - template - inline void replace_first( - SequenceT& Input, - const Range1T& Search, - const Range2T& Format ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::first_finder(Search), - ::boost::algorithm::const_formatter(Format) ); - } - -// replace_first ( case insensitive ) ---------------------------------------------// - - //! Replace first algorithm ( case insensitive ) - /*! - Replace the first match of the search substring in the input - with the format string. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - Searching is case insensitive. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param Search A substring to be searched for - \param Format A substitute string - \param Loc A locale used for case insensitive comparison - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T, - typename Range3T> - inline OutputIteratorT ireplace_first_copy( - OutputIteratorT Output, - const Range1T& Input, - const Range2T& Search, - const Range3T& Format, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::first_finder(Search, is_iequal(Loc)), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace first algorithm ( case insensitive ) - /*! - \overload - */ - template - inline SequenceT ireplace_first_copy( - const SequenceT& Input, - const Range2T& Search, - const Range1T& Format, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::first_finder(Search, is_iequal(Loc)), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace first algorithm ( case insensitive ) - /*! - Replace the first match of the search substring in the input - with the format string. Input sequence is modified in-place. - Searching is case insensitive. - - \param Input An input string - \param Search A substring to be searched for - \param Format A substitute string - \param Loc A locale used for case insensitive comparison - */ - template - inline void ireplace_first( - SequenceT& Input, - const Range1T& Search, - const Range2T& Format, - const std::locale& Loc=std::locale() ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::first_finder(Search, is_iequal(Loc)), - ::boost::algorithm::const_formatter(Format) ); - } - -// replace_last --------------------------------------------------------------------// - - //! Replace last algorithm - /*! - Replace the last match of the search string in the input - with the format string. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param Search A substring to be searched for - \param Format A substitute string - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T, - typename Range3T> - inline OutputIteratorT replace_last_copy( - OutputIteratorT Output, - const Range1T& Input, - const Range2T& Search, - const Range3T& Format ) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::last_finder(Search), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace last algorithm - /*! - \overload - */ - template - inline SequenceT replace_last_copy( - const SequenceT& Input, - const Range1T& Search, - const Range2T& Format ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::last_finder(Search), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace last algorithm - /*! - Replace the last match of the search string in the input - with the format string. Input sequence is modified in-place. - - \param Input An input string - \param Search A substring to be searched for - \param Format A substitute string - */ - template - inline void replace_last( - SequenceT& Input, - const Range1T& Search, - const Range2T& Format ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::last_finder(Search), - ::boost::algorithm::const_formatter(Format) ); - } - -// replace_last ( case insensitive ) -----------------------------------------------// - - //! Replace last algorithm ( case insensitive ) - /*! - Replace the last match of the search string in the input - with the format string. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - Searching is case insensitive. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param Search A substring to be searched for - \param Format A substitute string - \param Loc A locale used for case insensitive comparison - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T, - typename Range3T> - inline OutputIteratorT ireplace_last_copy( - OutputIteratorT Output, - const Range1T& Input, - const Range2T& Search, - const Range3T& Format, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::last_finder(Search, is_iequal(Loc)), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace last algorithm ( case insensitive ) - /*! - \overload - */ - template - inline SequenceT ireplace_last_copy( - const SequenceT& Input, - const Range1T& Search, - const Range2T& Format, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::last_finder(Search, is_iequal(Loc)), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace last algorithm ( case insensitive ) - /*! - Replace the last match of the search string in the input - with the format string.The input sequence is modified in-place. - Searching is case insensitive. - - \param Input An input string - \param Search A substring to be searched for - \param Format A substitute string - \param Loc A locale used for case insensitive comparison - \return A reference to the modified input - */ - template - inline void ireplace_last( - SequenceT& Input, - const Range1T& Search, - const Range2T& Format, - const std::locale& Loc=std::locale() ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::last_finder(Search, is_iequal(Loc)), - ::boost::algorithm::const_formatter(Format) ); - } - -// replace_nth --------------------------------------------------------------------// - - //! Replace nth algorithm - /*! - Replace an Nth (zero-indexed) match of the search string in the input - with the format string. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param Search A substring to be searched for - \param Nth An index of the match to be replaced. The index is 0-based. - For negative N, matches are counted from the end of string. - \param Format A substitute string - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T, - typename Range3T> - inline OutputIteratorT replace_nth_copy( - OutputIteratorT Output, - const Range1T& Input, - const Range2T& Search, - int Nth, - const Range3T& Format ) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::nth_finder(Search, Nth), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace nth algorithm - /*! - \overload - */ - template - inline SequenceT replace_nth_copy( - const SequenceT& Input, - const Range1T& Search, - int Nth, - const Range2T& Format ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::nth_finder(Search, Nth), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace nth algorithm - /*! - Replace an Nth (zero-indexed) match of the search string in the input - with the format string. Input sequence is modified in-place. - - \param Input An input string - \param Search A substring to be searched for - \param Nth An index of the match to be replaced. The index is 0-based. - For negative N, matches are counted from the end of string. - \param Format A substitute string - */ - template - inline void replace_nth( - SequenceT& Input, - const Range1T& Search, - int Nth, - const Range2T& Format ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::nth_finder(Search, Nth), - ::boost::algorithm::const_formatter(Format) ); - } - -// replace_nth ( case insensitive ) -----------------------------------------------// - - //! Replace nth algorithm ( case insensitive ) - /*! - Replace an Nth (zero-indexed) match of the search string in the input - with the format string. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - Searching is case insensitive. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param Search A substring to be searched for - \param Nth An index of the match to be replaced. The index is 0-based. - For negative N, matches are counted from the end of string. - \param Format A substitute string - \param Loc A locale used for case insensitive comparison - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T, - typename Range3T> - inline OutputIteratorT ireplace_nth_copy( - OutputIteratorT Output, - const Range1T& Input, - const Range2T& Search, - int Nth, - const Range3T& Format, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc) ), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace nth algorithm ( case insensitive ) - /*! - \overload - */ - template - inline SequenceT ireplace_nth_copy( - const SequenceT& Input, - const Range1T& Search, - int Nth, - const Range2T& Format, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc)), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace nth algorithm ( case insensitive ) - /*! - Replace an Nth (zero-indexed) match of the search string in the input - with the format string. Input sequence is modified in-place. - Searching is case insensitive. - - \param Input An input string - \param Search A substring to be searched for - \param Nth An index of the match to be replaced. The index is 0-based. - For negative N, matches are counted from the end of string. - \param Format A substitute string - \param Loc A locale used for case insensitive comparison - */ - template - inline void ireplace_nth( - SequenceT& Input, - const Range1T& Search, - int Nth, - const Range2T& Format, - const std::locale& Loc=std::locale() ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc)), - ::boost::algorithm::const_formatter(Format) ); - } - -// replace_all --------------------------------------------------------------------// - - //! Replace all algorithm - /*! - Replace all occurrences of the search string in the input - with the format string. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param Search A substring to be searched for - \param Format A substitute string - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T, - typename Range3T> - inline OutputIteratorT replace_all_copy( - OutputIteratorT Output, - const Range1T& Input, - const Range2T& Search, - const Range3T& Format ) - { - return ::boost::algorithm::find_format_all_copy( - Output, - Input, - ::boost::algorithm::first_finder(Search), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace all algorithm - /*! - \overload - */ - template - inline SequenceT replace_all_copy( - const SequenceT& Input, - const Range1T& Search, - const Range2T& Format ) - { - return ::boost::algorithm::find_format_all_copy( - Input, - ::boost::algorithm::first_finder(Search), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace all algorithm - /*! - Replace all occurrences of the search string in the input - with the format string. The input sequence is modified in-place. - - \param Input An input string - \param Search A substring to be searched for - \param Format A substitute string - \return A reference to the modified input - */ - template - inline void replace_all( - SequenceT& Input, - const Range1T& Search, - const Range2T& Format ) - { - ::boost::algorithm::find_format_all( - Input, - ::boost::algorithm::first_finder(Search), - ::boost::algorithm::const_formatter(Format) ); - } - -// replace_all ( case insensitive ) -----------------------------------------------// - - //! Replace all algorithm ( case insensitive ) - /*! - Replace all occurrences of the search string in the input - with the format string. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - Searching is case insensitive. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param Search A substring to be searched for - \param Format A substitute string - \param Loc A locale used for case insensitive comparison - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T, - typename Range3T> - inline OutputIteratorT ireplace_all_copy( - OutputIteratorT Output, - const Range1T& Input, - const Range2T& Search, - const Range3T& Format, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::find_format_all_copy( - Output, - Input, - ::boost::algorithm::first_finder(Search, is_iequal(Loc)), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace all algorithm ( case insensitive ) - /*! - \overload - */ - template - inline SequenceT ireplace_all_copy( - const SequenceT& Input, - const Range1T& Search, - const Range2T& Format, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::find_format_all_copy( - Input, - ::boost::algorithm::first_finder(Search, is_iequal(Loc)), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace all algorithm ( case insensitive ) - /*! - Replace all occurrences of the search string in the input - with the format string.The input sequence is modified in-place. - Searching is case insensitive. - - \param Input An input string - \param Search A substring to be searched for - \param Format A substitute string - \param Loc A locale used for case insensitive comparison - */ - template - inline void ireplace_all( - SequenceT& Input, - const Range1T& Search, - const Range2T& Format, - const std::locale& Loc=std::locale() ) - { - ::boost::algorithm::find_format_all( - Input, - ::boost::algorithm::first_finder(Search, is_iequal(Loc)), - ::boost::algorithm::const_formatter(Format) ); - } - -// replace_head --------------------------------------------------------------------// - - //! Replace head algorithm - /*! - Replace the head of the input with the given format string. - The head is a prefix of a string of given size. - If the sequence is shorter then required, whole string if - considered to be the head. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param N Length of the head. - For N>=0, at most N characters are extracted. - For N<0, size(Input)-|N| characters are extracted. - \param Format A substitute string - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T> - inline OutputIteratorT replace_head_copy( - OutputIteratorT Output, - const Range1T& Input, - int N, - const Range2T& Format ) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::head_finder(N), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace head algorithm - /*! - \overload - */ - template - inline SequenceT replace_head_copy( - const SequenceT& Input, - int N, - const RangeT& Format ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::head_finder(N), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace head algorithm - /*! - Replace the head of the input with the given format string. - The head is a prefix of a string of given size. - If the sequence is shorter then required, the whole string is - considered to be the head. The input sequence is modified in-place. - - \param Input An input string - \param N Length of the head. - For N>=0, at most N characters are extracted. - For N<0, size(Input)-|N| characters are extracted. - \param Format A substitute string - */ - template - inline void replace_head( - SequenceT& Input, - int N, - const RangeT& Format ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::head_finder(N), - ::boost::algorithm::const_formatter(Format) ); - } - -// replace_tail --------------------------------------------------------------------// - - //! Replace tail algorithm - /*! - Replace the tail of the input with the given format string. - The tail is a suffix of a string of given size. - If the sequence is shorter then required, whole string is - considered to be the tail. - The result is a modified copy of the input. It is returned as a sequence - or copied to the output iterator. - - \param Output An output iterator to which the result will be copied - \param Input An input string - \param N Length of the tail. - For N>=0, at most N characters are extracted. - For N<0, size(Input)-|N| characters are extracted. - \param Format A substitute string - \return An output iterator pointing just after the last inserted character or - a modified copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template< - typename OutputIteratorT, - typename Range1T, - typename Range2T> - inline OutputIteratorT replace_tail_copy( - OutputIteratorT Output, - const Range1T& Input, - int N, - const Range2T& Format ) - { - return ::boost::algorithm::find_format_copy( - Output, - Input, - ::boost::algorithm::tail_finder(N), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace tail algorithm - /*! - \overload - */ - template - inline SequenceT replace_tail_copy( - const SequenceT& Input, - int N, - const RangeT& Format ) - { - return ::boost::algorithm::find_format_copy( - Input, - ::boost::algorithm::tail_finder(N), - ::boost::algorithm::const_formatter(Format) ); - } - - //! Replace tail algorithm - /*! - Replace the tail of the input with the given format sequence. - The tail is a suffix of a string of given size. - If the sequence is shorter then required, the whole string is - considered to be the tail. The input sequence is modified in-place. - - \param Input An input string - \param N Length of the tail. - For N>=0, at most N characters are extracted. - For N<0, size(Input)-|N| characters are extracted. - \param Format A substitute string - */ - template - inline void replace_tail( - SequenceT& Input, - int N, - const RangeT& Format ) - { - ::boost::algorithm::find_format( - Input, - ::boost::algorithm::tail_finder(N), - ::boost::algorithm::const_formatter(Format) ); - } - - } // namespace algorithm - - // pull names to the boost namespace - using algorithm::replace_range_copy; - using algorithm::replace_range; - using algorithm::replace_first_copy; - using algorithm::replace_first; - using algorithm::ireplace_first_copy; - using algorithm::ireplace_first; - using algorithm::replace_last_copy; - using algorithm::replace_last; - using algorithm::ireplace_last_copy; - using algorithm::ireplace_last; - using algorithm::replace_nth_copy; - using algorithm::replace_nth; - using algorithm::ireplace_nth_copy; - using algorithm::ireplace_nth; - using algorithm::replace_all_copy; - using algorithm::replace_all; - using algorithm::ireplace_all_copy; - using algorithm::ireplace_all; - using algorithm::replace_head_copy; - using algorithm::replace_head; - using algorithm::replace_tail_copy; - using algorithm::replace_tail; - -} // namespace boost - -#endif // BOOST_REPLACE_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/sequence_traits.hpp b/third_party/boost_parts/boost/algorithm/string/sequence_traits.hpp deleted file mode 100644 index be151f8d..00000000 --- a/third_party/boost_parts/boost/algorithm/string/sequence_traits.hpp +++ /dev/null @@ -1,120 +0,0 @@ -// Boost string_algo library sequence_traits.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_SEQUENCE_TRAITS_HPP -#define BOOST_STRING_SEQUENCE_TRAITS_HPP - -#include -#include -#include - -/*! \file - Traits defined in this header are used by various algorithms to achieve - better performance for specific containers. - Traits provide fail-safe defaults. If a container supports some of these - features, it is possible to specialize the specific trait for this container. - For lacking compilers, it is possible of define an override for a specific tester - function. - - Due to a language restriction, it is not currently possible to define specializations for - stl containers without including the corresponding header. To decrease the overhead - needed by this inclusion, user can selectively include a specialization - header for a specific container. They are located in boost/algorithm/string/stl - directory. Alternatively she can include boost/algorithm/string/std_collection_traits.hpp - header which contains specializations for all stl containers. -*/ - -namespace boost { - namespace algorithm { - -// sequence traits -----------------------------------------------// - - - //! Native replace trait - /*! - This trait specifies that the sequence has \c std::string like replace method - */ - template< typename T > - class has_native_replace - { - - public: -# if BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - enum { value = false }; -# else - BOOST_STATIC_CONSTANT(bool, value=false); -# endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - - - typedef mpl::bool_::value> type; - }; - - - //! Stable iterators trait - /*! - This trait specifies that the sequence has stable iterators. It means - that operations like insert/erase/replace do not invalidate iterators. - */ - template< typename T > - class has_stable_iterators - { - public: -# if BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - enum { value = false }; -# else - BOOST_STATIC_CONSTANT(bool, value=false); -# endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - - typedef mpl::bool_::value> type; - }; - - - //! Const time insert trait - /*! - This trait specifies that the sequence's insert method has - constant time complexity. - */ - template< typename T > - class has_const_time_insert - { - public: -# if BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - enum { value = false }; -# else - BOOST_STATIC_CONSTANT(bool, value=false); -# endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - - typedef mpl::bool_::value> type; - }; - - - //! Const time erase trait - /*! - This trait specifies that the sequence's erase method has - constant time complexity. - */ - template< typename T > - class has_const_time_erase - { - public: -# if BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - enum { value = false }; -# else - BOOST_STATIC_CONSTANT(bool, value=false); -# endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - - typedef mpl::bool_::value> type; - }; - - } // namespace algorithm -} // namespace boost - - -#endif // BOOST_STRING_SEQUENCE_TRAITS_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/split.hpp b/third_party/boost_parts/boost/algorithm/string/split.hpp deleted file mode 100644 index cae712c0..00000000 --- a/third_party/boost_parts/boost/algorithm/string/split.hpp +++ /dev/null @@ -1,163 +0,0 @@ -// Boost string_algo library split.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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) - -// See http://www.boost.org/ for updates, documentation, and revision history. - -#ifndef BOOST_STRING_SPLIT_HPP -#define BOOST_STRING_SPLIT_HPP - -#include - -#include -#include -#include - -/*! \file - Defines basic split algorithms. - Split algorithms can be used to divide a string - into several parts according to given criteria. - - Each part is copied and added as a new element to the - output container. - Thus the result container must be able to hold copies - of the matches (in a compatible structure like std::string) or - a reference to it (e.g. using the iterator range class). - Examples of such a container are \c std::vector - or \c std::list> -*/ - -namespace boost { - namespace algorithm { - -// find_all ------------------------------------------------------------// - - //! Find all algorithm - /*! - This algorithm finds all occurrences of the search string - in the input. - - Each part is copied and added as a new element to the - output container. - Thus the result container must be able to hold copies - of the matches (in a compatible structure like std::string) or - a reference to it (e.g. using the iterator range class). - Examples of such a container are \c std::vector - or \c std::list> - - \param Result A container that can hold copies of references to the substrings - \param Input A container which will be searched. - \param Search A substring to be searched for. - \return A reference the result - - \note Prior content of the result will be overwritten. - - \note This function provides the strong exception-safety guarantee - */ - template< typename SequenceSequenceT, typename Range1T, typename Range2T > - inline SequenceSequenceT& find_all( - SequenceSequenceT& Result, - Range1T& Input, - const Range2T& Search) - { - return ::boost::algorithm::iter_find( - Result, - Input, - ::boost::algorithm::first_finder(Search) ); - } - - //! Find all algorithm ( case insensitive ) - /*! - This algorithm finds all occurrences of the search string - in the input. - Each part is copied and added as a new element to the - output container. Thus the result container must be able to hold copies - of the matches (in a compatible structure like std::string) or - a reference to it (e.g. using the iterator range class). - Examples of such a container are \c std::vector - or \c std::list> - - Searching is case insensitive. - - \param Result A container that can hold copies of references to the substrings - \param Input A container which will be searched. - \param Search A substring to be searched for. - \param Loc A locale used for case insensitive comparison - \return A reference the result - - \note Prior content of the result will be overwritten. - - \note This function provides the strong exception-safety guarantee - */ - template< typename SequenceSequenceT, typename Range1T, typename Range2T > - inline SequenceSequenceT& ifind_all( - SequenceSequenceT& Result, - Range1T& Input, - const Range2T& Search, - const std::locale& Loc=std::locale() ) - { - return ::boost::algorithm::iter_find( - Result, - Input, - ::boost::algorithm::first_finder(Search, is_iequal(Loc) ) ); - } - - -// tokenize -------------------------------------------------------------// - - //! Split algorithm - /*! - Tokenize expression. This function is equivalent to C strtok. Input - sequence is split into tokens, separated by separators. Separators - are given by means of the predicate. - - Each part is copied and added as a new element to the - output container. - Thus the result container must be able to hold copies - of the matches (in a compatible structure like std::string) or - a reference to it (e.g. using the iterator range class). - Examples of such a container are \c std::vector - or \c std::list> - - \param Result A container that can hold copies of references to the substrings - \param Input A container which will be searched. - \param Pred A predicate to identify separators. This predicate is - supposed to return true if a given element is a separator. - \param eCompress If eCompress argument is set to token_compress_on, adjacent - separators are merged together. Otherwise, every two separators - delimit a token. - \return A reference the result - - \note Prior content of the result will be overwritten. - - \note This function provides the strong exception-safety guarantee - */ - template< typename SequenceSequenceT, typename RangeT, typename PredicateT > - inline SequenceSequenceT& split( - SequenceSequenceT& Result, - RangeT& Input, - PredicateT Pred, - token_compress_mode_type eCompress=token_compress_off ) - { - return ::boost::algorithm::iter_split( - Result, - Input, - ::boost::algorithm::token_finder( Pred, eCompress ) ); - } - - } // namespace algorithm - - // pull names to the boost namespace - using algorithm::find_all; - using algorithm::ifind_all; - using algorithm::split; - -} // namespace boost - - -#endif // BOOST_STRING_SPLIT_HPP - diff --git a/third_party/boost_parts/boost/algorithm/string/std/list_traits.hpp b/third_party/boost_parts/boost/algorithm/string/std/list_traits.hpp deleted file mode 100644 index a3cf7bb1..00000000 --- a/third_party/boost_parts/boost/algorithm/string/std/list_traits.hpp +++ /dev/null @@ -1,68 +0,0 @@ -// Boost string_algo library list_traits.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_STD_LIST_TRAITS_HPP -#define BOOST_STRING_STD_LIST_TRAITS_HPP - -#include -#include -#include - -namespace boost { - namespace algorithm { - -// std::list<> traits -----------------------------------------------// - - - // stable iterators trait - template - class has_stable_iterators< ::std::list > - { - public: -#if BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - enum { value = true }; -#else - BOOST_STATIC_CONSTANT(bool, value=true); -#endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - typedef mpl::bool_::value> type; - }; - - // const time insert trait - template - class has_const_time_insert< ::std::list > - { - public: -#if BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - enum { value = true }; -#else - BOOST_STATIC_CONSTANT(bool, value=true); -#endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - typedef mpl::bool_::value> type; - }; - - // const time erase trait - template - class has_const_time_erase< ::std::list > - { - public: -#if BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - enum { value = true }; -#else - BOOST_STATIC_CONSTANT(bool, value=true); -#endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - typedef mpl::bool_::value> type; - }; - - - } // namespace algorithm -} // namespace boost - - -#endif // BOOST_STRING_STD_LIST_TRAITS_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/std/slist_traits.hpp b/third_party/boost_parts/boost/algorithm/string/std/slist_traits.hpp deleted file mode 100644 index c30b93c7..00000000 --- a/third_party/boost_parts/boost/algorithm/string/std/slist_traits.hpp +++ /dev/null @@ -1,69 +0,0 @@ -// Boost string_algo library slist_traits.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_STD_SLIST_TRAITS_HPP -#define BOOST_STRING_STD_SLIST_TRAITS_HPP - -#include -#include -#include BOOST_SLIST_HEADER -#include - -namespace boost { - namespace algorithm { - -// SGI's std::slist<> traits -----------------------------------------------// - - - // stable iterators trait - template - class has_stable_iterators< BOOST_STD_EXTENSION_NAMESPACE::slist > - { - public: -#if BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - enum { value = true }; -#else - BOOST_STATIC_CONSTANT(bool, value=true); -#endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - typedef mpl::bool_::value> type; - }; - - // const time insert trait - template - class has_const_time_insert< BOOST_STD_EXTENSION_NAMESPACE::slist > - { - public: -#if BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - enum { value = true }; -#else - BOOST_STATIC_CONSTANT(bool, value=true); -#endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - typedef mpl::bool_::value> type; - }; - - // const time erase trait - template - class has_const_time_erase< BOOST_STD_EXTENSION_NAMESPACE::slist > - { - public: -#if BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - enum { value = true }; -#else - BOOST_STATIC_CONSTANT(bool, value=true); -#endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - typedef mpl::bool_::value> type; - }; - - - } // namespace algorithm -} // namespace boost - - -#endif // BOOST_STRING_STD_LIST_TRAITS_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/std/string_traits.hpp b/third_party/boost_parts/boost/algorithm/string/std/string_traits.hpp deleted file mode 100644 index c9408307..00000000 --- a/third_party/boost_parts/boost/algorithm/string/std/string_traits.hpp +++ /dev/null @@ -1,44 +0,0 @@ -// Boost string_algo library string_traits.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_STD_STRING_TRAITS_HPP -#define BOOST_STRING_STD_STRING_TRAITS_HPP - -#include -#include -#include - -namespace boost { - namespace algorithm { - -// std::basic_string<> traits -----------------------------------------------// - - - // native replace trait - template - class has_native_replace< std::basic_string > - { - public: -#if BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - enum { value = true } ; -#else - BOOST_STATIC_CONSTANT(bool, value=true); -#endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 ) - - typedef mpl::bool_::value> type; - }; - - - - } // namespace algorithm -} // namespace boost - - -#endif // BOOST_STRING_LIST_TRAITS_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/std_containers_traits.hpp b/third_party/boost_parts/boost/algorithm/string/std_containers_traits.hpp deleted file mode 100644 index 3f02246f..00000000 --- a/third_party/boost_parts/boost/algorithm/string/std_containers_traits.hpp +++ /dev/null @@ -1,26 +0,0 @@ -// Boost string_algo library std_containers_traits.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_STD_CONTAINERS_TRAITS_HPP -#define BOOST_STRING_STD_CONTAINERS_TRAITS_HPP - -/*!\file - This file includes sequence traits for stl containers. -*/ - -#include -#include -#include - -#ifdef BOOST_HAS_SLIST -# include -#endif - -#endif // BOOST_STRING_STD_CONTAINERS_TRAITS_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/trim.hpp b/third_party/boost_parts/boost/algorithm/string/trim.hpp deleted file mode 100644 index e740d57d..00000000 --- a/third_party/boost_parts/boost/algorithm/string/trim.hpp +++ /dev/null @@ -1,398 +0,0 @@ -// Boost string_algo library trim.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_TRIM_HPP -#define BOOST_STRING_TRIM_HPP - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -/*! \file - Defines trim algorithms. - Trim algorithms are used to remove trailing and leading spaces from a - sequence (string). Space is recognized using given locales. - - Parametric (\c _if) variants use a predicate (functor) to select which characters - are to be trimmed.. - Functions take a selection predicate as a parameter, which is used to determine - whether a character is a space. Common predicates are provided in classification.hpp header. - -*/ - -namespace boost { - namespace algorithm { - - // left trim -----------------------------------------------// - - - //! Left trim - parametric - /*! - Remove all leading spaces from the input. - The supplied predicate is used to determine which characters are considered spaces. - The result is a trimmed copy of the input. It is returned as a sequence - or copied to the output iterator - - \param Output An output iterator to which the result will be copied - \param Input An input range - \param IsSpace A unary predicate identifying spaces - \return - An output iterator pointing just after the last inserted character or - a copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template - inline OutputIteratorT trim_left_copy_if( - OutputIteratorT Output, - const RangeT& Input, - PredicateT IsSpace) - { - iterator_range::type> lit_range(::boost::as_literal(Input)); - - std::copy( - ::boost::algorithm::detail::trim_begin( - ::boost::begin(lit_range), - ::boost::end(lit_range), - IsSpace ), - ::boost::end(lit_range), - Output); - - return Output; - } - - //! Left trim - parametric - /*! - \overload - */ - template - inline SequenceT trim_left_copy_if(const SequenceT& Input, PredicateT IsSpace) - { - return SequenceT( - ::boost::algorithm::detail::trim_begin( - ::boost::begin(Input), - ::boost::end(Input), - IsSpace ), - ::boost::end(Input)); - } - - //! Left trim - parametric - /*! - Remove all leading spaces from the input. - The result is a trimmed copy of the input. - - \param Input An input sequence - \param Loc a locale used for 'space' classification - \return A trimmed copy of the input - - \note This function provides the strong exception-safety guarantee - */ - template - inline SequenceT trim_left_copy(const SequenceT& Input, const std::locale& Loc=std::locale()) - { - return - ::boost::algorithm::trim_left_copy_if( - Input, - is_space(Loc)); - } - - //! Left trim - /*! - Remove all leading spaces from the input. The supplied predicate is - used to determine which characters are considered spaces. - The input sequence is modified in-place. - - \param Input An input sequence - \param IsSpace A unary predicate identifying spaces - */ - template - inline void trim_left_if(SequenceT& Input, PredicateT IsSpace) - { - Input.erase( - ::boost::begin(Input), - ::boost::algorithm::detail::trim_begin( - ::boost::begin(Input), - ::boost::end(Input), - IsSpace)); - } - - //! Left trim - /*! - Remove all leading spaces from the input. - The Input sequence is modified in-place. - - \param Input An input sequence - \param Loc A locale used for 'space' classification - */ - template - inline void trim_left(SequenceT& Input, const std::locale& Loc=std::locale()) - { - ::boost::algorithm::trim_left_if( - Input, - is_space(Loc)); - } - - // right trim -----------------------------------------------// - - //! Right trim - parametric - /*! - Remove all trailing spaces from the input. - The supplied predicate is used to determine which characters are considered spaces. - The result is a trimmed copy of the input. It is returned as a sequence - or copied to the output iterator - - \param Output An output iterator to which the result will be copied - \param Input An input range - \param IsSpace A unary predicate identifying spaces - \return - An output iterator pointing just after the last inserted character or - a copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template - inline OutputIteratorT trim_right_copy_if( - OutputIteratorT Output, - const RangeT& Input, - PredicateT IsSpace ) - { - iterator_range::type> lit_range(::boost::as_literal(Input)); - - std::copy( - ::boost::begin(lit_range), - ::boost::algorithm::detail::trim_end( - ::boost::begin(lit_range), - ::boost::end(lit_range), - IsSpace ), - Output ); - - return Output; - } - - //! Right trim - parametric - /*! - \overload - */ - template - inline SequenceT trim_right_copy_if(const SequenceT& Input, PredicateT IsSpace) - { - return SequenceT( - ::boost::begin(Input), - ::boost::algorithm::detail::trim_end( - ::boost::begin(Input), - ::boost::end(Input), - IsSpace) - ); - } - - //! Right trim - /*! - Remove all trailing spaces from the input. - The result is a trimmed copy of the input - - \param Input An input sequence - \param Loc A locale used for 'space' classification - \return A trimmed copy of the input - - \note This function provides the strong exception-safety guarantee - */ - template - inline SequenceT trim_right_copy(const SequenceT& Input, const std::locale& Loc=std::locale()) - { - return - ::boost::algorithm::trim_right_copy_if( - Input, - is_space(Loc)); - } - - - //! Right trim - parametric - /*! - Remove all trailing spaces from the input. - The supplied predicate is used to determine which characters are considered spaces. - The input sequence is modified in-place. - - \param Input An input sequence - \param IsSpace A unary predicate identifying spaces - */ - template - inline void trim_right_if(SequenceT& Input, PredicateT IsSpace) - { - Input.erase( - ::boost::algorithm::detail::trim_end( - ::boost::begin(Input), - ::boost::end(Input), - IsSpace ), - ::boost::end(Input) - ); - } - - - //! Right trim - /*! - Remove all trailing spaces from the input. - The input sequence is modified in-place. - - \param Input An input sequence - \param Loc A locale used for 'space' classification - */ - template - inline void trim_right(SequenceT& Input, const std::locale& Loc=std::locale()) - { - ::boost::algorithm::trim_right_if( - Input, - is_space(Loc) ); - } - - // both side trim -----------------------------------------------// - - //! Trim - parametric - /*! - Remove all trailing and leading spaces from the input. - The supplied predicate is used to determine which characters are considered spaces. - The result is a trimmed copy of the input. It is returned as a sequence - or copied to the output iterator - - \param Output An output iterator to which the result will be copied - \param Input An input range - \param IsSpace A unary predicate identifying spaces - \return - An output iterator pointing just after the last inserted character or - a copy of the input - - \note The second variant of this function provides the strong exception-safety guarantee - */ - template - inline OutputIteratorT trim_copy_if( - OutputIteratorT Output, - const RangeT& Input, - PredicateT IsSpace) - { - iterator_range::type> lit_range(::boost::as_literal(Input)); - - BOOST_STRING_TYPENAME - range_const_iterator::type TrimEnd= - ::boost::algorithm::detail::trim_end( - ::boost::begin(lit_range), - ::boost::end(lit_range), - IsSpace); - - std::copy( - detail::trim_begin( - ::boost::begin(lit_range), TrimEnd, IsSpace), - TrimEnd, - Output - ); - - return Output; - } - - //! Trim - parametric - /*! - \overload - */ - template - inline SequenceT trim_copy_if(const SequenceT& Input, PredicateT IsSpace) - { - BOOST_STRING_TYPENAME - range_const_iterator::type TrimEnd= - ::boost::algorithm::detail::trim_end( - ::boost::begin(Input), - ::boost::end(Input), - IsSpace); - - return SequenceT( - detail::trim_begin( - ::boost::begin(Input), - TrimEnd, - IsSpace), - TrimEnd - ); - } - - //! Trim - /*! - Remove all leading and trailing spaces from the input. - The result is a trimmed copy of the input - - \param Input An input sequence - \param Loc A locale used for 'space' classification - \return A trimmed copy of the input - - \note This function provides the strong exception-safety guarantee - */ - template - inline SequenceT trim_copy( const SequenceT& Input, const std::locale& Loc=std::locale() ) - { - return - ::boost::algorithm::trim_copy_if( - Input, - is_space(Loc) ); - } - - //! Trim - /*! - Remove all leading and trailing spaces from the input. - The supplied predicate is used to determine which characters are considered spaces. - The input sequence is modified in-place. - - \param Input An input sequence - \param IsSpace A unary predicate identifying spaces - */ - template - inline void trim_if(SequenceT& Input, PredicateT IsSpace) - { - ::boost::algorithm::trim_right_if( Input, IsSpace ); - ::boost::algorithm::trim_left_if( Input, IsSpace ); - } - - //! Trim - /*! - Remove all leading and trailing spaces from the input. - The input sequence is modified in-place. - - \param Input An input sequence - \param Loc A locale used for 'space' classification - */ - template - inline void trim(SequenceT& Input, const std::locale& Loc=std::locale()) - { - ::boost::algorithm::trim_if( - Input, - is_space( Loc ) ); - } - - } // namespace algorithm - - // pull names to the boost namespace - using algorithm::trim_left; - using algorithm::trim_left_if; - using algorithm::trim_left_copy; - using algorithm::trim_left_copy_if; - using algorithm::trim_right; - using algorithm::trim_right_if; - using algorithm::trim_right_copy; - using algorithm::trim_right_copy_if; - using algorithm::trim; - using algorithm::trim_if; - using algorithm::trim_copy; - using algorithm::trim_copy_if; - -} // namespace boost - -#endif // BOOST_STRING_TRIM_HPP diff --git a/third_party/boost_parts/boost/algorithm/string/yes_no_type.hpp b/third_party/boost_parts/boost/algorithm/string/yes_no_type.hpp deleted file mode 100644 index b76cc6c1..00000000 --- a/third_party/boost_parts/boost/algorithm/string/yes_no_type.hpp +++ /dev/null @@ -1,33 +0,0 @@ -// Boost string_algo library yes_no_type.hpp header file ---------------------------// - -// Copyright Pavol Droba 2002-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 updates, documentation, and revision history. - -#ifndef BOOST_STRING_YES_NO_TYPE_DETAIL_HPP -#define BOOST_STRING_YES_NO_TYPE_DETAIL_HPP - -namespace boost { - namespace algorithm { - - // taken from boost mailing-list - // when yes_no_type will become officially - // a part of boost distribution, this header - // will be deprecated - template struct size_descriptor - { - typedef char (& type)[I]; - }; - - typedef size_descriptor<1>::type yes_type; - typedef size_descriptor<2>::type no_type; - - } // namespace algorithm -} // namespace boost - - -#endif // BOOST_STRING_YES_NO_TYPE_DETAIL_HPP diff --git a/third_party/boost_parts/boost/align/align.hpp b/third_party/boost_parts/boost/align/align.hpp deleted file mode 100644 index 3582dcc0..00000000 --- a/third_party/boost_parts/boost/align/align.hpp +++ /dev/null @@ -1,20 +0,0 @@ -/* -(c) 2014-2015 Glen Joseph Fernandes - - -Distributed under the Boost Software -License, Version 1.0. -http://boost.org/LICENSE_1_0.txt -*/ -#ifndef BOOST_ALIGN_ALIGN_HPP -#define BOOST_ALIGN_ALIGN_HPP - -#include - -#if !defined(BOOST_NO_CXX11_STD_ALIGN) -#include -#else -#include -#endif - -#endif diff --git a/third_party/boost_parts/boost/align/detail/align.hpp b/third_party/boost_parts/boost/align/detail/align.hpp deleted file mode 100644 index 0828c583..00000000 --- a/third_party/boost_parts/boost/align/detail/align.hpp +++ /dev/null @@ -1,38 +0,0 @@ -/* -(c) 2014 Glen Joseph Fernandes - - -Distributed under the Boost Software -License, Version 1.0. -http://boost.org/LICENSE_1_0.txt -*/ -#ifndef BOOST_ALIGN_DETAIL_ALIGN_HPP -#define BOOST_ALIGN_DETAIL_ALIGN_HPP - -#include -#include - -namespace boost { -namespace alignment { - -inline void* align(std::size_t alignment, std::size_t size, - void*& ptr, std::size_t& space) -{ - BOOST_ASSERT(detail::is_alignment(alignment)); - if (size <= space) { - char* p = reinterpret_cast((reinterpret_cast(ptr) + alignment - 1) & ~(alignment - 1)); - std::ptrdiff_t n = p - static_cast(ptr); - if (size <= space - n) { - ptr = p; - space -= n; - return p; - } - } - return 0; -} - -} /* .alignment */ -} /* .boost */ - -#endif diff --git a/third_party/boost_parts/boost/align/detail/align_cxx11.hpp b/third_party/boost_parts/boost/align/detail/align_cxx11.hpp deleted file mode 100644 index a95b84c7..00000000 --- a/third_party/boost_parts/boost/align/detail/align_cxx11.hpp +++ /dev/null @@ -1,22 +0,0 @@ -/* -(c) 2014 Glen Joseph Fernandes - - -Distributed under the Boost Software -License, Version 1.0. -http://boost.org/LICENSE_1_0.txt -*/ -#ifndef BOOST_ALIGN_DETAIL_ALIGN_CXX11_HPP -#define BOOST_ALIGN_DETAIL_ALIGN_CXX11_HPP - -#include - -namespace boost { -namespace alignment { - -using std::align; - -} /* .alignment */ -} /* .boost */ - -#endif diff --git a/third_party/boost_parts/boost/align/detail/is_alignment.hpp b/third_party/boost_parts/boost/align/detail/is_alignment.hpp deleted file mode 100644 index 12d8df97..00000000 --- a/third_party/boost_parts/boost/align/detail/is_alignment.hpp +++ /dev/null @@ -1,29 +0,0 @@ -/* -(c) 2014 Glen Joseph Fernandes - - -Distributed under the Boost Software -License, Version 1.0. -http://boost.org/LICENSE_1_0.txt -*/ -#ifndef BOOST_ALIGN_DETAIL_IS_ALIGNMENT_HPP -#define BOOST_ALIGN_DETAIL_IS_ALIGNMENT_HPP - -#include -#include - -namespace boost { -namespace alignment { -namespace detail { - -BOOST_CONSTEXPR inline bool is_alignment(std::size_t value) - BOOST_NOEXCEPT -{ - return (value > 0) && ((value & (value - 1)) == 0); -} - -} /* .detail */ -} /* .alignment */ -} /* .boost */ - -#endif diff --git a/third_party/boost_parts/boost/archive/add_facet.hpp b/third_party/boost_parts/boost/archive/add_facet.hpp deleted file mode 100644 index 6bafe9bd..00000000 --- a/third_party/boost_parts/boost/archive/add_facet.hpp +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef BOOST_ARCHIVE_ADD_FACET_HPP -#define BOOST_ARCHIVE_ADD_FACET_HPP - -// MS compatible compilers support #pragma once -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -# pragma once -#endif - -/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// add_facet.hpp - -// (C) Copyright 2003 Robert Ramey - http://www.rrsd.com . -// Use, modification and distribution is subject to the Boost Software -// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for updates, documentation, and revision history. - -#include -#include -#include - -// does STLport uses native STL for locales? -#if (defined(__SGI_STL_PORT)&& defined(_STLP_NO_OWN_IOSTREAMS)) -// and this native STL lib is old Dinkumware (has not defined _CPPLIB_VER) -# if (defined(_YVALS) && !defined(__IBMCPP__)) || !defined(_CPPLIB_VER) -# define BOOST_ARCHIVE_OLD_DINKUMWARE_BENEATH_STLPORT -# endif -#endif - -namespace boost { -namespace archive { - -template -inline std::locale * -add_facet(const std::locale &l, Facet * f){ - return - #if defined BOOST_ARCHIVE_OLD_DINKUMWARE_BENEATH_STLPORT - // std namespace used for native locale - new std::locale(std::_Addfac(l, f)); - #elif BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1) // old Dinkumwar - // std namespace used for native locale - new std::locale(std::_Addfac(l, f)); - #else - // standard compatible - new std::locale(l, f); - #endif -} - -} // namespace archive -} // namespace boost - -#undef BOOST_ARCHIVE_OLD_DINKUMWARE_BENEATH_STLPORT - -#endif // BOOST_ARCHIVE_ADD_FACET_HPP diff --git a/third_party/boost_parts/boost/archive/basic_archive.hpp b/third_party/boost_parts/boost/archive/basic_archive.hpp index ce7ac99a..9283974f 100644 --- a/third_party/boost_parts/boost/archive/basic_archive.hpp +++ b/third_party/boost_parts/boost/archive/basic_archive.hpp @@ -127,11 +127,11 @@ class class_id_type { } // used for text output - operator int () const { + operator base_type () const { return t; } // used for text input - operator int_least16_t &() { + operator base_type &() { return t; } bool operator==(const class_id_type & rhs) const { @@ -151,7 +151,10 @@ class object_id_type { public: object_id_type(): t(0) {}; // note: presumes that size_t >= unsigned int. - explicit object_id_type(const std::size_t & t_) : t(t_){ + // use explicit cast to silence useless warning + explicit object_id_type(const std::size_t & t_) : t(static_cast(t_)){ + // make quadriple sure that we haven't lost any real integer + // precision BOOST_ASSERT(t_ <= boost::integer_traits::const_max); } object_id_type(const object_id_type & t_) : @@ -162,11 +165,11 @@ class object_id_type { return *this; } // used for text output - operator uint_least32_t () const { + operator base_type () const { return t; } // used for text input - operator uint_least32_t & () { + operator base_type & () { return t; } bool operator==(const object_id_type & rhs) const { diff --git a/third_party/boost_parts/boost/archive/basic_binary_iprimitive.hpp b/third_party/boost_parts/boost/archive/basic_binary_iprimitive.hpp index 40f45d9c..665d3e81 100644 --- a/third_party/boost_parts/boost/archive/basic_binary_iprimitive.hpp +++ b/third_party/boost_parts/boost/archive/basic_binary_iprimitive.hpp @@ -50,7 +50,7 @@ namespace std{ //#include #include -#include +#include #include #include diff --git a/third_party/boost_parts/boost/archive/basic_binary_oprimitive.hpp b/third_party/boost_parts/boost/archive/basic_binary_oprimitive.hpp index 4b7f454b..6dc770c6 100644 --- a/third_party/boost_parts/boost/archive/basic_binary_oprimitive.hpp +++ b/third_party/boost_parts/boost/archive/basic_binary_oprimitive.hpp @@ -45,7 +45,7 @@ namespace std{ //#include #include -#include +#include #include #include diff --git a/third_party/boost_parts/boost/archive/basic_text_iarchive.hpp b/third_party/boost_parts/boost/archive/basic_text_iarchive.hpp index 583041d8..48a646cc 100644 --- a/third_party/boost_parts/boost/archive/basic_text_iarchive.hpp +++ b/third_party/boost_parts/boost/archive/basic_text_iarchive.hpp @@ -21,7 +21,7 @@ // // note the fact that on libraries without wide characters, ostream is // is not a specialization of basic_ostream which in fact is not defined -// in such cases. So we can't use basic_ostream but rather +// in such cases. So we can't use basic_istream but rather // use two template parameters #include diff --git a/third_party/boost_parts/boost/archive/basic_text_oprimitive.hpp b/third_party/boost_parts/boost/archive/basic_text_oprimitive.hpp index c9f8c591..45f09358 100644 --- a/third_party/boost_parts/boost/archive/basic_text_oprimitive.hpp +++ b/third_party/boost_parts/boost/archive/basic_text_oprimitive.hpp @@ -175,8 +175,6 @@ class BOOST_SYMBOL_VISIBLE basic_text_oprimitive template void save(const T & t){ - boost::io::ios_flags_saver fs(os); - boost::io::ios_precision_saver ps(os); typename is_float::type tf; save_impl(t, tf); } diff --git a/third_party/boost_parts/boost/archive/basic_xml_iarchive.hpp b/third_party/boost_parts/boost/archive/basic_xml_iarchive.hpp index a882df56..e9f7482f 100644 --- a/third_party/boost_parts/boost/archive/basic_xml_iarchive.hpp +++ b/third_party/boost_parts/boost/archive/basic_xml_iarchive.hpp @@ -89,8 +89,7 @@ class BOOST_SYMBOL_VISIBLE basic_xml_iarchive : // leaving the archive in an undetermined state BOOST_ARCHIVE_OR_WARCHIVE_DECL void load_override(class_id_type & t); - BOOST_ARCHIVE_OR_WARCHIVE_DECL void - load_override(class_id_optional_type & /* t */){} + void load_override(class_id_optional_type & /* t */){} BOOST_ARCHIVE_OR_WARCHIVE_DECL void load_override(object_id_type & t); BOOST_ARCHIVE_OR_WARCHIVE_DECL void diff --git a/third_party/boost_parts/boost/archive/codecvt_null.hpp b/third_party/boost_parts/boost/archive/codecvt_null.hpp index 9cc9e572..3b39c8ed 100644 --- a/third_party/boost_parts/boost/archive/codecvt_null.hpp +++ b/third_party/boost_parts/boost/archive/codecvt_null.hpp @@ -18,8 +18,11 @@ #include #include // NULL, size_t +#ifndef BOOST_NO_CWCHAR #include // for mbstate_t +#endif #include +#include #include #include // must be the last header @@ -60,9 +63,10 @@ class codecvt_null : public std::codecvt }; template<> -class BOOST_SYMBOL_VISIBLE codecvt_null : public std::codecvt +class BOOST_WARCHIVE_DECL codecvt_null : + public std::codecvt { - virtual BOOST_WARCHIVE_DECL std::codecvt_base::result + virtual std::codecvt_base::result do_out( std::mbstate_t & state, const wchar_t * first1, @@ -72,7 +76,7 @@ class BOOST_SYMBOL_VISIBLE codecvt_null : public std::codecvt : public std::codecvt(no_locale_manage) {} - virtual ~codecvt_null(){}; + //virtual ~codecvt_null(){}; }; } // namespace archive diff --git a/third_party/boost_parts/boost/archive/detail/common_iarchive.hpp b/third_party/boost_parts/boost/archive/detail/common_iarchive.hpp index 82304f1e..4176a8a5 100644 --- a/third_party/boost_parts/boost/archive/detail/common_iarchive.hpp +++ b/third_party/boost_parts/boost/archive/detail/common_iarchive.hpp @@ -35,11 +35,12 @@ class extended_type_info; // note: referred to as Curiously Recurring Template Patter (CRTP) template -class BOOST_SYMBOL_VISIBLE common_iarchive : +class BOOST_SYMBOL_VISIBLE common_iarchive : public basic_iarchive, public interface_iarchive { friend class interface_iarchive; + friend class basic_iarchive; private: virtual void vload(version_type & t){ * this->This() >> t; diff --git a/third_party/boost_parts/boost/archive/detail/common_oarchive.hpp b/third_party/boost_parts/boost/archive/detail/common_oarchive.hpp index ee42bbe5..f7428637 100644 --- a/third_party/boost_parts/boost/archive/detail/common_oarchive.hpp +++ b/third_party/boost_parts/boost/archive/detail/common_oarchive.hpp @@ -38,6 +38,7 @@ class BOOST_SYMBOL_VISIBLE common_oarchive : public interface_oarchive { friend class interface_oarchive; + friend class basic_oarchive; private: virtual void vsave(const version_type t){ * this->This() << t; diff --git a/third_party/boost_parts/boost/archive/detail/iserializer.hpp b/third_party/boost_parts/boost/archive/detail/iserializer.hpp index 6bec499b..6c2fd67d 100644 --- a/third_party/boost_parts/boost/archive/detail/iserializer.hpp +++ b/third_party/boost_parts/boost/archive/detail/iserializer.hpp @@ -57,11 +57,10 @@ namespace std{ #include -#ifndef BOOST_MSVC - #define DONT_USE_HAS_NEW_OPERATOR ( \ - BOOST_WORKAROUND(__IBMCPP__, < 1210) \ - || defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x590) \ - ) +#if !defined(BOOST_MSVC) && \ + (BOOST_WORKAROUND(__IBMCPP__, < 1210) || \ + defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x590)) + #define DONT_USE_HAS_NEW_OPERATOR 1 #else #define DONT_USE_HAS_NEW_OPERATOR 0 #endif @@ -77,10 +76,10 @@ namespace std{ #include #include #include -#include #include #include #include +#include // the following is need only for dynamic cast of polymorphic pointers #include @@ -90,6 +89,8 @@ namespace std{ #include #include +#include + namespace boost { namespace serialization { @@ -234,7 +235,7 @@ struct heap_allocation { // that the class might have class specific new with NO // class specific delete at all. Patches (compatible with // C++03) welcome! - delete t; + (operator delete)(t); } }; struct doesnt_have_new_operator { @@ -243,7 +244,7 @@ struct heap_allocation { } static void invoke_delete(T * t) { // Note: I'm reliance upon automatic conversion from T * to void * here - delete t; + (operator delete)(t); } }; static T * invoke_new() { @@ -406,7 +407,7 @@ struct load_non_pointer_type { struct load_standard { template static void invoke(Archive &ar, const T & t){ - void * x = & const_cast(t); + void * x = boost::addressof(const_cast(t)); ar.load_object( x, boost::serialization::singleton< @@ -484,7 +485,7 @@ struct load_pointer_type { }; template - static const basic_pointer_iserializer * register_type(Archive &ar, const T & /*t*/){ + static const basic_pointer_iserializer * register_type(Archive &ar, const T* const /*t*/){ // there should never be any need to load an abstract polymorphic // class pointer. Inhibiting code generation for this // permits abstract base classes to be used - note: exception @@ -523,7 +524,7 @@ struct load_pointer_type { } template - static void check_load(T & /* t */){ + static void check_load(T * const /* t */){ check_pointer_level< T >(); check_pointer_tracking< T >(); } @@ -537,8 +538,8 @@ struct load_pointer_type { template static void invoke(Archive & ar, Tptr & t){ - check_load(*t); - const basic_pointer_iserializer * bpis_ptr = register_type(ar, *t); + check_load(t); + const basic_pointer_iserializer * bpis_ptr = register_type(ar, t); const basic_pointer_iserializer * newbpis_ptr = ar.load_pointer( // note major hack here !!! // I tried every way to convert Tptr &t (where Tptr might @@ -588,7 +589,14 @@ struct load_array_type { boost::archive::archive_exception::array_size_too_short ) ); - ar >> serialization::make_array(static_cast(&t[0]),count); + // explict template arguments to pass intel C++ compiler + ar >> serialization::make_array< + value_type, + boost::serialization::collection_size_type + >( + static_cast(&t[0]), + count + ); } }; @@ -598,7 +606,7 @@ template inline void load(Archive & ar, T &t){ // if this assertion trips. It means we're trying to load a // const object with a compiler that doesn't have correct - // funtion template ordering. On other compilers, this is + // function template ordering. On other compilers, this is // handled below. detail::check_const_loading< T >(); typedef diff --git a/third_party/boost_parts/boost/archive/detail/oserializer.hpp b/third_party/boost_parts/boost/archive/detail/oserializer.hpp index 0f2e733c..612e1f2c 100644 --- a/third_party/boost_parts/boost/archive/detail/oserializer.hpp +++ b/third_party/boost_parts/boost/archive/detail/oserializer.hpp @@ -26,6 +26,7 @@ #include // NULL #include + #include #include @@ -56,8 +57,9 @@ #include #include #include -#include #include +#include + #include #include @@ -67,6 +69,8 @@ #include #include +#include + namespace boost { namespace serialization { @@ -252,7 +256,7 @@ struct save_non_pointer_type { template static void invoke(Archive &ar, const T & t){ ar.save_object( - & t, + boost::addressof(t), boost::serialization::singleton< oserializer >::get_const_instance() @@ -260,6 +264,8 @@ struct save_non_pointer_type { } }; + + // adds class information to the archive. This includes // serialization level and class version struct save_conditional { @@ -337,7 +343,7 @@ struct save_pointer_type { }; template - static const basic_pointer_oserializer * register_type(Archive &ar, T & /*t*/){ + static const basic_pointer_oserializer * register_type(Archive &ar, T* const /*t*/){ // there should never be any need to save an abstract polymorphic // class pointer. Inhibiting code generation for this // permits abstract base classes to be used - note: exception @@ -404,7 +410,7 @@ struct save_pointer_type { // if its not a pointer to a more derived type const void *vp = static_cast(&t); if(*this_type == *true_type){ - const basic_pointer_oserializer * bpos = register_type(ar, t); + const basic_pointer_oserializer * bpos = register_type(ar, &t); ar.save_pointer(vp, bpos); return; } @@ -463,7 +469,7 @@ struct save_pointer_type { template static void invoke(Archive &ar, const TPtr t){ - register_type(ar, * t); + register_type(ar, t); if(NULL == t){ basic_oarchive & boa = boost::serialization::smart_cast_reference(ar); @@ -501,7 +507,14 @@ struct save_array_type ); boost::serialization::collection_size_type count(c); ar << BOOST_SERIALIZATION_NVP(count); - ar << serialization::make_array(static_cast(&t[0]),count); + // explict template arguments to pass intel C++ compiler + ar << serialization::make_array< + const value_type, + boost::serialization::collection_size_type + >( + static_cast(&t[0]), + count + ); } }; diff --git a/third_party/boost_parts/boost/archive/detail/utf8_codecvt_facet.hpp b/third_party/boost_parts/boost/archive/detail/utf8_codecvt_facet.hpp index dfbec6bd..00b2b419 100644 --- a/third_party/boost_parts/boost/archive/detail/utf8_codecvt_facet.hpp +++ b/third_party/boost_parts/boost/archive/detail/utf8_codecvt_facet.hpp @@ -9,26 +9,21 @@ #include -// std::codecvt_utf8 doesn't seem to work for msvc -// versions prior to MSVC 14.0 +#ifdef BOOST_NO_STD_WSTREAMBUF +#error "wide char i/o not supported on this platform" +#endif -#if defined(_MSC_VER) && _MSC_VER < 1900 \ -|| defined( BOOST_NO_CXX11_HDR_CODECVT ) - #include - #define BOOST_UTF8_BEGIN_NAMESPACE \ - namespace boost { namespace archive { namespace detail { - #define BOOST_UTF8_DECL BOOST_ARCHIVE_DECL - #define BOOST_UTF8_END_NAMESPACE }}} +// use boost's utf8 codecvt facet +#include +#define BOOST_UTF8_BEGIN_NAMESPACE \ + namespace boost { namespace archive { namespace detail { +#define BOOST_UTF8_DECL BOOST_ARCHIVE_DECL +#define BOOST_UTF8_END_NAMESPACE }}} - #include +#include + +#undef BOOST_UTF8_END_NAMESPACE +#undef BOOST_UTF8_DECL +#undef BOOST_UTF8_BEGIN_NAMESPACE - #undef BOOST_UTF8_END_NAMESPACE - #undef BOOST_UTF8_DECL - #undef BOOST_UTF8_BEGIN_NAMESPACE -#else - #include - namespace boost { namespace archive { namespace detail { - typedef std::codecvt_utf8 utf8_codecvt_facet; - } } } -#endif // BOOST_NO_CXX11_HDR_CODECVT #endif // BOOST_ARCHIVE_DETAIL_UTF8_CODECVT_FACET_HPP diff --git a/third_party/boost_parts/boost/archive/impl/archive_serializer_map.ipp b/third_party/boost_parts/boost/archive/impl/archive_serializer_map.ipp index 8dabf0d0..7f163ec4 100644 --- a/third_party/boost_parts/boost/archive/impl/archive_serializer_map.ipp +++ b/third_party/boost_parts/boost/archive/impl/archive_serializer_map.ipp @@ -47,6 +47,10 @@ archive_serializer_map::insert(const basic_serializer * bs){ template BOOST_ARCHIVE_OR_WARCHIVE_DECL void archive_serializer_map::erase(const basic_serializer * bs){ + BOOST_ASSERT(! boost::serialization::singleton< + extra_detail::map + >::is_destroyed() + ); if(boost::serialization::singleton< extra_detail::map >::is_destroyed()) diff --git a/third_party/boost_parts/boost/archive/impl/basic_binary_iprimitive.ipp b/third_party/boost_parts/boost/archive/impl/basic_binary_iprimitive.ipp index 7082b003..e2d05108 100644 --- a/third_party/boost_parts/boost/archive/impl/basic_binary_iprimitive.ipp +++ b/third_party/boost_parts/boost/archive/impl/basic_binary_iprimitive.ipp @@ -84,6 +84,8 @@ basic_binary_iprimitive::init() ); } +#ifndef BOOST_NO_CWCHAR +#ifndef BOOST_NO_INTRINSIC_WCHAR_T template BOOST_ARCHIVE_OR_WARCHIVE_DECL void basic_binary_iprimitive::load(wchar_t * ws) @@ -93,6 +95,8 @@ basic_binary_iprimitive::load(wchar_t * ws) load_binary(ws, l * sizeof(wchar_t) / sizeof(char)); ws[l] = L'\0'; } +#endif +#endif template BOOST_ARCHIVE_OR_WARCHIVE_DECL void @@ -110,7 +114,6 @@ basic_binary_iprimitive::load(std::string & s) load_binary(&(*s.begin()), l); } -#ifndef BOOST_NO_CWCHAR template BOOST_ARCHIVE_OR_WARCHIVE_DECL void basic_binary_iprimitive::load(char * s) @@ -120,7 +123,6 @@ basic_binary_iprimitive::load(char * s) load_binary(s, l); s[l] = '\0'; } -#endif #ifndef BOOST_NO_STD_WSTRING template diff --git a/third_party/boost_parts/boost/archive/impl/basic_binary_oprimitive.ipp b/third_party/boost_parts/boost/archive/impl/basic_binary_oprimitive.ipp index 130831e4..7b042173 100644 --- a/third_party/boost_parts/boost/archive/impl/basic_binary_oprimitive.ipp +++ b/third_party/boost_parts/boost/archive/impl/basic_binary_oprimitive.ipp @@ -71,6 +71,7 @@ basic_binary_oprimitive::save(const std::string &s) } #ifndef BOOST_NO_CWCHAR +#ifndef BOOST_NO_INTRINSIC_WCHAR_T template BOOST_ARCHIVE_OR_WARCHIVE_DECL void basic_binary_oprimitive::save(const wchar_t * ws) @@ -91,6 +92,7 @@ basic_binary_oprimitive::save(const std::wstring &ws) save_binary(ws.data(), l * sizeof(wchar_t) / sizeof(char)); } #endif +#endif // BOOST_NO_CWCHAR template BOOST_ARCHIVE_OR_WARCHIVE_DECL diff --git a/third_party/boost_parts/boost/archive/impl/text_wiarchive_impl.ipp b/third_party/boost_parts/boost/archive/impl/text_wiarchive_impl.ipp index 12af2b9f..e85625ac 100644 --- a/third_party/boost_parts/boost/archive/impl/text_wiarchive_impl.ipp +++ b/third_party/boost_parts/boost/archive/impl/text_wiarchive_impl.ipp @@ -56,7 +56,7 @@ text_wiarchive_impl::load(std::string &s) s.resize(0); s.reserve(size); while(size-- > 0){ - int x = is.narrow(is.get(), '\0'); + char x = is.narrow(is.get(), '\0'); s += x; } } diff --git a/third_party/boost_parts/boost/archive/impl/xml_wiarchive_impl.ipp b/third_party/boost_parts/boost/archive/impl/xml_wiarchive_impl.ipp index ee66c126..f572b762 100644 --- a/third_party/boost_parts/boost/archive/impl/xml_wiarchive_impl.ipp +++ b/third_party/boost_parts/boost/archive/impl/xml_wiarchive_impl.ipp @@ -161,13 +161,13 @@ xml_wiarchive_impl::xml_wiarchive_impl( gimpl(new xml_wgrammar()) { if(0 == (flags & no_codecvt)){ - std::locale l = std::locale( + archive_locale = std::locale( is_.getloc(), new boost::archive::detail::utf8_codecvt_facet ); // libstdc++ crashes without this is_.sync(); - is_.imbue(l); + is_.imbue(archive_locale); } if(0 == (flags & no_header)) init(); diff --git a/third_party/boost_parts/boost/archive/impl/xml_woarchive_impl.ipp b/third_party/boost_parts/boost/archive/impl/xml_woarchive_impl.ipp index 58f92c9d..630898b8 100644 --- a/third_party/boost_parts/boost/archive/impl/xml_woarchive_impl.ipp +++ b/third_party/boost_parts/boost/archive/impl/xml_woarchive_impl.ipp @@ -17,7 +17,9 @@ #include // strlen #include // mbtowc +#ifndef BOOST_NO_CWCHAR #include // wcslen +#endif #include #if defined(BOOST_NO_STDC_NAMESPACE) @@ -101,7 +103,6 @@ xml_woarchive_impl::save(const char * s){ template BOOST_WARCHIVE_DECL void xml_woarchive_impl::save(const wchar_t * ws){ - os << ws; typedef iterators::xml_escape xmbtows; std::copy( xmbtows(ws), @@ -124,12 +125,12 @@ xml_woarchive_impl::xml_woarchive_impl( basic_xml_oarchive(flags) { if(0 == (flags & no_codecvt)){ - std::locale l = std::locale( + archive_locale = std::locale( os_.getloc(), new boost::archive::detail::utf8_codecvt_facet ); os_.flush(); - os_.imbue(l); + os_.imbue(archive_locale); } if(0 == (flags & no_header)) this->init(); @@ -141,7 +142,7 @@ xml_woarchive_impl::~xml_woarchive_impl(){ if(std::uncaught_exception()) return; if(0 == (this->get_flags() & no_header)){ - save(L"\n"); + os << L""; } } diff --git a/third_party/boost_parts/boost/archive/iterators/base64_from_binary.hpp b/third_party/boost_parts/boost/archive/iterators/base64_from_binary.hpp index 00c4e10c..ee849944 100644 --- a/third_party/boost_parts/boost/archive/iterators/base64_from_binary.hpp +++ b/third_party/boost_parts/boost/archive/iterators/base64_from_binary.hpp @@ -41,7 +41,7 @@ template struct from_6_bit { typedef CharType result_type; CharType operator()(CharType t) const{ - const char * lookup_table = + static const char * lookup_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789" diff --git a/third_party/boost_parts/boost/archive/iterators/binary_from_base64.hpp b/third_party/boost_parts/boost/archive/iterators/binary_from_base64.hpp index 2eb78282..89b8f889 100644 --- a/third_party/boost_parts/boost/archive/iterators/binary_from_base64.hpp +++ b/third_party/boost_parts/boost/archive/iterators/binary_from_base64.hpp @@ -37,7 +37,7 @@ template struct to_6_bit { typedef CharType result_type; CharType operator()(CharType t) const{ - const signed char lookup_table[] = { + static const signed char lookup_table[] = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63, diff --git a/third_party/boost_parts/boost/archive/iterators/escape.hpp b/third_party/boost_parts/boost/archive/iterators/escape.hpp index a1fee914..103b31e0 100644 --- a/third_party/boost_parts/boost/archive/iterators/escape.hpp +++ b/third_party/boost_parts/boost/archive/iterators/escape.hpp @@ -102,7 +102,8 @@ class escape : super_t(base), m_bnext(NULL), m_bend(NULL), - m_full(false) + m_full(false), + m_current_value(0) { } }; diff --git a/third_party/boost_parts/boost/archive/iterators/istream_iterator.hpp b/third_party/boost_parts/boost/archive/iterators/istream_iterator.hpp index 9a1d555c..a187f605 100644 --- a/third_party/boost_parts/boost/archive/iterators/istream_iterator.hpp +++ b/third_party/boost_parts/boost/archive/iterators/istream_iterator.hpp @@ -56,7 +56,7 @@ class istream_iterator : //Access the value referred to Elem dereference() const { - return m_istream->peek(); + return static_cast(m_istream->peek()); } void increment(){ @@ -75,14 +75,14 @@ class istream_iterator : } istream_iterator() : - m_istream(NULL) + m_istream(NULL), + m_current_value(NULL) {} istream_iterator(const istream_iterator & rhs) : m_istream(rhs.m_istream), m_current_value(rhs.m_current_value) {} - }; } // namespace iterators diff --git a/third_party/boost_parts/boost/archive/iterators/mb_from_wchar.hpp b/third_party/boost_parts/boost/archive/iterators/mb_from_wchar.hpp index d5110de2..eb30480c 100644 --- a/third_party/boost_parts/boost/archive/iterators/mb_from_wchar.hpp +++ b/third_party/boost_parts/boost/archive/iterators/mb_from_wchar.hpp @@ -18,14 +18,16 @@ #include #include // size_t +#ifndef BOOST_NO_CWCHAR #include // mbstate_t - +#endif #include #if defined(BOOST_NO_STDC_NAMESPACE) namespace std{ using ::mbstate_t; } // namespace std #endif + #include #include @@ -84,12 +86,15 @@ class mb_from_wchar wchar_t value = * this->base_reference(); const wchar_t *wend; char *bend; - std::codecvt_base::result r = m_codecvt_facet.out( - m_mbs, - & value, & value + 1, wend, - m_buffer, m_buffer + sizeof(m_buffer), bend + BOOST_VERIFY( + m_codecvt_facet.out( + m_mbs, + & value, & value + 1, wend, + m_buffer, m_buffer + sizeof(m_buffer), bend + ) + == + std::codecvt_base::ok ); - BOOST_ASSERT(std::codecvt_base::ok == r); m_bnext = 0; m_bend = bend - m_buffer; } diff --git a/third_party/boost_parts/boost/archive/iterators/transform_width.hpp b/third_party/boost_parts/boost/archive/iterators/transform_width.hpp index d042560e..09c050a9 100644 --- a/third_party/boost_parts/boost/archive/iterators/transform_width.hpp +++ b/third_party/boost_parts/boost/archive/iterators/transform_width.hpp @@ -111,6 +111,7 @@ class transform_width : transform_width(T start) : super_t(Base(static_cast< T >(start))), m_buffer_out_full(false), + m_buffer_out(0), // To disable GCC warning, but not truly necessary //(m_buffer_in will be initialized later before being //used because m_remaining_bits == 0) diff --git a/third_party/boost_parts/boost/archive/iterators/wchar_from_mb.hpp b/third_party/boost_parts/boost/archive/iterators/wchar_from_mb.hpp index 52a44bdc..2af8f640 100644 --- a/third_party/boost_parts/boost/archive/iterators/wchar_from_mb.hpp +++ b/third_party/boost_parts/boost/archive/iterators/wchar_from_mb.hpp @@ -19,7 +19,9 @@ #include #include #include // size_t +#ifndef BOOST_NO_CWCHAR #include // mbstate_t +#endif #include // copy #include diff --git a/third_party/boost_parts/boost/archive/shared_ptr_helper.hpp b/third_party/boost_parts/boost/archive/shared_ptr_helper.hpp deleted file mode 100644 index 39e6eb82..00000000 --- a/third_party/boost_parts/boost/archive/shared_ptr_helper.hpp +++ /dev/null @@ -1,219 +0,0 @@ -#ifndef BOOST_ARCHIVE_SHARED_PTR_HELPER_HPP -#define BOOST_ARCHIVE_SHARED_PTR_HELPER_HPP - -// MS compatible compilers support #pragma once -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -# pragma once -#endif - -/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// shared_ptr_helper.hpp: serialization for boost shared pointern - -// (C) Copyright 2004-2009 Robert Ramey, Martin Ecker and Takatoshi Kondo -// Use, modification and distribution is subject to the Boost Software -// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org for updates, documentation, and revision history. - -#include -#include -#include -#include // NULL - -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include // must be the last headern - -namespace boost_132 { - template class shared_ptr; -} -namespace boost { - template class shared_ptr; - namespace serialization { - class extended_type_info; - template - inline void load( - Archive & ar, - boost::shared_ptr< T > &t, - const unsigned int file_version - ); - } -namespace archive{ -namespace detail { - -/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// a common class for holding various types of shared pointers - -class shared_ptr_helper { - struct collection_type_compare { - bool operator()( - const shared_ptr &lhs, - const shared_ptr &rhs - )const{ - return lhs.get() < rhs.get(); - } - }; - typedef std::set< - boost::shared_ptr, - collection_type_compare - > collection_type; - typedef collection_type::const_iterator iterator_type; - // list of shared_pointers create accessable by raw pointer. This - // is used to "match up" shared pointers loaded at different - // points in the archive. Note, we delay construction until - // it is actually used since this is by default included as - // a "mix-in" even if shared_ptr isn't used. - collection_type * m_pointers; - - struct null_deleter { - void operator()(void const *) const {} - }; - - struct void_deleter { - const boost::serialization::extended_type_info * m_eti; - void_deleter(const boost::serialization::extended_type_info *eti) : - m_eti(eti) - {} - void operator()(void *vp) const { - m_eti->destroy(vp); - } - }; - -#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS -public: -#else - template - friend inline void boost::serialization::load( - Archive & ar, - boost::shared_ptr< T > &t, - const unsigned int file_version - ); -#endif - -// #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP - // list of loaded pointers. This is used to be sure that the pointers - // stay around long enough to be "matched" with other pointers loaded - // by the same archive. These are created with a "null_deleter" so that - // when this list is destroyed - the underlaying raw pointers are not - // destroyed. This has to be done because the pointers are also held by - // new system which is disjoint from this set. This is implemented - // by a change in load_construct_data below. It makes this file suitable - // only for loading pointers into a 1.33 or later boost system. - std::list > * m_pointers_132; -// #endif - - // returns pointer to object and an indicator whether this is a - // new entry (true) or a previous one (false) - BOOST_ARCHIVE_DECL(shared_ptr) - get_od( - const void * od, - const boost::serialization::extended_type_info * true_type, - const boost::serialization::extended_type_info * this_type - ); - - BOOST_ARCHIVE_DECL(void) - append(const boost::shared_ptr &); - - template - struct non_polymorphic { - static const boost::serialization::extended_type_info * - get_object_identifier(T &){ - return & boost::serialization::singleton< - BOOST_DEDUCED_TYPENAME - boost::serialization::type_info_implementation< T >::type - >::get_const_instance(); - } - }; - template - struct polymorphic { - static const boost::serialization::extended_type_info * - get_object_identifier(T & t){ - return boost::serialization::singleton< - BOOST_DEDUCED_TYPENAME - boost::serialization::type_info_implementation< T >::type - >::get_const_instance().get_derived_extended_type_info(t); - } - }; -public: - template - void reset(shared_ptr< T > & s, T * t){ - if(NULL == t){ - s.reset(); - return; - } - const boost::serialization::extended_type_info * this_type - = & boost::serialization::type_info_implementation< T >::type - ::get_const_instance(); - - // get pointer to the most derived object. This is effectively - // the object identifern - typedef BOOST_DEDUCED_TYPENAME mpl::eval_if< - is_polymorphic< T >, - mpl::identity >, - mpl::identity > - >::type type; - - const boost::serialization::extended_type_info * true_type - = type::get_object_identifier(*t); - - // note:if this exception is thrown, be sure that derived pointern - // is either registered or exported. - if(NULL == true_type) - boost::serialization::throw_exception( - archive_exception( - archive_exception::unregistered_class, - this_type->get_debug_info() - ) - ); - shared_ptr r = - get_od( - static_cast(t), - true_type, - this_type - ); - if(!r){ - s.reset(t); - const void * od = void_downcast( - *true_type, - *this_type, - static_cast(t) - ); - shared_ptr sp(s, od); - append(sp); - } - else{ - s = shared_ptr< T >( - r, - static_cast(r.get()) - ); - } - } - -// #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP - BOOST_ARCHIVE_DECL(void) - append(const boost_132::shared_ptr & t); -// #endif -public: - BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) - shared_ptr_helper(); - BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) - ~shared_ptr_helper(); -}; - -} // namespace detail -} // namespace archive -} // namespace boost - -#include // pops abi_suffix.hpp pragmas - -#endif // BOOST_ARCHIVE_SHARED_PTR_HELPER_HPP diff --git a/third_party/boost_parts/boost/archive/wcslen.hpp b/third_party/boost_parts/boost/archive/wcslen.hpp index 2a3d6351..0b60004f 100644 --- a/third_party/boost_parts/boost/archive/wcslen.hpp +++ b/third_party/boost_parts/boost/archive/wcslen.hpp @@ -44,7 +44,9 @@ inline std::size_t wcslen(const wchar_t * ws) #else +#ifndef BOOST_NO_CWCHAR #include +#endif #ifdef BOOST_NO_STDC_NAMESPACE namespace std{ using ::wcslen; } #endif diff --git a/third_party/boost_parts/boost/archive/xml_wiarchive.hpp b/third_party/boost_parts/boost/archive/xml_wiarchive.hpp index ac24289a..2ca3e559 100644 --- a/third_party/boost_parts/boost/archive/xml_wiarchive.hpp +++ b/third_party/boost_parts/boost/archive/xml_wiarchive.hpp @@ -62,6 +62,7 @@ class BOOST_SYMBOL_VISIBLE xml_wiarchive_impl : friend class basic_xml_iarchive; friend class load_access; #endif + std::locale archive_locale; boost::scoped_ptr gimpl; std::wistream & get_is(){ return is; diff --git a/third_party/boost_parts/boost/array.hpp b/third_party/boost_parts/boost/array.hpp index fa06fa9a..210c0721 100644 --- a/third_party/boost_parts/boost/array.hpp +++ b/third_party/boost_parts/boost/array.hpp @@ -13,6 +13,7 @@ * accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) * + * 9 Jan 2013 - (mtc) Added constexpr * 14 Apr 2012 - (mtc) Added support for boost::hash * 28 Dec 2010 - (mtc) Added cbegin and cend (and crbegin and crend) for C++Ox compatibility. * 10 Mar 2010 - (mtc) fill method added, matching resolution of the standard library working group. @@ -42,12 +43,12 @@ #include #include #include +#include #include // Handles broken standard libraries better than #include #include -#include #include // FIXES for broken compilers @@ -81,15 +82,9 @@ namespace boost { const_iterator cend() const { return elems+N; } // reverse iterator support -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS) +#if !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS) typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; -#elif defined(_MSC_VER) && (_MSC_VER == 1300) && defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB == 310) - // workaround for broken reverse_iterator in VC7 - typedef std::reverse_iterator > reverse_iterator; - typedef std::reverse_iterator > const_reverse_iterator; #elif defined(_RWSTD_NO_CLASS_PARTIAL_SPEC) typedef std::reverse_iterator reverse_iterator; @@ -120,19 +115,17 @@ namespace boost { // operator[] reference operator[](size_type i) { - BOOST_ASSERT_MSG( i < N, "out of range" ); - return elems[i]; + return BOOST_ASSERT_MSG( i < N, "out of range" ), elems[i]; } - const_reference operator[](size_type i) const + /*BOOST_CONSTEXPR*/ const_reference operator[](size_type i) const { - BOOST_ASSERT_MSG( i < N, "out of range" ); - return elems[i]; + return BOOST_ASSERT_MSG( i < N, "out of range" ), elems[i]; } // at() with range check - reference at(size_type i) { rangecheck(i); return elems[i]; } - const_reference at(size_type i) const { rangecheck(i); return elems[i]; } + reference at(size_type i) { return rangecheck(i), elems[i]; } + /*BOOST_CONSTEXPR*/ const_reference at(size_type i) const { return rangecheck(i), elems[i]; } // front() and back() reference front() @@ -140,7 +133,7 @@ namespace boost { return elems[0]; } - const_reference front() const + BOOST_CONSTEXPR const_reference front() const { return elems[0]; } @@ -150,15 +143,15 @@ namespace boost { return elems[N-1]; } - const_reference back() const + BOOST_CONSTEXPR const_reference back() const { return elems[N-1]; } // size is constant - static size_type size() { return N; } - static bool empty() { return false; } - static size_type max_size() { return N; } + static BOOST_CONSTEXPR size_type size() { return N; } + static BOOST_CONSTEXPR bool empty() { return false; } + static BOOST_CONSTEXPR size_type max_size() { return N; } enum { static_size = N }; // swap (note: linear complexity) @@ -189,16 +182,12 @@ namespace boost { } // check range (may be private because it is static) - static void rangecheck (size_type i) { - if (i >= size()) { - std::out_of_range e("array<>: index out of range"); - boost::throw_exception(e); - } + static BOOST_CONSTEXPR bool rangecheck (size_type i) { + return i > size() ? boost::throw_exception(std::out_of_range ("array<>: index out of range")), true : true; } }; -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) template< class T > class array< T, 0 > { @@ -222,15 +211,9 @@ namespace boost { const_iterator cend() const { return cbegin(); } // reverse iterator support -#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS) +#if !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS) typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; -#elif defined(_MSC_VER) && (_MSC_VER == 1300) && defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB == 310) - // workaround for broken reverse_iterator in VC7 - typedef std::reverse_iterator > reverse_iterator; - typedef std::reverse_iterator > const_reverse_iterator; #elif defined(_RWSTD_NO_CLASS_PARTIAL_SPEC) typedef std::reverse_iterator reverse_iterator; @@ -264,14 +247,14 @@ namespace boost { return failed_rangecheck(); } - const_reference operator[](size_type /*i*/) const + /*BOOST_CONSTEXPR*/ const_reference operator[](size_type /*i*/) const { return failed_rangecheck(); } // at() with range check reference at(size_type /*i*/) { return failed_rangecheck(); } - const_reference at(size_type /*i*/) const { return failed_rangecheck(); } + /*BOOST_CONSTEXPR*/ const_reference at(size_type /*i*/) const { return failed_rangecheck(); } // front() and back() reference front() @@ -279,7 +262,7 @@ namespace boost { return failed_rangecheck(); } - const_reference front() const + BOOST_CONSTEXPR const_reference front() const { return failed_rangecheck(); } @@ -289,15 +272,15 @@ namespace boost { return failed_rangecheck(); } - const_reference back() const + BOOST_CONSTEXPR const_reference back() const { return failed_rangecheck(); } // size is constant - static size_type size() { return 0; } - static bool empty() { return true; } - static size_type max_size() { return 0; } + static BOOST_CONSTEXPR size_type size() { return 0; } + static BOOST_CONSTEXPR bool empty() { return true; } + static BOOST_CONSTEXPR size_type max_size() { return 0; } enum { static_size = 0 }; void swap (array& /*y*/) { @@ -335,7 +318,6 @@ namespace boost { #endif } }; -#endif // comparisons template @@ -391,7 +373,7 @@ namespace boost { // Specific for boost::array: simply returns its elems data member. template - typename const detail::c_array::type& get_c_array(const boost::array& arg) + typename detail::c_array::type const& get_c_array(const boost::array& arg) { return arg.elems; } @@ -429,6 +411,7 @@ namespace boost { } #endif + template std::size_t hash_range(It, It); template std::size_t hash_value(const array& arr) @@ -436,8 +419,36 @@ namespace boost { return boost::hash_range(arr.begin(), arr.end()); } + template + T &get(boost::array &arr) BOOST_NOEXCEPT { + BOOST_STATIC_ASSERT_MSG ( Idx < N, "boost::get<>(boost::array &) index out of range" ); + return arr[Idx]; + } + + template + const T &get(const boost::array &arr) BOOST_NOEXCEPT { + BOOST_STATIC_ASSERT_MSG ( Idx < N, "boost::get<>(const boost::array &) index out of range" ); + return arr[Idx]; + } + } /* namespace boost */ +#ifndef BOOST_NO_CXX11_HDR_ARRAY +// If we don't have std::array, I'm assuming that we don't have std::get +namespace std { + template + T &get(boost::array &arr) BOOST_NOEXCEPT { + BOOST_STATIC_ASSERT_MSG ( Idx < N, "std::get<>(boost::array &) index out of range" ); + return arr[Idx]; + } + + template + const T &get(const boost::array &arr) BOOST_NOEXCEPT { + BOOST_STATIC_ASSERT_MSG ( Idx < N, "std::get<>(const boost::array &) index out of range" ); + return arr[Idx]; + } +} +#endif #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) # pragma warning(pop) diff --git a/third_party/boost_parts/boost/bind/arg.hpp b/third_party/boost_parts/boost/bind/arg.hpp index a74b8298..cb52e668 100644 --- a/third_party/boost_parts/boost/bind/arg.hpp +++ b/third_party/boost_parts/boost/bind/arg.hpp @@ -21,20 +21,27 @@ #include #include -#include namespace boost { +template struct _arg_eq +{ +}; + +template<> struct _arg_eq +{ + typedef void type; +}; + template< int I > struct arg { BOOST_CONSTEXPR arg() { } - template< class T > BOOST_CONSTEXPR arg( T const & /* t */ ) + template< class T > BOOST_CONSTEXPR arg( T const & /* t */, typename _arg_eq< I == is_placeholder::value >::type * = 0 ) { - BOOST_STATIC_ASSERT( I == is_placeholder::value ); } }; diff --git a/third_party/boost_parts/boost/bind/bind.hpp b/third_party/boost_parts/boost/bind/bind.hpp index f793551d..4cedc5e9 100644 --- a/third_party/boost_parts/boost/bind/bind.hpp +++ b/third_party/boost_parts/boost/bind/bind.hpp @@ -887,9 +887,17 @@ template< class A1 > class rrlist1 template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist1 a( a1_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist1 a( a1_ ); + return b.eval( a ); + } }; template< class A1, class A2 > class rrlist2 @@ -915,9 +923,17 @@ template< class A1, class A2 > class rrlist2 template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist2 a( a1_, a2_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist2 a( a1_, a2_ ); + return b.eval( a ); + } }; template< class A1, class A2, class A3 > class rrlist3 @@ -946,9 +962,17 @@ template< class A1, class A2, class A3 > class rrlist3 template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist3 a( a1_, a2_, a3_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist3 a( a1_, a2_, a3_ ); + return b.eval( a ); + } }; template< class A1, class A2, class A3, class A4 > class rrlist4 @@ -980,9 +1004,17 @@ template< class A1, class A2, class A3, class A4 > class rrlist4 template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist4 a( a1_, a2_, a3_, a4_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist4 a( a1_, a2_, a3_, a4_ ); + return b.eval( a ); + } }; template< class A1, class A2, class A3, class A4, class A5 > class rrlist5 @@ -1017,9 +1049,17 @@ template< class A1, class A2, class A3, class A4, class A5 > class rrlist5 template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist5 a( a1_, a2_, a3_, a4_, a5_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist5 a( a1_, a2_, a3_, a4_, a5_ ); + return b.eval( a ); + } }; template< class A1, class A2, class A3, class A4, class A5, class A6 > class rrlist6 @@ -1057,9 +1097,17 @@ template< class A1, class A2, class A3, class A4, class A5, class A6 > class rrl template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist6 a( a1_, a2_, a3_, a4_, a5_, a6_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist6 a( a1_, a2_, a3_, a4_, a5_, a6_ ); + return b.eval( a ); + } }; template< class A1, class A2, class A3, class A4, class A5, class A6, class A7 > class rrlist7 @@ -1100,9 +1148,17 @@ template< class A1, class A2, class A3, class A4, class A5, class A6, class A7 > template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist7 a( a1_, a2_, a3_, a4_, a5_, a6_, a7_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist7 a( a1_, a2_, a3_, a4_, a5_, a6_, a7_ ); + return b.eval( a ); + } }; template< class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > class rrlist8 @@ -1146,9 +1202,17 @@ template< class A1, class A2, class A3, class A4, class A5, class A6, class A7, template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist8 a( a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist8 a( a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_ ); + return b.eval( a ); + } }; template< class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > class rrlist9 @@ -1195,9 +1259,17 @@ template< class A1, class A2, class A3, class A4, class A5, class A6, class A7, template T & operator[] (reference_wrapper const & v) const { return v.get(); } - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t & b) const + { + rrlist9 a( a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_, a9_ ); + return b.eval( a ); + } - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + template typename result_traits::type operator[] (bind_t const & b) const + { + rrlist9 a( a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_, a9_ ); + return b.eval( a ); + } }; template class bind_t @@ -2050,21 +2122,31 @@ template +# if defined( __cpp_noexcept_function_type ) || defined( _NOEXCEPT_TYPES_SUPPORTED ) +# undef BOOST_BIND_NOEXCEPT +# define BOOST_BIND_NOEXCEPT noexcept +# include +# endif + #undef BOOST_BIND_CC #undef BOOST_BIND_ST +#undef BOOST_BIND_NOEXCEPT #ifdef BOOST_BIND_ENABLE_STDCALL #define BOOST_BIND_CC __stdcall #define BOOST_BIND_ST +#define BOOST_BIND_NOEXCEPT #include #undef BOOST_BIND_CC #undef BOOST_BIND_ST +#undef BOOST_BIND_NOEXCEPT #endif @@ -2072,11 +2154,13 @@ template #undef BOOST_BIND_CC #undef BOOST_BIND_ST +#undef BOOST_BIND_NOEXCEPT #endif @@ -2084,11 +2168,13 @@ template #undef BOOST_BIND_ST #undef BOOST_BIND_CC +#undef BOOST_BIND_NOEXCEPT #endif @@ -2096,23 +2182,33 @@ template #include +# if defined( __cpp_noexcept_function_type ) || defined( _NOEXCEPT_TYPES_SUPPORTED ) +# undef BOOST_BIND_MF_NOEXCEPT +# define BOOST_BIND_MF_NOEXCEPT noexcept +# include +# endif + #undef BOOST_BIND_MF_NAME #undef BOOST_BIND_MF_CC +#undef BOOST_BIND_MF_NOEXCEPT #ifdef BOOST_MEM_FN_ENABLE_CDECL #define BOOST_BIND_MF_NAME(X) X##_cdecl #define BOOST_BIND_MF_CC __cdecl +#define BOOST_BIND_MF_NOEXCEPT #include #include #undef BOOST_BIND_MF_NAME #undef BOOST_BIND_MF_CC +#undef BOOST_BIND_MF_NOEXCEPT #endif @@ -2120,12 +2216,14 @@ template #include #undef BOOST_BIND_MF_NAME #undef BOOST_BIND_MF_CC +#undef BOOST_BIND_MF_NOEXCEPT #endif @@ -2133,12 +2231,14 @@ template #include #undef BOOST_BIND_MF_NAME #undef BOOST_BIND_MF_CC +#undef BOOST_BIND_MF_NOEXCEPT #endif @@ -2192,6 +2292,15 @@ template< class R, class T > struct add_cref< R (T::*) () const, 1 > typedef void type; }; +#if defined( __cpp_noexcept_function_type ) || defined( _NOEXCEPT_TYPES_SUPPORTED ) + +template< class R, class T > struct add_cref< R (T::*) () const noexcept, 1 > +{ + typedef void type; +}; + +#endif // __cpp_noexcept_function_type + #endif // __IBMCPP__ template struct isref diff --git a/third_party/boost_parts/boost/bind/bind_cc.hpp b/third_party/boost_parts/boost/bind/bind_cc.hpp index 35f8eceb..278aa9a2 100644 --- a/third_party/boost_parts/boost/bind/bind_cc.hpp +++ b/third_party/boost_parts/boost/bind/bind_cc.hpp @@ -13,28 +13,28 @@ // template - _bi::bind_t - BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) ()) + _bi::bind_t + BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) () BOOST_BIND_NOEXCEPT) { - typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (); + typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) () BOOST_BIND_NOEXCEPT; typedef _bi::list0 list_type; return _bi::bind_t (f, list_type()); } template - _bi::bind_t::type> - BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1), A1 a1) + _bi::bind_t::type> + BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1) BOOST_BIND_NOEXCEPT, A1 a1) { - typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1); + typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1) BOOST_BIND_NOEXCEPT; typedef typename _bi::list_av_1::type list_type; return _bi::bind_t (f, list_type(a1)); } template - _bi::bind_t::type> - BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2), A1 a1, A2 a2) + _bi::bind_t::type> + BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2) BOOST_BIND_NOEXCEPT, A1 a1, A2 a2) { - typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2); + typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2) BOOST_BIND_NOEXCEPT; typedef typename _bi::list_av_2::type list_type; return _bi::bind_t (f, list_type(a1, a2)); } @@ -42,10 +42,10 @@ template template - _bi::bind_t::type> - BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3), A1 a1, A2 a2, A3 a3) + _bi::bind_t::type> + BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3) BOOST_BIND_NOEXCEPT, A1 a1, A2 a2, A3 a3) { - typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3); + typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3) BOOST_BIND_NOEXCEPT; typedef typename _bi::list_av_3::type list_type; return _bi::bind_t(f, list_type(a1, a2, a3)); } @@ -53,10 +53,10 @@ template - _bi::bind_t::type> - BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4), A1 a1, A2 a2, A3 a3, A4 a4) + _bi::bind_t::type> + BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4) BOOST_BIND_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4) { - typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4); + typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4) BOOST_BIND_NOEXCEPT; typedef typename _bi::list_av_4::type list_type; return _bi::bind_t(f, list_type(a1, a2, a3, a4)); } @@ -64,10 +64,10 @@ template - _bi::bind_t::type> - BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4, B5), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) + _bi::bind_t::type> + BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4, B5) BOOST_BIND_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { - typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4, B5); + typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4, B5) BOOST_BIND_NOEXCEPT; typedef typename _bi::list_av_5::type list_type; return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5)); } @@ -75,10 +75,10 @@ template - _bi::bind_t::type> - BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4, B5, B6), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) + _bi::bind_t::type> + BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4, B5, B6) BOOST_BIND_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { - typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4, B5, B6); + typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4, B5, B6) BOOST_BIND_NOEXCEPT; typedef typename _bi::list_av_6::type list_type; return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5, a6)); } @@ -86,10 +86,10 @@ template - _bi::bind_t::type> - BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4, B5, B6, B7), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) + _bi::bind_t::type> + BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4, B5, B6, B7) BOOST_BIND_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) { - typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4, B5, B6, B7); + typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4, B5, B6, B7) BOOST_BIND_NOEXCEPT; typedef typename _bi::list_av_7::type list_type; return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5, a6, a7)); } @@ -97,10 +97,10 @@ template - _bi::bind_t::type> - BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4, B5, B6, B7, B8), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) + _bi::bind_t::type> + BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4, B5, B6, B7, B8) BOOST_BIND_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) { - typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4, B5, B6, B7, B8); + typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4, B5, B6, B7, B8) BOOST_BIND_NOEXCEPT; typedef typename _bi::list_av_8::type list_type; return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8)); } @@ -108,10 +108,10 @@ template - _bi::bind_t::type> - BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4, B5, B6, B7, B8, B9), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) + _bi::bind_t::type> + BOOST_BIND(BOOST_BIND_ST R (BOOST_BIND_CC *f) (B1, B2, B3, B4, B5, B6, B7, B8, B9) BOOST_BIND_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) { - typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4, B5, B6, B7, B8, B9); + typedef BOOST_BIND_ST R (BOOST_BIND_CC *F) (B1, B2, B3, B4, B5, B6, B7, B8, B9) BOOST_BIND_NOEXCEPT; typedef typename _bi::list_av_9::type list_type; return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9)); } diff --git a/third_party/boost_parts/boost/bind/bind_mf_cc.hpp b/third_party/boost_parts/boost/bind/bind_mf_cc.hpp index e149384f..bbfd3719 100644 --- a/third_party/boost_parts/boost/bind/bind_mf_cc.hpp +++ b/third_party/boost_parts/boost/bind/bind_mf_cc.hpp @@ -17,7 +17,7 @@ template _bi::bind_t, typename _bi::list_av_1::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (), A1 a1) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) () BOOST_BIND_MF_NOEXCEPT, A1 a1) { typedef _mfi::BOOST_BIND_MF_NAME(mf0) F; typedef typename _bi::list_av_1::type list_type; @@ -27,7 +27,7 @@ template _bi::bind_t, typename _bi::list_av_1::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) () const, A1 a1) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) () const BOOST_BIND_MF_NOEXCEPT, A1 a1) { typedef _mfi::BOOST_BIND_MF_NAME(cmf0) F; typedef typename _bi::list_av_1::type list_type; @@ -38,7 +38,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_1::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (), A1 a1) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) () BOOST_BIND_MF_NOEXCEPT, A1 a1) { typedef _mfi::BOOST_BIND_MF_NAME(mf0) F; typedef typename _bi::list_av_1::type list_type; @@ -49,7 +49,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_1::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) () const, A1 a1) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) () const BOOST_BIND_MF_NOEXCEPT, A1 a1) { typedef _mfi::BOOST_BIND_MF_NAME(cmf0) F; typedef typename _bi::list_av_1::type list_type; @@ -62,7 +62,7 @@ template _bi::bind_t, typename _bi::list_av_2::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1), A1 a1, A2 a2) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2) { typedef _mfi::BOOST_BIND_MF_NAME(mf1) F; typedef typename _bi::list_av_2::type list_type; @@ -73,7 +73,7 @@ template _bi::bind_t, typename _bi::list_av_2::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1) const, A1 a1, A2 a2) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2) { typedef _mfi::BOOST_BIND_MF_NAME(cmf1) F; typedef typename _bi::list_av_2::type list_type; @@ -85,7 +85,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_2::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1), A1 a1, A2 a2) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2) { typedef _mfi::BOOST_BIND_MF_NAME(mf1) F; typedef typename _bi::list_av_2::type list_type; @@ -97,7 +97,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_2::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1) const, A1 a1, A2 a2) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2) { typedef _mfi::BOOST_BIND_MF_NAME(cmf1) F; typedef typename _bi::list_av_2::type list_type; @@ -110,7 +110,7 @@ template _bi::bind_t, typename _bi::list_av_3::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2), A1 a1, A2 a2, A3 a3) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3) { typedef _mfi::BOOST_BIND_MF_NAME(mf2) F; typedef typename _bi::list_av_3::type list_type; @@ -121,7 +121,7 @@ template _bi::bind_t, typename _bi::list_av_3::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2) const, A1 a1, A2 a2, A3 a3) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3) { typedef _mfi::BOOST_BIND_MF_NAME(cmf2) F; typedef typename _bi::list_av_3::type list_type; @@ -133,7 +133,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_3::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2), A1 a1, A2 a2, A3 a3) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3) { typedef _mfi::BOOST_BIND_MF_NAME(mf2) F; typedef typename _bi::list_av_3::type list_type; @@ -145,7 +145,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_3::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2) const, A1 a1, A2 a2, A3 a3) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3) { typedef _mfi::BOOST_BIND_MF_NAME(cmf2) F; typedef typename _bi::list_av_3::type list_type; @@ -158,7 +158,7 @@ template _bi::bind_t, typename _bi::list_av_4::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3), A1 a1, A2 a2, A3 a3, A4 a4) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4) { typedef _mfi::BOOST_BIND_MF_NAME(mf3) F; typedef typename _bi::list_av_4::type list_type; @@ -169,7 +169,7 @@ template _bi::bind_t, typename _bi::list_av_4::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3) const, A1 a1, A2 a2, A3 a3, A4 a4) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4) { typedef _mfi::BOOST_BIND_MF_NAME(cmf3) F; typedef typename _bi::list_av_4::type list_type; @@ -181,7 +181,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_4::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3), A1 a1, A2 a2, A3 a3, A4 a4) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4) { typedef _mfi::BOOST_BIND_MF_NAME(mf3) F; typedef typename _bi::list_av_4::type list_type; @@ -193,7 +193,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_4::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3) const, A1 a1, A2 a2, A3 a3, A4 a4) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4) { typedef _mfi::BOOST_BIND_MF_NAME(cmf3) F; typedef typename _bi::list_av_4::type list_type; @@ -206,7 +206,7 @@ template _bi::bind_t, typename _bi::list_av_5::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { typedef _mfi::BOOST_BIND_MF_NAME(mf4) F; typedef typename _bi::list_av_5::type list_type; @@ -217,7 +217,7 @@ template _bi::bind_t, typename _bi::list_av_5::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { typedef _mfi::BOOST_BIND_MF_NAME(cmf4) F; typedef typename _bi::list_av_5::type list_type; @@ -229,7 +229,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_5::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { typedef _mfi::BOOST_BIND_MF_NAME(mf4) F; typedef typename _bi::list_av_5::type list_type; @@ -241,7 +241,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_5::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { typedef _mfi::BOOST_BIND_MF_NAME(cmf4) F; typedef typename _bi::list_av_5::type list_type; @@ -254,7 +254,7 @@ template _bi::bind_t, typename _bi::list_av_6::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { typedef _mfi::BOOST_BIND_MF_NAME(mf5) F; typedef typename _bi::list_av_6::type list_type; @@ -265,7 +265,7 @@ template _bi::bind_t, typename _bi::list_av_6::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { typedef _mfi::BOOST_BIND_MF_NAME(cmf5) F; typedef typename _bi::list_av_6::type list_type; @@ -277,7 +277,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_6::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { typedef _mfi::BOOST_BIND_MF_NAME(mf5) F; typedef typename _bi::list_av_6::type list_type; @@ -289,7 +289,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_6::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { typedef _mfi::BOOST_BIND_MF_NAME(cmf5) F; typedef typename _bi::list_av_6::type list_type; @@ -302,7 +302,7 @@ template _bi::bind_t, typename _bi::list_av_7::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) { typedef _mfi::BOOST_BIND_MF_NAME(mf6) F; typedef typename _bi::list_av_7::type list_type; @@ -313,7 +313,7 @@ template _bi::bind_t, typename _bi::list_av_7::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) { typedef _mfi::BOOST_BIND_MF_NAME(cmf6) F; typedef typename _bi::list_av_7::type list_type; @@ -325,7 +325,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_7::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) { typedef _mfi::BOOST_BIND_MF_NAME(mf6) F; typedef typename _bi::list_av_7::type list_type; @@ -337,7 +337,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_7::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) { typedef _mfi::BOOST_BIND_MF_NAME(cmf6) F; typedef typename _bi::list_av_7::type list_type; @@ -350,7 +350,7 @@ template _bi::bind_t, typename _bi::list_av_8::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) { typedef _mfi::BOOST_BIND_MF_NAME(mf7) F; typedef typename _bi::list_av_8::type list_type; @@ -361,7 +361,7 @@ template _bi::bind_t, typename _bi::list_av_8::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) { typedef _mfi::BOOST_BIND_MF_NAME(cmf7) F; typedef typename _bi::list_av_8::type list_type; @@ -373,7 +373,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_8::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) { typedef _mfi::BOOST_BIND_MF_NAME(mf7) F; typedef typename _bi::list_av_8::type list_type; @@ -385,7 +385,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_8::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) { typedef _mfi::BOOST_BIND_MF_NAME(cmf7) F; typedef typename _bi::list_av_8::type list_type; @@ -398,7 +398,7 @@ template _bi::bind_t, typename _bi::list_av_9::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7, B8), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7, B8) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) { typedef _mfi::BOOST_BIND_MF_NAME(mf8) F; typedef typename _bi::list_av_9::type list_type; @@ -409,7 +409,7 @@ template _bi::bind_t, typename _bi::list_av_9::type> - BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7, B8) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) + BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7, B8) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) { typedef _mfi::BOOST_BIND_MF_NAME(cmf8) F; typedef typename _bi::list_av_9::type list_type; @@ -421,7 +421,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_9::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7, B8), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7, B8) BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) { typedef _mfi::BOOST_BIND_MF_NAME(mf8) F; typedef typename _bi::list_av_9::type list_type; @@ -433,7 +433,7 @@ template typename boost::enable_if_c::value, _bi::bind_t, typename _bi::list_av_9::type> - >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7, B8) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) + >::type BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7, B8) const BOOST_BIND_MF_NOEXCEPT, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) { typedef _mfi::BOOST_BIND_MF_NAME(cmf8) F; typedef typename _bi::list_av_9::type list_type; diff --git a/third_party/boost_parts/boost/concept_archetype.hpp b/third_party/boost_parts/boost/concept_archetype.hpp index f21c8173..f2455fd8 100644 --- a/third_party/boost_parts/boost/concept_archetype.hpp +++ b/third_party/boost_parts/boost/concept_archetype.hpp @@ -15,9 +15,10 @@ #define BOOST_CONCEPT_ARCHETYPES_HPP #include -#include #include #include +#include // iterator tags +#include // std::ptrdiff_t namespace boost { diff --git a/third_party/boost_parts/boost/config.hpp b/third_party/boost_parts/boost/config.hpp index d49bb27c..f00a9805 100644 --- a/third_party/boost_parts/boost/config.hpp +++ b/third_party/boost_parts/boost/config.hpp @@ -32,7 +32,7 @@ // if we don't have a compiler config set, try and find one: #if !defined(BOOST_COMPILER_CONFIG) && !defined(BOOST_NO_COMPILER_CONFIG) && !defined(BOOST_NO_CONFIG) -# include +# include #endif // if we have a compiler config, include it now: #ifdef BOOST_COMPILER_CONFIG @@ -41,7 +41,7 @@ // if we don't have a std library config set, try and find one: #if !defined(BOOST_STDLIB_CONFIG) && !defined(BOOST_NO_STDLIB_CONFIG) && !defined(BOOST_NO_CONFIG) && defined(__cplusplus) -# include +# include #endif // if we have a std library config, include it now: #ifdef BOOST_STDLIB_CONFIG @@ -50,7 +50,7 @@ // if we don't have a platform config set, try and find one: #if !defined(BOOST_PLATFORM_CONFIG) && !defined(BOOST_NO_PLATFORM_CONFIG) && !defined(BOOST_NO_CONFIG) -# include +# include #endif // if we have a platform config, include it now: #ifdef BOOST_PLATFORM_CONFIG @@ -58,7 +58,7 @@ #endif // get config suffix code: -#include +#include #ifdef BOOST_HAS_PRAGMA_ONCE #pragma once diff --git a/third_party/boost_parts/boost/config/auto_link.hpp b/third_party/boost_parts/boost/config/auto_link.hpp index 56a16b0b..271f8379 100644 --- a/third_party/boost_parts/boost/config/auto_link.hpp +++ b/third_party/boost_parts/boost/config/auto_link.hpp @@ -45,6 +45,7 @@ BOOST_LIB_PREFIX + BOOST_LIB_TOOLSET + BOOST_LIB_THREAD_OPT + BOOST_LIB_RT_OPT + + BOOST_LIB_ARCH_AND_MODEL_OPT "-" + BOOST_LIB_VERSION @@ -69,6 +70,9 @@ BOOST_LIB_RT_OPT: A suffix that indicates the runtime library used, p STLport build. n STLport build without its IOStreams. +BOOST_LIB_ARCH_AND_MODEL_OPT: The architecture and address model + (-x32 or -x64 for x86/32 and x86/64 respectively) + BOOST_LIB_VERSION: The Boost version, in the form x_y, for Boost version x.y. @@ -161,10 +165,15 @@ BOOST_LIB_VERSION: The Boost version, in the form x_y, for Boost version x.y. // vc12: # define BOOST_LIB_TOOLSET "vc120" -# elif defined(BOOST_MSVC) +# elif defined(BOOST_MSVC) && (BOOST_MSVC < 1910) + + // vc14: +# define BOOST_LIB_TOOLSET "vc140" + +# elif defined(BOOST_MSVC) - // vc14: -# define BOOST_LIB_TOOLSET "vc140" + // vc14.1: +# define BOOST_LIB_TOOLSET "vc141" # elif defined(__BORLANDC__) @@ -356,6 +365,20 @@ BOOST_LIB_VERSION: The Boost version, in the form x_y, for Boost version x.y. #endif +// +// BOOST_LIB_ARCH_AND_MODEL_OPT +// + +#if defined( _M_IX86 ) +# define BOOST_LIB_ARCH_AND_MODEL_OPT "-x32" +#elif defined( _M_X64 ) +# define BOOST_LIB_ARCH_AND_MODEL_OPT "-x64" +#elif defined( _M_ARM ) +# define BOOST_LIB_ARCH_AND_MODEL_OPT "-a32" +#elif defined( _M_ARM64 ) +# define BOOST_LIB_ARCH_AND_MODEL_OPT "-a64" +#endif + // // select linkage opt: // @@ -375,6 +398,7 @@ BOOST_LIB_VERSION: The Boost version, in the form x_y, for Boost version x.y. && defined(BOOST_LIB_TOOLSET) \ && defined(BOOST_LIB_THREAD_OPT) \ && defined(BOOST_LIB_RT_OPT) \ + && defined(BOOST_LIB_ARCH_AND_MODEL_OPT) \ && defined(BOOST_LIB_VERSION) #ifdef BOOST_AUTO_LINK_TAGGED @@ -388,14 +412,14 @@ BOOST_LIB_VERSION: The Boost version, in the form x_y, for Boost version x.y. # pragma message ("Linking to lib file: " BOOST_STRINGIZE(BOOST_LIB_NAME) ".lib") # endif #elif defined(BOOST_LIB_BUILDID) -# pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION "-" BOOST_STRINGIZE(BOOST_LIB_BUILDID) ".lib") +# pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT BOOST_LIB_ARCH_AND_MODEL_OPT "-" BOOST_LIB_VERSION "-" BOOST_STRINGIZE(BOOST_LIB_BUILDID) ".lib") # ifdef BOOST_LIB_DIAGNOSTIC -# pragma message ("Linking to lib file: " BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION "-" BOOST_STRINGIZE(BOOST_LIB_BUILDID) ".lib") +# pragma message ("Linking to lib file: " BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT BOOST_LIB_ARCH_AND_MODEL_OPT "-" BOOST_LIB_VERSION "-" BOOST_STRINGIZE(BOOST_LIB_BUILDID) ".lib") # endif #else -# pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION ".lib") +# pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT BOOST_LIB_ARCH_AND_MODEL_OPT "-" BOOST_LIB_VERSION ".lib") # ifdef BOOST_LIB_DIAGNOSTIC -# pragma message ("Linking to lib file: " BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION ".lib") +# pragma message ("Linking to lib file: " BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT BOOST_LIB_ARCH_AND_MODEL_OPT "-" BOOST_LIB_VERSION ".lib") # endif #endif @@ -426,6 +450,9 @@ BOOST_LIB_VERSION: The Boost version, in the form x_y, for Boost version x.y. #if defined(BOOST_LIB_RT_OPT) # undef BOOST_LIB_RT_OPT #endif +#if defined(BOOST_LIB_ARCH_AND_MODEL_OPT) +# undef BOOST_LIB_ARCH_AND_MODEL_OPT +#endif #if defined(BOOST_LIB_LINK_OPT) # undef BOOST_LIB_LINK_OPT #endif diff --git a/third_party/boost_parts/boost/config/compiler/borland.hpp b/third_party/boost_parts/boost/config/compiler/borland.hpp index 80dd2300..6190e390 100644 --- a/third_party/boost_parts/boost/config/compiler/borland.hpp +++ b/third_party/boost_parts/boost/config/compiler/borland.hpp @@ -174,6 +174,7 @@ #define BOOST_NO_CXX11_CONSTEXPR #define BOOST_NO_CXX11_DECLTYPE_N3276 #define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS +#define BOOST_NO_CXX11_DEFAULTED_MOVES #define BOOST_NO_CXX11_DELETED_FUNCTIONS #define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS #define BOOST_NO_CXX11_HDR_INITIALIZER_LIST @@ -185,6 +186,7 @@ #define BOOST_NO_CXX11_RVALUE_REFERENCES #define BOOST_NO_CXX11_SCOPED_ENUMS #define BOOST_NO_SFINAE_EXPR +#define BOOST_NO_CXX11_SFINAE_EXPR #define BOOST_NO_CXX11_TEMPLATE_ALIASES #define BOOST_NO_CXX11_UNICODE_LITERALS // UTF-8 still not supported #define BOOST_NO_CXX11_VARIADIC_TEMPLATES @@ -196,6 +198,7 @@ #define BOOST_NO_CXX11_INLINE_NAMESPACES #define BOOST_NO_CXX11_REF_QUALIFIERS #define BOOST_NO_CXX11_FINAL +#define BOOST_NO_CXX11_THREAD_LOCAL // C++ 14: #if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304) @@ -226,6 +229,17 @@ # define BOOST_NO_CXX14_VARIABLE_TEMPLATES #endif +// C++17 +#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606) +# define BOOST_NO_CXX17_STRUCTURED_BINDINGS +#endif +#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606) +# define BOOST_NO_CXX17_INLINE_VARIABLES +#endif +#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603) +# define BOOST_NO_CXX17_FOLD_EXPRESSIONS +#endif + #if __BORLANDC__ >= 0x590 # define BOOST_HAS_TR1_HASH diff --git a/third_party/boost_parts/boost/config/compiler/clang.hpp b/third_party/boost_parts/boost/config/compiler/clang.hpp index 01355bb7..da736bc4 100644 --- a/third_party/boost_parts/boost/config/compiler/clang.hpp +++ b/third_party/boost_parts/boost/config/compiler/clang.hpp @@ -27,6 +27,10 @@ #define __has_attribute(x) 0 #endif +#ifndef __has_cpp_attribute +#define __has_cpp_attribute(x) 0 +#endif + #if !__has_feature(cxx_exceptions) && !defined(BOOST_NO_EXCEPTIONS) # define BOOST_NO_EXCEPTIONS #endif @@ -39,14 +43,25 @@ # define BOOST_NO_TYPEID #endif -#if defined(__int64) && !defined(__GNUC__) +#if !__has_feature(cxx_thread_local) +# define BOOST_NO_CXX11_THREAD_LOCAL +#endif + +#ifdef __is_identifier +#if !__is_identifier(__int64) && !defined(__GNUC__) # define BOOST_HAS_MS_INT64 #endif +#endif + +#if __has_include() +# define BOOST_HAS_STDINT_H +#endif + #define BOOST_HAS_NRVO // Branch prediction hints -#if defined(__has_builtin) +#if !defined (__c2__) && defined(__has_builtin) #if __has_builtin(__builtin_expect) #define BOOST_LIKELY(x) __builtin_expect(x, 1) #define BOOST_UNLIKELY(x) __builtin_expect(x, 0) @@ -83,11 +98,15 @@ // // Dynamic shared object (DSO) and dynamic-link library (DLL) support // -#if !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32) +#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__) +# define BOOST_HAS_DECLSPEC +# define BOOST_SYMBOL_EXPORT __attribute__((__dllexport__)) +# define BOOST_SYMBOL_IMPORT __attribute__((__dllimport__)) +#else # define BOOST_SYMBOL_EXPORT __attribute__((__visibility__("default"))) # define BOOST_SYMBOL_IMPORT -# define BOOST_SYMBOL_VISIBLE __attribute__((__visibility__("default"))) #endif +#define BOOST_SYMBOL_VISIBLE __attribute__((__visibility__("default"))) // // The BOOST_FALLTHROUGH macro can be used to annotate implicit fall-through @@ -107,11 +126,16 @@ // // Currently clang on Windows using VC++ RTL does not support C++11's char16_t or char32_t // -#if defined(_MSC_VER) || !(defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L) +#if (defined(_MSC_VER) && (_MSC_VER < 1900)) || !(defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L) # define BOOST_NO_CXX11_CHAR16_T # define BOOST_NO_CXX11_CHAR32_T #endif +#if defined(_MSC_VER) && (_MSC_VER >= 1800) && !defined(__GNUC__) +#define BOOST_HAS_EXPM1 +#define BOOST_HAS_LOG1P +#endif + #if !__has_feature(cxx_constexpr) # define BOOST_NO_CXX11_CONSTEXPR #endif @@ -266,6 +290,20 @@ # define BOOST_NO_CXX14_VARIABLE_TEMPLATES #endif +#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606) +# define BOOST_NO_CXX17_STRUCTURED_BINDINGS +#endif + +// Clang 3.9+ in c++1z +#if !__has_cpp_attribute(fallthrough) || __cplusplus < 201406L +# define BOOST_NO_CXX17_INLINE_VARIABLES +# define BOOST_NO_CXX17_FOLD_EXPRESSIONS +#endif + +#if __cplusplus < 201103L +#define BOOST_NO_CXX11_SFINAE_EXPR +#endif + #if __cplusplus < 201400 // All versions with __cplusplus above this value seem to support this: # define BOOST_NO_CXX14_DIGIT_SEPARATORS @@ -276,9 +314,19 @@ #define BOOST_UNREACHABLE_RETURN(x) __builtin_unreachable(); #endif +#if (__clang_major__ == 3) && (__clang_minor__ == 0) +// Apparently a clang bug: +# define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS +#endif + // Clang has supported the 'unused' attribute since the first release. #define BOOST_ATTRIBUTE_UNUSED __attribute__((__unused__)) +// Type aliasing hint. +#if __has_attribute(__may_alias__) +# define BOOST_MAY_ALIAS __attribute__((__may_alias__)) +#endif + #ifndef BOOST_COMPILER # define BOOST_COMPILER "Clang version " __clang_version__ #endif diff --git a/third_party/boost_parts/boost/config/compiler/codegear.hpp b/third_party/boost_parts/boost/config/compiler/codegear.hpp index 02bd792a..44ca8428 100644 --- a/third_party/boost_parts/boost/config/compiler/codegear.hpp +++ b/third_party/boost_parts/boost/config/compiler/codegear.hpp @@ -112,6 +112,7 @@ #define BOOST_NO_CXX11_RAW_LITERALS #define BOOST_NO_CXX11_RVALUE_REFERENCES #define BOOST_NO_SFINAE_EXPR +#define BOOST_NO_CXX11_SFINAE_EXPR #define BOOST_NO_CXX11_TEMPLATE_ALIASES #define BOOST_NO_CXX11_UNICODE_LITERALS #define BOOST_NO_CXX11_VARIADIC_TEMPLATES @@ -122,6 +123,7 @@ #define BOOST_NO_CXX11_INLINE_NAMESPACES #define BOOST_NO_CXX11_REF_QUALIFIERS #define BOOST_NO_CXX11_FINAL +#define BOOST_NO_CXX11_THREAD_LOCAL // C++ 14: #if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304) @@ -152,6 +154,19 @@ # define BOOST_NO_CXX14_VARIABLE_TEMPLATES #endif +// C++17 +#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606) +# define BOOST_NO_CXX17_STRUCTURED_BINDINGS +#endif + +#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606) +# define BOOST_NO_CXX17_INLINE_VARIABLES +#endif + +#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603) +# define BOOST_NO_CXX17_FOLD_EXPRESSIONS +#endif + // // TR1 macros: // diff --git a/third_party/boost_parts/boost/config/compiler/comeau.hpp b/third_party/boost_parts/boost/config/compiler/comeau.hpp index 278222dc..09841604 100644 --- a/third_party/boost_parts/boost/config/compiler/comeau.hpp +++ b/third_party/boost_parts/boost/config/compiler/comeau.hpp @@ -12,7 +12,7 @@ // Comeau C++ compiler setup: -#include "boost/config/compiler/common_edg.hpp" +#include #if (__COMO_VERSION__ <= 4245) diff --git a/third_party/boost_parts/boost/config/compiler/common_edg.hpp b/third_party/boost_parts/boost/config/compiler/common_edg.hpp index b92e574d..d49ceb68 100644 --- a/third_party/boost_parts/boost/config/compiler/common_edg.hpp +++ b/third_party/boost_parts/boost/config/compiler/common_edg.hpp @@ -95,6 +95,7 @@ #define BOOST_NO_CXX11_RVALUE_REFERENCES #define BOOST_NO_CXX11_SCOPED_ENUMS #define BOOST_NO_SFINAE_EXPR +#define BOOST_NO_CXX11_SFINAE_EXPR #define BOOST_NO_CXX11_STATIC_ASSERT #define BOOST_NO_CXX11_TEMPLATE_ALIASES #define BOOST_NO_CXX11_UNICODE_LITERALS @@ -106,6 +107,7 @@ #define BOOST_NO_CXX11_INLINE_NAMESPACES #define BOOST_NO_CXX11_REF_QUALIFIERS #define BOOST_NO_CXX11_FINAL +#define BOOST_NO_CXX11_THREAD_LOCAL // C++ 14: #if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304) @@ -136,6 +138,17 @@ # define BOOST_NO_CXX14_VARIABLE_TEMPLATES #endif +// C++17 +#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606) +# define BOOST_NO_CXX17_STRUCTURED_BINDINGS +#endif +#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606) +# define BOOST_NO_CXX17_INLINE_VARIABLES +#endif +#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603) +# define BOOST_NO_CXX17_FOLD_EXPRESSIONS +#endif + #ifdef c_plusplus // EDG has "long long" in non-strict mode // However, some libraries have insufficient "long long" support diff --git a/third_party/boost_parts/boost/config/compiler/compaq_cxx.hpp b/third_party/boost_parts/boost/config/compiler/compaq_cxx.hpp index b44486c6..4d6b8ab3 100644 --- a/third_party/boost_parts/boost/config/compiler/compaq_cxx.hpp +++ b/third_party/boost_parts/boost/config/compiler/compaq_cxx.hpp @@ -9,7 +9,7 @@ #define BOOST_COMPILER "HP Tru64 C++ " BOOST_STRINGIZE(__DECCXX_VER) -#include "boost/config/compiler/common_edg.hpp" +#include // // versions check: diff --git a/third_party/boost_parts/boost/config/compiler/cray.hpp b/third_party/boost_parts/boost/config/compiler/cray.hpp index 3f660433..5f810781 100644 --- a/third_party/boost_parts/boost/config/compiler/cray.hpp +++ b/third_party/boost_parts/boost/config/compiler/cray.hpp @@ -10,7 +10,7 @@ #define BOOST_COMPILER "Cray C version " BOOST_STRINGIZE(_RELEASE) -#if _RELEASE < 8 +#if _RELEASE_MAJOR < 8 # error "Boost is not configured for Cray compilers prior to version 8, please try the configure script." #endif @@ -21,8 +21,8 @@ # error "Unsupported Cray compiler, please try running the configure script." #endif -#include "boost/config/compiler/common_edg.hpp" - +#if _RELEASE_MINOR < 5 || __cplusplus < 201100 +#include // // @@ -39,6 +39,7 @@ #define BOOST_NO_CXX11_TEMPLATE_ALIASES #define BOOST_NO_CXX11_STATIC_ASSERT #define BOOST_NO_SFINAE_EXPR +#define BOOST_NO_CXX11_SFINAE_EXPR #define BOOST_NO_CXX11_SCOPED_ENUMS #define BOOST_NO_CXX11_RVALUE_REFERENCES #define BOOST_NO_CXX11_RANGE_BASED_FOR @@ -60,6 +61,7 @@ #define BOOST_NO_CXX11_CHAR16_T #define BOOST_NO_CXX11_REF_QUALIFIERS #define BOOST_NO_CXX11_FINAL +#define BOOST_NO_CXX11_THREAD_LOCAL //#define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG @@ -88,5 +90,35 @@ #define __ATOMIC_SEQ_CST 5 #endif +#else /* _RELEASE_MINOR */ + +#define BOOST_HAS_VARIADIC_TMPL +#define BOOST_HAS_UNISTD_H +#define BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG +#define BOOST_HAS_TR1_COMPLEX_OVERLOADS +#define BOOST_HAS_STDINT_H +#define BOOST_HAS_STATIC_ASSERT +#define BOOST_HAS_SIGACTION +#define BOOST_HAS_SCHED_YIELD +#define BOOST_HAS_RVALUE_REFS +#define BOOST_HAS_PTHREADS +#define BOOST_HAS_PTHREAD_YIELD +#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE +#define BOOST_HAS_PARTIAL_STD_ALLOCATOR +#define BOOST_HAS_NRVO +#define BOOST_HAS_NL_TYPES_H +#define BOOST_HAS_NANOSLEEP +#define BOOST_NO_CXX11_SMART_PTR +#define BOOST_NO_CXX11_HDR_FUNCTIONAL +#define BOOST_NO_CXX14_CONSTEXPR +#define BOOST_HAS_LONG_LONG +#define BOOST_HAS_FLOAT128 + +#if __cplusplus < 201400 +#define BOOST_NO_CXX11_DECLTYPE_N3276 +#endif /* __cpluspus */ + +#endif /* _RELEASE_MINOR */ + diff --git a/third_party/boost_parts/boost/config/compiler/diab.hpp b/third_party/boost_parts/boost/config/compiler/diab.hpp new file mode 100644 index 00000000..943db83f --- /dev/null +++ b/third_party/boost_parts/boost/config/compiler/diab.hpp @@ -0,0 +1,26 @@ +// (C) Copyright Brian Kuhl 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) + +// Check this is a recent EDG based compiler, otherwise we don't support it here: + + +#ifndef __EDG_VERSION__ +# error "Unknown Diab compiler version - please run the configure tests and report the results" +#endif + +#include "boost/config/compiler/common_edg.hpp" + +#define BOOST_NO_TWO_PHASE_NAME_LOOKUP +#define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS + +#define BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE +#define BOOST_LOG_NO_MEMBER_TEMPLATE_FRIENDS +#define BOOST_REGEX_NO_EXTERNAL_TEMPLATES + +#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST +#define BOOST_NO_CXX11_HDR_CODECVT +#define BOOST_NO_CXX11_NUMERIC_LIMITS + +#define BOOST_COMPILER "Wind River Diab " BOOST_STRINGIZE(__VERSION_NUMBER__) diff --git a/third_party/boost_parts/boost/config/compiler/digitalmars.hpp b/third_party/boost_parts/boost/config/compiler/digitalmars.hpp index a3d293c7..e4c5afdd 100644 --- a/third_party/boost_parts/boost/config/compiler/digitalmars.hpp +++ b/third_party/boost_parts/boost/config/compiler/digitalmars.hpp @@ -71,6 +71,7 @@ #define BOOST_NO_CXX11_RVALUE_REFERENCES #define BOOST_NO_CXX11_SCOPED_ENUMS #define BOOST_NO_SFINAE_EXPR +#define BOOST_NO_CXX11_SFINAE_EXPR #define BOOST_NO_CXX11_STATIC_ASSERT #define BOOST_NO_CXX11_TEMPLATE_ALIASES #define BOOST_NO_CXX11_UNICODE_LITERALS @@ -82,6 +83,7 @@ #define BOOST_NO_CXX11_INLINE_NAMESPACES #define BOOST_NO_CXX11_REF_QUALIFIERS #define BOOST_NO_CXX11_FINAL +#define BOOST_NO_CXX11_THREAD_LOCAL // C++ 14: #if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304) @@ -112,6 +114,17 @@ # define BOOST_NO_CXX14_VARIABLE_TEMPLATES #endif +// C++17 +#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606) +# define BOOST_NO_CXX17_STRUCTURED_BINDINGS +#endif +#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606) +# define BOOST_NO_CXX17_INLINE_VARIABLES +#endif +#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603) +# define BOOST_NO_CXX17_FOLD_EXPRESSIONS +#endif + #if (__DMC__ <= 0x840) #error "Compiler not supported or configured - please reconfigure" #endif diff --git a/third_party/boost_parts/boost/config/compiler/gcc.hpp b/third_party/boost_parts/boost/config/compiler/gcc.hpp index fbd3dd9c..4fe968a0 100644 --- a/third_party/boost_parts/boost/config/compiler/gcc.hpp +++ b/third_party/boost_parts/boost/config/compiler/gcc.hpp @@ -99,10 +99,10 @@ // Dynamic shared object (DSO) and dynamic-link library (DLL) support // #if __GNUC__ >= 4 -# if (defined(_WIN32) || defined(__WIN32__) || defined(WIN32)) && !defined(__CYGWIN__) +# if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__) // All Win32 development environments, including 64-bit Windows and MinGW, define // _WIN32 or one of its variant spellings. Note that Cygwin is a POSIX environment, - // so does not define _WIN32 or its variants. + // so does not define _WIN32 or its variants, but still supports dllexport/dllimport. # define BOOST_HAS_DECLSPEC # define BOOST_SYMBOL_EXPORT __attribute__((__dllexport__)) # define BOOST_SYMBOL_IMPORT __attribute__((__dllimport__)) @@ -233,6 +233,7 @@ // #if (BOOST_GCC_VERSION < 40600) || !defined(BOOST_GCC_CXX11) #define BOOST_NO_CXX11_CONSTEXPR +#define BOOST_NO_CXX11_DEFAULTED_MOVES #define BOOST_NO_CXX11_NOEXCEPT #define BOOST_NO_CXX11_NULLPTR #define BOOST_NO_CXX11_RANGE_BASED_FOR @@ -252,6 +253,8 @@ // #if (BOOST_GCC_VERSION < 40800) || !defined(BOOST_GCC_CXX11) # define BOOST_NO_CXX11_ALIGNAS +# define BOOST_NO_CXX11_THREAD_LOCAL +# define BOOST_NO_CXX11_SFINAE_EXPR #endif // C++0x features in 4.8.1 and later @@ -282,15 +285,41 @@ #if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304) # define BOOST_NO_CXX14_CONSTEXPR #endif -#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304) +#if (BOOST_GCC_VERSION < 50200) || !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304) # define BOOST_NO_CXX14_VARIABLE_TEMPLATES #endif +// C++17 +#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606) +# define BOOST_NO_CXX17_STRUCTURED_BINDINGS +#endif +#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606) +# define BOOST_NO_CXX17_INLINE_VARIABLES +#endif +#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603) +# define BOOST_NO_CXX17_FOLD_EXPRESSIONS +#endif + +#if __GNUC__ >= 7 +# define BOOST_FALLTHROUGH __attribute__((fallthrough)) +#endif + +#ifdef __MINGW32__ +// Currently (June 2017) thread_local is broken on mingw for all current compiler releases, see +// https://sourceforge.net/p/mingw-w64/bugs/527/ +// Not setting this causes program termination on thread exit. +#define BOOST_NO_CXX11_THREAD_LOCAL +#endif + // // Unused attribute: #if __GNUC__ >= 4 # define BOOST_ATTRIBUTE_UNUSED __attribute__((__unused__)) #endif + +// Type aliasing hint. Supported since gcc 3.3. +#define BOOST_MAY_ALIAS __attribute__((__may_alias__)) + // // __builtin_unreachable: #if BOOST_GCC_VERSION >= 40800 @@ -314,10 +343,10 @@ # error "Compiler not configured - please reconfigure" #endif // -// last known and checked version is 4.9: -#if (BOOST_GCC_VERSION > 40900) +// last known and checked version is 7.1: +#if (BOOST_GCC_VERSION > 70100) # if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" +# error "Boost.Config is older than your compiler - please check for an updated Boost release." # else // we don't emit warnings here anymore since there are no defect macros defined for // gcc post 3.4, so any failures are gcc regressions... diff --git a/third_party/boost_parts/boost/config/compiler/gcc_xml.hpp b/third_party/boost_parts/boost/config/compiler/gcc_xml.hpp index c11f29dd..2b47585a 100644 --- a/third_party/boost_parts/boost/config/compiler/gcc_xml.hpp +++ b/third_party/boost_parts/boost/config/compiler/gcc_xml.hpp @@ -46,6 +46,7 @@ # define BOOST_NO_CXX11_HDR_INITIALIZER_LIST # define BOOST_NO_CXX11_SCOPED_ENUMS # define BOOST_NO_SFINAE_EXPR +# define BOOST_NO_CXX11_SFINAE_EXPR # define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS # define BOOST_NO_CXX11_LAMBDAS # define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS @@ -59,7 +60,8 @@ # define BOOST_NO_CXX11_TRAILING_RESULT_TYPES # define BOOST_NO_CXX11_INLINE_NAMESPACES # define BOOST_NO_CXX11_REF_QUALIFIERS -#define BOOST_NO_CXX11_FINAL +# define BOOST_NO_CXX11_FINAL +# define BOOST_NO_CXX11_THREAD_LOCAL // C++ 14: #if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304) @@ -90,6 +92,17 @@ # define BOOST_NO_CXX14_VARIABLE_TEMPLATES #endif +// C++17 +#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606) +# define BOOST_NO_CXX17_STRUCTURED_BINDINGS +#endif +#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606) +# define BOOST_NO_CXX17_INLINE_VARIABLES +#endif +#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603) +# define BOOST_NO_CXX17_FOLD_EXPRESSIONS +#endif + #define BOOST_COMPILER "GCC-XML C++ version " __GCCXML__ diff --git a/third_party/boost_parts/boost/config/compiler/greenhills.hpp b/third_party/boost_parts/boost/config/compiler/greenhills.hpp index 038b6b2b..a76a07cf 100644 --- a/third_party/boost_parts/boost/config/compiler/greenhills.hpp +++ b/third_party/boost_parts/boost/config/compiler/greenhills.hpp @@ -9,7 +9,7 @@ #define BOOST_COMPILER "Greenhills C++ version " BOOST_STRINGIZE(__ghs) -#include "boost/config/compiler/common_edg.hpp" +#include // // versions check: diff --git a/third_party/boost_parts/boost/config/compiler/hp_acc.hpp b/third_party/boost_parts/boost/config/compiler/hp_acc.hpp index fb63839a..9df18eaf 100644 --- a/third_party/boost_parts/boost/config/compiler/hp_acc.hpp +++ b/third_party/boost_parts/boost/config/compiler/hp_acc.hpp @@ -13,7 +13,7 @@ // HP aCC C++ compiler setup: #if defined(__EDG__) -#include "boost/config/compiler/common_edg.hpp" +#include #endif #if (__HP_aCC <= 33100) @@ -114,6 +114,7 @@ #define BOOST_NO_CXX11_RVALUE_REFERENCES #define BOOST_NO_CXX11_SCOPED_ENUMS #define BOOST_NO_SFINAE_EXPR +#define BOOST_NO_CXX11_SFINAE_EXPR #define BOOST_NO_CXX11_STATIC_ASSERT #define BOOST_NO_CXX11_TEMPLATE_ALIASES #define BOOST_NO_CXX11_UNICODE_LITERALS @@ -123,6 +124,7 @@ #define BOOST_NO_CXX11_TRAILING_RESULT_TYPES #define BOOST_NO_CXX11_INLINE_NAMESPACES #define BOOST_NO_CXX11_REF_QUALIFIERS +#define BOOST_NO_CXX11_THREAD_LOCAL /* See https://forums13.itrc.hp.com/service/forums/questionanswer.do?threadId=1443331 and diff --git a/third_party/boost_parts/boost/config/compiler/intel.hpp b/third_party/boost_parts/boost/config/compiler/intel.hpp index 88ac023a..0eea05b9 100644 --- a/third_party/boost_parts/boost/config/compiler/intel.hpp +++ b/third_party/boost_parts/boost/config/compiler/intel.hpp @@ -35,15 +35,25 @@ #endif -#else +#if (__INTEL_COMPILER <= 1600) && !defined(BOOST_NO_CXX14_VARIABLE_TEMPLATES) +# define BOOST_NO_CXX14_VARIABLE_TEMPLATES +#endif + +#else // defined(_MSC_VER) #include #undef BOOST_GCC_VERSION #undef BOOST_GCC_CXX11 +#undef BOOST_GCC +// Broken in all versions up to 17 (newer versions not tested) +#if (__INTEL_COMPILER <= 1700) && !defined(BOOST_NO_CXX14_CONSTEXPR) +# define BOOST_NO_CXX14_CONSTEXPR #endif +#endif // defined(_MSC_VER) + #undef BOOST_COMPILER #if defined(__INTEL_COMPILER) @@ -88,9 +98,9 @@ # define BOOST_INTEL_LINUX BOOST_INTEL #endif -#else +#else // defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1500) && (defined(_MSC_VER) || defined(__GNUC__)) -#include "boost/config/compiler/common_edg.hpp" +#include #if defined(__INTEL_COMPILER) #if __INTEL_COMPILER == 9999 @@ -302,6 +312,12 @@ template<> struct assert_intrinsic_wchar_t {}; # define BOOST_SYMBOL_IMPORT # define BOOST_SYMBOL_VISIBLE __attribute__((visibility("default"))) #endif + +// Type aliasing hint +#if defined(__GNUC__) && (BOOST_INTEL_CXX_VERSION >= 1300) +# define BOOST_MAY_ALIAS __attribute__((__may_alias__)) +#endif + // // C++0x features // For each feature we need to check both the Intel compiler version, @@ -406,6 +422,11 @@ template<> struct assert_intrinsic_wchar_t {}; # undef BOOST_NO_SFINAE_EXPR #endif +// BOOST_NO_CXX11_SFINAE_EXPR +#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40800)) && !defined(_MSC_VER) +# undef BOOST_NO_CXX11_SFINAE_EXPR +#endif + // BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS #if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827)) // This is available in earlier Intel releases, but breaks Multiprecision: @@ -479,7 +500,7 @@ template<> struct assert_intrinsic_wchar_t {}; # undef BOOST_NO_CXX11_FINAL #endif -#endif +#endif // defined(BOOST_INTEL_STDCXX0X) // // Broken in all versions up to 15: @@ -526,12 +547,12 @@ template<> struct assert_intrinsic_wchar_t {}; # define BOOST_HAS_INT128 #endif -#endif +#endif // defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1500) && (defined(_MSC_VER) || defined(__GNUC__)) // // last known and checked version: -#if (BOOST_INTEL_CXX_VERSION > 1500) +#if (BOOST_INTEL_CXX_VERSION > 1700) # if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" +# error "Boost.Config is older than your compiler - please check for an updated Boost release." # elif defined(_MSC_VER) // // We don't emit this warning any more, since we have so few diff --git a/third_party/boost_parts/boost/config/compiler/kai.hpp b/third_party/boost_parts/boost/config/compiler/kai.hpp index 2337e6a8..960d501c 100644 --- a/third_party/boost_parts/boost/config/compiler/kai.hpp +++ b/third_party/boost_parts/boost/config/compiler/kai.hpp @@ -9,7 +9,7 @@ // Kai C++ compiler setup: -#include "boost/config/compiler/common_edg.hpp" +#include # if (__KCC_VERSION <= 4001) || !defined(BOOST_STRICT_CONFIG) // at least on Sun, the contents of is not in namespace std diff --git a/third_party/boost_parts/boost/config/compiler/metrowerks.hpp b/third_party/boost_parts/boost/config/compiler/metrowerks.hpp index c9301434..99ff0f5e 100644 --- a/third_party/boost_parts/boost/config/compiler/metrowerks.hpp +++ b/third_party/boost_parts/boost/config/compiler/metrowerks.hpp @@ -113,6 +113,7 @@ #define BOOST_NO_CXX11_RAW_LITERALS #define BOOST_NO_CXX11_SCOPED_ENUMS #define BOOST_NO_SFINAE_EXPR +#define BOOST_NO_CXX11_SFINAE_EXPR #define BOOST_NO_CXX11_STATIC_ASSERT #define BOOST_NO_CXX11_TEMPLATE_ALIASES #define BOOST_NO_CXX11_UNICODE_LITERALS @@ -125,6 +126,7 @@ #define BOOST_NO_CXX11_INLINE_NAMESPACES #define BOOST_NO_CXX11_REF_QUALIFIERS #define BOOST_NO_CXX11_FINAL +#define BOOST_NO_CXX11_THREAD_LOCAL // C++ 14: #if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304) @@ -155,6 +157,17 @@ # define BOOST_NO_CXX14_VARIABLE_TEMPLATES #endif +// C++17 +#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606) +# define BOOST_NO_CXX17_STRUCTURED_BINDINGS +#endif +#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606) +# define BOOST_NO_CXX17_INLINE_VARIABLES +#endif +#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603) +# define BOOST_NO_CXX17_FOLD_EXPRESSIONS +#endif + #define BOOST_COMPILER "Metrowerks CodeWarrior C++ version " BOOST_STRINGIZE(BOOST_COMPILER_VERSION) // diff --git a/third_party/boost_parts/boost/config/compiler/mpw.hpp b/third_party/boost_parts/boost/config/compiler/mpw.hpp index 76045bcd..d9544345 100644 --- a/third_party/boost_parts/boost/config/compiler/mpw.hpp +++ b/third_party/boost_parts/boost/config/compiler/mpw.hpp @@ -62,6 +62,7 @@ #define BOOST_NO_CXX11_RVALUE_REFERENCES #define BOOST_NO_CXX11_SCOPED_ENUMS #define BOOST_NO_SFINAE_EXPR +#define BOOST_NO_CXX11_SFINAE_EXPR #define BOOST_NO_CXX11_STATIC_ASSERT #define BOOST_NO_CXX11_TEMPLATE_ALIASES #define BOOST_NO_CXX11_UNICODE_LITERALS @@ -74,6 +75,7 @@ #define BOOST_NO_CXX11_INLINE_NAMESPACES #define BOOST_NO_CXX11_REF_QUALIFIERS #define BOOST_NO_CXX11_FINAL +#define BOOST_NO_CXX11_THREAD_LOCAL // C++ 14: #if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304) @@ -104,6 +106,17 @@ # define BOOST_NO_CXX14_VARIABLE_TEMPLATES #endif +// C++17 +#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606) +# define BOOST_NO_CXX17_STRUCTURED_BINDINGS +#endif +#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606) +# define BOOST_NO_CXX17_INLINE_VARIABLES +#endif +#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603) +# define BOOST_NO_CXX17_FOLD_EXPRESSIONS +#endif + // // versions check: // we don't support MPW prior to version 8.9: diff --git a/third_party/boost_parts/boost/config/compiler/nvcc.hpp b/third_party/boost_parts/boost/config/compiler/nvcc.hpp index 5a047070..f21b9b54 100644 --- a/third_party/boost_parts/boost/config/compiler/nvcc.hpp +++ b/third_party/boost_parts/boost/config/compiler/nvcc.hpp @@ -11,6 +11,13 @@ # define BOOST_COMPILER "NVIDIA CUDA C++ Compiler" #endif +#if defined(__CUDACC_VER_MAJOR__) && defined(__CUDACC_VER_MINOR__) && defined(__CUDACC_VER_BUILD__) +# define BOOST_CUDA_VERSION __CUDACC_VER_MAJOR__ * 1000000 + __CUDACC_VER_MINOR__ * 10000 + __CUDACC_VER_BUILD__ +#else +// We don't really know what the CUDA version is, but it's definitely before 7.5: +# define BOOST_CUDA_VERSION 7000000 +#endif + // NVIDIA Specific support // BOOST_GPU_ENABLED : Flag a function or a method as being enabled on the host and device #define BOOST_GPU_ENABLED __host__ __device__ @@ -19,6 +26,33 @@ // https://svn.boost.org/trac/boost/ticket/11897 // This is fixed in 7.5. As the following version macro was introduced in 7.5 an existance // check is enough to detect versions < 7.5 -#if !defined(__CUDACC_VER__) || (__CUDACC_VER__ < 70500) +#if BOOST_CUDA_VERSION < 7050000 +# define BOOST_NO_CXX11_VARIADIC_TEMPLATES +#endif +// The same bug is back again in 8.0: +#if (BOOST_CUDA_VERSION > 8000000) && (BOOST_CUDA_VERSION < 8010000) # define BOOST_NO_CXX11_VARIADIC_TEMPLATES #endif +// Most recent CUDA (8.0) has no constexpr support in msvc mode: +#if defined(_MSC_VER) +# define BOOST_NO_CXX11_CONSTEXPR +#endif + +#ifdef __CUDACC__ +// +// When compiing .cu files, there's a bunch of stuff that doesn't work with msvc: +// +#if defined(_MSC_VER) +# define BOOST_NO_CXX14_DIGIT_SEPARATORS +# define BOOST_NO_CXX11_UNICODE_LITERALS +#endif +// +// And this one effects the NVCC front end, +// See https://svn.boost.org/trac/boost/ticket/13049 +// +#if (BOOST_CUDA_VERSION >= 8000000) && (BOOST_CUDA_VERSION < 8010000) +# define BOOST_NO_CXX11_NOEXCEPT +#endif + +#endif + diff --git a/third_party/boost_parts/boost/config/compiler/pathscale.hpp b/third_party/boost_parts/boost/config/compiler/pathscale.hpp index 7c211c45..94b3f91d 100644 --- a/third_party/boost_parts/boost/config/compiler/pathscale.hpp +++ b/third_party/boost_parts/boost/config/compiler/pathscale.hpp @@ -12,7 +12,12 @@ # define BOOST_COMPILER "PathScale EKOPath C++ Compiler version " __PATHSCALE__ #endif -#if __PATHCC__ >= 4 +#if __PATHCC__ >= 6 +// PathCC is based on clang, and supports the __has_*() builtins used +// to detect features in clang.hpp. Since the clang toolset is much +// better maintained, it is more convenient to reuse its definitions. +# include "boost/config/compiler/clang.hpp" +#elif __PATHCC__ >= 4 # define BOOST_MSVC6_MEMBER_TEMPLATES # define BOOST_HAS_UNISTD_H # define BOOST_HAS_STDINT_H @@ -37,6 +42,7 @@ # define BOOST_NO_CXX11_TEMPLATE_ALIASES # define BOOST_NO_CXX11_STATIC_ASSERT # define BOOST_NO_SFINAE_EXPR +# define BOOST_NO_CXX11_SFINAE_EXPR # define BOOST_NO_CXX11_SCOPED_ENUMS # define BOOST_NO_CXX11_RVALUE_REFERENCES # define BOOST_NO_CXX11_RANGE_BASED_FOR @@ -82,6 +88,7 @@ # define BOOST_NO_CXX11_INLINE_NAMESPACES # define BOOST_NO_CXX11_REF_QUALIFIERS # define BOOST_NO_CXX11_FINAL +# define BOOST_NO_CXX11_THREAD_LOCAL // C++ 14: #if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304) @@ -111,4 +118,15 @@ #if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304) # define BOOST_NO_CXX14_VARIABLE_TEMPLATES #endif + +// C++17 +#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606) +# define BOOST_NO_CXX17_STRUCTURED_BINDINGS +#endif +#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606) +# define BOOST_NO_CXX17_INLINE_VARIABLES +#endif +#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603) +# define BOOST_NO_CXX17_FOLD_EXPRESSIONS +#endif #endif diff --git a/third_party/boost_parts/boost/config/compiler/pgi.hpp b/third_party/boost_parts/boost/config/compiler/pgi.hpp index e5605c9e..4e909d8a 100644 --- a/third_party/boost_parts/boost/config/compiler/pgi.hpp +++ b/third_party/boost_parts/boost/config/compiler/pgi.hpp @@ -1,4 +1,5 @@ // (C) Copyright Noel Belcourt 2007. +// Copyright 2017, NVIDIA 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) @@ -10,146 +11,13 @@ #define BOOST_COMPILER_VERSION __PGIC__##__PGIC_MINOR__ #define BOOST_COMPILER "PGI compiler version " BOOST_STRINGIZE(BOOST_COMPILER_VERSION) -// -// Threading support: -// Turn this on unconditionally here, it will get turned off again later -// if no threading API is detected. -// +// PGI is mostly GNU compatible. So start with that. +#include -#if __PGIC__ >= 11 +// Now adjust for things that are different. -// options requested by configure --enable-test -#define BOOST_HAS_PTHREADS -#define BOOST_HAS_THREADS -#define BOOST_HAS_PTHREAD_YIELD -#define BOOST_HAS_NRVO -#define BOOST_HAS_LONG_LONG - -// options --enable-test wants undefined -#undef BOOST_NO_STDC_NAMESPACE -#undef BOOST_NO_EXCEPTION_STD_NAMESPACE -#undef BOOST_DEDUCED_TYPENAME - -#define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -#define BOOST_NO_TWO_PHASE_NAME_LOOKUP -#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS -#define BOOST_NO_CXX11_AUTO_DECLARATIONS - -#elif __PGIC__ >= 10 - -// options requested by configure --enable-test -#define BOOST_HAS_THREADS -#define BOOST_HAS_NRVO -#define BOOST_HAS_LONG_LONG -#if defined(linux) || defined(__linux) || defined(__linux__) -# define BOOST_HAS_STDINT_H -#endif - -// options --enable-test wants undefined -#undef BOOST_NO_STDC_NAMESPACE -#undef BOOST_NO_EXCEPTION_STD_NAMESPACE -#undef BOOST_DEDUCED_TYPENAME - -#elif __PGIC__ >= 7 - -#define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -#define BOOST_NO_TWO_PHASE_NAME_LOOKUP -#define BOOST_NO_SWPRINTF -#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS -#define BOOST_NO_CXX11_AUTO_DECLARATIONS - -#else - -# error "Pgi compiler not configured - please reconfigure" - -#endif -// -// C++0x features -// -// See boost\config\suffix.hpp for BOOST_NO_LONG_LONG -// -#define BOOST_NO_CXX11_CHAR16_T -#define BOOST_NO_CXX11_CHAR32_T -#define BOOST_NO_CXX11_CONSTEXPR -#define BOOST_NO_CXX11_DECLTYPE -#define BOOST_NO_CXX11_DECLTYPE_N3276 -#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS -#define BOOST_NO_CXX11_DELETED_FUNCTIONS -#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS -#define BOOST_NO_CXX11_EXTERN_TEMPLATE -#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS -#define BOOST_NO_CXX11_LAMBDAS -#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS -#define BOOST_NO_CXX11_NOEXCEPT -#define BOOST_NO_CXX11_NULLPTR -#define BOOST_NO_CXX11_NUMERIC_LIMITS -#define BOOST_NO_CXX11_RANGE_BASED_FOR -#define BOOST_NO_CXX11_RAW_LITERALS -#define BOOST_NO_CXX11_RVALUE_REFERENCES -#define BOOST_NO_CXX11_SCOPED_ENUMS -#define BOOST_NO_SFINAE_EXPR -#define BOOST_NO_CXX11_STATIC_ASSERT -#define BOOST_NO_SWPRINTF -#define BOOST_NO_CXX11_TEMPLATE_ALIASES -#define BOOST_NO_CXX11_UNICODE_LITERALS -#define BOOST_NO_CXX11_VARIADIC_TEMPLATES -#define BOOST_NO_CXX11_VARIADIC_MACROS -#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX - -#define BOOST_NO_CXX11_HDR_UNORDERED_SET -#define BOOST_NO_CXX11_HDR_UNORDERED_MAP -#define BOOST_NO_CXX11_HDR_TYPEINDEX -#define BOOST_NO_CXX11_HDR_TYPE_TRAITS -#define BOOST_NO_CXX11_HDR_TUPLE -#define BOOST_NO_CXX11_HDR_THREAD -#define BOOST_NO_CXX11_HDR_SYSTEM_ERROR -#define BOOST_NO_CXX11_HDR_REGEX -#define BOOST_NO_CXX11_HDR_RATIO -#define BOOST_NO_CXX11_HDR_RANDOM -#define BOOST_NO_CXX11_HDR_MUTEX -#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST -#define BOOST_NO_CXX11_HDR_FUTURE -#define BOOST_NO_CXX11_HDR_FORWARD_LIST -#define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE -#define BOOST_NO_CXX11_HDR_CODECVT -#define BOOST_NO_CXX11_HDR_CHRONO -#define BOOST_NO_CXX11_HDR_ARRAY -#define BOOST_NO_CXX11_USER_DEFINED_LITERALS -#define BOOST_NO_CXX11_ALIGNAS -#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES -#define BOOST_NO_CXX11_INLINE_NAMESPACES -#define BOOST_NO_CXX11_REF_QUALIFIERS -#define BOOST_NO_CXX11_FINAL - -// C++ 14: -#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304) -# define BOOST_NO_CXX14_AGGREGATE_NSDMI -#endif -#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304) -# define BOOST_NO_CXX14_BINARY_LITERALS -#endif -#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304) -# define BOOST_NO_CXX14_CONSTEXPR -#endif -#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304) -# define BOOST_NO_CXX14_DECLTYPE_AUTO -#endif -#if (__cplusplus < 201304) // There's no SD6 check for this.... -# define BOOST_NO_CXX14_DIGIT_SEPARATORS -#endif -#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304) -# define BOOST_NO_CXX14_GENERIC_LAMBDAS -#endif -#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304) -# define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES -#endif -#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304) -# define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION -#endif -#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304) -# define BOOST_NO_CXX14_VARIABLE_TEMPLATES -#endif -// -// version check: -// probably nothing to do here? +// __float128 is a typedef, not a distinct type. +#undef BOOST_HAS_FLOAT128 +// __int128 is not supported. +#undef BOOST_HAS_INT128 diff --git a/third_party/boost_parts/boost/config/compiler/sgi_mipspro.hpp b/third_party/boost_parts/boost/config/compiler/sgi_mipspro.hpp index 90688314..54433c99 100644 --- a/third_party/boost_parts/boost/config/compiler/sgi_mipspro.hpp +++ b/third_party/boost_parts/boost/config/compiler/sgi_mipspro.hpp @@ -9,7 +9,7 @@ #define BOOST_COMPILER "SGI Irix compiler version " BOOST_STRINGIZE(_COMPILER_VERSION) -#include "boost/config/compiler/common_edg.hpp" +#include // // Threading support: diff --git a/third_party/boost_parts/boost/config/compiler/sunpro_cc.hpp b/third_party/boost_parts/boost/config/compiler/sunpro_cc.hpp index 6017660c..54ad77a3 100644 --- a/third_party/boost_parts/boost/config/compiler/sunpro_cc.hpp +++ b/third_party/boost_parts/boost/config/compiler/sunpro_cc.hpp @@ -132,6 +132,7 @@ #define BOOST_NO_CXX11_DECLTYPE_N3276 #define BOOST_NO_CXX11_USER_DEFINED_LITERALS #define BOOST_NO_CXX11_REF_QUALIFIERS +#define BOOST_NO_CXX11_THREAD_LOCAL #endif #define BOOST_NO_COMPLETE_VALUE_INITIALIZATION @@ -140,6 +141,7 @@ // # define BOOST_HAS_LONG_LONG +#define BOOST_NO_CXX11_SFINAE_EXPR // C++ 14: #if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304) @@ -151,7 +153,7 @@ #if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304) # define BOOST_NO_CXX14_CONSTEXPR #endif -#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304) +#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304) || (__cplusplus < 201402L) # define BOOST_NO_CXX14_DECLTYPE_AUTO #endif #if (__cplusplus < 201304) // There's no SD6 check for this.... @@ -169,6 +171,24 @@ #if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304) # define BOOST_NO_CXX14_VARIABLE_TEMPLATES #endif + +// C++17 +#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606) +# define BOOST_NO_CXX17_STRUCTURED_BINDINGS +#endif +#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606) +# define BOOST_NO_CXX17_INLINE_VARIABLES +#endif +#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603) +# define BOOST_NO_CXX17_FOLD_EXPRESSIONS +#endif + +// Turn on threading support for Solaris 12. +// Ticket #11972 +#if (__SUNPRO_CC >= 0x5140) && defined(__SunOS_5_12) && !defined(BOOST_HAS_THREADS) +# define BOOST_HAS_THREADS +#endif + // // Version // @@ -182,9 +202,9 @@ #error "Compiler not supported or configured - please reconfigure" #endif // -// last known and checked version is 0x590: -#if (__SUNPRO_CC > 0x590) +// last known and checked version: +#if (__SUNPRO_CC > 0x5150) # if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" +# error "Boost.Config is older than your compiler - please check for an updated Boost release." # endif #endif diff --git a/third_party/boost_parts/boost/config/compiler/vacpp.hpp b/third_party/boost_parts/boost/config/compiler/vacpp.hpp index 6c228eab..c8400a34 100644 --- a/third_party/boost_parts/boost/config/compiler/vacpp.hpp +++ b/third_party/boost_parts/boost/config/compiler/vacpp.hpp @@ -65,6 +65,11 @@ #define BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS #endif +// Type aliasing hint. Supported since XL C++ 13.1 +#if (__IBMCPP__ >= 1310) +# define BOOST_MAY_ALIAS __attribute__((__may_alias__)) +#endif + // // C++0x features // @@ -114,6 +119,7 @@ # define BOOST_NO_CXX11_SCOPED_ENUMS #endif #define BOOST_NO_SFINAE_EXPR +#define BOOST_NO_CXX11_SFINAE_EXPR #define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX #if ! __IBMCPP_STATIC_ASSERT # define BOOST_NO_CXX11_STATIC_ASSERT @@ -131,6 +137,7 @@ #define BOOST_NO_CXX11_INLINE_NAMESPACES #define BOOST_NO_CXX11_REF_QUALIFIERS #define BOOST_NO_CXX11_FINAL +#define BOOST_NO_CXX11_THREAD_LOCAL // C++ 14: #if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304) @@ -160,3 +167,14 @@ #if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304) # define BOOST_NO_CXX14_VARIABLE_TEMPLATES #endif + +// C++17 +#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606) +# define BOOST_NO_CXX17_STRUCTURED_BINDINGS +#endif +#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606) +# define BOOST_NO_CXX17_INLINE_VARIABLES +#endif +#if !defined(__cpp_fold_expressions) || (__cpp_fold_expressions < 201603) +# define BOOST_NO_CXX17_FOLD_EXPRESSIONS +#endif diff --git a/third_party/boost_parts/boost/config/compiler/visualc.hpp b/third_party/boost_parts/boost/config/compiler/visualc.hpp index baaab589..c533c50d 100644 --- a/third_party/boost_parts/boost/config/compiler/visualc.hpp +++ b/third_party/boost_parts/boost/config/compiler/visualc.hpp @@ -107,7 +107,7 @@ // // TR1 features: // -#if _MSC_VER >= 1700 +#if (_MSC_VER >= 1700) && defined(_HAS_CXX17) && (_HAS_CXX17 > 0) // # define BOOST_HAS_TR1_HASH // don't know if this is true yet. // # define BOOST_HAS_TR1_TYPE_TRAITS // don't know if this is true yet. # define BOOST_HAS_TR1_UNORDERED_MAP @@ -158,10 +158,16 @@ # define BOOST_NO_CXX11_DECLTYPE_N3276 #endif +#if _MSC_FULL_VER >= 180020827 +#define BOOST_HAS_EXPM1 +#define BOOST_HAS_LOG1P +#endif + // C++11 features supported by VC++ 14 (aka 2015) // #if (_MSC_FULL_VER < 190023026) # define BOOST_NO_CXX11_NOEXCEPT +# define BOOST_NO_CXX11_DEFAULTED_MOVES # define BOOST_NO_CXX11_REF_QUALIFIERS # define BOOST_NO_CXX11_USER_DEFINED_LITERALS # define BOOST_NO_CXX11_ALIGNAS @@ -175,6 +181,26 @@ # define BOOST_NO_CXX14_BINARY_LITERALS # define BOOST_NO_CXX14_GENERIC_LAMBDAS # define BOOST_NO_CXX14_DIGIT_SEPARATORS +# define BOOST_NO_CXX11_THREAD_LOCAL +#endif +// C++11 features supported by VC++ 14 update 3 (aka 2015) +// +#if (_MSC_FULL_VER < 190024210) +# define BOOST_NO_CXX14_VARIABLE_TEMPLATES +# define BOOST_NO_SFINAE_EXPR +# define BOOST_NO_CXX11_CONSTEXPR +#endif + +// C++14 features supported by VC++ 14.1 (Visual Studio 2017) +// +#if (_MSC_VER < 1910) +# define BOOST_NO_CXX14_AGGREGATE_NSDMI +#endif + +// C++17 features supported by VC++ 14.1 (Visual Studio 2017) Update 3 +// +#if (_MSC_VER < 1911) || (_MSVC_LANG < 201703) +# define BOOST_NO_CXX17_STRUCTURED_BINDINGS #endif // MSVC including version 14 has not yet completely @@ -192,25 +218,48 @@ // https://connect.microsoft.com/VisualStudio/feedback/details/1582233/c-subobjects-still-not-value-initialized-correctly // See also: http://www.boost.org/libs/utility/value_init.htm#compiler_issues // (Niels Dekker, LKEB, May 2010) +// Still present in VC15.5, Dec 2017. #define BOOST_NO_COMPLETE_VALUE_INITIALIZATION -// C++11 features not supported by any versions -#define BOOST_NO_SFINAE_EXPR -#define BOOST_NO_TWO_PHASE_NAME_LOOKUP // -// This is somewhat supported in VC14, but we may need to wait for -// a service release before enabling: +// C++ 11: +// +// This is supported with /permissive- for 15.5 onwards, unfortunately we appear to have no way to tell +// if this is in effect or not, in any case nothing in Boost is currently using this, so we'll just go +// on defining it for now: // -#define BOOST_NO_CXX11_CONSTEXPR +# define BOOST_NO_TWO_PHASE_NAME_LOOKUP -// C++ 14: -#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304) -# define BOOST_NO_CXX14_AGGREGATE_NSDMI +#if (_MSC_VER < 1912) || (_MSVC_LANG < 201402) +// Supported from msvc-15.5 onwards: +#define BOOST_NO_CXX11_SFINAE_EXPR #endif -#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304) +// C++ 14: +// Still gives internal compiler error for msvc-15.5: # define BOOST_NO_CXX14_CONSTEXPR +// C++ 17: +#if (_MSC_VER < 1912) || (_MSVC_LANG < 201703) +#define BOOST_NO_CXX17_INLINE_VARIABLES +#define BOOST_NO_CXX17_FOLD_EXPRESSIONS +#endif + +// +// Things that don't work in clr mode: +// +#ifdef _M_CEE +#ifndef BOOST_NO_CXX11_THREAD_LOCAL +# define BOOST_NO_CXX11_THREAD_LOCAL +#endif +#ifndef BOOST_NO_SFINAE_EXPR +# define BOOST_NO_SFINAE_EXPR +#endif +#ifndef BOOST_NO_CXX11_REF_QUALIFIERS +# define BOOST_NO_CXX11_REF_QUALIFIERS +#endif +#endif +#ifdef _M_CEE_PURE +#ifndef BOOST_NO_CXX11_CONSTEXPR +# define BOOST_NO_CXX11_CONSTEXPR #endif -#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304) -# define BOOST_NO_CXX14_VARIABLE_TEMPLATES #endif // @@ -258,7 +307,7 @@ # endif # endif # else -# if _MSC_VER < 1310 +# if _MSC_VER < 1200 // Note: Versions up to 7.0 aren't supported. # define BOOST_COMPILER_VERSION 5.0 # elif _MSC_VER < 1300 @@ -277,8 +326,10 @@ # define BOOST_COMPILER_VERSION 11.0 # elif _MSC_VER < 1900 # define BOOST_COMPILER_VERSION 12.0 -# elif _MSC_VER < 2000 +# elif _MSC_VER < 1910 # define BOOST_COMPILER_VERSION 14.0 +# elif _MSC_VER < 1920 +# define BOOST_COMPILER_VERSION 14.1 # else # define BOOST_COMPILER_VERSION _MSC_VER # endif @@ -287,12 +338,17 @@ # define BOOST_COMPILER "Microsoft Visual C++ version " BOOST_STRINGIZE(BOOST_COMPILER_VERSION) #endif +#include + // -// last known and checked version is 19.00.23026 (VC++ 2015 RTM): -#if (_MSC_VER > 1900) +// last known and checked version is 19.12.25830.2 (VC++ 2017.3): +#if (_MSC_VER > 1912) # if defined(BOOST_ASSERT_CONFIG) -# error "Unknown compiler version - please run the configure tests and report the results" -# else -# pragma message("Unknown compiler version - please run the configure tests and report the results") +# error "Boost.Config is older than your current compiler version." +# elif !defined(BOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE) + // + // Disabled as of March 2018 - the pace of VS releases is hard to keep up with + // and in any case, we have relatively few defect macros defined now. + // BOOST_PRAGMA_MESSAGE("Info: Boost.Config is older than your compiler version - probably nothing bad will happen - but you may wish to look for an updated Boost version. Define BOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE to suppress this message.") # endif #endif diff --git a/third_party/boost_parts/boost/config/compiler/xlcpp.hpp b/third_party/boost_parts/boost/config/compiler/xlcpp.hpp index e369ecef..a4c66e40 100644 --- a/third_party/boost_parts/boost/config/compiler/xlcpp.hpp +++ b/third_party/boost_parts/boost/config/compiler/xlcpp.hpp @@ -23,6 +23,10 @@ #define __has_extension __has_feature #endif +#ifndef __has_cpp_attribute +#define __has_cpp_attribute(x) 0 +#endif + #if !__has_feature(cxx_exceptions) && !defined(BOOST_NO_EXCEPTIONS) # define BOOST_NO_EXCEPTIONS #endif @@ -238,6 +242,20 @@ # define BOOST_NO_CXX14_VARIABLE_TEMPLATES #endif +#if !defined(__cpp_structured_bindings) || (__cpp_structured_bindings < 201606) +# define BOOST_NO_CXX17_STRUCTURED_BINDINGS +#endif + +// Clang 3.9+ in c++1z +#if !__has_cpp_attribute(fallthrough) || __cplusplus < 201406L +# define BOOST_NO_CXX17_INLINE_VARIABLES +# define BOOST_NO_CXX17_FOLD_EXPRESSIONS +#endif + +#if !__has_feature(cxx_thread_local) +# define BOOST_NO_CXX11_THREAD_LOCAL +#endif + #if __cplusplus < 201400 // All versions with __cplusplus above this value seem to support this: # define BOOST_NO_CXX14_DIGIT_SEPARATORS @@ -249,6 +267,11 @@ # define BOOST_ATTRIBUTE_UNUSED __attribute__((unused)) #endif +// Type aliasing hint. +#if __has_attribute(__may_alias__) +# define BOOST_MAY_ALIAS __attribute__((__may_alias__)) +#endif + #ifndef BOOST_COMPILER # define BOOST_COMPILER "Clang version " __clang_version__ #endif diff --git a/third_party/boost_parts/boost/config/compiler/xlcpp_zos.hpp b/third_party/boost_parts/boost/config/compiler/xlcpp_zos.hpp new file mode 100644 index 00000000..bc785b8a --- /dev/null +++ b/third_party/boost_parts/boost/config/compiler/xlcpp_zos.hpp @@ -0,0 +1,169 @@ +// Copyright (c) 2017 Dynatrace +// +// Distributed under the Boost Software License, Version 1.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. + +// Compiler setup for IBM z/OS XL C/C++ compiler. + +// Oldest compiler version currently supported is 2.1 (V2R1) +#if !defined(__IBMCPP__) || !defined(__COMPILER_VER__) || __COMPILER_VER__ < 0x42010000 +# error "Compiler not supported or configured - please reconfigure" +#endif + +#if __COMPILER_VER__ > 0x42010000 +# if defined(BOOST_ASSERT_CONFIG) +# error "Unknown compiler version - please run the configure tests and report the results" +# endif +#endif + +#define BOOST_COMPILER "IBM z/OS XL C/C++ version " BOOST_STRINGIZE(__COMPILER_VER__) +#define BOOST_XLCPP_ZOS __COMPILER_VER__ + +// ------------------------------------- + +#include // For __UU, __C99, __TR1, ... + +#if !defined(__IBMCPP_DEFAULTED_AND_DELETED_FUNCTIONS) +# define BOOST_NO_CXX11_DELETED_FUNCTIONS +# define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS +# define BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS +#endif + +// ------------------------------------- + +#if defined(__UU) || defined(__C99) || defined(__TR1) +# define BOOST_HAS_LOG1P +# define BOOST_HAS_EXPM1 +#endif + +#if defined(__C99) || defined(__TR1) +# define BOOST_HAS_STDINT_H +#else +# define BOOST_NO_FENV_H +#endif + +// ------------------------------------- + +#define BOOST_HAS_NRVO + +#if !defined(__RTTI_ALL__) +# define BOOST_NO_RTTI +#endif + +#if !defined(_CPPUNWIND) && !defined(__EXCEPTIONS) +# define BOOST_NO_EXCEPTIONS +#endif + +#if defined(_LONG_LONG) || defined(__IBMCPP_C99_LONG_LONG) || defined(__LL) +# define BOOST_HAS_LONG_LONG +#else +# define BOOST_NO_LONG_LONG +#endif + +#if defined(_LONG_LONG) || defined(__IBMCPP_C99_LONG_LONG) || defined(__LL) || defined(_LP64) +# define BOOST_HAS_MS_INT64 +#endif + +#define BOOST_NO_SFINAE_EXPR +#define BOOST_NO_CXX11_SFINAE_EXPR + +#if defined(__IBMCPP_VARIADIC_TEMPLATES) +# define BOOST_HAS_VARIADIC_TMPL +#else +# define BOOST_NO_CXX11_VARIADIC_TEMPLATES +# define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS +#endif + +#if defined(__IBMCPP_STATIC_ASSERT) +# define BOOST_HAS_STATIC_ASSERT +#else +# define BOOST_NO_CXX11_STATIC_ASSERT +#endif + +#if defined(__IBMCPP_RVALUE_REFERENCES) +# define BOOST_HAS_RVALUE_REFS +#else +# define BOOST_NO_CXX11_RVALUE_REFERENCES +#endif + +#if !defined(__IBMCPP_SCOPED_ENUM) +# define BOOST_NO_CXX11_SCOPED_ENUMS +#endif + +#define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS +#define BOOST_NO_CXX11_TEMPLATE_ALIASES +#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS + +#if !defined(__IBMCPP_EXPLICIT_CONVERSION_OPERATORS) +# define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS +#endif + +#if !defined(__IBMCPP_DECLTYPE) +# define BOOST_NO_CXX11_DECLTYPE +#else +# define BOOST_HAS_DECLTYPE +#endif +#define BOOST_NO_CXX11_DECLTYPE_N3276 + +#if !defined(__IBMCPP_INLINE_NAMESPACE) +# define BOOST_NO_CXX11_INLINE_NAMESPACES +#endif + +#if !defined(__IBMCPP_AUTO_TYPEDEDUCTION) +# define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS +# define BOOST_NO_CXX11_AUTO_DECLARATIONS +# define BOOST_NO_CXX11_TRAILING_RESULT_TYPES +#endif + +#if !defined(__IBM_CHAR32_T__) +# define BOOST_NO_CXX11_CHAR32_T +#endif +#if !defined(__IBM_CHAR16_T__) +# define BOOST_NO_CXX11_CHAR16_T +#endif + +#if !defined(__IBMCPP_CONSTEXPR) +# define BOOST_NO_CXX11_CONSTEXPR +#endif + +#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX +#define BOOST_NO_CXX11_UNICODE_LITERALS +#define BOOST_NO_CXX11_RAW_LITERALS +#define BOOST_NO_CXX11_RANGE_BASED_FOR +#define BOOST_NO_CXX11_NULLPTR +#define BOOST_NO_CXX11_NOEXCEPT +#define BOOST_NO_CXX11_LAMBDAS +#define BOOST_NO_CXX11_USER_DEFINED_LITERALS +#define BOOST_NO_CXX11_THREAD_LOCAL +#define BOOST_NO_CXX11_REF_QUALIFIERS +#define BOOST_NO_CXX11_FINAL +#define BOOST_NO_CXX11_ALIGNAS +#define BOOST_NO_CXX14_VARIABLE_TEMPLATES +#define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION +#define BOOST_NO_CXX14_AGGREGATE_NSDMI +#define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES +#define BOOST_NO_CXX14_GENERIC_LAMBDAS +#define BOOST_NO_CXX14_DIGIT_SEPARATORS +#define BOOST_NO_CXX14_DECLTYPE_AUTO +#define BOOST_NO_CXX14_CONSTEXPR +#define BOOST_NO_CXX14_BINARY_LITERALS +#define BOOST_NO_CXX17_STRUCTURED_BINDINGS +#define BOOST_NO_CXX17_INLINE_VARIABLES +#define BOOST_NO_CXX17_FOLD_EXPRESSIONS + +// ------------------------------------- + +#if defined(__IBM_ATTRIBUTES) +# define BOOST_FORCEINLINE inline __attribute__ ((__always_inline__)) +# define BOOST_NOINLINE __attribute__ ((__noinline__)) +# define BOOST_MAY_ALIAS __attribute__((__may_alias__)) +// No BOOST_ALIGNMENT - explicit alignment support is broken (V2R1). +#endif + +extern "builtin" long __builtin_expect(long, long); + +#define BOOST_LIKELY(x) __builtin_expect((x) && true, 1) +#define BOOST_UNLIKELY(x) __builtin_expect((x) && true, 0) diff --git a/third_party/boost_parts/boost/config/posix_features.hpp b/third_party/boost_parts/boost/config/detail/posix_features.hpp similarity index 100% rename from third_party/boost_parts/boost/config/posix_features.hpp rename to third_party/boost_parts/boost/config/detail/posix_features.hpp diff --git a/third_party/boost_parts/boost/config/select_compiler_config.hpp b/third_party/boost_parts/boost/config/detail/select_compiler_config.hpp similarity index 75% rename from third_party/boost_parts/boost/config/select_compiler_config.hpp rename to third_party/boost_parts/boost/config/detail/select_compiler_config.hpp index 4d87093a..ced8443d 100644 --- a/third_party/boost_parts/boost/config/select_compiler_config.hpp +++ b/third_party/boost_parts/boost/config/detail/select_compiler_config.hpp @@ -48,6 +48,14 @@ // Digital Mars C++ # define BOOST_COMPILER_CONFIG "boost/config/compiler/digitalmars.hpp" +#elif defined __DCC__ +// Wind River Diab C++ +# define BOOST_COMPILER_CONFIG "boost/config/compiler/diab.hpp" + +#elif defined(__PGI) +// Portland Group Inc. +# define BOOST_COMPILER_CONFIG "boost/config/compiler/pgi.hpp" + # elif defined(__GNUC__) && !defined(__ibmxl__) // GNU C++: # define BOOST_COMPILER_CONFIG "boost/config/compiler/gcc.hpp" @@ -92,18 +100,18 @@ // MPW MrCpp or SCpp # define BOOST_COMPILER_CONFIG "boost/config/compiler/mpw.hpp" +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) && defined(__MVS__) +// IBM z/OS XL C/C++ +# define BOOST_COMPILER_CONFIG "boost/config/compiler/xlcpp_zos.hpp" + #elif defined(__ibmxl__) -// IBM XL C/C++ for Linux (Little Endian) +// IBM XL C/C++ for Linux (Little Endian) # define BOOST_COMPILER_CONFIG "boost/config/compiler/xlcpp.hpp" #elif defined(__IBMCPP__) // IBM Visual Age or IBM XL C/C++ for Linux (Big Endian) # define BOOST_COMPILER_CONFIG "boost/config/compiler/vacpp.hpp" -#elif defined(__PGI) -// Portland Group Inc. -# define BOOST_COMPILER_CONFIG "boost/config/compiler/pgi.hpp" - #elif defined _MSC_VER // Microsoft Visual C++ // @@ -122,27 +130,29 @@ // // This section allows dependency scanners to find all the headers we *might* include: // -#include "boost/config/compiler/gcc_xml.hpp" -#include "boost/config/compiler/cray.hpp" -#include "boost/config/compiler/comeau.hpp" -#include "boost/config/compiler/pathscale.hpp" -#include "boost/config/compiler/intel.hpp" -#include "boost/config/compiler/clang.hpp" -#include "boost/config/compiler/digitalmars.hpp" -#include "boost/config/compiler/gcc.hpp" -#include "boost/config/compiler/kai.hpp" -#include "boost/config/compiler/sgi_mipspro.hpp" -#include "boost/config/compiler/compaq_cxx.hpp" -#include "boost/config/compiler/greenhills.hpp" -#include "boost/config/compiler/codegear.hpp" -#include "boost/config/compiler/borland.hpp" -#include "boost/config/compiler/metrowerks.hpp" -#include "boost/config/compiler/sunpro_cc.hpp" -#include "boost/config/compiler/hp_acc.hpp" -#include "boost/config/compiler/mpw.hpp" -#include "boost/config/compiler/vacpp.hpp" -#include "boost/config/compiler/pgi.hpp" -#include "boost/config/compiler/visualc.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #endif diff --git a/third_party/boost_parts/boost/config/select_platform_config.hpp b/third_party/boost_parts/boost/config/detail/select_platform_config.hpp similarity index 94% rename from third_party/boost_parts/boost/config/select_platform_config.hpp rename to third_party/boost_parts/boost/config/detail/select_platform_config.hpp index 62fd818b..b36eca57 100644 --- a/third_party/boost_parts/boost/config/select_platform_config.hpp +++ b/third_party/boost_parts/boost/config/detail/select_platform_config.hpp @@ -53,8 +53,12 @@ // MacOS # define BOOST_PLATFORM_CONFIG "boost/config/platform/macos.hpp" +#elif defined(__TOS_MVS__) +// IBM z/OS +# define BOOST_PLATFORM_CONFIG "boost/config/platform/zos.hpp" + #elif defined(__IBMCPP__) || defined(_AIX) -// IBM +// IBM AIX # define BOOST_PLATFORM_CONFIG "boost/config/platform/aix.hpp" #elif defined(__amigaos__) @@ -97,7 +101,7 @@ # define BOOST_HAS_UNISTD_H # endif -# include +# include # endif @@ -122,6 +126,7 @@ # include "boost/config/platform/win32.hpp" # include "boost/config/platform/beos.hpp" # include "boost/config/platform/macos.hpp" +# include "boost/config/platform/zos.hpp" # include "boost/config/platform/aix.hpp" # include "boost/config/platform/amigaos.hpp" # include "boost/config/platform/qnxnto.hpp" @@ -129,7 +134,7 @@ # include "boost/config/platform/symbian.hpp" # include "boost/config/platform/cray.hpp" # include "boost/config/platform/vms.hpp" -# include +# include diff --git a/third_party/boost_parts/boost/config/select_stdlib_config.hpp b/third_party/boost_parts/boost/config/detail/select_stdlib_config.hpp similarity index 94% rename from third_party/boost_parts/boost/config/select_stdlib_config.hpp rename to third_party/boost_parts/boost/config/detail/select_stdlib_config.hpp index e270a881..8db778c8 100644 --- a/third_party/boost_parts/boost/config/select_stdlib_config.hpp +++ b/third_party/boost_parts/boost/config/detail/select_stdlib_config.hpp @@ -66,6 +66,10 @@ // MSL standard lib: # define BOOST_STDLIB_CONFIG "boost/config/stdlib/msl.hpp" +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) && defined(__MVS__) +// IBM z/OS XL C/C++ +# define BOOST_STDLIB_CONFIG "boost/config/stdlib/xlcpp_zos.hpp" + #elif defined(__IBMCPP__) // take the default VACPP std lib # define BOOST_STDLIB_CONFIG "boost/config/stdlib/vacpp.hpp" @@ -98,6 +102,7 @@ # include "boost/config/stdlib/libstdcpp3.hpp" # include "boost/config/stdlib/sgi.hpp" # include "boost/config/stdlib/msl.hpp" +# include "boost/config/stdlib/xlcpp_zos.hpp" # include "boost/config/stdlib/vacpp.hpp" # include "boost/config/stdlib/modena.hpp" # include "boost/config/stdlib/dinkumware.hpp" diff --git a/third_party/boost_parts/boost/config/suffix.hpp b/third_party/boost_parts/boost/config/detail/suffix.hpp similarity index 94% rename from third_party/boost_parts/boost/config/suffix.hpp rename to third_party/boost_parts/boost/config/detail/suffix.hpp index 17bf1020..22d31f68 100644 --- a/third_party/boost_parts/boost/config/suffix.hpp +++ b/third_party/boost_parts/boost/config/detail/suffix.hpp @@ -537,25 +537,10 @@ namespace std{ using ::type_info; } // ---------------------------------------------------------------------------// -// // Helper macro BOOST_STRINGIZE: -// Converts the parameter X to a string after macro replacement -// on X has been performed. -// -#define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X) -#define BOOST_DO_STRINGIZE(X) #X - -// // Helper macro BOOST_JOIN: -// The following piece of macro magic joins the two -// arguments together, even when one of the arguments is -// itself a macro (see 16.3.1 in C++ standard). The key -// is that macro expansion of macro arguments does not -// occur in BOOST_DO_JOIN2 but does in BOOST_DO_JOIN. -// -#define BOOST_JOIN( X, Y ) BOOST_DO_JOIN( X, Y ) -#define BOOST_DO_JOIN( X, Y ) BOOST_DO_JOIN2(X,Y) -#define BOOST_DO_JOIN2( X, Y ) X##Y + +#include // // Set some default values for compiler/library/platform names. @@ -583,6 +568,33 @@ namespace std{ using ::type_info; } # define BOOST_GPU_ENABLED # endif +// BOOST_RESTRICT ---------------------------------------------// +// Macro to use in place of 'restrict' keyword variants +#if !defined(BOOST_RESTRICT) +# if defined(_MSC_VER) +# define BOOST_RESTRICT __restrict +# if !defined(BOOST_NO_RESTRICT_REFERENCES) && (_MSC_FULL_VER < 190023026) +# define BOOST_NO_RESTRICT_REFERENCES +# endif +# elif defined(__GNUC__) && __GNUC__ > 3 + // Clang also defines __GNUC__ (as 4) +# define BOOST_RESTRICT __restrict__ +# else +# define BOOST_RESTRICT +# if !defined(BOOST_NO_RESTRICT_REFERENCES) +# define BOOST_NO_RESTRICT_REFERENCES +# endif +# endif +#endif + +// BOOST_MAY_ALIAS -----------------------------------------------// +// The macro expands to an attribute to mark a type that is allowed to alias other types. +// The macro is defined in the compiler-specific headers. +#if !defined(BOOST_MAY_ALIAS) +# define BOOST_NO_MAY_ALIAS +# define BOOST_MAY_ALIAS +#endif + // BOOST_FORCEINLINE ---------------------------------------------// // Macro to use in place of 'inline' to force a function to be inline #if !defined(BOOST_FORCEINLINE) @@ -604,7 +616,7 @@ namespace std{ using ::type_info; } # elif defined(__GNUC__) && __GNUC__ > 3 // Clang also defines __GNUC__ (as 4) # if defined(__CUDACC__) - // nvcc doesn't always parse __noinline__, + // nvcc doesn't always parse __noinline__, // see: https://svn.boost.org/trac/boost/ticket/9392 # define BOOST_NOINLINE __attribute__ ((noinline)) # else @@ -624,12 +636,22 @@ namespace std{ using ::type_info; } # define BOOST_NORETURN __declspec(noreturn) # elif defined(__GNUC__) # define BOOST_NORETURN __attribute__ ((__noreturn__)) -# else -# define BOOST_NO_NORETURN -# define BOOST_NORETURN +# elif defined(__has_attribute) && defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x5130) +# if __has_attribute(noreturn) +# define BOOST_NORETURN [[noreturn]] +# endif +# elif defined(__has_cpp_attribute) +# if __has_cpp_attribute(noreturn) +# define BOOST_NORETURN [[noreturn]] +# endif # endif #endif +#if !defined(BOOST_NORETURN) +# define BOOST_NO_NORETURN +# define BOOST_NORETURN +#endif + // Branch prediction hints // These macros are intended to wrap conditional expressions that yield true or false // @@ -647,15 +669,17 @@ namespace std{ using ::type_info; } // Type and data alignment specification // -#if !defined(BOOST_NO_CXX11_ALIGNAS) -# define BOOST_ALIGNMENT(x) alignas(x) -#elif defined(_MSC_VER) -# define BOOST_ALIGNMENT(x) __declspec(align(x)) -#elif defined(__GNUC__) -# define BOOST_ALIGNMENT(x) __attribute__ ((__aligned__(x))) -#else -# define BOOST_NO_ALIGNMENT -# define BOOST_ALIGNMENT(x) +#if !defined(BOOST_ALIGNMENT) +# if !defined(BOOST_NO_CXX11_ALIGNAS) +# define BOOST_ALIGNMENT(x) alignas(x) +# elif defined(_MSC_VER) +# define BOOST_ALIGNMENT(x) __declspec(align(x)) +# elif defined(__GNUC__) +# define BOOST_ALIGNMENT(x) __attribute__ ((__aligned__(x))) +# else +# define BOOST_NO_ALIGNMENT +# define BOOST_ALIGNMENT(x) +# endif #endif // Lack of non-public defaulted functions is implied by the lack of any defaulted functions @@ -663,6 +687,11 @@ namespace std{ using ::type_info; } # define BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS #endif +// Lack of defaulted moves is implied by the lack of either rvalue references or any defaulted functions +#if !defined(BOOST_NO_CXX11_DEFAULTED_MOVES) && (defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES)) +# define BOOST_NO_CXX11_DEFAULTED_MOVES +#endif + // Defaulted and deleted function declaration helpers // These macros are intended to be inside a class definition. // BOOST_DEFAULTED_FUNCTION accepts the function declaration and its diff --git a/third_party/boost_parts/boost/config/header_deprecated.hpp b/third_party/boost_parts/boost/config/header_deprecated.hpp new file mode 100644 index 00000000..864554f2 --- /dev/null +++ b/third_party/boost_parts/boost/config/header_deprecated.hpp @@ -0,0 +1,26 @@ +#ifndef BOOST_CONFIG_HEADER_DEPRECATED_HPP_INCLUDED +#define BOOST_CONFIG_HEADER_DEPRECATED_HPP_INCLUDED + +// Copyright 2017 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 +// +// BOOST_HEADER_DEPRECATED("") +// +// Expands to the equivalent of +// BOOST_PRAGMA_MESSAGE("This header is deprecated. Use instead.") +// +// Note that this header is C compatible. + +#include + +#if defined(BOOST_ALLOW_DEPRECATED_HEADERS) +# define BOOST_HEADER_DEPRECATED(a) +#else +# define BOOST_HEADER_DEPRECATED(a) BOOST_PRAGMA_MESSAGE("This header is deprecated. Use " a " instead.") +#endif + +#endif // BOOST_CONFIG_HEADER_DEPRECATED_HPP_INCLUDED diff --git a/third_party/boost_parts/boost/config/helper_macros.hpp b/third_party/boost_parts/boost/config/helper_macros.hpp new file mode 100644 index 00000000..3e79526d --- /dev/null +++ b/third_party/boost_parts/boost/config/helper_macros.hpp @@ -0,0 +1,37 @@ +#ifndef BOOST_CONFIG_HELPER_MACROS_HPP_INCLUDED +#define BOOST_CONFIG_HELPER_MACROS_HPP_INCLUDED + +// Copyright 2001 John Maddock. +// Copyright 2017 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 +// +// BOOST_STRINGIZE(X) +// BOOST_JOIN(X, Y) +// +// Note that this header is C compatible. + +// +// Helper macro BOOST_STRINGIZE: +// Converts the parameter X to a string after macro replacement +// on X has been performed. +// +#define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X) +#define BOOST_DO_STRINGIZE(X) #X + +// +// Helper macro BOOST_JOIN: +// The following piece of macro magic joins the two +// arguments together, even when one of the arguments is +// itself a macro (see 16.3.1 in C++ standard). The key +// is that macro expansion of macro arguments does not +// occur in BOOST_DO_JOIN2 but does in BOOST_DO_JOIN. +// +#define BOOST_JOIN(X, Y) BOOST_DO_JOIN(X, Y) +#define BOOST_DO_JOIN(X, Y) BOOST_DO_JOIN2(X,Y) +#define BOOST_DO_JOIN2(X, Y) X##Y + +#endif // BOOST_CONFIG_HELPER_MACROS_HPP_INCLUDED diff --git a/third_party/boost_parts/boost/config/platform/aix.hpp b/third_party/boost_parts/boost/config/platform/aix.hpp index 894ef42c..a48e2320 100644 --- a/third_party/boost_parts/boost/config/platform/aix.hpp +++ b/third_party/boost_parts/boost/config/platform/aix.hpp @@ -26,7 +26,7 @@ //#define BOOST_HAS_PTHREAD_YIELD // boilerplate code: -#include +#include diff --git a/third_party/boost_parts/boost/config/platform/beos.hpp b/third_party/boost_parts/boost/config/platform/beos.hpp index 48c3d8dc..6158c1c2 100644 --- a/third_party/boost_parts/boost/config/platform/beos.hpp +++ b/third_party/boost_parts/boost/config/platform/beos.hpp @@ -20,7 +20,7 @@ #endif // boilerplate code: -#include +#include diff --git a/third_party/boost_parts/boost/config/platform/bsd.hpp b/third_party/boost_parts/boost/config/platform/bsd.hpp index a0142978..79e74a08 100644 --- a/third_party/boost_parts/boost/config/platform/bsd.hpp +++ b/third_party/boost_parts/boost/config/platform/bsd.hpp @@ -77,7 +77,7 @@ // boilerplate code: #define BOOST_HAS_UNISTD_H -#include +#include diff --git a/third_party/boost_parts/boost/config/platform/cray.hpp b/third_party/boost_parts/boost/config/platform/cray.hpp index 5c476e41..103e9c06 100644 --- a/third_party/boost_parts/boost/config/platform/cray.hpp +++ b/third_party/boost_parts/boost/config/platform/cray.hpp @@ -12,7 +12,7 @@ // boilerplate code: #define BOOST_HAS_UNISTD_H -#include +#include diff --git a/third_party/boost_parts/boost/config/platform/cygwin.hpp b/third_party/boost_parts/boost/config/platform/cygwin.hpp index b7ef572f..6dd7e57c 100644 --- a/third_party/boost_parts/boost/config/platform/cygwin.hpp +++ b/third_party/boost_parts/boost/config/platform/cygwin.hpp @@ -23,7 +23,7 @@ # define BOOST_HAS_SCHED_YIELD # define BOOST_HAS_GETTIMEOFDAY # define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -# define BOOST_HAS_SIGACTION +//# define BOOST_HAS_SIGACTION #else # if !defined(BOOST_HAS_WINTHREADS) # define BOOST_HAS_WINTHREADS @@ -38,12 +38,23 @@ #ifdef _STDINT_H #define BOOST_HAS_STDINT_H #endif +#if __GNUC__ > 5 && !defined(BOOST_HAS_STDINT_H) +# define BOOST_HAS_STDINT_H +#endif /// Cygwin has no fenv.h #define BOOST_NO_FENV_H +// Cygwin has it's own which breaks unless the correct compiler flags are used: +#ifndef BOOST_NO_CXX14_HDR_SHARED_MUTEX +#include +#if !(__XSI_VISIBLE >= 500 || __POSIX_VISIBLE >= 200112) +# define BOOST_NO_CXX14_HDR_SHARED_MUTEX +#endif +#endif + // boilerplate code: -#include +#include // // Cygwin lies about XSI conformance, there is no nl_types.h: @@ -51,7 +62,6 @@ #ifdef BOOST_HAS_NL_TYPES_H # undef BOOST_HAS_NL_TYPES_H #endif - diff --git a/third_party/boost_parts/boost/config/platform/haiku.hpp b/third_party/boost_parts/boost/config/platform/haiku.hpp index 750866c4..04244c56 100644 --- a/third_party/boost_parts/boost/config/platform/haiku.hpp +++ b/third_party/boost_parts/boost/config/platform/haiku.hpp @@ -28,4 +28,4 @@ #define BOOST_HAS_GETTIMEOFDAY // boilerplate code: -#include +#include diff --git a/third_party/boost_parts/boost/config/platform/hpux.hpp b/third_party/boost_parts/boost/config/platform/hpux.hpp index 19ce68e5..222622e7 100644 --- a/third_party/boost_parts/boost/config/platform/hpux.hpp +++ b/third_party/boost_parts/boost/config/platform/hpux.hpp @@ -43,7 +43,7 @@ // boilerplate code: #define BOOST_HAS_UNISTD_H -#include +#include // the following are always available: #ifndef BOOST_HAS_GETTIMEOFDAY diff --git a/third_party/boost_parts/boost/config/platform/irix.hpp b/third_party/boost_parts/boost/config/platform/irix.hpp index aeae49c8..0acb6515 100644 --- a/third_party/boost_parts/boost/config/platform/irix.hpp +++ b/third_party/boost_parts/boost/config/platform/irix.hpp @@ -25,7 +25,7 @@ // boilerplate code: #define BOOST_HAS_UNISTD_H -#include +#include diff --git a/third_party/boost_parts/boost/config/platform/linux.hpp b/third_party/boost_parts/boost/config/platform/linux.hpp index 6fa5f45b..c4eef8f8 100644 --- a/third_party/boost_parts/boost/config/platform/linux.hpp +++ b/third_party/boost_parts/boost/config/platform/linux.hpp @@ -24,8 +24,9 @@ #if defined(__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 1))) // defines int64_t unconditionally, but defines // int64_t only if __GNUC__. Thus, assume a fully usable - // only when using GCC. -# if defined __GNUC__ + // only when using GCC. Update 2017: this appears not to be the case for + // recent glibc releases, see bug report: https://svn.boost.org/trac/boost/ticket/13045 +# if defined(__GNUC__) || ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 5))) # define BOOST_HAS_STDINT_H # endif #endif @@ -71,8 +72,8 @@ // boilerplate code: #define BOOST_HAS_UNISTD_H -#include -#ifdef __USE_GNU +#include +#if defined(__USE_GNU) && !defined(__ANDROID__) && !defined(ANDROID) #define BOOST_HAS_PTHREAD_YIELD #endif diff --git a/third_party/boost_parts/boost/config/platform/macos.hpp b/third_party/boost_parts/boost/config/platform/macos.hpp index 5be4e3b3..ed7dc15f 100644 --- a/third_party/boost_parts/boost/config/platform/macos.hpp +++ b/third_party/boost_parts/boost/config/platform/macos.hpp @@ -25,7 +25,7 @@ // to replace the platform-native BSD one. G++ users // should also always be able to do this on MaxOS X. // -# include +# include # ifndef BOOST_HAS_STDINT_H # define BOOST_HAS_STDINT_H # endif diff --git a/third_party/boost_parts/boost/config/platform/qnxnto.hpp b/third_party/boost_parts/boost/config/platform/qnxnto.hpp index b1377c8d..d0298cb4 100644 --- a/third_party/boost_parts/boost/config/platform/qnxnto.hpp +++ b/third_party/boost_parts/boost/config/platform/qnxnto.hpp @@ -10,7 +10,7 @@ #define BOOST_PLATFORM "QNX" #define BOOST_HAS_UNISTD_H -#include +#include // QNX claims XOpen version 5 compatibility, but doesn't have an nl_types.h // or log1p and expm1: diff --git a/third_party/boost_parts/boost/config/platform/solaris.hpp b/third_party/boost_parts/boost/config/platform/solaris.hpp index 6e4efc9e..51ffe67f 100644 --- a/third_party/boost_parts/boost/config/platform/solaris.hpp +++ b/third_party/boost_parts/boost/config/platform/solaris.hpp @@ -14,7 +14,7 @@ // boilerplate code: #define BOOST_HAS_UNISTD_H -#include +#include // // pthreads don't actually work with gcc unless _PTHREADS is defined: diff --git a/third_party/boost_parts/boost/config/platform/symbian.hpp b/third_party/boost_parts/boost/config/platform/symbian.hpp index e02a7782..f814d00b 100644 --- a/third_party/boost_parts/boost/config/platform/symbian.hpp +++ b/third_party/boost_parts/boost/config/platform/symbian.hpp @@ -24,7 +24,7 @@ #include #endif// boilerplate code: # define BOOST_HAS_UNISTD_H -# include +# include // S60 SDK defines _POSIX_VERSION as POSIX.1 # ifndef BOOST_HAS_STDINT_H # define BOOST_HAS_STDINT_H diff --git a/third_party/boost_parts/boost/config/platform/vxworks.hpp b/third_party/boost_parts/boost/config/platform/vxworks.hpp index cdda0158..a91e4ab4 100644 --- a/third_party/boost_parts/boost/config/platform/vxworks.hpp +++ b/third_party/boost_parts/boost/config/platform/vxworks.hpp @@ -1,30 +1,50 @@ // (C) Copyright Dustin Spicuzza 2009. // Adapted to vxWorks 6.9 by Peter Brockamp 2012. +// Updated for VxWorks 7 by Brian Kuhl 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 for most recent version. -// Since WRS does not yet properly support boost under vxWorks -// and this file was badly outdated, but I was keen on using it, -// I patched boost myself to make things work. This has been tested -// and adapted by me for vxWorks 6.9 *only*, as I'm lacking access -// to earlier 6.X versions! The only thing I know for sure is that -// very old versions of vxWorks (namely everything below 6.x) are -// absolutely unable to use boost. This is mainly due to the completely -// outdated libraries and ancient compiler (GCC 2.96 or worse). Do -// not even think of getting this to work, a miserable failure will -// be guaranteed! +// Old versions of vxWorks (namely everything below 6.x) are +// absolutely unable to use boost. Old STLs and compilers +// like (GCC 2.96) . Do not even think of getting this to work, +// a miserable failure will be guaranteed! +// // Equally, this file has been tested for RTPs (Real Time Processes) // only, not for DKMs (Downloadable Kernel Modules). These two types // of executables differ largely in the available functionality of -// the C-library, STL, and so on. A DKM uses a library similar to those -// of vxWorks 5.X - with all its limitations and incompatibilities -// with respect to ANSI C++ and STL. So probably there might be problems -// with the usage of boost from DKMs. WRS or any voluteers are free to -// prove the opposite! - +// the C-library, STL, and so on. A DKM uses a C89 library with no +// wide character support and no guarantee of ANSI C. The same Dinkum +// STL library is used in both contexts. +// +// Similarly the Dinkum abridged STL that supports the loosely specified +// embedded C++ standard has not been tested and is unlikely to work +// on anything but the simplest library. +// ==================================================================== +// +// Additional Configuration +// ------------------------------------------------------------------- +// +// Because of the ordering of include files and other issues the following +// additional definitions worked better outside this file. +// +// When building the log library add the following to the b2 invocation +// define=BOOST_LOG_WITHOUT_IPC +// and +// -DBOOST_LOG_WITHOUT_DEFAULT_FACTORIES +// to your compile options. +// +// When building the test library add +// -DBOOST_TEST_LIMITED_SIGNAL_DETAILS +// to your compile options +// +// When building containers library add +// -DHAVE_MORECORE=0 +// to your c compile options so dlmalloc heap library is compiled +// without brk() calls +// // ==================================================================== // // Some important information regarding the usage of POSIX semaphores: @@ -38,29 +58,14 @@ // Now, VxWorks POSIX-semaphores for DKM's default to the usage of // priority inverting semaphores, which is fine. On the other hand, // for RTP's it defaults to using non priority inverting semaphores, -// which could easily pose a serious problem for a real time process, -// i.e. deadlocks! To overcome this two possibilities do exist: +// which could easily pose a serious problem for a real time process. // -// a) Patch every piece of boost that uses semaphores to instanciate -// the proper type of semaphores. This is non-intrusive with respect -// to the OS and could relatively easy been done by giving all -// semaphores attributes deviating from the default (for in-depth -// information see the POSIX functions pthread_mutexattr_init() -// and pthread_mutexattr_setprotocol()). However this breaks all -// too easily, as with every new version some boost library could -// all in a sudden start using semaphores, resurrecting the very -// same, hard to locate problem over and over again! -// -// b) We could change the default properties for POSIX-semaphores -// that VxWorks uses for RTP's and this is being suggested here, -// as it will more or less seamlessly integrate with boost. I got -// the following information from WRS how to do this, compare -// Wind River TSR# 1209768: -// -// Instructions for changing the default properties of POSIX- -// semaphores for RTP's in VxWorks 6.9: -// - Edit the file /vxworks-6.9/target/usr/src/posix/pthreadLib.c -// in the root of your Workbench-installation. +// To change the default properties for POSIX-semaphores in VxWorks 7 +// enable core > CORE_USER Menu > DEFAULT_PTHREAD_PRIO_INHERIT +// +// In VxWorks 6.x so as to integrate with boost. +// - Edit the file +// installDir/vxworks-6.x/target/usr/src/posix/pthreadLib.c // - Around line 917 there should be the definition of the default // mutex attributes: // @@ -81,30 +86,11 @@ // pAttr->mutexAttrType = PTHREAD_MUTEX_DEFAULT; // // Here again, replace PTHREAD_PRIO_NONE by PTHREAD_PRIO_INHERIT. -// - Finally, rebuild your VSB. This will create a new VxWorks kernel +// - Finally, rebuild your VSB. This will rebuild the libraries // with the changed properties. That's it! Now, using boost should // no longer cause any problems with task deadlocks! // -// And here's another useful piece of information concerning VxWorks' -// POSIX-functionality in general: -// VxWorks is not a genuine POSIX-OS in itself, rather it is using a -// kind of compatibility layer (sort of a wrapper) to emulate the -// POSIX-functionality by using its own resources and functions. -// At the time a task (thread) calls it's first POSIX-function during -// runtime it is being transformed by the OS into a POSIX-thread. -// This transformation does include a call to malloc() to allocate the -// memory required for the housekeeping of POSIX-threads. In a high -// priority RTP this malloc() call may be highly undesirable, as its -// timing is more or less unpredictable (depending on what your actual -// heap looks like). You can circumvent this problem by calling the -// function thread_self() at a well defined point in the code of the -// task, e.g. shortly after the task spawns up. Thereby you are able -// to define the time when the task-transformation will take place and -// you could shift it to an uncritical point where a malloc() call is -// tolerable. So, if this could pose a problem for your code, remember -// to call thread_self() from the affected task at an early stage. -// -// ==================================================================== +// ==================================================================== // Block out all versions before vxWorks 6.x, as these don't work: // Include header with the vxWorks version information and query them @@ -158,11 +144,6 @@ #define BOOST_HAS_CLOCK_GETTIME #define BOOST_HAS_MACRO_USE_FACET -// Generally unavailable functionality, delivered by boost's test function: -//#define BOOST_NO_DEDUCED_TYPENAME // Commented this out, boost's test gives an errorneous result! -#define BOOST_NO_CXX11_EXTERN_TEMPLATE -#define BOOST_NO_CXX11_VARIADIC_MACROS - // Generally available threading API's: #define BOOST_HAS_PTHREADS #define BOOST_HAS_SCHED_YIELD @@ -180,7 +161,7 @@ // Luckily, at the moment there seems to be none! #endif -// These #defines allow posix_features to work, since vxWorks doesn't +// These #defines allow detail/posix_features to work, since vxWorks doesn't // #define them itself for DKMs (for RTPs on the contrary it does): #ifdef _WRS_KERNEL # ifndef _POSIX_TIMERS @@ -191,14 +172,7 @@ # endif #endif -// vxWorks doesn't work with asio serial ports: -#define BOOST_ASIO_DISABLE_SERIAL_PORT -// TODO: The problem here seems to bee that vxWorks uses its own, very specific -// ways to handle serial ports, incompatible with POSIX or anything... -// Maybe a specific implementation would be possible, but until the -// straight need arises... This implementation would presumably consist -// of some vxWorks specific ioctl-calls, etc. Any voluteers? - +#if (_WRS_VXWORKS_MAJOR < 7) // vxWorks-around: #defines CLOCKS_PER_SEC as sysClkRateGet() but // miserably fails to #include the required to make // sysClkRateGet() available! So we manually include it here. @@ -208,11 +182,12 @@ #endif // vxWorks-around: In the macros INT32_C(), UINT32_C(), INT64_C() and -// UINT64_C() are defined errorneously, yielding not a signed/ +// UINT64_C() are defined erroneously, yielding not a signed/ // unsigned long/long long type, but a signed/unsigned int/long // type. Eventually this leads to compile errors in ratio_fwd.hpp, // when trying to define several constants which do not fit into a // long type! We correct them here by redefining. + #include // Some macro-magic to do the job @@ -231,12 +206,16 @@ #define UINT64_C(x) VX_JOIN(x, ULL) // #include Libraries required for the following function adaption +#include +#endif // _WRS_VXWORKS_MAJOR < 7 + #include #include -#include // Use C-linkage for the following helper functions +#ifdef __cplusplus extern "C" { +#endif // vxWorks-around: The required functions getrlimit() and getrlimit() are missing. // But we have the similar functions getprlimit() and setprlimit(), @@ -248,7 +227,7 @@ extern "C" { // TODO: getprlimit() and setprlimit() do exist for RTPs only, for whatever reason. // Thus for DKMs there would have to be another implementation. -#ifdef __RTP__ +#if defined ( __RTP__) && (_WRS_VXWORKS_MAJOR < 7) inline int getrlimit(int resource, struct rlimit *rlp){ return getprlimit(0, 0, resource, rlp); } @@ -273,23 +252,27 @@ inline int truncate(const char *p, off_t l){ return close(fd); } +#ifdef __GNUC__ +#define ___unused __attribute__((unused)) +#else +#define ___unused +#endif + // Fake symlink handling by dummy functions: -inline int symlink(const char*, const char*){ +inline int symlink(const char* path1 ___unused, const char* path2 ___unused){ // vxWorks has no symlinks -> always return an error! errno = EACCES; return -1; } -inline ssize_t readlink(const char*, char*, size_t){ +inline ssize_t readlink(const char* path1 ___unused, char* path2 ___unused, size_t size ___unused){ // vxWorks has no symlinks -> always return an error! errno = EACCES; return -1; } -// vxWorks claims to implement gettimeofday in sys/time.h -// but nevertheless does not provide it! See -// https://support.windriver.com/olsPortal/faces/maintenance/techtipDetail_noHeader.jspx?docId=16442&contentId=WR_TECHTIP_006256 -// We implement a surrogate version here via clock_gettime: +#if (_WRS_VXWORKS_MAJOR < 7) + inline int gettimeofday(struct timeval *tv, void * /*tzv*/) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); @@ -297,8 +280,20 @@ inline int gettimeofday(struct timeval *tv, void * /*tzv*/) { tv->tv_usec = ts.tv_nsec / 1000; return 0; } +#endif + +#ifdef __cplusplus +} // extern "C" +#endif + +/* + * moved to os/utils/unix/freind_h/times.h in VxWorks 7 + * to avoid conflict with MPL operator times + */ +#if (_WRS_VXWORKS_MAJOR < 7) +#ifdef __cplusplus -// vxWorks does provide neither struct tms nor function times()! +// vxWorks provides neither struct tms nor function times()! // We implement an empty dummy-function, simply setting the user // and system time to the half of thew actual system ticks-value // and the child user and system time to 0. @@ -315,7 +310,8 @@ struct tms{ clock_t tms_cstime; // System CPU time of terminated child processes }; -inline clock_t times(struct tms *t){ + + inline clock_t times(struct tms *t){ struct timespec ts; clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts); clock_t ticks(static_cast(static_cast(ts.tv_sec) * CLOCKS_PER_SEC + @@ -327,7 +323,16 @@ inline clock_t times(struct tms *t){ return ticks; } -} // extern "C" + +namespace std { + using ::times; +} +#endif // __cplusplus +#endif // _WRS_VXWORKS_MAJOR < 7 + + +#ifdef __cplusplus +extern "C" void bzero (void *, size_t); // FD_ZERO uses bzero() but doesn't include strings.h // Put the selfmade functions into the std-namespace, just in case namespace std { @@ -338,9 +343,11 @@ namespace std { using ::truncate; using ::symlink; using ::readlink; - using ::times; - using ::gettimeofday; +#if (_WRS_VXWORKS_MAJOR < 7) + using ::gettimeofday; +#endif } +#endif // __cplusplus // Some more macro-magic: // vxWorks-around: Some functions are not present or broken in vxWorks @@ -348,22 +355,79 @@ namespace std { // Include signal.h which might contain a typo to be corrected here #include - +#if (_WRS_VXWORKS_MAJOR < 7) #define getpagesize() sysconf(_SC_PAGESIZE) // getpagesize is deprecated anyway! +inline int lstat(p, b) { return stat(p, b); } // lstat() == stat(), as vxWorks has no symlinks! +#endif #ifndef S_ISSOCK # define S_ISSOCK(mode) ((mode & S_IFMT) == S_IFSOCK) // Is file a socket? #endif -#define lstat(p, b) stat(p, b) // lstat() == stat(), as vxWorks has no symlinks! #ifndef FPE_FLTINV # define FPE_FLTINV (FPE_FLTSUB+1) // vxWorks has no FPE_FLTINV, so define one as a dummy #endif #if !defined(BUS_ADRALN) && defined(BUS_ADRALNR) # define BUS_ADRALN BUS_ADRALNR // Correct a supposed typo in vxWorks' #endif -//typedef int locale_t; // locale_t is a POSIX-extension, currently unpresent in vxWorks! +typedef int locale_t; // locale_t is a POSIX-extension, currently not present in vxWorks! // #include boilerplate code: -#include +#include // vxWorks lies about XSI conformance, there is no nl_types.h: #undef BOOST_HAS_NL_TYPES_H + +// vxWorks 7 adds C++11 support +// however it is optional, and does not match exactly the support determined +// by examining the Dinkum STL version and GCC version (or ICC and DCC) +#ifndef _WRS_CONFIG_LANG_LIB_CPLUS_CPLUS_USER_2011 +# define BOOST_NO_CXX11_ADDRESSOF // C11 addressof operator on memory location +# define BOOST_NO_CXX11_ALLOCATOR +# define BOOST_NO_CXX11_ATOMIC_SMART_PTR +# define BOOST_NO_CXX11_NUMERIC_LIMITS // max_digits10 in test/../print_helper.hpp +# define BOOST_NO_CXX11_SMART_PTR +# define BOOST_NO_CXX11_STD_ALIGN + + +# define BOOST_NO_CXX11_HDR_ARRAY +# define BOOST_NO_CXX11_HDR_ATOMIC +# define BOOST_NO_CXX11_HDR_CHRONO +# define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE +# define BOOST_NO_CXX11_HDR_FORWARD_LIST //serialization/test/test_list.cpp +# define BOOST_NO_CXX11_HDR_FUNCTIONAL +# define BOOST_NO_CXX11_HDR_FUTURE +# define BOOST_NO_CXX11_HDR_MUTEX +# define BOOST_NO_CXX11_HDR_RANDOM //math/../test_data.hpp +# define BOOST_NO_CXX11_HDR_RATIO +# define BOOST_NO_CXX11_HDR_REGEX +# define BOOST_NO_CXX14_HDR_SHARED_MUTEX +# define BOOST_NO_CXX11_HDR_SYSTEM_ERROR +# define BOOST_NO_CXX11_HDR_THREAD +# define BOOST_NO_CXX11_HDR_TYPEINDEX +# define BOOST_NO_CXX11_HDR_TYPE_TRAITS +# define BOOST_NO_CXX11_HDR_TUPLE +# define BOOST_NO_CXX11_HDR_UNORDERED_MAP +# define BOOST_NO_CXX11_HDR_UNORDERED_SET +#else +#ifndef BOOST_SYSTEM_NO_DEPRECATED +# define BOOST_SYSTEM_NO_DEPRECATED // workaround link error in spirit +#endif +#endif + + +// NONE is used in enums in lamda and other libraries +#undef NONE +// restrict is an iostreams class +#undef restrict + +// use fake poll() from Unix layer in ASIO to get full functionality +// most libraries will use select() but this define allows 'iostream' functionality +// which is based on poll() only +#if (_WRS_VXWORKS_MAJOR > 6) +# ifndef BOOST_ASIO_HAS_POSIX_STREAM_DESCRIPTOR +# define BOOST_ASIO_HAS_POSIX_STREAM_DESCRIPTOR +# endif +#else +# define BOOST_ASIO_DISABLE_SERIAL_PORT +#endif + + diff --git a/third_party/boost_parts/boost/config/platform/zos.hpp b/third_party/boost_parts/boost/config/platform/zos.hpp new file mode 100644 index 00000000..fa77999e --- /dev/null +++ b/third_party/boost_parts/boost/config/platform/zos.hpp @@ -0,0 +1,32 @@ +// Copyright (c) 2017 Dynatrace +// +// Distributed under the Boost Software License, Version 1.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. + +// Platform setup for IBM z/OS. + +#define BOOST_PLATFORM "IBM z/OS" + +#include // For __UU, __C99, __TR1, ... + +#if defined(__UU) +# define BOOST_HAS_GETTIMEOFDAY +#endif + +#if defined(_OPEN_THREADS) || defined(__SUSV3_THR) +# define BOOST_HAS_PTHREADS +# define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE +# define BOOST_HAS_THREADS +#endif + +#if defined(__SUSV3) || defined(__SUSV3_THR) +# define BOOST_HAS_SCHED_YIELD +#endif + +#define BOOST_HAS_SIGACTION +#define BOOST_HAS_UNISTD_H +#define BOOST_HAS_DIRENT_H +#define BOOST_HAS_NL_TYPES_H diff --git a/third_party/boost_parts/boost/config/pragma_message.hpp b/third_party/boost_parts/boost/config/pragma_message.hpp new file mode 100644 index 00000000..b2c5ff2e --- /dev/null +++ b/third_party/boost_parts/boost/config/pragma_message.hpp @@ -0,0 +1,31 @@ +#ifndef BOOST_CONFIG_PRAGMA_MESSAGE_HPP_INCLUDED +#define BOOST_CONFIG_PRAGMA_MESSAGE_HPP_INCLUDED + +// Copyright 2017 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 +// +// BOOST_PRAGMA_MESSAGE("message") +// +// Expands to the equivalent of #pragma message("message") +// +// Note that this header is C compatible. + +#include + +#if defined(BOOST_DISABLE_PRAGMA_MESSAGE) +# define BOOST_PRAGMA_MESSAGE(x) +#elif defined(__INTEL_COMPILER) +# define BOOST_PRAGMA_MESSAGE(x) __pragma(message(__FILE__ "(" BOOST_STRINGIZE(__LINE__) "): note: " x)) +#elif defined(__GNUC__) +# define BOOST_PRAGMA_MESSAGE(x) _Pragma(BOOST_STRINGIZE(message(x))) +#elif defined(_MSC_VER) +# define BOOST_PRAGMA_MESSAGE(x) __pragma(message(__FILE__ "(" BOOST_STRINGIZE(__LINE__) "): note: " x)) +#else +# define BOOST_PRAGMA_MESSAGE(x) +#endif + +#endif // BOOST_CONFIG_PRAGMA_MESSAGE_HPP_INCLUDED diff --git a/third_party/boost_parts/boost/config/stdlib/dinkumware.hpp b/third_party/boost_parts/boost/config/stdlib/dinkumware.hpp index af8ddda5..641c2ae2 100644 --- a/third_party/boost_parts/boost/config/stdlib/dinkumware.hpp +++ b/third_party/boost_parts/boost/config/stdlib/dinkumware.hpp @@ -96,7 +96,8 @@ #include #endif #include -#if ( (!_HAS_EXCEPTIONS && !defined(__ghs__)) || (!_HAS_NAMESPACE && defined(__ghs__)) ) && !defined(__TI_COMPILER_VERSION__) && !defined(__VISUALDSPVERSION__) +#if ( (!_HAS_EXCEPTIONS && !defined(__ghs__)) || (!_HAS_NAMESPACE && defined(__ghs__)) ) && !defined(__TI_COMPILER_VERSION__) && !defined(__VISUALDSPVERSION__) \ + && !defined(__VXWORKS__) # define BOOST_NO_STD_TYPEINFO #endif @@ -147,16 +148,42 @@ # define BOOST_NO_CXX11_STD_ALIGN #endif +// Before 650 std::pointer_traits has a broken rebind template +#if !defined(_CPPLIB_VER) || _CPPLIB_VER < 650 +# define BOOST_NO_CXX11_POINTER_TRAITS +#elif defined(BOOST_MSVC) && BOOST_MSVC < 1910 +# define BOOST_NO_CXX11_POINTER_TRAITS +#endif + #if defined(__has_include) #if !__has_include() # define BOOST_NO_CXX14_HDR_SHARED_MUTEX -#elif __cplusplus < 201402 +#elif (__cplusplus < 201402) && !defined(_MSC_VER) # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif #elif !defined(_CPPLIB_VER) || (_CPPLIB_VER < 650) # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif +// C++14 features +#if !defined(_CPPLIB_VER) || (_CPPLIB_VER < 650) +# define BOOST_NO_CXX14_STD_EXCHANGE +#endif + +// C++17 features +#if !defined(_CPPLIB_VER) || (_CPPLIB_VER < 650) || !defined(BOOST_MSVC) || (BOOST_MSVC < 1910) || !defined(_HAS_CXX17) || (_HAS_CXX17 == 0) +# define BOOST_NO_CXX17_STD_APPLY +# define BOOST_NO_CXX17_ITERATOR_TRAITS +#endif +#if !defined(_CPPLIB_VER) || (_CPPLIB_VER < 650) +# define BOOST_NO_CXX17_STD_INVOKE +#endif + +#if !(!defined(_CPPLIB_VER) || (_CPPLIB_VER < 650) || !defined(BOOST_MSVC) || (BOOST_MSVC < 1912) || !defined(_HAS_CXX17) || (_HAS_CXX17 == 0)) +// Deprecated std::iterator: +# define BOOST_NO_STD_ITERATOR +#endif + #if defined(BOOST_INTEL) && (BOOST_INTEL <= 1400) // Intel's compiler can't handle this header yet: # define BOOST_NO_CXX11_HDR_ATOMIC @@ -177,14 +204,47 @@ #endif #if defined(_CPPLIB_VER) && (_CPPLIB_VER >= 650) -// If _HAS_AUTO_PTR_ETC is defined to 0, std::auto_ptr is not available. +// If _HAS_AUTO_PTR_ETC is defined to 0, std::auto_ptr and std::random_shuffle are not available. // See https://www.visualstudio.com/en-us/news/vs2015-vs.aspx#C++ // and http://blogs.msdn.com/b/vcblog/archive/2015/06/19/c-11-14-17-features-in-vs-2015-rtm.aspx # if defined(_HAS_AUTO_PTR_ETC) && (_HAS_AUTO_PTR_ETC == 0) # define BOOST_NO_AUTO_PTR +# define BOOST_NO_CXX98_RANDOM_SHUFFLE +# define BOOST_NO_CXX98_FUNCTION_BASE +# define BOOST_NO_CXX98_BINDERS # endif #endif + +// +// Things not supported by the CLR: +#ifdef _M_CEE +#ifndef BOOST_NO_CXX11_HDR_MUTEX +# define BOOST_NO_CXX11_HDR_MUTEX +#endif +#ifndef BOOST_NO_CXX11_HDR_ATOMIC +# define BOOST_NO_CXX11_HDR_ATOMIC +#endif +#ifndef BOOST_NO_CXX11_HDR_FUTURE +# define BOOST_NO_CXX11_HDR_FUTURE +#endif +#ifndef BOOST_NO_CXX11_HDR_CONDITION_VARIABLE +# define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE +#endif +#ifndef BOOST_NO_CXX11_HDR_THREAD +# define BOOST_NO_CXX11_HDR_THREAD +#endif +#ifndef BOOST_NO_CXX14_HDR_SHARED_MUTEX +# define BOOST_NO_CXX14_HDR_SHARED_MUTEX +#endif +#ifndef BOOST_NO_CXX14_STD_EXCHANGE +# define BOOST_NO_CXX14_STD_EXCHANGE +#endif +#ifndef BOOST_NO_FENV_H +# define BOOST_NO_FENV_H +#endif +#endif + #ifdef _CPPLIB_VER # define BOOST_DINKUMWARE_STDLIB _CPPLIB_VER #else diff --git a/third_party/boost_parts/boost/config/stdlib/libcomo.hpp b/third_party/boost_parts/boost/config/stdlib/libcomo.hpp index 941498d0..75ac2bb7 100644 --- a/third_party/boost_parts/boost/config/stdlib/libcomo.hpp +++ b/third_party/boost_parts/boost/config/stdlib/libcomo.hpp @@ -55,6 +55,7 @@ # define BOOST_NO_CXX11_HDR_UNORDERED_SET # define BOOST_NO_CXX11_NUMERIC_LIMITS # define BOOST_NO_CXX11_ALLOCATOR +# define BOOST_NO_CXX11_POINTER_TRAITS # define BOOST_NO_CXX11_ATOMIC_SMART_PTR # define BOOST_NO_CXX11_SMART_PTR # define BOOST_NO_CXX11_HDR_FUNCTIONAL @@ -72,6 +73,14 @@ # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif +// C++14 features +# define BOOST_NO_CXX14_STD_EXCHANGE + +// C++17 features +# define BOOST_NO_CXX17_STD_APPLY +# define BOOST_NO_CXX17_STD_INVOKE +# define BOOST_NO_CXX17_ITERATOR_TRAITS + // // Intrinsic type_traits support. // The SGI STL has it's own __type_traits class, which diff --git a/third_party/boost_parts/boost/config/stdlib/libcpp.hpp b/third_party/boost_parts/boost/config/stdlib/libcpp.hpp index 645bb63b..1e77dca3 100644 --- a/third_party/boost_parts/boost/config/stdlib/libcpp.hpp +++ b/third_party/boost_parts/boost/config/stdlib/libcpp.hpp @@ -29,13 +29,18 @@ // aliases since members rebind_alloc and rebind_traits require it. #if defined(_LIBCPP_HAS_NO_TEMPLATE_ALIASES) # define BOOST_NO_CXX11_ALLOCATOR +# define BOOST_NO_CXX11_POINTER_TRAITS #endif #if __cplusplus < 201103 -# define BOOST_NO_CXX11_HDR_ARRAY +// +// These two appear to be somewhat useable in C++03 mode, there may be others... +// +//# define BOOST_NO_CXX11_HDR_ARRAY +//# define BOOST_NO_CXX11_HDR_FORWARD_LIST + # define BOOST_NO_CXX11_HDR_CODECVT # define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE -# define BOOST_NO_CXX11_HDR_FORWARD_LIST # define BOOST_NO_CXX11_HDR_INITIALIZER_LIST # define BOOST_NO_CXX11_HDR_MUTEX # define BOOST_NO_CXX11_HDR_RANDOM @@ -49,6 +54,7 @@ # define BOOST_NO_CXX11_HDR_UNORDERED_SET # define BOOST_NO_CXX11_NUMERIC_LIMITS # define BOOST_NO_CXX11_ALLOCATOR +# define BOOST_NO_CXX11_POINTER_TRAITS # define BOOST_NO_CXX11_SMART_PTR # define BOOST_NO_CXX11_HDR_FUNCTIONAL # define BOOST_NO_CXX11_STD_ALIGN @@ -75,6 +81,45 @@ #define BOOST_NO_STD_MESSAGES #endif +// C++14 features +#if (_LIBCPP_VERSION < 3700) || (__cplusplus <= 201402L) +# define BOOST_NO_CXX14_STD_EXCHANGE +#endif + +// C++17 features +#if (_LIBCPP_VERSION < 3700) || (__cplusplus <= 201402L) +# define BOOST_NO_CXX17_STD_INVOKE +#endif +#if (_LIBCPP_VERSION < 4000) || (__cplusplus <= 201402L) +# define BOOST_NO_CXX17_STD_APPLY +#endif +#if (_LIBCPP_VERSION > 4000) && (__cplusplus > 201402L) && !defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) +# define BOOST_NO_AUTO_PTR +#endif +#if (_LIBCPP_VERSION > 4000) && (__cplusplus > 201402L) && !defined(_LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE) +# define BOOST_NO_CXX98_RANDOM_SHUFFLE +#endif +#if (_LIBCPP_VERSION > 4000) && (__cplusplus > 201402L) && !defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS) +# define BOOST_NO_CXX98_BINDERS +#endif + +#define BOOST_NO_CXX17_ITERATOR_TRAITS + +#if (_LIBCPP_VERSION <= 1101) && !defined(BOOST_NO_CXX11_THREAD_LOCAL) +// This is a bit of a sledgehammer, because really it's just libc++abi that has no +// support for thread_local, leading to linker errors such as +// "undefined reference to `__cxa_thread_atexit'". It is fixed in the +// most recent releases of libc++abi though... +# define BOOST_NO_CXX11_THREAD_LOCAL +#endif + +#if defined(__linux__) && !defined(BOOST_NO_CXX11_THREAD_LOCAL) +// After libc++-dev is installed on Trusty, clang++-libc++ almost works, +// except uses of `thread_local` fail with undefined reference to +// `__cxa_thread_atexit`. +# define BOOST_NO_CXX11_THREAD_LOCAL +#endif + #if defined(__has_include) #if !__has_include() # define BOOST_NO_CXX14_HDR_SHARED_MUTEX diff --git a/third_party/boost_parts/boost/config/stdlib/libstdcpp3.hpp b/third_party/boost_parts/boost/config/stdlib/libstdcpp3.hpp index 9718bedc..e99fe316 100644 --- a/third_party/boost_parts/boost/config/stdlib/libstdcpp3.hpp +++ b/third_party/boost_parts/boost/config/stdlib/libstdcpp3.hpp @@ -78,6 +78,7 @@ # include #endif +#ifndef __VXWORKS__ // VxWorks uses Dinkum, not GNU STL with GCC #if defined(__GLIBCXX__) || (defined(__GLIBCPP__) && __GLIBCPP__>=20020514) // GCC >= 3.1.0 # define BOOST_STD_EXTENSION_NAMESPACE __gnu_cxx # define BOOST_HAS_SLIST @@ -91,6 +92,7 @@ # define BOOST_HASH_MAP_HEADER # endif #endif +#endif // // Decide whether we have C++11 support turned on: @@ -98,10 +100,11 @@ #if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103) # define BOOST_LIBSTDCXX11 #endif + // // Decide which version of libstdc++ we have, normally -// stdlibc++ C++0x support is detected via __GNUC__, __GNUC_MINOR__, and possibly -// __GNUC_PATCHLEVEL__ at the suggestion of Jonathan Wakely, one of the stdlibc++ +// libstdc++ C++0x support is detected via __GNUC__, __GNUC_MINOR__, and possibly +// __GNUC_PATCHLEVEL__ at the suggestion of Jonathan Wakely, one of the libstdc++ // developers. He also commented: // // "I'm not sure how useful __GLIBCXX__ is for your purposes, for instance in @@ -109,7 +112,7 @@ // Although 4.3.0 was released earlier than 4.2.4, it has better C++0x support // than any release in the 4.2 series." // -// Another resource for understanding stdlibc++ features is: +// Another resource for understanding libstdc++ features is: // http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#manual.intro.status.standard.200x // // However, using the GCC version number fails when the compiler is clang since this @@ -122,7 +125,9 @@ // #ifdef __clang__ -#if __has_include() +#if __has_include() +# define BOOST_LIBSTDCXX_VERSION 60100 +#elif __has_include() # define BOOST_LIBSTDCXX_VERSION 50100 #elif __has_include() # define BOOST_LIBSTDCXX_VERSION 40900 @@ -139,6 +144,38 @@ #elif __has_include() # define BOOST_LIBSTDCXX_VERSION 40300 #endif + +#if (BOOST_LIBSTDCXX_VERSION < 50100) +// libstdc++ does not define this function as it's deprecated in C++11, but clang still looks for it, +// defining it here is a terrible cludge, but should get things working: +extern "C" char *gets (char *__s); +#endif +// +// clang is unable to parse some GCC headers, add those workarounds here: +// +#if BOOST_LIBSTDCXX_VERSION < 50000 +# define BOOST_NO_CXX11_HDR_REGEX +#endif +// +// GCC 4.7.x has no __cxa_thread_atexit which +// thread_local objects require for cleanup: +// +#if BOOST_LIBSTDCXX_VERSION < 40800 +# define BOOST_NO_CXX11_THREAD_LOCAL +#endif +// +// Early clang versions can handle , not exactly sure which versions +// but certainly up to clang-3.8 and gcc-4.6: +// +#if (__clang_major__ < 5) +# if BOOST_LIBSTDCXX_VERSION < 40800 +# define BOOST_NO_CXX11_HDR_FUTURE +# define BOOST_NO_CXX11_HDR_MUTEX +# define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE +# define BOOST_NO_CXX11_HDR_CHRONO +# endif +#endif + // // GCC 4.8 and 9 add working versions of and respectively. // However, we have no test for these as the headers were present but broken @@ -151,13 +188,29 @@ // Oracle Solaris compiler uses it's own verison of libstdc++ but doesn't // set __GNUC__ // +#if __SUNPRO_CC >= 0x5140 +#define BOOST_LIBSTDCXX_VERSION 50100 +#else #define BOOST_LIBSTDCXX_VERSION 40800 #endif +#endif #if !defined(BOOST_LIBSTDCXX_VERSION) # define BOOST_LIBSTDCXX_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) #endif +// std::auto_ptr isn't provided with _GLIBCXX_DEPRECATED=0 (GCC 4.5 and earlier) +// or _GLIBCXX_USE_DEPRECATED=0 (GCC 4.6 and later). +#if defined(BOOST_LIBSTDCXX11) +# if BOOST_LIBSTDCXX_VERSION < 40600 +# if !_GLIBCXX_DEPRECATED +# define BOOST_NO_AUTO_PTR +# endif +# elif !_GLIBCXX_USE_DEPRECATED +# define BOOST_NO_AUTO_PTR +# endif +#endif + // C++0x headers in GCC 4.3.0 and later // #if (BOOST_LIBSTDCXX_VERSION < 40300) || !defined(BOOST_LIBSTDCXX11) @@ -196,15 +249,17 @@ #if (BOOST_LIBSTDCXX_VERSION < 40600) || !defined(BOOST_LIBSTDCXX11) # define BOOST_NO_CXX11_HDR_TYPEINDEX # define BOOST_NO_CXX11_ADDRESSOF +# define BOOST_NO_CXX17_ITERATOR_TRAITS #endif // C++0x features in GCC 4.7.0 and later // #if (BOOST_LIBSTDCXX_VERSION < 40700) || !defined(BOOST_LIBSTDCXX11) // Note that although existed prior to 4.7, "steady_clock" is spelled "monotonic_clock" -// so 4.7.0 is the first truely conforming one. +// so 4.7.0 is the first truly conforming one. # define BOOST_NO_CXX11_HDR_CHRONO # define BOOST_NO_CXX11_ALLOCATOR +# define BOOST_NO_CXX11_POINTER_TRAITS #endif // C++0x features in GCC 4.8.0 and later // @@ -220,6 +275,9 @@ // even for the simplest patterns such as "\d" or "[0-9]". This is the case at least in gcc up to 4.8, inclusively. # define BOOST_NO_CXX11_HDR_REGEX #endif +#if (BOOST_LIBSTDCXX_VERSION < 40900) || (__cplusplus <= 201103) +# define BOOST_NO_CXX14_STD_EXCHANGE +#endif #if defined(__clang_major__) && ((__clang_major__ < 3) || ((__clang_major__ == 3) && (__clang_minor__ < 7))) // As of clang-3.6, libstdc++ header throws up errors with clang: @@ -235,6 +293,16 @@ # define BOOST_NO_CXX11_STD_ALIGN #endif +// +// C++17 features in GCC 6.1 and later +// +#if (BOOST_LIBSTDCXX_VERSION < 60100) || (__cplusplus <= 201402L) +# define BOOST_NO_CXX17_STD_INVOKE +#endif +#if (BOOST_LIBSTDCXX_VERSION < 70100) || (__cplusplus <= 201402L) +# define BOOST_NO_CXX17_STD_APPLY +#endif + #if defined(__has_include) #if !__has_include() # define BOOST_NO_CXX14_HDR_SHARED_MUTEX @@ -247,7 +315,7 @@ // // Headers not present on Solaris with the Oracle compiler: -#if defined(__SUNPRO_CC) +#if defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x5140) #define BOOST_NO_CXX11_HDR_FUTURE #define BOOST_NO_CXX11_HDR_FORWARD_LIST #define BOOST_NO_CXX11_HDR_ATOMIC diff --git a/third_party/boost_parts/boost/config/stdlib/modena.hpp b/third_party/boost_parts/boost/config/stdlib/modena.hpp index 7a85e0cd..81919e01 100644 --- a/third_party/boost_parts/boost/config/stdlib/modena.hpp +++ b/third_party/boost_parts/boost/config/stdlib/modena.hpp @@ -44,6 +44,7 @@ # define BOOST_NO_CXX11_HDR_UNORDERED_SET # define BOOST_NO_CXX11_NUMERIC_LIMITS # define BOOST_NO_CXX11_ALLOCATOR +# define BOOST_NO_CXX11_POINTER_TRAITS # define BOOST_NO_CXX11_ATOMIC_SMART_PTR # define BOOST_NO_CXX11_SMART_PTR # define BOOST_NO_CXX11_HDR_FUNCTIONAL @@ -61,6 +62,14 @@ # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif +// C++14 features +# define BOOST_NO_CXX14_STD_EXCHANGE + +// C++17 features +# define BOOST_NO_CXX17_STD_APPLY +# define BOOST_NO_CXX17_STD_INVOKE +# define BOOST_NO_CXX17_ITERATOR_TRAITS + #define BOOST_STDLIB "Modena C++ standard library" diff --git a/third_party/boost_parts/boost/config/stdlib/msl.hpp b/third_party/boost_parts/boost/config/stdlib/msl.hpp index dd2775e1..0e2e2afe 100644 --- a/third_party/boost_parts/boost/config/stdlib/msl.hpp +++ b/third_party/boost_parts/boost/config/stdlib/msl.hpp @@ -34,7 +34,7 @@ # define BOOST_HAS_UNISTD_H # endif // boilerplate code: -# include +# include #endif #if defined(_MWMT) || _MSL_THREADSAFE @@ -68,6 +68,7 @@ # define BOOST_NO_CXX11_HDR_UNORDERED_SET # define BOOST_NO_CXX11_NUMERIC_LIMITS # define BOOST_NO_CXX11_ALLOCATOR +# define BOOST_NO_CXX11_POINTER_TRAITS # define BOOST_NO_CXX11_ATOMIC_SMART_PTR # define BOOST_NO_CXX11_SMART_PTR # define BOOST_NO_CXX11_HDR_FUNCTIONAL @@ -85,4 +86,12 @@ # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif +// C++14 features +# define BOOST_NO_CXX14_STD_EXCHANGE + +// C++17 features +# define BOOST_NO_CXX17_STD_APPLY +# define BOOST_NO_CXX17_STD_INVOKE +# define BOOST_NO_CXX17_ITERATOR_TRAITS + #define BOOST_STDLIB "Metrowerks Standard Library version " BOOST_STRINGIZE(__MSL_CPP__) diff --git a/third_party/boost_parts/boost/config/stdlib/roguewave.hpp b/third_party/boost_parts/boost/config/stdlib/roguewave.hpp index 97a2b0b9..df602155 100644 --- a/third_party/boost_parts/boost/config/stdlib/roguewave.hpp +++ b/third_party/boost_parts/boost/config/stdlib/roguewave.hpp @@ -180,6 +180,7 @@ # define BOOST_NO_CXX11_HDR_UNORDERED_SET # define BOOST_NO_CXX11_NUMERIC_LIMITS # define BOOST_NO_CXX11_ALLOCATOR +# define BOOST_NO_CXX11_POINTER_TRAITS # define BOOST_NO_CXX11_ATOMIC_SMART_PTR # define BOOST_NO_CXX11_SMART_PTR # define BOOST_NO_CXX11_HDR_FUNCTIONAL @@ -196,3 +197,11 @@ #else # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif + +// C++14 features +# define BOOST_NO_CXX14_STD_EXCHANGE + +// C++17 features +# define BOOST_NO_CXX17_STD_APPLY +# define BOOST_NO_CXX17_STD_INVOKE +# define BOOST_NO_CXX17_ITERATOR_TRAITS diff --git a/third_party/boost_parts/boost/config/stdlib/sgi.hpp b/third_party/boost_parts/boost/config/stdlib/sgi.hpp index c8052717..0c8ab2e4 100644 --- a/third_party/boost_parts/boost/config/stdlib/sgi.hpp +++ b/third_party/boost_parts/boost/config/stdlib/sgi.hpp @@ -138,6 +138,7 @@ # define BOOST_NO_CXX11_HDR_UNORDERED_SET # define BOOST_NO_CXX11_NUMERIC_LIMITS # define BOOST_NO_CXX11_ALLOCATOR +# define BOOST_NO_CXX11_POINTER_TRAITS # define BOOST_NO_CXX11_ATOMIC_SMART_PTR # define BOOST_NO_CXX11_SMART_PTR # define BOOST_NO_CXX11_HDR_FUNCTIONAL @@ -155,4 +156,12 @@ # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif -#define BOOST_STDLIB "SGI standard library" \ No newline at end of file +// C++14 features +# define BOOST_NO_CXX14_STD_EXCHANGE + +// C++17 features +# define BOOST_NO_CXX17_STD_APPLY +# define BOOST_NO_CXX17_STD_INVOKE +# define BOOST_NO_CXX17_ITERATOR_TRAITS + +#define BOOST_STDLIB "SGI standard library" diff --git a/third_party/boost_parts/boost/config/stdlib/stlport.hpp b/third_party/boost_parts/boost/config/stdlib/stlport.hpp index bbc4176c..2e304e2b 100644 --- a/third_party/boost_parts/boost/config/stdlib/stlport.hpp +++ b/third_party/boost_parts/boost/config/stdlib/stlport.hpp @@ -228,6 +228,7 @@ namespace boost { using std::min; using std::max; } # define BOOST_NO_CXX11_HDR_UNORDERED_SET # define BOOST_NO_CXX11_NUMERIC_LIMITS # define BOOST_NO_CXX11_ALLOCATOR +# define BOOST_NO_CXX11_POINTER_TRAITS # define BOOST_NO_CXX11_ATOMIC_SMART_PTR # define BOOST_NO_CXX11_SMART_PTR # define BOOST_NO_CXX11_HDR_FUNCTIONAL @@ -245,4 +246,12 @@ namespace boost { using std::min; using std::max; } # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif +// C++14 features +# define BOOST_NO_CXX14_STD_EXCHANGE + +// C++17 features +# define BOOST_NO_CXX17_STD_APPLY +# define BOOST_NO_CXX17_STD_INVOKE +# define BOOST_NO_CXX17_ITERATOR_TRAITS + #define BOOST_STDLIB "STLPort standard library version " BOOST_STRINGIZE(__SGI_STL_PORT) diff --git a/third_party/boost_parts/boost/config/stdlib/vacpp.hpp b/third_party/boost_parts/boost/config/stdlib/vacpp.hpp index 4ccd0d24..c4e1fb18 100644 --- a/third_party/boost_parts/boost/config/stdlib/vacpp.hpp +++ b/third_party/boost_parts/boost/config/stdlib/vacpp.hpp @@ -44,6 +44,7 @@ # define BOOST_NO_CXX11_HDR_UNORDERED_SET # define BOOST_NO_CXX11_NUMERIC_LIMITS # define BOOST_NO_CXX11_ALLOCATOR +# define BOOST_NO_CXX11_POINTER_TRAITS # define BOOST_NO_CXX11_ATOMIC_SMART_PTR # define BOOST_NO_CXX11_SMART_PTR # define BOOST_NO_CXX11_HDR_FUNCTIONAL @@ -61,4 +62,12 @@ # define BOOST_NO_CXX14_HDR_SHARED_MUTEX #endif +// C++14 features +# define BOOST_NO_CXX14_STD_EXCHANGE + +// C++17 features +# define BOOST_NO_CXX17_STD_APPLY +# define BOOST_NO_CXX17_STD_INVOKE +# define BOOST_NO_CXX17_ITERATOR_TRAITS + #define BOOST_STDLIB "Visual Age default standard library" diff --git a/third_party/boost_parts/boost/config/stdlib/xlcpp_zos.hpp b/third_party/boost_parts/boost/config/stdlib/xlcpp_zos.hpp new file mode 100644 index 00000000..4d5beb18 --- /dev/null +++ b/third_party/boost_parts/boost/config/stdlib/xlcpp_zos.hpp @@ -0,0 +1,60 @@ +// Copyright (c) 2017 Dynatrace +// +// Distributed under the Boost Software License, Version 1.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. + +// Standard library setup for IBM z/OS XL C/C++ compiler. + +// Oldest library version currently supported is 2.1 (V2R1) +#if __TARGET_LIB__ < 0x42010000 +# error "Library version not supported or configured - please reconfigure" +#endif + +#if __TARGET_LIB__ > 0x42010000 +# if defined(BOOST_ASSERT_CONFIG) +# error "Unknown library version - please run the configure tests and report the results" +# endif +#endif + +#define BOOST_STDLIB "IBM z/OS XL C/C++ standard library" + +#define BOOST_HAS_MACRO_USE_FACET + +#define BOOST_NO_CXX11_HDR_TYPE_TRAITS +#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST + +#define BOOST_NO_CXX11_ADDRESSOF +#define BOOST_NO_CXX11_SMART_PTR +#define BOOST_NO_CXX11_ATOMIC_SMART_PTR +#define BOOST_NO_CXX11_NUMERIC_LIMITS +#define BOOST_NO_CXX11_ALLOCATOR +#define BOOST_NO_CXX11_POINTER_TRAITS +#define BOOST_NO_CXX11_HDR_FUNCTIONAL +#define BOOST_NO_CXX11_HDR_UNORDERED_SET +#define BOOST_NO_CXX11_HDR_UNORDERED_MAP +#define BOOST_NO_CXX11_HDR_TYPEINDEX +#define BOOST_NO_CXX11_HDR_TUPLE +#define BOOST_NO_CXX11_HDR_THREAD +#define BOOST_NO_CXX11_HDR_SYSTEM_ERROR +#define BOOST_NO_CXX11_HDR_REGEX +#define BOOST_NO_CXX11_HDR_RATIO +#define BOOST_NO_CXX11_HDR_RANDOM +#define BOOST_NO_CXX11_HDR_MUTEX +#define BOOST_NO_CXX11_HDR_FUTURE +#define BOOST_NO_CXX11_HDR_FORWARD_LIST +#define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE +#define BOOST_NO_CXX11_HDR_CODECVT +#define BOOST_NO_CXX11_HDR_CHRONO +#define BOOST_NO_CXX11_HDR_ATOMIC +#define BOOST_NO_CXX11_HDR_ARRAY +#define BOOST_NO_CXX11_STD_ALIGN + +#define BOOST_NO_CXX14_STD_EXCHANGE +#define BOOST_NO_CXX14_HDR_SHARED_MUTEX + +#define BOOST_NO_CXX17_STD_INVOKE +#define BOOST_NO_CXX17_STD_APPLY +#define BOOST_NO_CXX17_ITERATOR_TRAITS diff --git a/third_party/boost_parts/boost/config/workaround.hpp b/third_party/boost_parts/boost/config/workaround.hpp new file mode 100644 index 00000000..fca8f3ab --- /dev/null +++ b/third_party/boost_parts/boost/config/workaround.hpp @@ -0,0 +1,279 @@ +// 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) +#ifndef BOOST_CONFIG_WORKAROUND_HPP +#define BOOST_CONFIG_WORKAROUND_HPP + +// Compiler/library version workaround macro +// +// Usage: +// +// #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) +// // workaround for eVC4 and VC6 +// ... // workaround code here +// #endif +// +// When BOOST_STRICT_CONFIG is defined, expands to 0. Otherwise, the +// first argument must be undefined or expand to a numeric +// value. The above expands to: +// +// (BOOST_MSVC) != 0 && (BOOST_MSVC) < 1300 +// +// When used for workarounds that apply to the latest known version +// and all earlier versions of a compiler, the following convention +// should be observed: +// +// #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1301)) +// +// The version number in this case corresponds to the last version in +// which the workaround was known to have been required. When +// BOOST_DETECT_OUTDATED_WORKAROUNDS is not the defined, the macro +// BOOST_TESTED_AT(x) expands to "!= 0", which effectively activates +// the workaround for any version of the compiler. When +// BOOST_DETECT_OUTDATED_WORKAROUNDS is defined, a compiler warning or +// error will be issued if the compiler version exceeds the argument +// to BOOST_TESTED_AT(). This can be used to locate workarounds which +// may be obsoleted by newer versions. + +#ifndef BOOST_STRICT_CONFIG + +#include + +#ifndef __BORLANDC__ +#define __BORLANDC___WORKAROUND_GUARD 1 +#else +#define __BORLANDC___WORKAROUND_GUARD 0 +#endif +#ifndef __CODEGEARC__ +#define __CODEGEARC___WORKAROUND_GUARD 1 +#else +#define __CODEGEARC___WORKAROUND_GUARD 0 +#endif +#ifndef _MSC_VER +#define _MSC_VER_WORKAROUND_GUARD 1 +#else +#define _MSC_VER_WORKAROUND_GUARD 0 +#endif +#ifndef _MSC_FULL_VER +#define _MSC_FULL_VER_WORKAROUND_GUARD 1 +#else +#define _MSC_FULL_VER_WORKAROUND_GUARD 0 +#endif +#ifndef BOOST_MSVC +#define BOOST_MSVC_WORKAROUND_GUARD 1 +#else +#define BOOST_MSVC_WORKAROUND_GUARD 0 +#endif +#ifndef BOOST_MSVC_FULL_VER +#define BOOST_MSVC_FULL_VER_WORKAROUND_GUARD 1 +#else +#define BOOST_MSVC_FULL_VER_WORKAROUND_GUARD 0 +#endif +#ifndef __GNUC__ +#define __GNUC___WORKAROUND_GUARD 1 +#else +#define __GNUC___WORKAROUND_GUARD 0 +#endif +#ifndef __GNUC_MINOR__ +#define __GNUC_MINOR___WORKAROUND_GUARD 1 +#else +#define __GNUC_MINOR___WORKAROUND_GUARD 0 +#endif +#ifndef __GNUC_PATCHLEVEL__ +#define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 1 +#else +#define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 0 +#endif +#ifndef BOOST_GCC +#define BOOST_GCC_WORKAROUND_GUARD 1 +#define BOOST_GCC_VERSION_WORKAROUND_GUARD 1 +#else +#define BOOST_GCC_WORKAROUND_GUARD 0 +#define BOOST_GCC_VERSION_WORKAROUND_GUARD 0 +#endif +#ifndef BOOST_XLCPP_ZOS +#define BOOST_XLCPP_ZOS_WORKAROUND_GUARD 1 +#else +#define BOOST_XLCPP_ZOS_WORKAROUND_GUARD 0 +#endif +#ifndef __IBMCPP__ +#define __IBMCPP___WORKAROUND_GUARD 1 +#else +#define __IBMCPP___WORKAROUND_GUARD 0 +#endif +#ifndef __SUNPRO_CC +#define __SUNPRO_CC_WORKAROUND_GUARD 1 +#else +#define __SUNPRO_CC_WORKAROUND_GUARD 0 +#endif +#ifndef __DECCXX_VER +#define __DECCXX_VER_WORKAROUND_GUARD 1 +#else +#define __DECCXX_VER_WORKAROUND_GUARD 0 +#endif +#ifndef __MWERKS__ +#define __MWERKS___WORKAROUND_GUARD 1 +#else +#define __MWERKS___WORKAROUND_GUARD 0 +#endif +#ifndef __EDG__ +#define __EDG___WORKAROUND_GUARD 1 +#else +#define __EDG___WORKAROUND_GUARD 0 +#endif +#ifndef __EDG_VERSION__ +#define __EDG_VERSION___WORKAROUND_GUARD 1 +#else +#define __EDG_VERSION___WORKAROUND_GUARD 0 +#endif +#ifndef __HP_aCC +#define __HP_aCC_WORKAROUND_GUARD 1 +#else +#define __HP_aCC_WORKAROUND_GUARD 0 +#endif +#ifndef __hpxstd98 +#define __hpxstd98_WORKAROUND_GUARD 1 +#else +#define __hpxstd98_WORKAROUND_GUARD 0 +#endif +#ifndef _CRAYC +#define _CRAYC_WORKAROUND_GUARD 1 +#else +#define _CRAYC_WORKAROUND_GUARD 0 +#endif +#ifndef __DMC__ +#define __DMC___WORKAROUND_GUARD 1 +#else +#define __DMC___WORKAROUND_GUARD 0 +#endif +#ifndef MPW_CPLUS +#define MPW_CPLUS_WORKAROUND_GUARD 1 +#else +#define MPW_CPLUS_WORKAROUND_GUARD 0 +#endif +#ifndef __COMO__ +#define __COMO___WORKAROUND_GUARD 1 +#else +#define __COMO___WORKAROUND_GUARD 0 +#endif +#ifndef __COMO_VERSION__ +#define __COMO_VERSION___WORKAROUND_GUARD 1 +#else +#define __COMO_VERSION___WORKAROUND_GUARD 0 +#endif +#ifndef __INTEL_COMPILER +#define __INTEL_COMPILER_WORKAROUND_GUARD 1 +#else +#define __INTEL_COMPILER_WORKAROUND_GUARD 0 +#endif +#ifndef __ICL +#define __ICL_WORKAROUND_GUARD 1 +#else +#define __ICL_WORKAROUND_GUARD 0 +#endif +#ifndef _COMPILER_VERSION +#define _COMPILER_VERSION_WORKAROUND_GUARD 1 +#else +#define _COMPILER_VERSION_WORKAROUND_GUARD 0 +#endif + +#ifndef _RWSTD_VER +#define _RWSTD_VER_WORKAROUND_GUARD 1 +#else +#define _RWSTD_VER_WORKAROUND_GUARD 0 +#endif +#ifndef BOOST_RWSTD_VER +#define BOOST_RWSTD_VER_WORKAROUND_GUARD 1 +#else +#define BOOST_RWSTD_VER_WORKAROUND_GUARD 0 +#endif +#ifndef __GLIBCPP__ +#define __GLIBCPP___WORKAROUND_GUARD 1 +#else +#define __GLIBCPP___WORKAROUND_GUARD 0 +#endif +#ifndef _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC +#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 1 +#else +#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 0 +#endif +#ifndef __SGI_STL_PORT +#define __SGI_STL_PORT_WORKAROUND_GUARD 1 +#else +#define __SGI_STL_PORT_WORKAROUND_GUARD 0 +#endif +#ifndef _STLPORT_VERSION +#define _STLPORT_VERSION_WORKAROUND_GUARD 1 +#else +#define _STLPORT_VERSION_WORKAROUND_GUARD 0 +#endif +#ifndef __LIBCOMO_VERSION__ +#define __LIBCOMO_VERSION___WORKAROUND_GUARD 1 +#else +#define __LIBCOMO_VERSION___WORKAROUND_GUARD 0 +#endif +#ifndef _CPPLIB_VER +#define _CPPLIB_VER_WORKAROUND_GUARD 1 +#else +#define _CPPLIB_VER_WORKAROUND_GUARD 0 +#endif + +#ifndef BOOST_INTEL_CXX_VERSION +#define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 1 +#else +#define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 0 +#endif +#ifndef BOOST_INTEL_WIN +#define BOOST_INTEL_WIN_WORKAROUND_GUARD 1 +#else +#define BOOST_INTEL_WIN_WORKAROUND_GUARD 0 +#endif +#ifndef BOOST_DINKUMWARE_STDLIB +#define BOOST_DINKUMWARE_STDLIB_WORKAROUND_GUARD 1 +#else +#define BOOST_DINKUMWARE_STDLIB_WORKAROUND_GUARD 0 +#endif +#ifndef BOOST_INTEL +#define BOOST_INTEL_WORKAROUND_GUARD 1 +#else +#define BOOST_INTEL_WORKAROUND_GUARD 0 +#endif +// Always define to zero, if it's used it'll be defined my MPL: +#define BOOST_MPL_CFG_GCC_WORKAROUND_GUARD 0 + +#define BOOST_WORKAROUND(symbol, test) \ + ((symbol ## _WORKAROUND_GUARD + 0 == 0) && \ + (symbol != 0) && (1 % (( (symbol test) ) + 1))) +// ^ ^ ^ ^ +// The extra level of parenthesis nesting above, along with the +// BOOST_OPEN_PAREN indirection below, is required to satisfy the +// broken preprocessor in MWCW 8.3 and earlier. +// +// The basic mechanism works as follows: +// (symbol test) + 1 => if (symbol test) then 2 else 1 +// 1 % ((symbol test) + 1) => if (symbol test) then 1 else 0 +// +// The complication with % is for cooperation with BOOST_TESTED_AT(). +// When "test" is BOOST_TESTED_AT(x) and +// BOOST_DETECT_OUTDATED_WORKAROUNDS is #defined, +// +// symbol test => if (symbol <= x) then 1 else -1 +// (symbol test) + 1 => if (symbol <= x) then 2 else 0 +// 1 % ((symbol test) + 1) => if (symbol <= x) then 1 else divide-by-zero +// + +#ifdef BOOST_DETECT_OUTDATED_WORKAROUNDS +# define BOOST_OPEN_PAREN ( +# define BOOST_TESTED_AT(value) > value) ?(-1): BOOST_OPEN_PAREN 1 +#else +# define BOOST_TESTED_AT(value) != ((value)-(value)) +#endif + +#else + +#define BOOST_WORKAROUND(symbol, test) 0 + +#endif + +#endif // BOOST_CONFIG_WORKAROUND_HPP diff --git a/third_party/boost_parts/boost/container/allocator_traits.hpp b/third_party/boost_parts/boost/container/allocator_traits.hpp index e6a882e5..af32f182 100644 --- a/third_party/boost_parts/boost/container/allocator_traits.hpp +++ b/third_party/boost_parts/boost/container/allocator_traits.hpp @@ -50,21 +50,21 @@ #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED #define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME allocate -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG namespace boost { namespace container { namespace container_detail { +#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG namespace boost { namespace container { namespace dtl { #define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}} #define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MIN 2 #define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MAX 2 #include #define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME destroy -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG namespace boost { namespace container { namespace container_detail { +#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG namespace boost { namespace container { namespace dtl { #define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}} #define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MIN 1 #define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MAX 1 #include #define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME construct -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG namespace boost { namespace container { namespace container_detail { +#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG namespace boost { namespace container { namespace dtl { #define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}} #define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MIN 1 #define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MAX 9 @@ -87,7 +87,7 @@ BOOST_INTRUSIVE_HAS_STATIC_MEMBER_FUNC_SIGNATURE(has_select_on_container_copy_co } //namespace allocator_traits_detail { -namespace container_detail { +namespace dtl { //workaround needed for C++03 compilers with no construct() //supporting rvalue references @@ -121,7 +121,7 @@ BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(is_always_equal) BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(difference_type) BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(is_partially_propagable) -} //namespace container_detail { +} //namespace dtl { #endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED @@ -196,59 +196,59 @@ struct allocator_traits { typedef see_documentation type; }; #else //pointer - typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::container_detail::, Allocator, + typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, pointer, value_type*) pointer; //const_pointer - typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_EVAL_DEFAULT(boost::container::container_detail::, Allocator, + typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_EVAL_DEFAULT(boost::container::dtl::, Allocator, const_pointer, typename boost::intrusive::pointer_traits::template rebind_pointer) const_pointer; //reference - typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::container_detail::, Allocator, - reference, typename container_detail::unvoid_ref::type) + typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, + reference, typename dtl::unvoid_ref::type) reference; //const_reference - typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::container_detail::, Allocator, - const_reference, typename container_detail::unvoid_ref::type) + typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, + const_reference, typename dtl::unvoid_ref::type) const_reference; //void_pointer - typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_EVAL_DEFAULT(boost::container::container_detail::, Allocator, + typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_EVAL_DEFAULT(boost::container::dtl::, Allocator, void_pointer, typename boost::intrusive::pointer_traits::template rebind_pointer) void_pointer; //const_void_pointer - typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_EVAL_DEFAULT(boost::container::container_detail::, Allocator, + typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_EVAL_DEFAULT(boost::container::dtl::, Allocator, const_void_pointer, typename boost::intrusive::pointer_traits::template rebind_pointer) const_void_pointer; //difference_type - typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::container_detail::, Allocator, + typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, difference_type, std::ptrdiff_t) difference_type; //size_type - typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::container_detail::, Allocator, + typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, size_type, std::size_t) size_type; //propagate_on_container_copy_assignment - typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::container_detail::, Allocator, - propagate_on_container_copy_assignment, container_detail::false_type) + typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, + propagate_on_container_copy_assignment, dtl::false_type) propagate_on_container_copy_assignment; //propagate_on_container_move_assignment - typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::container_detail::, Allocator, - propagate_on_container_move_assignment, container_detail::false_type) + typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, + propagate_on_container_move_assignment, dtl::false_type) propagate_on_container_move_assignment; //propagate_on_container_swap - typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::container_detail::, Allocator, - propagate_on_container_swap, container_detail::false_type) + typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, + propagate_on_container_swap, dtl::false_type) propagate_on_container_swap; //is_always_equal - typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::container_detail::, Allocator, - is_always_equal, container_detail::is_empty) + typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, + is_always_equal, dtl::is_empty) is_always_equal; //is_partially_propagable - typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::container_detail::, Allocator, - is_partially_propagable, container_detail::false_type) + typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::dtl::, Allocator, + is_partially_propagable, dtl::false_type) is_partially_propagable; //rebind_alloc & rebind_traits @@ -289,143 +289,143 @@ struct allocator_traits //! Returns: a.allocate(n) //! - static pointer allocate(Allocator &a, size_type n) + BOOST_CONTAINER_FORCEINLINE static pointer allocate(Allocator &a, size_type n) { return a.allocate(n); } //! Returns: a.deallocate(p, n) //! //! Throws: Nothing - static void deallocate(Allocator &a, pointer p, size_type n) + BOOST_CONTAINER_FORCEINLINE static void deallocate(Allocator &a, pointer p, size_type n) { a.deallocate(p, n); } //! Effects: calls a.allocate(n, p) if that call is well-formed; //! otherwise, invokes a.allocate(n) - static pointer allocate(Allocator &a, size_type n, const_void_pointer p) + BOOST_CONTAINER_FORCEINLINE static pointer allocate(Allocator &a, size_type n, const_void_pointer p) { - const bool value = boost::container::container_detail:: + const bool value = boost::container::dtl:: has_member_function_callable_with_allocate ::value; - container_detail::bool_ flag; + dtl::bool_ flag; return allocator_traits::priv_allocate(flag, a, n, p); } //! Effects: calls a.destroy(p) if that call is well-formed; //! otherwise, invokes p->~T(). template - static void destroy(Allocator &a, T*p) BOOST_NOEXCEPT_OR_NOTHROW + BOOST_CONTAINER_FORCEINLINE static void destroy(Allocator &a, T*p) BOOST_NOEXCEPT_OR_NOTHROW { typedef T* destroy_pointer; - const bool value = boost::container::container_detail:: + const bool value = boost::container::dtl:: has_member_function_callable_with_destroy ::value; - container_detail::bool_ flag; + dtl::bool_ flag; allocator_traits::priv_destroy(flag, a, p); } //! Returns: a.max_size() if that expression is well-formed; otherwise, //! numeric_limits::max(). - static size_type max_size(const Allocator &a) BOOST_NOEXCEPT_OR_NOTHROW + BOOST_CONTAINER_FORCEINLINE static size_type max_size(const Allocator &a) BOOST_NOEXCEPT_OR_NOTHROW { const bool value = allocator_traits_detail::has_max_size::value; - container_detail::bool_ flag; + dtl::bool_ flag; return allocator_traits::priv_max_size(flag, a); } //! Returns: a.select_on_container_copy_construction() if that expression is well-formed; //! otherwise, a. - static BOOST_CONTAINER_DOC1ST(Allocator, - typename container_detail::if_c + BOOST_CONTAINER_FORCEINLINE static BOOST_CONTAINER_DOC1ST(Allocator, + typename dtl::if_c < allocator_traits_detail::has_select_on_container_copy_construction::value BOOST_MOVE_I Allocator BOOST_MOVE_I const Allocator & >::type) select_on_container_copy_construction(const Allocator &a) { const bool value = allocator_traits_detail::has_select_on_container_copy_construction ::value; - container_detail::bool_ flag; + dtl::bool_ flag; return allocator_traits::priv_select_on_container_copy_construction(flag, a); } #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED) //! Effects: calls a.construct(p, std::forward(args)...) if that call is well-formed; - //! otherwise, invokes ::new (static_cast(p)) T(std::forward(args)...) + //! otherwise, invokes `placement new` (static_cast(p)) T(std::forward(args)...) template - static void construct(Allocator & a, T* p, BOOST_FWD_REF(Args)... args) + BOOST_CONTAINER_FORCEINLINE static void construct(Allocator & a, T* p, BOOST_FWD_REF(Args)... args) { static const bool value = ::boost::move_detail::and_ - < container_detail::is_not_std_allocator - , boost::container::container_detail::has_member_function_callable_with_construct + < dtl::is_not_std_allocator + , boost::container::dtl::has_member_function_callable_with_construct < Allocator, T*, Args... > >::value; - container_detail::bool_ flag; + dtl::bool_ flag; allocator_traits::priv_construct(flag, a, p, ::boost::forward(args)...); } #endif //! Returns: a.storage_is_unpropagable(p) if is_partially_propagable::value is true; otherwise, //! false. - static bool storage_is_unpropagable(const Allocator &a, pointer p) BOOST_NOEXCEPT_OR_NOTHROW + BOOST_CONTAINER_FORCEINLINE static bool storage_is_unpropagable(const Allocator &a, pointer p) BOOST_NOEXCEPT_OR_NOTHROW { - container_detail::bool_ flag; + dtl::bool_ flag; return allocator_traits::priv_storage_is_unpropagable(flag, a, p); } //! Returns: true if is_always_equal::value == true, otherwise, //! a == b. - static bool equal(const Allocator &a, const Allocator &b) BOOST_NOEXCEPT_OR_NOTHROW + BOOST_CONTAINER_FORCEINLINE static bool equal(const Allocator &a, const Allocator &b) BOOST_NOEXCEPT_OR_NOTHROW { - container_detail::bool_ flag; + dtl::bool_ flag; return allocator_traits::priv_equal(flag, a, b); } #if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED) private: - static pointer priv_allocate(container_detail::true_type, Allocator &a, size_type n, const_void_pointer p) + BOOST_CONTAINER_FORCEINLINE static pointer priv_allocate(dtl::true_type, Allocator &a, size_type n, const_void_pointer p) { return a.allocate(n, p); } - static pointer priv_allocate(container_detail::false_type, Allocator &a, size_type n, const_void_pointer) + BOOST_CONTAINER_FORCEINLINE static pointer priv_allocate(dtl::false_type, Allocator &a, size_type n, const_void_pointer) { return a.allocate(n); } template - static void priv_destroy(container_detail::true_type, Allocator &a, T* p) BOOST_NOEXCEPT_OR_NOTHROW + BOOST_CONTAINER_FORCEINLINE static void priv_destroy(dtl::true_type, Allocator &a, T* p) BOOST_NOEXCEPT_OR_NOTHROW { a.destroy(p); } template - static void priv_destroy(container_detail::false_type, Allocator &, T* p) BOOST_NOEXCEPT_OR_NOTHROW + BOOST_CONTAINER_FORCEINLINE static void priv_destroy(dtl::false_type, Allocator &, T* p) BOOST_NOEXCEPT_OR_NOTHROW { p->~T(); (void)p; } - static size_type priv_max_size(container_detail::true_type, const Allocator &a) BOOST_NOEXCEPT_OR_NOTHROW + BOOST_CONTAINER_FORCEINLINE static size_type priv_max_size(dtl::true_type, const Allocator &a) BOOST_NOEXCEPT_OR_NOTHROW { return a.max_size(); } - static size_type priv_max_size(container_detail::false_type, const Allocator &) BOOST_NOEXCEPT_OR_NOTHROW + BOOST_CONTAINER_FORCEINLINE static size_type priv_max_size(dtl::false_type, const Allocator &) BOOST_NOEXCEPT_OR_NOTHROW { return size_type(-1)/sizeof(value_type); } - static Allocator priv_select_on_container_copy_construction(container_detail::true_type, const Allocator &a) + BOOST_CONTAINER_FORCEINLINE static Allocator priv_select_on_container_copy_construction(dtl::true_type, const Allocator &a) { return a.select_on_container_copy_construction(); } - static const Allocator &priv_select_on_container_copy_construction(container_detail::false_type, const Allocator &a) BOOST_NOEXCEPT_OR_NOTHROW + BOOST_CONTAINER_FORCEINLINE static const Allocator &priv_select_on_container_copy_construction(dtl::false_type, const Allocator &a) BOOST_NOEXCEPT_OR_NOTHROW { return a; } #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) template - static void priv_construct(container_detail::true_type, Allocator &a, T *p, BOOST_FWD_REF(Args) ...args) + BOOST_CONTAINER_FORCEINLINE static void priv_construct(dtl::true_type, Allocator &a, T *p, BOOST_FWD_REF(Args) ...args) { a.construct( p, ::boost::forward(args)...); } template - static void priv_construct(container_detail::false_type, Allocator &, T *p, BOOST_FWD_REF(Args) ...args) + BOOST_CONTAINER_FORCEINLINE static void priv_construct(dtl::false_type, Allocator &, T *p, BOOST_FWD_REF(Args) ...args) { ::new((void*)p, boost_container_new_t()) T(::boost::forward(args)...); } #else // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) public: #define BOOST_CONTAINER_ALLOCATOR_TRAITS_CONSTRUCT_IMPL(N) \ template\ - static void construct(Allocator &a, T *p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\ + BOOST_CONTAINER_FORCEINLINE static void construct(Allocator &a, T *p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\ {\ static const bool value = ::boost::move_detail::and_ \ - < container_detail::is_not_std_allocator \ - , boost::container::container_detail::has_member_function_callable_with_construct \ + < dtl::is_not_std_allocator \ + , boost::container::dtl::has_member_function_callable_with_construct \ < Allocator, T* BOOST_MOVE_I##N BOOST_MOVE_FWD_T##N > \ >::value; \ - container_detail::bool_ flag;\ + dtl::bool_ flag;\ (priv_construct)(flag, a, p BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\ }\ // @@ -438,11 +438,11 @@ struct allocator_traits ///////////////////////////////// #define BOOST_CONTAINER_ALLOCATOR_TRAITS_PRIV_CONSTRUCT_IMPL(N) \ template\ - static void priv_construct(container_detail::true_type, Allocator &a, T *p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\ + BOOST_CONTAINER_FORCEINLINE static void priv_construct(dtl::true_type, Allocator &a, T *p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\ { a.construct( p BOOST_MOVE_I##N BOOST_MOVE_FWD##N ); }\ \ template\ - static void priv_construct(container_detail::false_type, Allocator &, T *p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\ + BOOST_CONTAINER_FORCEINLINE static void priv_construct(dtl::false_type, Allocator &, T *p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\ { ::new((void*)p, boost_container_new_t()) T(BOOST_MOVE_FWD##N); }\ // BOOST_MOVE_ITERATE_0TO8(BOOST_CONTAINER_ALLOCATOR_TRAITS_PRIV_CONSTRUCT_IMPL) @@ -451,19 +451,19 @@ struct allocator_traits #endif // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) template - static void priv_construct(container_detail::false_type, Allocator &, T *p, const ::boost::container::default_init_t&) + BOOST_CONTAINER_FORCEINLINE static void priv_construct(dtl::false_type, Allocator &, T *p, const ::boost::container::default_init_t&) { ::new((void*)p, boost_container_new_t()) T; } - static bool priv_storage_is_unpropagable(container_detail::true_type, const Allocator &a, pointer p) + BOOST_CONTAINER_FORCEINLINE static bool priv_storage_is_unpropagable(dtl::true_type, const Allocator &a, pointer p) { return a.storage_is_unpropagable(p); } - static bool priv_storage_is_unpropagable(container_detail::false_type, const Allocator &, pointer) + BOOST_CONTAINER_FORCEINLINE static bool priv_storage_is_unpropagable(dtl::false_type, const Allocator &, pointer) { return false; } - static bool priv_equal(container_detail::true_type, const Allocator &, const Allocator &) + BOOST_CONTAINER_FORCEINLINE static bool priv_equal(dtl::true_type, const Allocator &, const Allocator &) { return true; } - static bool priv_equal(container_detail::false_type, const Allocator &a, const Allocator &b) + BOOST_CONTAINER_FORCEINLINE static bool priv_equal(dtl::false_type, const Allocator &a, const Allocator &b) { return a == b; } #endif //#if defined(BOOST_CONTAINER_DOXYGEN_INVOKED) diff --git a/third_party/boost_parts/boost/container/container_fwd.hpp b/third_party/boost_parts/boost/container/container_fwd.hpp index e85a6ce9..e4fe6f85 100644 --- a/third_party/boost_parts/boost/container/container_fwd.hpp +++ b/third_party/boost_parts/boost/container/container_fwd.hpp @@ -67,7 +67,7 @@ namespace detail{ //Create namespace to avoid compilation errors }}} -namespace boost{ namespace container{ namespace container_detail{ +namespace boost{ namespace container{ namespace dtl{ namespace bi = boost::intrusive; namespace bid = boost::intrusive::detail; }}} @@ -88,23 +88,14 @@ namespace boost{ namespace container{ namespace pmr{ namespace boost { namespace container { -//! Enumeration used to configure ordered associative containers -//! with a concrete tree implementation. -enum tree_type_enum -{ - red_black_tree, - avl_tree, - scapegoat_tree, - splay_tree -}; - #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED template class new_allocator; template > + ,class Allocator = new_allocator + ,class Options = void> class vector; template > class slist; -template -struct tree_opt; - -typedef tree_opt tree_assoc_defaults; - template ,class Allocator = new_allocator - ,class Options = tree_assoc_defaults > + ,class Options = void> class set; template ,class Allocator = new_allocator - ,class Options = tree_assoc_defaults > + ,class Options = void > class multiset; template ,class Allocator = new_allocator > - ,class Options = tree_assoc_defaults > + ,class Options = void > class map; template ,class Allocator = new_allocator > - ,class Options = tree_assoc_defaults > + ,class Options = void > class multimap; template -//! - optimize_size -typedef implementation_defined tree_assoc_defaults; - #endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED //! Type used to tag that the input range is diff --git a/third_party/boost_parts/boost/container/detail/memory_util.hpp b/third_party/boost_parts/boost/container/detail/memory_util.hpp deleted file mode 100644 index ed899548..00000000 --- a/third_party/boost_parts/boost/container/detail/memory_util.hpp +++ /dev/null @@ -1,83 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2011-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/container for documentation. -// -////////////////////////////////////////////////////////////////////////////// - -#ifndef BOOST_CONTAINER_ALLOCATOR_MEMORY_UTIL_HPP -#define BOOST_CONTAINER_ALLOCATOR_MEMORY_UTIL_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include -#include -#include -#include - - -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME allocate -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace container { namespace container_detail { -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}} -#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 2, )) -#include BOOST_PP_ITERATE() - -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME destroy -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace container { namespace container_detail { -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}} -#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 3, )) -#include BOOST_PP_ITERATE() - -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME max_size -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace container { namespace container_detail { -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}} -#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 0, )) -#include BOOST_PP_ITERATE() - -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME select_on_container_copy_construction -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace container { namespace container_detail { -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}} -#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 0, )) -#include BOOST_PP_ITERATE() - -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME construct -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace container { namespace container_detail { -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}} -#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS+1, )) -#include BOOST_PP_ITERATE() - -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME swap -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace container { namespace container_detail { -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}} -#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 1, )) -#include BOOST_PP_ITERATE() - -namespace boost { -namespace container { -namespace container_detail { - - -BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(pointer) -BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(const_pointer) -BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(reference) -BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(const_reference) -BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(void_pointer) -BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(const_void_pointer) -BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(size_type) -BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(propagate_on_container_copy_assignment) -BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(propagate_on_container_move_assignment) -BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(propagate_on_container_swap) -BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(difference_type) - -} //namespace container_detail { -} //namespace container { -} //namespace boost { - -#include - -#endif // ! defined(BOOST_CONTAINER_ALLOCATOR_MEMORY_UTIL_HPP) diff --git a/third_party/boost_parts/boost/container/detail/mpl.hpp b/third_party/boost_parts/boost/container/detail/mpl.hpp index e1684ea0..4bb3cc7d 100644 --- a/third_party/boost_parts/boost/container/detail/mpl.hpp +++ b/third_party/boost_parts/boost/container/detail/mpl.hpp @@ -30,7 +30,7 @@ namespace boost { namespace container { -namespace container_detail { +namespace dtl { using boost::move_detail::integral_constant; using boost::move_detail::true_type; @@ -62,22 +62,21 @@ using boost::move_detail::disable_if_and; using boost::move_detail::enable_if_or; using boost::move_detail::disable_if_or; - -template +template struct select1st { - typedef Pair argument_type; - typedef typename Pair::first_type result_type; + typedef FirstType type; - template - const typename Pair::first_type& operator()(const OtherPair& x) const + template + const type& operator()(const T& x) const { return x.first; } - const typename Pair::first_type& operator()(const typename Pair::first_type& x) const - { return x; } + template + type& operator()(T& x) + { return const_cast(x.first); } }; -} //namespace container_detail { +} //namespace dtl { } //namespace container { } //namespace boost { diff --git a/third_party/boost_parts/boost/container/detail/preprocessor.hpp b/third_party/boost_parts/boost/container/detail/preprocessor.hpp deleted file mode 100644 index 41d1f553..00000000 --- a/third_party/boost_parts/boost/container/detail/preprocessor.hpp +++ /dev/null @@ -1,232 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (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/container for documentation. -// -////////////////////////////////////////////////////////////////////////////// - -#ifndef BOOST_CONTAINER_DETAIL_PREPROCESSOR_HPP -#define BOOST_CONTAINER_DETAIL_PREPROCESSOR_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include -#include -#include - -#ifdef BOOST_CONTAINER_PERFECT_FORWARDING -//#error "This file is not needed when perfect forwarding is available" -#endif //BOOST_CONTAINER_PERFECT_FORWARDING - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS 10 - -//Note: -//We define template parameters as const references to -//be able to bind temporaries. After that we will un-const them. -//This cast is ugly but it is necessary until "perfect forwarding" -//is achieved in C++0x. Meanwhile, if we want to be able to -//bind rvalues with non-const references, we have to be ugly -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - #define BOOST_CONTAINER_PP_PARAM_LIST(z, n, data) \ - BOOST_PP_CAT(P, n) && BOOST_PP_CAT(p, n) \ - //! -#else - #define BOOST_CONTAINER_PP_PARAM_LIST(z, n, data) \ - const BOOST_PP_CAT(P, n) & BOOST_PP_CAT(p, n) \ - //! -#endif //#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - -#define BOOST_CONTAINER_PP_CONST_REF_PARAM_LIST_Q(z, n, Data) \ -const BOOST_PP_CAT(Q, n) & BOOST_PP_CAT(q, n) \ -//! - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - #define BOOST_CONTAINER_PP_PARAM(U, u) \ - U && u \ - //! -#else - #define BOOST_CONTAINER_PP_PARAM(U, u) \ - const U & u \ - //! -#endif //#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - - #define BOOST_CONTAINER_PP_PARAM_INIT(z, n, data) \ - BOOST_PP_CAT(m_p, n) (::boost::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(p, n) )) \ - //! - -#else //BOOST_NO_CXX11_RVALUE_REFERENCES - - #define BOOST_CONTAINER_PP_PARAM_INIT(z, n, data) \ - BOOST_PP_CAT(m_p, n) (const_cast(BOOST_PP_CAT(p, n))) \ - //! -#endif //#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - - #if defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG) - - namespace boost { - namespace container { - namespace container_detail { - template - struct ref_holder; - - template - struct ref_holder - { - explicit ref_holder(T &t) - : t_(t) - {} - T &t_; - T & get() { return t_; } - }; - - template - struct ref_holder - { - explicit ref_holder(const T &t) - : t_(t) - {} - const T &t_; - const T & get() { return t_; } - }; - - template - struct ref_holder - { - explicit ref_holder(const T &t) - : t_(t) - {} - const T &t_; - const T & get() { return t_; } - }; - - template - struct ref_holder - { - explicit ref_holder(T &&t) - : t_(t) - {} - T &t_; - T && get() { return ::boost::move(t_); } - }; - - template - struct ref_holder - { - explicit ref_holder(T &&t) - : t_(t) - {} - T &t_; - T && get() { return ::boost::move(t_); } - }; - - } //namespace container_detail { - } //namespace container { - } //namespace boost { - - #define BOOST_CONTAINER_PP_PARAM_DEFINE(z, n, data) \ - ::boost::container::container_detail::ref_holder BOOST_PP_CAT(m_p, n); \ - //! - - #else //BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG - - #define BOOST_CONTAINER_PP_PARAM_DEFINE(z, n, data) \ - BOOST_PP_CAT(P, n) && BOOST_PP_CAT(m_p, n); \ - //! - - #endif //defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG) - -#else //BOOST_NO_CXX11_RVALUE_REFERENCES - - #define BOOST_CONTAINER_PP_PARAM_DEFINE(z, n, data) \ - BOOST_PP_CAT(P, n) & BOOST_PP_CAT(m_p, n); \ - //! -#endif //#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - -#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG) - - #define BOOST_CONTAINER_PP_MEMBER_FORWARD(z, n, data) BOOST_PP_CAT(this->m_p, n).get() \ - //! - -#else //!defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG) - - #define BOOST_CONTAINER_PP_MEMBER_FORWARD(z, n, data) \ - ::boost::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(this->m_p, n) ) \ - //! - -#endif //!defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && defined(BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG) - -#define BOOST_CONTAINER_PP_PARAM_INC(z, n, data) \ - BOOST_PP_CAT(++this->m_p, n) \ -//! - -#define BOOST_CONTAINER_PP_IDENTITY(z, n, data) data - - -#define BOOST_CONTAINER_PP_PARAM_FORWARD(z, n, data) \ -::boost::forward< BOOST_PP_CAT(P, n) >( BOOST_PP_CAT(p, n) ) \ -//! - -#define BOOST_CONTAINER_PP_DECLVAL(z, n, data) \ -::boost::move_detail::declval< BOOST_PP_CAT(P, n) >() \ -//! - -#define BOOST_CONTAINER_PP_MEMBER_IT_FORWARD(z, n, data) \ -BOOST_PP_CAT(*this->m_p, n) \ -//! - -#define BOOST_CONTAINER_PP_TEMPLATE_PARAM_VOID_DEFAULT(z, n, data) \ - BOOST_PP_CAT(class P, n) = void \ -//! - -#define BOOST_CONTAINER_PP_TEMPLATE_PARAM_WITH_DEFAULT(z, n, default_type) \ - BOOST_PP_CAT(class P, n) = default_type \ -//! - -#define BOOST_CONTAINER_PP_STATIC_PARAM_REF_DECLARE(z, n, data) \ - static BOOST_PP_CAT(P, n) & BOOST_PP_CAT(p, n); \ -//! - -#define BOOST_CONTAINER_PP_PARAM_PASS(z, n, data) \ - BOOST_PP_CAT(p, n) \ -//! - -#define BOOST_CONTAINER_PP_FWD_TYPE(z, n, data) \ - typename ::boost::move_detail::forward_type< BOOST_PP_CAT(P, n) >::type \ -//! - -#include - -//#else - -//#ifdef BOOST_CONTAINER_PERFECT_FORWARDING -//#error "This file is not needed when perfect forwarding is available" -//#endif //BOOST_CONTAINER_PERFECT_FORWARDING - -#endif //#ifndef BOOST_CONTAINER_DETAIL_PREPROCESSOR_HPP diff --git a/third_party/boost_parts/boost/container/detail/type_traits.hpp b/third_party/boost_parts/boost/container/detail/type_traits.hpp index e1453a65..686cc409 100644 --- a/third_party/boost_parts/boost/container/detail/type_traits.hpp +++ b/third_party/boost_parts/boost/container/detail/type_traits.hpp @@ -28,7 +28,7 @@ namespace boost { namespace container { -namespace container_detail { +namespace dtl { using ::boost::move_detail::enable_if; using ::boost::move_detail::enable_if_and; @@ -63,7 +63,7 @@ using ::boost::move_detail::aligned_storage; using ::boost::move_detail::nat; using ::boost::move_detail::max_align_t; -} //namespace container_detail { +} //namespace dtl { } //namespace container { } //namespace boost { diff --git a/third_party/boost_parts/boost/container/detail/workaround.hpp b/third_party/boost_parts/boost/container/detail/workaround.hpp index ae9151c3..736326b7 100644 --- a/third_party/boost_parts/boost/container/detail/workaround.hpp +++ b/third_party/boost_parts/boost/container/detail/workaround.hpp @@ -29,10 +29,26 @@ #define BOOST_CONTAINER_UNIMPLEMENTED_PACK_EXPANSION_TO_FIXED_LIST #endif -#if !defined(BOOST_FALLTHOUGH) - #define BOOST_CONTAINER_FALLTHOUGH -#else - #define BOOST_CONTAINER_FALLTHOUGH BOOST_FALLTHOUGH; +#if defined(BOOST_GCC_VERSION) +# if (BOOST_GCC_VERSION < 40700) || !defined(BOOST_GCC_CXX11) +# define BOOST_CONTAINER_NO_CXX11_DELEGATING_CONSTRUCTORS +# endif +#elif defined(BOOST_MSVC) +# if _MSC_FULL_VER < 180020827 +# define BOOST_CONTAINER_NO_CXX11_DELEGATING_CONSTRUCTORS +# endif +#elif defined(BOOST_CLANG) +# if !__has_feature(cxx_delegating_constructors) +# define BOOST_CONTAINER_NO_CXX11_DELEGATING_CONSTRUCTORS +# endif +#endif + +#if defined(BOOST_MSVC) && (_MSC_VER < 1400) + #define BOOST_CONTAINER_TEMPLATED_CONVERSION_OPERATOR_BROKEN +#endif + +#if !defined(BOOST_NO_CXX11_HDR_TUPLE) || (defined(BOOST_MSVC) && (BOOST_MSVC == 1700 || BOOST_MSVC == 1600)) +#define BOOST_CONTAINER_PAIR_TEST_HAS_HEADER_TUPLE #endif //Macros for documentation purposes. For code, expands to the argument @@ -85,6 +101,9 @@ #elif defined(BOOST_MSVC) && defined(_DEBUG) //"__forceinline" and MSVC seems to have some bugs in debug mode #define BOOST_CONTAINER_FORCEINLINE inline +#elif defined(__GNUC__) && ((__GNUC__ < 4) || (__GNUC__ == 4 && (__GNUC_MINOR__ < 5))) + //Older GCCs have problems with forceinline + #define BOOST_CONTAINER_FORCEINLINE inline #else #define BOOST_CONTAINER_FORCEINLINE BOOST_FORCEINLINE #endif diff --git a/third_party/boost_parts/boost/functional/hash/detail/float_functions.hpp b/third_party/boost_parts/boost/container_hash/detail/float_functions.hpp similarity index 100% rename from third_party/boost_parts/boost/functional/hash/detail/float_functions.hpp rename to third_party/boost_parts/boost/container_hash/detail/float_functions.hpp diff --git a/third_party/boost_parts/boost/functional/hash/detail/hash_float.hpp b/third_party/boost_parts/boost/container_hash/detail/hash_float.hpp similarity index 96% rename from third_party/boost_parts/boost/functional/hash/detail/hash_float.hpp rename to third_party/boost_parts/boost/container_hash/detail/hash_float.hpp index eb9264f7..f7634285 100644 --- a/third_party/boost_parts/boost/functional/hash/detail/hash_float.hpp +++ b/third_party/boost_parts/boost/container_hash/detail/hash_float.hpp @@ -11,9 +11,9 @@ #pragma once #endif -#include -#include -#include +#include +#include +#include #include #include #include @@ -179,7 +179,7 @@ namespace boost hash_float_combine(seed, part); } - hash_float_combine(seed, exp); + hash_float_combine(seed, static_cast(exp)); return seed; } @@ -241,7 +241,7 @@ namespace boost template inline bool is_zero(T v) { -#if !defined(__GNUC__) +#if !defined(__GNUC__) && !defined(__clang__) return v == 0; #else // GCC's '-Wfloat-equal' will complain about comparing diff --git a/third_party/boost_parts/boost/functional/hash/detail/limits.hpp b/third_party/boost_parts/boost/container_hash/detail/limits.hpp similarity index 100% rename from third_party/boost_parts/boost/functional/hash/detail/limits.hpp rename to third_party/boost_parts/boost/container_hash/detail/limits.hpp diff --git a/third_party/boost_parts/boost/functional/hash/extensions.hpp b/third_party/boost_parts/boost/container_hash/extensions.hpp similarity index 68% rename from third_party/boost_parts/boost/functional/hash/extensions.hpp rename to third_party/boost_parts/boost/container_hash/extensions.hpp index eafaefe8..4eebb4bc 100644 --- a/third_party/boost_parts/boost/functional/hash/extensions.hpp +++ b/third_party/boost_parts/boost/container_hash/extensions.hpp @@ -5,7 +5,7 @@ // Based on Peter Dimov's proposal // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf -// issue 6.18. +// issue 6.18. // This implements the extensions to the standard. // It's undocumented, so you shouldn't use it.... @@ -18,12 +18,11 @@ #pragma once #endif -#include +#include #include -#include +#include #include -#include -#include +#include #if !defined(BOOST_NO_CXX11_HDR_ARRAY) # include @@ -72,6 +71,56 @@ namespace boost return seed; } + inline std::size_t hash_range( + std::vector::iterator first, + std::vector::iterator last) + { + std::size_t seed = 0; + + for(; first != last; ++first) + { + hash_combine(seed, *first); + } + + return seed; + } + + inline std::size_t hash_range( + std::vector::const_iterator first, + std::vector::const_iterator last) + { + std::size_t seed = 0; + + for(; first != last; ++first) + { + hash_combine(seed, *first); + } + + return seed; + } + + inline void hash_range( + std::size_t& seed, + std::vector::iterator first, + std::vector::iterator last) + { + for(; first != last; ++first) + { + hash_combine(seed, *first); + } + } + + inline void hash_range( + std::size_t& seed, + std::vector::const_iterator first, + std::vector::const_iterator last) + { + for(; first != last; ++first) + { + hash_combine(seed, *first); + } + } + template std::size_t hash_value(std::vector const& v) { @@ -171,19 +220,66 @@ namespace boost return boost::hash_detail::hash_tuple(v); } -# define BOOST_HASH_TUPLE_F(z, n, _) \ - template< \ - BOOST_PP_ENUM_PARAMS_Z(z, n, typename A) \ - > \ - inline std::size_t hash_value(std::tuple< \ - BOOST_PP_ENUM_PARAMS_Z(z, n, A) \ - > const& v) \ - { \ - return boost::hash_detail::hash_tuple(v); \ + template + inline std::size_t hash_value(std::tuple const& v) + { + return boost::hash_detail::hash_tuple(v); + } + + template + inline std::size_t hash_value(std::tuple const& v) + { + return boost::hash_detail::hash_tuple(v); + } + + template + inline std::size_t hash_value(std::tuple const& v) + { + return boost::hash_detail::hash_tuple(v); + } + + template + inline std::size_t hash_value(std::tuple const& v) + { + return boost::hash_detail::hash_tuple(v); + } + + template + inline std::size_t hash_value(std::tuple const& v) + { + return boost::hash_detail::hash_tuple(v); + } + + template + inline std::size_t hash_value(std::tuple const& v) + { + return boost::hash_detail::hash_tuple(v); + } + + template + inline std::size_t hash_value(std::tuple const& v) + { + return boost::hash_detail::hash_tuple(v); + } + + template + inline std::size_t hash_value(std::tuple const& v) + { + return boost::hash_detail::hash_tuple(v); + } + + template + inline std::size_t hash_value(std::tuple const& v) + { + return boost::hash_detail::hash_tuple(v); + } + + template + inline std::size_t hash_value(std::tuple const& v) + { + return boost::hash_detail::hash_tuple(v); } - BOOST_PP_REPEAT_FROM_TO(1, 11, BOOST_HASH_TUPLE_F, _) -# undef BOOST_HASH_TUPLE_F #endif #endif @@ -254,7 +350,7 @@ namespace boost #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) template struct hash - : std::unary_function + : boost::hash_detail::hash_base { #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) std::size_t operator()(T const& val) const @@ -271,7 +367,7 @@ namespace boost #if BOOST_WORKAROUND(__DMC__, <= 0x848) template struct hash - : std::unary_function + : boost::hash_detail::hash_base { std::size_t operator()(const T* val) const { @@ -296,7 +392,7 @@ namespace boost { template struct inner - : std::unary_function + : boost::hash_detail::hash_base { #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) std::size_t operator()(T const& val) const diff --git a/third_party/boost_parts/boost/functional/hash/hash.hpp b/third_party/boost_parts/boost/container_hash/hash.hpp similarity index 71% rename from third_party/boost_parts/boost/functional/hash/hash.hpp rename to third_party/boost_parts/boost/container_hash/hash.hpp index 2fb9f211..76de7939 100644 --- a/third_party/boost_parts/boost/functional/hash/hash.hpp +++ b/third_party/boost_parts/boost/container_hash/hash.hpp @@ -5,7 +5,7 @@ // Based on Peter Dimov's proposal // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf -// issue 6.18. +// issue 6.18. // // This also contains public domain code from MurmurHash. From the // MurmurHash header: @@ -16,14 +16,14 @@ #if !defined(BOOST_FUNCTIONAL_HASH_HASH_HPP) #define BOOST_FUNCTIONAL_HASH_HASH_HPP -#include +#include #include -#include +#include #include #include #include #include -#include +#include #include #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) @@ -34,6 +34,10 @@ #include #endif +#if !defined(BOOST_NO_CXX11_HDR_SYSTEM_ERROR) +#include +#endif + #if defined(BOOST_MSVC) #pragma warning(push) @@ -58,10 +62,74 @@ # define BOOST_FUNCTIONAL_HASH_ROTL32(x, r) (x << r) | (x >> (32 - r)) #endif +// Detect whether standard library has C++17 headers + +#if !defined(BOOST_HASH_CXX17) +# if defined(BOOST_MSVC) +# if defined(_HAS_CXX17) && _HAS_CXX17 +# define BOOST_HASH_CXX17 1 +# endif +# elif defined(__cplusplus) && __cplusplus >= 201703 +# define BOOST_HASH_CXX17 1 +# endif +#endif + +#if !defined(BOOST_HASH_CXX17) +# define BOOST_HASH_CXX17 0 +#endif + +#if BOOST_HASH_CXX17 && defined(__has_include) +# if !defined(BOOST_HASH_HAS_STRING_VIEW) && __has_include() +# define BOOST_HASH_HAS_STRING_VIEW 1 +# endif +# if !defined(BOOST_HASH_HAS_OPTIONAL) && __has_include() +# define BOOST_HASH_HAS_OPTIONAL 1 +# endif +# if !defined(BOOST_HASH_HAS_VARIANT) && __has_include() +# define BOOST_HASH_HAS_VARIANT 1 +# endif +#endif + +#if !defined(BOOST_HASH_HAS_STRING_VIEW) +# define BOOST_HASH_HAS_STRING_VIEW 0 +#endif + +#if !defined(BOOST_HASH_HAS_OPTIONAL) +# define BOOST_HASH_HAS_OPTIONAL 0 +#endif + +#if !defined(BOOST_HASH_HAS_VARIANT) +# define BOOST_HASH_HAS_VARIANT 0 +#endif + +#if BOOST_HASH_HAS_STRING_VIEW +# include +#endif + +#if BOOST_HASH_HAS_OPTIONAL +# include +#endif + +#if BOOST_HASH_HAS_VARIANT +# include +#endif + namespace boost { namespace hash_detail { +#if defined(_HAS_AUTO_PTR_ETC) && !_HAS_AUTO_PTR_ETC + template + struct hash_base + { + typedef T argument_type; + typedef std::size_t result_type; + }; +#else + template + struct hash_base : std::unary_function {}; +#endif + struct enable_hash_value { typedef std::size_t type; }; template struct basic_numbers {}; @@ -95,6 +163,16 @@ namespace boost boost::hash_detail::enable_hash_value {}; #endif +#if !defined(BOOST_NO_CXX11_CHAR16_T) + template <> struct basic_numbers : + boost::hash_detail::enable_hash_value {}; +#endif + +#if !defined(BOOST_NO_CXX11_CHAR32_T) + template <> struct basic_numbers : + boost::hash_detail::enable_hash_value {}; +#endif + // long_numbers is defined like this to allow for separate // specialization for long_long and int128_type, in case // they conflict. @@ -154,13 +232,35 @@ namespace boost std::size_t hash_value( std::basic_string, A> const&); +#if BOOST_HASH_HAS_STRING_VIEW + template + std::size_t hash_value( + std::basic_string_view > const&); +#endif + template typename boost::hash_detail::float_numbers::type hash_value(T); +#if BOOST_HASH_HAS_OPTIONAL + template + std::size_t hash_value(std::optional const&); +#endif + +#if BOOST_HASH_HAS_VARIANT + std::size_t hash_value(std::monostate); + template + std::size_t hash_value(std::variant const&); +#endif + #if !defined(BOOST_NO_CXX11_HDR_TYPEINDEX) std::size_t hash_value(std::type_index); #endif +#if !defined(BOOST_NO_CXX11_HDR_SYSTEM_ERROR) + std::size_t hash_value(std::error_code const&); + std::size_t hash_value(std::error_condition const&); +#endif + // Implementation namespace hash_detail @@ -168,10 +268,10 @@ namespace boost template inline std::size_t hash_value_signed(T val) { - const int size_t_bits = std::numeric_limits::digits; + const unsigned int size_t_bits = std::numeric_limits::digits; // ceiling(std::numeric_limits::digits / size_t_bits) - 1 const int length = (std::numeric_limits::digits - 1) - / size_t_bits; + / static_cast(size_t_bits); std::size_t seed = 0; T positive = val < 0 ? -1 - val : val; @@ -189,10 +289,10 @@ namespace boost template inline std::size_t hash_value_unsigned(T val) { - const int size_t_bits = std::numeric_limits::digits; + const unsigned int size_t_bits = std::numeric_limits::digits; // ceiling(std::numeric_limits::digits / size_t_bits) - 1 const int length = (std::numeric_limits::digits - 1) - / size_t_bits; + / static_cast(size_t_bits); std::size_t seed = 0; @@ -212,7 +312,6 @@ namespace boost seed ^= value + 0x9e3779b9 + (seed<<6) + (seed>>2); } - template inline void hash_combine_impl(boost::uint32_t& h1, boost::uint32_t k1) { @@ -229,16 +328,15 @@ namespace boost } -// Don't define 64-bit hash combine on platforms with 64 bit integers, +// Don't define 64-bit hash combine on platforms without 64 bit integers, // and also not for 32-bit gcc as it warns about the 64-bit constant. #if !defined(BOOST_NO_INT64_T) && \ !(defined(__GNUC__) && ULONG_MAX == 0xffffffff) - template inline void hash_combine_impl(boost::uint64_t& h, boost::uint64_t k) { - const uint64_t m = UINT64_C(0xc6a4a7935bd1e995); + const boost::uint64_t m = UINT64_C(0xc6a4a7935bd1e995); const int r = 47; k *= m; @@ -247,6 +345,10 @@ namespace boost h ^= k; h *= m; + + // Completely arbitrary number, to prevent 0's + // from hashing to 0. + h += 0xe6546b64; } #endif // BOOST_NO_INT64_T @@ -386,12 +488,49 @@ namespace boost return hash_range(v.begin(), v.end()); } +#if BOOST_HASH_HAS_STRING_VIEW + template + inline std::size_t hash_value( + std::basic_string_view > const& v) + { + return hash_range(v.begin(), v.end()); + } +#endif + template typename boost::hash_detail::float_numbers::type hash_value(T v) { return boost::hash_detail::float_hash_value(v); } +#if BOOST_HASH_HAS_OPTIONAL + template + inline std::size_t hash_value(std::optional const& v) { + if (!v) { + // Arbitray value for empty optional. + return 0x12345678; + } else { + boost::hash hf; + return hf(*v); + } + } +#endif + +#if BOOST_HASH_HAS_VARIANT + inline std::size_t hash_value(std::monostate) { + return 0x87654321; + } + + template + inline std::size_t hash_value(std::variant const& v) { + std::size_t seed = 0; + hash_combine(seed, v.index()); + std::visit([&seed](auto&& x) { hash_combine(seed, x); }, v); + return seed; + } +#endif + + #if !defined(BOOST_NO_CXX11_HDR_TYPEINDEX) inline std::size_t hash_value(std::type_index v) { @@ -399,14 +538,30 @@ namespace boost } #endif +#if !defined(BOOST_NO_CXX11_HDR_SYSTEM_ERROR) + inline std::size_t hash_value(std::error_code const& v) { + std::size_t seed = 0; + hash_combine(seed, v.value()); + hash_combine(seed, &v.category()); + return seed; + } + + inline std::size_t hash_value(std::error_condition const& v) { + std::size_t seed = 0; + hash_combine(seed, v.value()); + hash_combine(seed, &v.category()); + return seed; + } +#endif + // // boost::hash // - + // Define the specializations required by the standard. The general purpose // boost::hash is defined later in extensions.hpp if // BOOST_HASH_NO_EXTENSIONS is not defined. - + // BOOST_HASH_SPECIALIZE - define a specialization for a type which is // passed by copy. // @@ -417,7 +572,7 @@ namespace boost #define BOOST_HASH_SPECIALIZE(type) \ template <> struct hash \ - : public std::unary_function \ + : public boost::hash_detail::hash_base \ { \ std::size_t operator()(type v) const \ { \ @@ -427,7 +582,17 @@ namespace boost #define BOOST_HASH_SPECIALIZE_REF(type) \ template <> struct hash \ - : public std::unary_function \ + : public boost::hash_detail::hash_base \ + { \ + std::size_t operator()(type const& v) const \ + { \ + return boost::hash_value(v); \ + } \ + }; + +#define BOOST_HASH_SPECIALIZE_TEMPLATE_REF(type) \ + struct hash \ + : public boost::hash_detail::hash_base \ { \ std::size_t operator()(type const& v) const \ { \ @@ -441,6 +606,12 @@ namespace boost BOOST_HASH_SPECIALIZE(unsigned char) #if !defined(BOOST_NO_INTRINSIC_WCHAR_T) BOOST_HASH_SPECIALIZE(wchar_t) +#endif +#if !defined(BOOST_NO_CXX11_CHAR16_T) + BOOST_HASH_SPECIALIZE(char16_t) +#endif +#if !defined(BOOST_NO_CXX11_CHAR32_T) + BOOST_HASH_SPECIALIZE(char32_t) #endif BOOST_HASH_SPECIALIZE(short) BOOST_HASH_SPECIALIZE(unsigned short) @@ -454,9 +625,28 @@ namespace boost BOOST_HASH_SPECIALIZE(long double) BOOST_HASH_SPECIALIZE_REF(std::string) -#if !defined(BOOST_NO_STD_WSTRING) +#if !defined(BOOST_NO_STD_WSTRING) && !defined(BOOST_NO_INTRINSIC_WCHAR_T) BOOST_HASH_SPECIALIZE_REF(std::wstring) #endif +#if !defined(BOOST_NO_CXX11_CHAR16_T) + BOOST_HASH_SPECIALIZE_REF(std::basic_string) +#endif +#if !defined(BOOST_NO_CXX11_CHAR32_T) + BOOST_HASH_SPECIALIZE_REF(std::basic_string) +#endif + +#if BOOST_HASH_HAS_STRING_VIEW + BOOST_HASH_SPECIALIZE_REF(std::string_view) +# if !defined(BOOST_NO_STD_WSTRING) && !defined(BOOST_NO_INTRINSIC_WCHAR_T) + BOOST_HASH_SPECIALIZE_REF(std::wstring_view) +# endif +# if !defined(BOOST_NO_CXX11_CHAR16_T) + BOOST_HASH_SPECIALIZE_REF(std::basic_string_view) +# endif +# if !defined(BOOST_NO_CXX11_CHAR32_T) + BOOST_HASH_SPECIALIZE_REF(std::basic_string_view) +# endif +#endif #if !defined(BOOST_NO_LONG_LONG) BOOST_HASH_SPECIALIZE(boost::long_long_type) @@ -468,12 +658,24 @@ namespace boost BOOST_HASH_SPECIALIZE(boost::uint128_type) #endif +#if BOOST_HASH_HAS_OPTIONAL + template + BOOST_HASH_SPECIALIZE_TEMPLATE_REF(std::optional) +#endif + +#if !defined(BOOST_HASH_HAS_VARIANT) + template + BOOST_HASH_SPECIALIZE_TEMPLATE_REF(std::variant) + BOOST_HASH_SPECIALIZE(std::monostate) +#endif + #if !defined(BOOST_NO_CXX11_HDR_TYPEINDEX) BOOST_HASH_SPECIALIZE(std::type_index) #endif #undef BOOST_HASH_SPECIALIZE #undef BOOST_HASH_SPECIALIZE_REF +#undef BOOST_HASH_SPECIALIZE_TEMPLATE_REF // Specializing boost::hash for pointers. @@ -481,7 +683,7 @@ namespace boost template struct hash - : public std::unary_function + : public boost::hash_detail::hash_base { std::size_t operator()(T* v) const { @@ -514,7 +716,7 @@ namespace boost { template struct inner - : public std::unary_function + : public boost::hash_detail::hash_base { std::size_t operator()(T val) const { @@ -555,5 +757,5 @@ namespace boost #if !defined(BOOST_HASH_NO_EXTENSIONS) \ && !defined(BOOST_FUNCTIONAL_HASH_EXTENSIONS_HPP) -#include +#include #endif diff --git a/third_party/boost_parts/boost/functional/hash/hash_fwd.hpp b/third_party/boost_parts/boost/container_hash/hash_fwd.hpp similarity index 93% rename from third_party/boost_parts/boost/functional/hash/hash_fwd.hpp rename to third_party/boost_parts/boost/container_hash/hash_fwd.hpp index 01fe012e..a87c182d 100644 --- a/third_party/boost_parts/boost/functional/hash/hash_fwd.hpp +++ b/third_party/boost_parts/boost/container_hash/hash_fwd.hpp @@ -10,13 +10,13 @@ #if !defined(BOOST_FUNCTIONAL_HASH_FWD_HPP) #define BOOST_FUNCTIONAL_HASH_FWD_HPP -#include +#include +#include + #if defined(BOOST_HAS_PRAGMA_ONCE) #pragma once #endif -#include -#include namespace boost { diff --git a/third_party/boost_parts/boost/core/addressof.hpp b/third_party/boost_parts/boost/core/addressof.hpp index 889b5825..f7eab06b 100644 --- a/third_party/boost_parts/boost/core/addressof.hpp +++ b/third_party/boost_parts/boost/core/addressof.hpp @@ -1,162 +1,274 @@ -// Copyright (C) 2002 Brad King (brad.king@kitware.com) -// Douglas Gregor (gregod@cs.rpi.edu) -// -// Copyright (C) 2002, 2008, 2013 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) +/* +Copyright (C) 2002 Brad King (brad.king@kitware.com) + Douglas Gregor (gregod@cs.rpi.edu) -// For more information, see http://www.boost.org +Copyright (C) 2002, 2008, 2013 Peter Dimov + +Copyright (C) 2017 Glen Joseph Fernandes (glenjofe@gmail.com) + +Distributed under the Boost Software License, Version 1.0. +(See accompanying file LICENSE_1_0.txt or copy at +http://www.boost.org/LICENSE_1_0.txt) +*/ #ifndef BOOST_CORE_ADDRESSOF_HPP #define BOOST_CORE_ADDRESSOF_HPP -# include -# include -# include +#include -namespace boost -{ +#if defined(BOOST_MSVC_FULL_VER) && BOOST_MSVC_FULL_VER >= 190024215 +#define BOOST_CORE_HAS_BUILTIN_ADDRESSOF +#elif defined(BOOST_GCC) && BOOST_GCC >= 70000 +#define BOOST_CORE_HAS_BUILTIN_ADDRESSOF +#elif defined(__has_builtin) +#if __has_builtin(__builtin_addressof) +#define BOOST_CORE_HAS_BUILTIN_ADDRESSOF +#endif +#endif -namespace detail -{ +#if defined(BOOST_CORE_HAS_BUILTIN_ADDRESSOF) +#if defined(BOOST_NO_CXX11_CONSTEXPR) +#define BOOST_CORE_NO_CONSTEXPR_ADDRESSOF +#endif + +namespace boost { -template struct addr_impl_ref +template +BOOST_CONSTEXPR inline T* +addressof(T& o) BOOST_NOEXCEPT { - T & v_; + return __builtin_addressof(o); +} + +} /* boost */ +#else +#include +#include - BOOST_FORCEINLINE addr_impl_ref( T & v ): v_( v ) {} - BOOST_FORCEINLINE operator T& () const { return v_; } +namespace boost { +namespace detail { +template +class addrof_ref { +public: + BOOST_FORCEINLINE addrof_ref(T& o) BOOST_NOEXCEPT + : o_(o) { } + BOOST_FORCEINLINE operator T&() const BOOST_NOEXCEPT { + return o_; + } private: - addr_impl_ref & operator=(const addr_impl_ref &); + addrof_ref& operator=(const addrof_ref&); + T& o_; }; -template struct addressof_impl -{ - static BOOST_FORCEINLINE T * f( T & v, long ) - { - return reinterpret_cast( - &const_cast(reinterpret_cast(v))); +template +struct addrof { + static BOOST_FORCEINLINE T* get(T& o, long) BOOST_NOEXCEPT { + return reinterpret_cast(& + const_cast(reinterpret_cast(o))); } - - static BOOST_FORCEINLINE T * f( T * v, int ) - { - return v; + static BOOST_FORCEINLINE T* get(T* p, int) BOOST_NOEXCEPT { + return p; } }; -#if !defined( BOOST_NO_CXX11_NULLPTR ) - -#if !defined( BOOST_NO_CXX11_DECLTYPE ) && ( ( defined( __clang__ ) && !defined( _LIBCPP_VERSION ) ) || defined( __INTEL_COMPILER ) ) - - typedef decltype(nullptr) addr_nullptr_t; - +#if !defined(BOOST_NO_CXX11_NULLPTR) +#if !defined(BOOST_NO_CXX11_DECLTYPE) && \ + (defined(__INTEL_COMPILER) || \ + (defined(__clang__) && !defined(_LIBCPP_VERSION))) +typedef decltype(nullptr) addrof_null_t; #else - - typedef std::nullptr_t addr_nullptr_t; - +typedef std::nullptr_t addrof_null_t; #endif -template<> struct addressof_impl< addr_nullptr_t > -{ - typedef addr_nullptr_t T; - - static BOOST_FORCEINLINE T * f( T & v, int ) - { - return &v; +template<> +struct addrof { + typedef addrof_null_t type; + static BOOST_FORCEINLINE type* get(type& o, int) BOOST_NOEXCEPT { + return &o; } }; -template<> struct addressof_impl< addr_nullptr_t const > -{ - typedef addr_nullptr_t const T; - - static BOOST_FORCEINLINE T * f( T & v, int ) - { - return &v; +template<> +struct addrof { + typedef const addrof_null_t type; + static BOOST_FORCEINLINE type* get(type& o, int) BOOST_NOEXCEPT { + return &o; } }; -template<> struct addressof_impl< addr_nullptr_t volatile > -{ - typedef addr_nullptr_t volatile T; +template<> +struct addrof { + typedef volatile addrof_null_t type; + static BOOST_FORCEINLINE type* get(type& o, int) BOOST_NOEXCEPT { + return &o; + } +}; - static BOOST_FORCEINLINE T * f( T & v, int ) - { - return &v; +template<> +struct addrof { + typedef const volatile addrof_null_t type; + static BOOST_FORCEINLINE type* get(type& o, int) BOOST_NOEXCEPT { + return &o; } }; +#endif + +} /* detail */ -template<> struct addressof_impl< addr_nullptr_t const volatile > +#if defined(BOOST_NO_CXX11_SFINAE_EXPR) || \ + defined(BOOST_NO_CXX11_CONSTEXPR) || \ + defined(BOOST_NO_CXX11_DECLTYPE) +#define BOOST_CORE_NO_CONSTEXPR_ADDRESSOF + +template +BOOST_FORCEINLINE T* +addressof(T& o) BOOST_NOEXCEPT { - typedef addr_nullptr_t const volatile T; +#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) || \ + BOOST_WORKAROUND(__SUNPRO_CC, <= 0x5120) + return boost::detail::addrof::get(o, 0); +#else + return boost::detail::addrof::get(boost::detail::addrof_ref(o), 0); +#endif +} - static BOOST_FORCEINLINE T * f( T & v, int ) - { - return &v; - } +#if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) +namespace detail { + +template +struct addrof_result { + typedef T* type; }; +} /* detail */ + +template +BOOST_FORCEINLINE typename boost::detail::addrof_result::type +addressof(T (&o)[N]) BOOST_NOEXCEPT +{ + return &o; +} #endif -} // namespace detail +#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) +template +BOOST_FORCEINLINE +T (*addressof(T (&o)[N]) BOOST_NOEXCEPT)[N] +{ + return reinterpret_cast(&o); +} -template +template BOOST_FORCEINLINE -T * addressof( T & v ) +const T (*addressof(const T (&o)[N]) BOOST_NOEXCEPT)[N] { -#if (defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x610 ) ) ) || (defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x5120)) + return reinterpret_cast(&o); +} +#endif +#else +namespace detail { - return boost::detail::addressof_impl::f( v, 0 ); +template +T addrof_declval() BOOST_NOEXCEPT; -#else +template +struct addrof_void { + typedef void type; +}; + +template +struct addrof_member_operator { + static constexpr bool value = false; +}; + +template +struct addrof_member_operator().operator&())>::type> { + static constexpr bool value = true; +}; - return boost::detail::addressof_impl::f( boost::detail::addr_impl_ref( v ), 0 ); +#if BOOST_WORKAROUND(BOOST_INTEL, < 1600) +struct addrof_addressable { }; +addrof_addressable* +operator&(addrof_addressable&) BOOST_NOEXCEPT; #endif -} -#if defined( __SUNPRO_CC ) && BOOST_WORKAROUND( __SUNPRO_CC, BOOST_TESTED_AT( 0x590 ) ) +template +struct addrof_non_member_operator { + static constexpr bool value = false; +}; -namespace detail -{ +template +struct addrof_non_member_operator()))>::type> { + static constexpr bool value = true; +}; -template struct addressof_addp -{ - typedef T * type; +template +struct addrof_expression { + static constexpr bool value = false; }; -} // namespace detail +template +struct addrof_expression())>::type> { + static constexpr bool value = true; +}; -template< class T, std::size_t N > +template +struct addrof_is_constexpr { + static constexpr bool value = addrof_expression::value && + !addrof_member_operator::value && + !addrof_non_member_operator::value; +}; + +template +struct addrof_if { }; + +template +struct addrof_if { + typedef T* type; +}; + +template BOOST_FORCEINLINE -typename detail::addressof_addp< T[N] >::type addressof( T (&t)[N] ) +typename addrof_if::value, T>::type +addressof(T& o) BOOST_NOEXCEPT { - return &t; + return addrof::get(addrof_ref(o), 0); } -#endif - -// Borland doesn't like casting an array reference to a char reference -// but these overloads work around the problem. -#if defined( __BORLANDC__ ) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -template -BOOST_FORCEINLINE -T (*addressof(T (&t)[N]))[N] +template +constexpr BOOST_FORCEINLINE +typename addrof_if::value, T>::type +addressof(T& o) BOOST_NOEXCEPT { - return reinterpret_cast(&t); + return &o; } -template -BOOST_FORCEINLINE -const T (*addressof(const T (&t)[N]))[N] +} /* detail */ + +template +constexpr BOOST_FORCEINLINE T* +addressof(T& o) BOOST_NOEXCEPT { - return reinterpret_cast(&t); + return boost::detail::addressof(o); } #endif -} // namespace boost +} /* boost */ +#endif + +#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && \ + !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) +namespace boost { -#endif // BOOST_CORE_ADDRESSOF_HPP +template +const T* addressof(const T&&) = delete; + +} /* boost */ +#endif + +#endif diff --git a/third_party/boost_parts/boost/core/demangle.hpp b/third_party/boost_parts/boost/core/demangle.hpp index f13c26a7..dc714d80 100644 --- a/third_party/boost_parts/boost/core/demangle.hpp +++ b/third_party/boost_parts/boost/core/demangle.hpp @@ -93,15 +93,10 @@ inline void demangle_free( char const * name ) BOOST_NOEXCEPT inline std::string demangle( char const * name ) { scoped_demangled_name demangled_name( name ); - char const * const p = demangled_name.get(); - if( p ) - { - return p; - } - else - { - return name; - } + char const * p = demangled_name.get(); + if( !p ) + p = name; + return p; } #else diff --git a/third_party/boost_parts/boost/core/ignore_unused.hpp b/third_party/boost_parts/boost/core/ignore_unused.hpp new file mode 100644 index 00000000..994e5f64 --- /dev/null +++ b/third_party/boost_parts/boost/core/ignore_unused.hpp @@ -0,0 +1,70 @@ +// Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland. +// +// Use, modification and distribution is subject to the Boost Software License, +// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_CORE_IGNORE_UNUSED_HPP +#define BOOST_CORE_IGNORE_UNUSED_HPP + +#include + +namespace boost { + +#ifndef BOOST_NO_CXX11_VARIADIC_TEMPLATES + +template +BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused(Ts const& ...) +{} + +template +BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused() +{} + +#else + +template +BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused(T1 const&) +{} + +template +BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused(T1 const&, T2 const&) +{} + +template +BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused(T1 const&, T2 const&, T3 const&) +{} + +template +BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused(T1 const&, T2 const&, T3 const&, T4 const&) +{} + +template +BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused(T1 const&, T2 const&, T3 const&, T4 const&, T5 const&) +{} + +template +BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused() +{} + +template +BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused() +{} + +template +BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused() +{} + +template +BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused() +{} + +template +BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void ignore_unused() +{} + +#endif + +} // namespace boost + +#endif // BOOST_CORE_IGNORE_UNUSED_HPP diff --git a/third_party/boost_parts/boost/core/no_exceptions_support.hpp b/third_party/boost_parts/boost/core/no_exceptions_support.hpp index a697f01a..e2453d08 100644 --- a/third_party/boost_parts/boost/core/no_exceptions_support.hpp +++ b/third_party/boost_parts/boost/core/no_exceptions_support.hpp @@ -21,7 +21,7 @@ //---------------------------------------------------------------------- #include -#include +#include #if !(defined BOOST_NO_EXCEPTIONS) # define BOOST_TRY { try diff --git a/third_party/boost_parts/boost/core/pointer_traits.hpp b/third_party/boost_parts/boost/core/pointer_traits.hpp new file mode 100644 index 00000000..e0ebfb07 --- /dev/null +++ b/third_party/boost_parts/boost/core/pointer_traits.hpp @@ -0,0 +1,233 @@ +/* +Copyright 2017-2018 Glen Joseph Fernandes +(glenjofe@gmail.com) + +Distributed under the Boost Software License, Version 1.0. +(http://www.boost.org/LICENSE_1_0.txt) +*/ +#ifndef BOOST_CORE_POINTER_TRAITS_HPP +#define BOOST_CORE_POINTER_TRAITS_HPP + +#include +#if !defined(BOOST_NO_CXX11_POINTER_TRAITS) +#include +#else +#include +#endif + +namespace boost { + +#if !defined(BOOST_NO_CXX11_POINTER_TRAITS) +template +struct pointer_traits + : std::pointer_traits { + template + struct rebind_to { + typedef typename std::pointer_traits::template rebind type; + }; +}; + +template +struct pointer_traits + : std::pointer_traits { + template + struct rebind_to { + typedef U* type; + }; +}; +#else +namespace detail { + +template +struct ptr_void { + typedef void type; +}; + +template +struct ptr_first; + +#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) +template class T, class U, class... Args> +struct ptr_first > { + typedef U type; +}; +#else +template class T, class U> +struct ptr_first > { + typedef U type; +}; + +template class T, class U1, class U2> +struct ptr_first > { + typedef U1 type; +}; + +template class T, class U1, class U2, class U3> +struct ptr_first > { + typedef U1 type; +}; +#endif + +template +struct ptr_element { + typedef typename ptr_first::type type; +}; + +template +struct ptr_element::type> { + typedef typename T::element_type type; +}; + +template +struct ptr_difference { + typedef std::ptrdiff_t type; +}; + +template +struct ptr_difference::type> { + typedef typename T::difference_type type; +}; + +template +struct ptr_transform; + +#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) +template class T, class U, class... Args, class V> +struct ptr_transform, V> { + typedef T type; +}; +#else +template class T, class U, class V> +struct ptr_transform, V> { + typedef T type; +}; + +template class T, class U1, class U2, class V> +struct ptr_transform, V> { + typedef T type; +}; + +template class T, + class U1, class U2, class U3, class V> +struct ptr_transform, V> { + typedef T type; +}; +#endif + +template +struct ptr_rebind { + typedef typename ptr_transform::type type; +}; + +#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) +template +struct ptr_rebind >::type> { + typedef typename T::template rebind type; +}; +#endif + +template +struct ptr_value { + typedef T type; +}; + +template<> +struct ptr_value { + typedef struct { } type; +}; + +} /* detail */ + +template +struct pointer_traits { + typedef T pointer; + typedef typename detail::ptr_element::type element_type; + typedef typename detail::ptr_difference::type difference_type; + template + struct rebind_to { + typedef typename detail::ptr_rebind::type type; + }; +#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) + template + using rebind = typename detail::ptr_rebind::type; +#endif + static pointer + pointer_to(typename detail::ptr_value::type& v) { + return pointer::pointer_to(v); + } +}; + +template +struct pointer_traits { + typedef T* pointer; + typedef T element_type; + typedef std::ptrdiff_t difference_type; + template + struct rebind_to { + typedef U* type; + }; +#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) + template + using rebind = U*; +#endif + static T* + pointer_to(typename detail::ptr_value::type& v) BOOST_NOEXCEPT { + return boost::addressof(v); + } +}; +#endif + +template +BOOST_CONSTEXPR inline T* +to_address(T* v) BOOST_NOEXCEPT +{ + return v; +} + +#if !defined(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION) +namespace detail { + +template +inline T* +ptr_address(T* v, int) BOOST_NOEXCEPT +{ + return v; +} + +template +inline auto +ptr_address(const T& v, int) BOOST_NOEXCEPT +-> decltype(boost::pointer_traits::to_address(v)) +{ + return boost::pointer_traits::to_address(v); +} + +template +inline auto +ptr_address(const T& v, long) BOOST_NOEXCEPT +{ + return boost::detail::ptr_address(v.operator->(), 0); +} + +} /* detail */ + +template +inline auto +to_address(const T& v) BOOST_NOEXCEPT +{ + return boost::detail::ptr_address(v, 0); +} +#else +template +inline typename pointer_traits::element_type* +to_address(const T& v) BOOST_NOEXCEPT +{ + return boost::to_address(v.operator->()); +} +#endif + +} /* boost */ + +#endif diff --git a/third_party/boost_parts/boost/core/ref.hpp b/third_party/boost_parts/boost/core/ref.hpp index 47dc8580..7d768ffc 100644 --- a/third_party/boost_parts/boost/core/ref.hpp +++ b/third_party/boost_parts/boost/core/ref.hpp @@ -8,8 +8,8 @@ #endif #include -#include -#include +#include +#include // // ref.hpp - ref/cref, useful helper functions diff --git a/third_party/boost_parts/boost/cstdint.hpp b/third_party/boost_parts/boost/cstdint.hpp index bf7097ec..c8474c46 100644 --- a/third_party/boost_parts/boost/cstdint.hpp +++ b/third_party/boost_parts/boost/cstdint.hpp @@ -34,6 +34,17 @@ #endif #include +// +// For the following code we get several warnings along the lines of: +// +// boost/cstdint.hpp:428:35: error: use of C99 long long integer constant +// +// So we declare this a system header to suppress these warnings. +// See also https://github.com/boostorg/config/issues/190 +// +#if defined(__GNUC__) && (__GNUC__ >= 4) +#pragma GCC system_header +#endif // // Note that GLIBC is a bit inconsistent about whether int64_t is defined or not @@ -60,7 +71,7 @@ # include // There is a bug in Cygwin two _C macros -# if defined(__STDC_CONSTANT_MACROS) && defined(__CYGWIN__) +# if defined(INTMAX_C) && defined(__CYGWIN__) # undef INTMAX_C # undef UINTMAX_C # define INTMAX_C(c) c##LL @@ -367,14 +378,11 @@ namespace boost #include #endif -// PGI seems to not support intptr_t/uintptr_t properly. BOOST_HAS_STDINT_H is not defined for this compiler by Boost.Config. -#if !defined(__PGIC__) - #if (defined(BOOST_WINDOWS) && !defined(_WIN32_WCE)) \ || (defined(_XOPEN_UNIX) && (_XOPEN_UNIX+0 > 0) && !defined(__UCLIBC__)) \ - || defined(__CYGWIN__) \ + || defined(__CYGWIN__) || defined(__VXWORKS__) \ || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) \ - || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(sun) + || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || (defined(sun) && !defined(BOOST_HAS_STDINT_H)) || defined(INTPTR_MAX) namespace boost { using ::intptr_t; @@ -393,8 +401,6 @@ namespace boost { #endif -#endif // !defined(__PGIC__) - #endif // BOOST_CSTDINT_HPP @@ -413,15 +419,19 @@ INT#_C macros if they're not already defined (John Maddock). #if !defined(BOOST__STDC_CONSTANT_MACROS_DEFINED) && \ (!defined(INT8_C) || !defined(INT16_C) || !defined(INT32_C) || !defined(INT64_C)) // -// For the following code we get several warnings along the lines of: -// -// boost/cstdint.hpp:428:35: error: use of C99 long long integer constant -// -// So we declare this a system header to suppress these warnings. +// Undef the macros as a precaution, since we may get here if has failed +// to define them all, see https://svn.boost.org/trac/boost/ticket/12786 // -#if defined(__GNUC__) && (__GNUC__ >= 4) -#pragma GCC system_header -#endif +#undef INT8_C +#undef INT16_C +#undef INT32_C +#undef INT64_C +#undef INTMAX_C +#undef UINT8_C +#undef UINT16_C +#undef UINT32_C +#undef UINT64_C +#undef UINTMAX_C #include # define BOOST__STDC_CONSTANT_MACROS_DEFINED diff --git a/third_party/boost_parts/boost/current_function.hpp b/third_party/boost_parts/boost/current_function.hpp index 5c113f80..86955cb0 100644 --- a/third_party/boost_parts/boost/current_function.hpp +++ b/third_party/boost_parts/boost/current_function.hpp @@ -28,7 +28,11 @@ namespace detail inline void current_function_helper() { -#if defined(__GNUC__) || (defined(__MWERKS__) && (__MWERKS__ >= 0x3000)) || (defined(__ICC) && (__ICC >= 600)) || defined(__ghs__) +#if defined( BOOST_DISABLE_CURRENT_FUNCTION ) + +# define BOOST_CURRENT_FUNCTION "(unknown)" + +#elif defined(__GNUC__) || (defined(__MWERKS__) && (__MWERKS__ >= 0x3000)) || (defined(__ICC) && (__ICC >= 600)) || defined(__ghs__) # define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__ diff --git a/third_party/boost_parts/boost/detail/allocator_utilities.hpp b/third_party/boost_parts/boost/detail/allocator_utilities.hpp index ed3de846..11eecbe1 100644 --- a/third_party/boost_parts/boost/detail/allocator_utilities.hpp +++ b/third_party/boost_parts/boost/detail/allocator_utilities.hpp @@ -121,8 +121,13 @@ struct rebinder template struct result { - typedef typename Allocator::BOOST_NESTED_TEMPLATE +#ifdef BOOST_NO_CXX11_ALLOCATOR + typedef typename Allocator::BOOST_NESTED_TEMPLATE rebind::other other; +#else + typedef typename std::allocator_traits::BOOST_NESTED_TEMPLATE + rebind_alloc other; +#endif }; }; @@ -159,7 +164,7 @@ void construct(void* p,const Type& t) */ #pragma warning(push) -#pragma warning(disable:4100) +#pragma warning(disable:4100) #endif template diff --git a/third_party/boost_parts/boost/detail/atomic_count.hpp b/third_party/boost_parts/boost/detail/atomic_count.hpp deleted file mode 100644 index 5411c7ae..00000000 --- a/third_party/boost_parts/boost/detail/atomic_count.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED -#define BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED - -// MS compatible compilers support #pragma once - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -# pragma once -#endif - -// -// boost/detail/atomic_count.hpp - thread/SMP safe reference counter -// -// Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd. -// -// Distributed under the 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 - -#endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED diff --git a/third_party/boost_parts/boost/detail/interlocked.hpp b/third_party/boost_parts/boost/detail/interlocked.hpp deleted file mode 100644 index 1152f710..00000000 --- a/third_party/boost_parts/boost/detail/interlocked.hpp +++ /dev/null @@ -1,210 +0,0 @@ -#ifndef BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED -#define BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED - -// -// boost/detail/interlocked.hpp -// -// Copyright 2005 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 - -// MS compatible compilers support #pragma once -#ifdef BOOST_HAS_PRAGMA_ONCE -#pragma once -#endif - -#if defined( BOOST_USE_WINDOWS_H ) - -# include - -# define BOOST_INTERLOCKED_INCREMENT InterlockedIncrement -# define BOOST_INTERLOCKED_DECREMENT InterlockedDecrement -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange -# define BOOST_INTERLOCKED_EXCHANGE InterlockedExchange -# define BOOST_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER InterlockedCompareExchangePointer -# define BOOST_INTERLOCKED_EXCHANGE_POINTER InterlockedExchangePointer - -#elif defined( BOOST_USE_INTRIN_H ) - -#include - -# define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement -# define BOOST_INTERLOCKED_DECREMENT _InterlockedDecrement -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange -# define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange -# define BOOST_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd - -# if defined(_M_IA64) || defined(_M_AMD64) || defined(__x86_64__) || defined(__x86_64) - -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER _InterlockedCompareExchangePointer -# define BOOST_INTERLOCKED_EXCHANGE_POINTER _InterlockedExchangePointer - -# else - -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \ - ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare))) -# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \ - ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange))) - -# endif - -#elif defined(_WIN32_WCE) - -#if _WIN32_WCE >= 0x600 - -extern "C" long __cdecl _InterlockedIncrement( long volatile * ); -extern "C" long __cdecl _InterlockedDecrement( long volatile * ); -extern "C" long __cdecl _InterlockedCompareExchange( long volatile *, long, long ); -extern "C" long __cdecl _InterlockedExchange( long volatile *, long ); -extern "C" long __cdecl _InterlockedExchangeAdd( long volatile *, long ); - -# define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement -# define BOOST_INTERLOCKED_DECREMENT _InterlockedDecrement -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange -# define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange -# define BOOST_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd - -#else -// under Windows CE we still have old-style Interlocked* functions - -extern "C" long __cdecl InterlockedIncrement( long* ); -extern "C" long __cdecl InterlockedDecrement( long* ); -extern "C" long __cdecl InterlockedCompareExchange( long*, long, long ); -extern "C" long __cdecl InterlockedExchange( long*, long ); -extern "C" long __cdecl InterlockedExchangeAdd( long*, long ); - -# define BOOST_INTERLOCKED_INCREMENT InterlockedIncrement -# define BOOST_INTERLOCKED_DECREMENT InterlockedDecrement -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange -# define BOOST_INTERLOCKED_EXCHANGE InterlockedExchange -# define BOOST_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd - -#endif - -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \ - ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long*)(dest),(long)(exchange),(long)(compare))) -# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \ - ((void*)BOOST_INTERLOCKED_EXCHANGE((long*)(dest),(long)(exchange))) - -#elif defined( BOOST_MSVC ) || defined( BOOST_INTEL_WIN ) - -#if defined( BOOST_MSVC ) && BOOST_MSVC >= 1500 - -#include - -#elif defined( __CLRCALL_PURE_OR_CDECL ) - -extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedIncrement( long volatile * ); -extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedDecrement( long volatile * ); -extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedCompareExchange( long volatile *, long, long ); -extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedExchange( long volatile *, long ); -extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedExchangeAdd( long volatile *, long ); - -#else - -extern "C" long __cdecl _InterlockedIncrement( long volatile * ); -extern "C" long __cdecl _InterlockedDecrement( long volatile * ); -extern "C" long __cdecl _InterlockedCompareExchange( long volatile *, long, long ); -extern "C" long __cdecl _InterlockedExchange( long volatile *, long ); -extern "C" long __cdecl _InterlockedExchangeAdd( long volatile *, long ); - -#endif - -# if defined(_M_IA64) || defined(_M_AMD64) - -extern "C" void* __cdecl _InterlockedCompareExchangePointer( void* volatile *, void*, void* ); -extern "C" void* __cdecl _InterlockedExchangePointer( void* volatile *, void* ); - -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER _InterlockedCompareExchangePointer -# define BOOST_INTERLOCKED_EXCHANGE_POINTER _InterlockedExchangePointer - -# else - -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \ - ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare))) -# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \ - ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange))) - -# endif - -# define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement -# define BOOST_INTERLOCKED_DECREMENT _InterlockedDecrement -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange -# define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange -# define BOOST_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd - -// Unlike __MINGW64__, __MINGW64_VERSION_MAJOR is defined by MinGW-w64 for both 32 and 64-bit targets. -#elif defined(__MINGW64_VERSION_MAJOR) - -// MinGW-w64 provides intrin.h for both 32 and 64-bit targets. -#include - -# define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement -# define BOOST_INTERLOCKED_DECREMENT _InterlockedDecrement -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange -# define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange -# define BOOST_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd -# if defined(__x86_64__) || defined(__x86_64) -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER _InterlockedCompareExchangePointer -# define BOOST_INTERLOCKED_EXCHANGE_POINTER _InterlockedExchangePointer -# else -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \ - ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare))) -# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \ - ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange))) -# endif - -#elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined( __CYGWIN__ ) - -#define BOOST_INTERLOCKED_IMPORT __declspec(dllimport) - -namespace boost -{ - -namespace detail -{ - -extern "C" BOOST_INTERLOCKED_IMPORT long __stdcall InterlockedIncrement( long volatile * ); -extern "C" BOOST_INTERLOCKED_IMPORT long __stdcall InterlockedDecrement( long volatile * ); -extern "C" BOOST_INTERLOCKED_IMPORT long __stdcall InterlockedCompareExchange( long volatile *, long, long ); -extern "C" BOOST_INTERLOCKED_IMPORT long __stdcall InterlockedExchange( long volatile *, long ); -extern "C" BOOST_INTERLOCKED_IMPORT long __stdcall InterlockedExchangeAdd( long volatile *, long ); - -# if defined(_M_IA64) || defined(_M_AMD64) -extern "C" BOOST_INTERLOCKED_IMPORT void* __stdcall InterlockedCompareExchangePointer( void* volatile *, void*, void* ); -extern "C" BOOST_INTERLOCKED_IMPORT void* __stdcall InterlockedExchangePointer( void* volatile *, void* ); -# endif - -} // namespace detail - -} // namespace boost - -# define BOOST_INTERLOCKED_INCREMENT ::boost::detail::InterlockedIncrement -# define BOOST_INTERLOCKED_DECREMENT ::boost::detail::InterlockedDecrement -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE ::boost::detail::InterlockedCompareExchange -# define BOOST_INTERLOCKED_EXCHANGE ::boost::detail::InterlockedExchange -# define BOOST_INTERLOCKED_EXCHANGE_ADD ::boost::detail::InterlockedExchangeAdd - -# if defined(_M_IA64) || defined(_M_AMD64) -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER ::boost::detail::InterlockedCompareExchangePointer -# define BOOST_INTERLOCKED_EXCHANGE_POINTER ::boost::detail::InterlockedExchangePointer -# else -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \ - ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare))) -# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \ - ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange))) -# endif - -#else - -# error "Interlocked intrinsics not available" - -#endif - -#endif // #ifndef BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED diff --git a/third_party/boost_parts/boost/detail/is_function_ref_tester.hpp b/third_party/boost_parts/boost/detail/is_function_ref_tester.hpp deleted file mode 100644 index 8e7d1d77..00000000 --- a/third_party/boost_parts/boost/detail/is_function_ref_tester.hpp +++ /dev/null @@ -1,136 +0,0 @@ - -// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, -// Aleksey Gurtovoy, Howard Hinnant & John Maddock 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) - -#if !defined(BOOST_PP_IS_ITERATING) - -///// header body - -#ifndef BOOST_DETAIL_IS_FUNCTION_REF_TESTER_HPP_INCLUDED -#define BOOST_DETAIL_IS_FUNCTION_REF_TESTER_HPP_INCLUDED - -#include "boost/type_traits/detail/yes_no_type.hpp" -#include "boost/type_traits/config.hpp" - -#if defined(BOOST_TT_PREPROCESSING_MODE) -# include "boost/preprocessor/iterate.hpp" -# include "boost/preprocessor/enum_params.hpp" -# include "boost/preprocessor/comma_if.hpp" -#endif - -namespace boost { -namespace detail { -namespace is_function_ref_tester_ { - -template -boost::type_traits::no_type BOOST_TT_DECL is_function_ref_tester(T& ...); - -#if !defined(BOOST_TT_PREPROCESSING_MODE) -// preprocessor-generated part, don't edit by hand! - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23), int); - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24), int); - -#else - -#define BOOST_PP_ITERATION_PARAMS_1 \ - (3, (0, 25, "boost/detail/is_function_ref_tester.hpp")) -#include BOOST_PP_ITERATE() - -#endif // BOOST_TT_PREPROCESSING_MODE - -} // namespace detail -} // namespace python -} // namespace boost - -#endif // BOOST_DETAIL_IS_FUNCTION_REF_TESTER_HPP_INCLUDED - -///// iteration - -#else -#define i BOOST_PP_FRAME_ITERATION(1) - -template -boost::type_traits::yes_type is_function_ref_tester(R (&)(BOOST_PP_ENUM_PARAMS(i,T)), int); - -#undef i -#endif // BOOST_PP_IS_ITERATING - diff --git a/third_party/boost_parts/boost/detail/iterator.hpp b/third_party/boost_parts/boost/detail/iterator.hpp index c2e8f1e2..2498ef44 100644 --- a/third_party/boost_parts/boost/detail/iterator.hpp +++ b/third_party/boost_parts/boost/detail/iterator.hpp @@ -9,6 +9,9 @@ // This header is obsolete and will be deprecated. #include +#if defined(__SUNPRO_CC) && (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) +#include +#endif namespace boost { @@ -19,6 +22,16 @@ namespace detail using std::iterator_traits; using std::distance; +#if defined(__SUNPRO_CC) && (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) +// std::distance from stlport with Oracle compiler 12.4 and 12.5 fails to deduce template parameters +// when one of the arguments is an array and the other one is a pointer. +template< typename T, std::size_t N > +inline typename std::iterator_traits< T* >::difference_type distance(T (&left)[N], T* right) +{ + return std::distance(static_cast< T* >(left), right); +} +#endif + } // namespace detail } // namespace boost diff --git a/third_party/boost_parts/boost/detail/lcast_precision.hpp b/third_party/boost_parts/boost/detail/lcast_precision.hpp index 93abce18..2be88fd8 100644 --- a/third_party/boost_parts/boost/detail/lcast_precision.hpp +++ b/third_party/boost_parts/boost/detail/lcast_precision.hpp @@ -125,6 +125,7 @@ inline std::streamsize lcast_get_precision(T* = 0) limits::radix == 10 && limits::digits10 > 0; std::streamsize const streamsize_max = (boost::integer_traits::max)(); + (void)streamsize_max; if(is_specialized_bin) { // Floating-point types with diff --git a/third_party/boost_parts/boost/detail/numeric_traits.hpp b/third_party/boost_parts/boost/detail/numeric_traits.hpp index 2f97ebf9..a62affb3 100644 --- a/third_party/boost_parts/boost/detail/numeric_traits.hpp +++ b/third_party/boost_parts/boost/detail/numeric_traits.hpp @@ -56,65 +56,39 @@ // 21 Jan 2001 - Created (David Abrahams) #ifndef BOOST_NUMERIC_TRAITS_HPP_DWA20001901 -# define BOOST_NUMERIC_TRAITS_HPP_DWA20001901 - -# include -# include -# include -# include -# include -# include +#define BOOST_NUMERIC_TRAITS_HPP_DWA20001901 + +#include +#include +#include +#include +#include +#include +#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS +#include +#include +#endif namespace boost { namespace detail { - // Template class is_signed -- determine whether a numeric type is signed - // Requires that T is constructable from the literals -1 and 0. Compile-time - // error results if that requirement is not met (and thus signedness is not - // likely to have meaning for that type). - template - struct is_signed - { -#if defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS) - BOOST_STATIC_CONSTANT(bool, value = (Number(-1) < Number(0))); -#else - BOOST_STATIC_CONSTANT(bool, value = std::numeric_limits::is_signed); -#endif - }; - -# ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS +#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS // digit_traits - compute the number of digits in a built-in integer // type. Needed for implementations on which numeric_limits is not specialized - // for intmax_t (e.g. VC6). - template struct digit_traits_select; - - // numeric_limits is specialized; just select that version of digits - template <> struct digit_traits_select + // for some integer types, like __int128 in libstdc++ (gcc). + template ::is_specialized> + struct digit_traits { - template struct traits - { - BOOST_STATIC_CONSTANT(int, digits = std::numeric_limits::digits); - }; + BOOST_STATIC_CONSTANT(int, digits = std::numeric_limits::digits); }; // numeric_limits is not specialized; compute digits from sizeof(T) - template <> struct digit_traits_select + template + struct digit_traits { - template struct traits - { - BOOST_STATIC_CONSTANT(int, digits = ( - sizeof(T) * std::numeric_limits::digits - - (is_signed::value ? 1 : 0)) - ); - }; - }; - - // here's the "usable" template - template struct digit_traits - { - typedef digit_traits_select< - ::std::numeric_limits::is_specialized> selector; - typedef typename selector::template traits traits; - BOOST_STATIC_CONSTANT(int, digits = traits::digits); + BOOST_STATIC_CONSTANT(int, digits = ( + sizeof(T) * std::numeric_limits::digits + - (boost::is_signed::value ? 1 : 0)) + ); }; #endif @@ -124,44 +98,48 @@ namespace boost { namespace detail { template struct integer_traits { -# ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS +#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS private: typedef Integer integer_type; typedef std::numeric_limits x; public: - typedef typename - if_true<(int(x::is_signed) - && (!int(x::is_bounded) - // digits is the number of no-sign bits - || (int(x::digits) + 1 >= digit_traits::digits)))>::template then< + typedef typename boost::conditional< + (int(x::is_signed) + && (!int(x::is_bounded) + // digits is the number of no-sign bits + || (int(x::digits) + 1 >= digit_traits::digits))), Integer, - - typename if_true<(int(x::digits) + 1 < digit_traits::digits)>::template then< - signed int, - typename if_true<(int(x::digits) + 1 < digit_traits::digits)>::template then< - signed long, + typename boost::conditional< + (int(x::digits) + 1 < digit_traits::digits), + signed int, - // else - intmax_t - >::type>::type>::type difference_type; + typename boost::conditional< + (int(x::digits) + 1 < digit_traits::digits), + signed long, + boost::intmax_t + >::type + >::type + >::type difference_type; #else BOOST_STATIC_ASSERT(boost::is_integral::value); - typedef typename - if_true<(sizeof(Integer) >= sizeof(intmax_t))>::template then< - - typename if_true<(is_signed::value)>::template then< + typedef typename boost::conditional< + (sizeof(Integer) >= sizeof(intmax_t)), + + boost::conditional< + (boost::is_signed::value), Integer, - intmax_t - >::type, + boost::intmax_t + >, - typename if_true<(sizeof(Integer) < sizeof(std::ptrdiff_t))>::template then< + boost::conditional< + (sizeof(Integer) < sizeof(std::ptrdiff_t)), std::ptrdiff_t, - intmax_t - >::type - >::type difference_type; -# endif + boost::intmax_t + > + >::type::type difference_type; +#endif }; // Right now, only supports integers, but should be expanded. @@ -172,7 +150,7 @@ namespace boost { namespace detail { }; template - typename numeric_traits::difference_type numeric_distance(Number x, Number y) + inline BOOST_CONSTEXPR typename numeric_traits::difference_type numeric_distance(Number x, Number y) { typedef typename numeric_traits::difference_type difference_type; return difference_type(y) - difference_type(x); diff --git a/third_party/boost_parts/boost/detail/ob_call_traits.hpp b/third_party/boost_parts/boost/detail/ob_call_traits.hpp deleted file mode 100644 index eb4df7a3..00000000 --- a/third_party/boost_parts/boost/detail/ob_call_traits.hpp +++ /dev/null @@ -1,168 +0,0 @@ -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/utility for most recent version including documentation. -// -// Crippled version for crippled compilers: -// see libs/utility/call_traits.htm -// - -/* Release notes: - 01st October 2000: - Fixed call_traits on VC6, using "poor man's partial specialisation", - using ideas taken from "Generative programming" by Krzysztof Czarnecki - & Ulrich Eisenecker. -*/ - -#ifndef BOOST_OB_CALL_TRAITS_HPP -#define BOOST_OB_CALL_TRAITS_HPP - -#ifndef BOOST_CONFIG_HPP -#include -#endif - -#ifndef BOOST_ARITHMETIC_TYPE_TRAITS_HPP -#include -#endif -#ifndef BOOST_COMPOSITE_TYPE_TRAITS_HPP -#include -#endif - -namespace boost{ - -#ifdef BOOST_MSVC6_MEMBER_TEMPLATES -// -// use member templates to emulate -// partial specialisation: -// -namespace detail{ - -template -struct standard_call_traits -{ - typedef T value_type; - typedef T& reference; - typedef const T& const_reference; - typedef const T& param_type; -}; -template -struct simple_call_traits -{ - typedef T value_type; - typedef T& reference; - typedef const T& const_reference; - typedef const T param_type; -}; -template -struct reference_call_traits -{ - typedef T value_type; - typedef T reference; - typedef T const_reference; - typedef T param_type; -}; - -template -struct call_traits_chooser -{ - template - struct rebind - { - typedef standard_call_traits type; - }; -}; - -template <> -struct call_traits_chooser -{ - template - struct rebind - { - typedef simple_call_traits type; - }; -}; - -template <> -struct call_traits_chooser -{ - template - struct rebind - { - typedef reference_call_traits type; - }; -}; - -template -struct call_traits_sizeof_chooser2 -{ - template - struct small_rebind - { - typedef simple_call_traits small_type; - }; -}; - -template<> -struct call_traits_sizeof_chooser2 -{ - template - struct small_rebind - { - typedef standard_call_traits small_type; - }; -}; - -template <> -struct call_traits_chooser -{ - template - struct rebind - { - enum { sizeof_choice = (sizeof(T) <= sizeof(void*)) }; - typedef call_traits_sizeof_chooser2<(sizeof(T) <= sizeof(void*))> chooser; - typedef typename chooser::template small_rebind bound_type; - typedef typename bound_type::small_type type; - }; -}; - -} // namespace detail -template -struct call_traits -{ -private: - typedef detail::call_traits_chooser< - ::boost::is_pointer::value, - ::boost::is_arithmetic::value, - ::boost::is_reference::value - > chooser; - typedef typename chooser::template rebind bound_type; - typedef typename bound_type::type call_traits_type; -public: - typedef typename call_traits_type::value_type value_type; - typedef typename call_traits_type::reference reference; - typedef typename call_traits_type::const_reference const_reference; - typedef typename call_traits_type::param_type param_type; -}; - -#else -// -// sorry call_traits is completely non-functional -// blame your broken compiler: -// - -template -struct call_traits -{ - typedef T value_type; - typedef T& reference; - typedef const T& const_reference; - typedef const T& param_type; -}; - -#endif // member templates - -} - -#endif // BOOST_OB_CALL_TRAITS_HPP diff --git a/third_party/boost_parts/boost/detail/ob_compressed_pair.hpp b/third_party/boost_parts/boost/detail/ob_compressed_pair.hpp deleted file mode 100644 index 727acab6..00000000 --- a/third_party/boost_parts/boost/detail/ob_compressed_pair.hpp +++ /dev/null @@ -1,510 +0,0 @@ -// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. -// Use, modification and distribution are subject to the Boost Software License, -// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt). -// -// See http://www.boost.org/libs/utility for most recent version including documentation. -// see libs/utility/compressed_pair.hpp -// -/* Release notes: - 20 Jan 2001: - Fixed obvious bugs (David Abrahams) - 07 Oct 2000: - Added better single argument constructor support. - 03 Oct 2000: - Added VC6 support (JM). - 23rd July 2000: - Additional comments added. (JM) - Jan 2000: - Original version: this version crippled for use with crippled compilers - - John Maddock Jan 2000. -*/ - - -#ifndef BOOST_OB_COMPRESSED_PAIR_HPP -#define BOOST_OB_COMPRESSED_PAIR_HPP - -#include -#ifndef BOOST_OBJECT_TYPE_TRAITS_HPP -#include -#endif -#ifndef BOOST_SAME_TRAITS_HPP -#include -#endif -#ifndef BOOST_CALL_TRAITS_HPP -#include -#endif - -namespace boost -{ -#ifdef BOOST_MSVC6_MEMBER_TEMPLATES -// -// use member templates to emulate -// partial specialisation. Note that due to -// problems with overload resolution with VC6 -// each of the compressed_pair versions that follow -// have one template single-argument constructor -// in place of two specific constructors: -// - -template -class compressed_pair; - -namespace detail{ - -template -struct best_conversion_traits -{ - typedef char one; - typedef char (&two)[2]; - static A a; - static one test(T1); - static two test(T2); - - enum { value = sizeof(test(a)) }; -}; - -template -struct init_one; - -template <> -struct init_one<1> -{ - template - static void init(const A& a, T1* p1, T2*) - { - *p1 = a; - } -}; - -template <> -struct init_one<2> -{ - template - static void init(const A& a, T1*, T2* p2) - { - *p2 = a; - } -}; - - -// T1 != T2, both non-empty -template -class compressed_pair_0 -{ -private: - T1 _first; - T2 _second; -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_0() : _first(), _second() {} - compressed_pair_0(first_param_type x, second_param_type y) : _first(x), _second(y) {} - template - explicit compressed_pair_0(const A& val) - { - init_one::value>::init(val, &_first, &_second); - } - compressed_pair_0(const ::boost::compressed_pair& x) - : _first(x.first()), _second(x.second()) {} - -#if 0 - compressed_pair_0& operator=(const compressed_pair_0& x) { - cout << "assigning compressed pair 0" << endl; - _first = x._first; - _second = x._second; - cout << "finished assigning compressed pair 0" << endl; - return *this; - } -#endif - - first_reference first() { return _first; } - first_const_reference first() const { return _first; } - - second_reference second() { return _second; } - second_const_reference second() const { return _second; } - - void swap(compressed_pair_0& y) - { - using std::swap; - swap(_first, y._first); - swap(_second, y._second); - } -}; - -// T1 != T2, T2 empty -template -class compressed_pair_1 : T2 -{ -private: - T1 _first; -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_1() : T2(), _first() {} - compressed_pair_1(first_param_type x, second_param_type y) : T2(y), _first(x) {} - - template - explicit compressed_pair_1(const A& val) - { - init_one::value>::init(val, &_first, static_cast(this)); - } - - compressed_pair_1(const ::boost::compressed_pair& x) - : T2(x.second()), _first(x.first()) {} - -#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300 - // Total weirdness. If the assignment to _first is moved after - // the call to the inherited operator=, then this breaks graph/test/graph.cpp - // by way of iterator_adaptor. - compressed_pair_1& operator=(const compressed_pair_1& x) { - _first = x._first; - T2::operator=(x); - return *this; - } -#endif - - first_reference first() { return _first; } - first_const_reference first() const { return _first; } - - second_reference second() { return *this; } - second_const_reference second() const { return *this; } - - void swap(compressed_pair_1& y) - { - // no need to swap empty base class: - using std::swap; - swap(_first, y._first); - } -}; - -// T1 != T2, T1 empty -template -class compressed_pair_2 : T1 -{ -private: - T2 _second; -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_2() : T1(), _second() {} - compressed_pair_2(first_param_type x, second_param_type y) : T1(x), _second(y) {} - template - explicit compressed_pair_2(const A& val) - { - init_one::value>::init(val, static_cast(this), &_second); - } - compressed_pair_2(const ::boost::compressed_pair& x) - : T1(x.first()), _second(x.second()) {} - -#if 0 - compressed_pair_2& operator=(const compressed_pair_2& x) { - cout << "assigning compressed pair 2" << endl; - T1::operator=(x); - _second = x._second; - cout << "finished assigning compressed pair 2" << endl; - return *this; - } -#endif - first_reference first() { return *this; } - first_const_reference first() const { return *this; } - - second_reference second() { return _second; } - second_const_reference second() const { return _second; } - - void swap(compressed_pair_2& y) - { - // no need to swap empty base class: - using std::swap; - swap(_second, y._second); - } -}; - -// T1 != T2, both empty -template -class compressed_pair_3 : T1, T2 -{ -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_3() : T1(), T2() {} - compressed_pair_3(first_param_type x, second_param_type y) : T1(x), T2(y) {} - template - explicit compressed_pair_3(const A& val) - { - init_one::value>::init(val, static_cast(this), static_cast(this)); - } - compressed_pair_3(const ::boost::compressed_pair& x) - : T1(x.first()), T2(x.second()) {} - - first_reference first() { return *this; } - first_const_reference first() const { return *this; } - - second_reference second() { return *this; } - second_const_reference second() const { return *this; } - - void swap(compressed_pair_3& y) - { - // no need to swap empty base classes: - } -}; - -// T1 == T2, and empty -template -class compressed_pair_4 : T1 -{ -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_4() : T1() {} - compressed_pair_4(first_param_type x, second_param_type y) : T1(x), m_second(y) {} - // only one single argument constructor since T1 == T2 - explicit compressed_pair_4(first_param_type x) : T1(x), m_second(x) {} - compressed_pair_4(const ::boost::compressed_pair& x) - : T1(x.first()), m_second(x.second()) {} - - first_reference first() { return *this; } - first_const_reference first() const { return *this; } - - second_reference second() { return m_second; } - second_const_reference second() const { return m_second; } - - void swap(compressed_pair_4& y) - { - // no need to swap empty base classes: - } -private: - T2 m_second; -}; - -// T1 == T2, not empty -template -class compressed_pair_5 -{ -private: - T1 _first; - T2 _second; -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair_5() : _first(), _second() {} - compressed_pair_5(first_param_type x, second_param_type y) : _first(x), _second(y) {} - // only one single argument constructor since T1 == T2 - explicit compressed_pair_5(first_param_type x) : _first(x), _second(x) {} - compressed_pair_5(const ::boost::compressed_pair& c) - : _first(c.first()), _second(c.second()) {} - - first_reference first() { return _first; } - first_const_reference first() const { return _first; } - - second_reference second() { return _second; } - second_const_reference second() const { return _second; } - - void swap(compressed_pair_5& y) - { - using std::swap; - swap(_first, y._first); - swap(_second, y._second); - } -}; - -template -struct compressed_pair_chooser -{ - template - struct rebind - { - typedef compressed_pair_0 type; - }; -}; - -template <> -struct compressed_pair_chooser -{ - template - struct rebind - { - typedef compressed_pair_1 type; - }; -}; - -template <> -struct compressed_pair_chooser -{ - template - struct rebind - { - typedef compressed_pair_2 type; - }; -}; - -template <> -struct compressed_pair_chooser -{ - template - struct rebind - { - typedef compressed_pair_3 type; - }; -}; - -template <> -struct compressed_pair_chooser -{ - template - struct rebind - { - typedef compressed_pair_4 type; - }; -}; - -template <> -struct compressed_pair_chooser -{ - template - struct rebind - { - typedef compressed_pair_5 type; - }; -}; - -template -struct compressed_pair_traits -{ -private: - typedef compressed_pair_chooser::value, is_empty::value, is_same::value> chooser; - typedef typename chooser::template rebind bound_type; -public: - typedef typename bound_type::type type; -}; - -} // namespace detail - -template -class compressed_pair : public detail::compressed_pair_traits::type -{ -private: - typedef typename detail::compressed_pair_traits::type base_type; -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair() : base_type() {} - compressed_pair(first_param_type x, second_param_type y) : base_type(x, y) {} - template - explicit compressed_pair(const A& x) : base_type(x){} - - first_reference first() { return base_type::first(); } - first_const_reference first() const { return base_type::first(); } - - second_reference second() { return base_type::second(); } - second_const_reference second() const { return base_type::second(); } -}; - -template -inline void swap(compressed_pair& x, compressed_pair& y) -{ - x.swap(y); -} - -#else -// no partial specialisation, no member templates: - -template -class compressed_pair -{ -private: - T1 _first; - T2 _second; -public: - typedef T1 first_type; - typedef T2 second_type; - typedef typename call_traits::param_type first_param_type; - typedef typename call_traits::param_type second_param_type; - typedef typename call_traits::reference first_reference; - typedef typename call_traits::reference second_reference; - typedef typename call_traits::const_reference first_const_reference; - typedef typename call_traits::const_reference second_const_reference; - - compressed_pair() : _first(), _second() {} - compressed_pair(first_param_type x, second_param_type y) : _first(x), _second(y) {} - explicit compressed_pair(first_param_type x) : _first(x), _second() {} - // can't define this in case T1 == T2: - // explicit compressed_pair(second_param_type y) : _first(), _second(y) {} - - first_reference first() { return _first; } - first_const_reference first() const { return _first; } - - second_reference second() { return _second; } - second_const_reference second() const { return _second; } - - void swap(compressed_pair& y) - { - using std::swap; - swap(_first, y._first); - swap(_second, y._second); - } -}; - -template -inline void swap(compressed_pair& x, compressed_pair& y) -{ - x.swap(y); -} - -#endif - -} // boost - -#endif // BOOST_OB_COMPRESSED_PAIR_HPP - - - diff --git a/third_party/boost_parts/boost/detail/quick_allocator.hpp b/third_party/boost_parts/boost/detail/quick_allocator.hpp deleted file mode 100644 index d54b3a79..00000000 --- a/third_party/boost_parts/boost/detail/quick_allocator.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED -#define BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED - -// MS compatible compilers support #pragma once - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -# pragma once -#endif - -// -// detail/quick_allocator.hpp -// -// Copyright (c) 2003 David Abrahams -// Copyright (c) 2003 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 - -#endif // #ifndef BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED diff --git a/third_party/boost_parts/boost/detail/utf8_codecvt_facet.hpp b/third_party/boost_parts/boost/detail/utf8_codecvt_facet.hpp index b3c7346d..12ae19ba 100644 --- a/third_party/boost_parts/boost/detail/utf8_codecvt_facet.hpp +++ b/third_party/boost_parts/boost/detail/utf8_codecvt_facet.hpp @@ -109,16 +109,14 @@ BOOST_UTF8_BEGIN_NAMESPACE #define BOOST_UTF8_DECL #endif -struct BOOST_SYMBOL_VISIBLE utf8_codecvt_facet : +struct BOOST_UTF8_DECL utf8_codecvt_facet : public std::codecvt { public: - BOOST_UTF8_DECL explicit utf8_codecvt_facet(std::size_t no_locale_manage=0) - : std::codecvt(no_locale_manage) - {} - virtual ~utf8_codecvt_facet(){} + explicit utf8_codecvt_facet(std::size_t no_locale_manage=0); + virtual ~utf8_codecvt_facet(){} protected: - BOOST_UTF8_DECL virtual std::codecvt_base::result do_in( + virtual std::codecvt_base::result do_in( std::mbstate_t& state, const char * from, const char * from_end, @@ -128,7 +126,7 @@ struct BOOST_SYMBOL_VISIBLE utf8_codecvt_facet : wchar_t*& to_next ) const; - BOOST_UTF8_DECL virtual std::codecvt_base::result do_out( + virtual std::codecvt_base::result do_out( std::mbstate_t & state, const wchar_t * from, const wchar_t * from_end, @@ -152,11 +150,11 @@ struct BOOST_SYMBOL_VISIBLE utf8_codecvt_facet : return get_octet_count(lead_octet) - 1; } - BOOST_UTF8_DECL static unsigned int get_octet_count(unsigned char lead_octet); + static unsigned int get_octet_count(unsigned char lead_octet); // How many "continuing octets" will be needed for this word // == total octets - 1. - BOOST_UTF8_DECL int get_cont_octet_out_count(wchar_t word) const ; + int get_cont_octet_out_count(wchar_t word) const ; virtual bool do_always_noconv() const BOOST_NOEXCEPT_OR_NOTHROW { return false; @@ -180,8 +178,8 @@ struct BOOST_SYMBOL_VISIBLE utf8_codecvt_facet : // How many char objects can I process to get <= max_limit // wchar_t objects? - BOOST_UTF8_DECL virtual int do_length( - const std::mbstate_t &, + virtual int do_length( + std::mbstate_t &, const char * from, const char * from_end, std::size_t max_limit @@ -190,8 +188,10 @@ struct BOOST_SYMBOL_VISIBLE utf8_codecvt_facet : throw() #endif ; + + // Nonstandard override virtual int do_length( - std::mbstate_t & s, + const std::mbstate_t & s, const char * from, const char * from_end, std::size_t max_limit @@ -201,12 +201,13 @@ struct BOOST_SYMBOL_VISIBLE utf8_codecvt_facet : #endif { return do_length( - const_cast(s), + const_cast(s), from, from_end, max_limit ); } + // Largest possible value do_length(state,from,from_end,1) could return. virtual int do_max_length() const BOOST_NOEXCEPT_OR_NOTHROW { return 6; // largest UTF-8 encoding of a UCS-4 character diff --git a/third_party/boost_parts/boost/detail/utf8_codecvt_facet.ipp b/third_party/boost_parts/boost/detail/utf8_codecvt_facet.ipp index a6a5e2d3..d60f9063 100644 --- a/third_party/boost_parts/boost/detail/utf8_codecvt_facet.ipp +++ b/third_party/boost_parts/boost/detail/utf8_codecvt_facet.ipp @@ -30,8 +30,14 @@ BOOST_UTF8_BEGIN_NAMESPACE /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 // implementation for wchar_t +utf8_codecvt_facet::utf8_codecvt_facet( + std::size_t no_locale_manage +) : + std::codecvt(no_locale_manage) +{} + // Translate incoming UTF-8 into UCS-4 -BOOST_UTF8_DECL std::codecvt_base::result utf8_codecvt_facet::do_in( +std::codecvt_base::result utf8_codecvt_facet::do_in( std::mbstate_t& /*state*/, const char * from, const char * from_end, @@ -108,7 +114,7 @@ BOOST_UTF8_DECL std::codecvt_base::result utf8_codecvt_facet::do_in( else return std::codecvt_base::partial; } -BOOST_UTF8_DECL std::codecvt_base::result utf8_codecvt_facet::do_out( +std::codecvt_base::result utf8_codecvt_facet::do_out( std::mbstate_t& /*state*/, const wchar_t * from, const wchar_t * from_end, @@ -170,8 +176,8 @@ BOOST_UTF8_DECL std::codecvt_base::result utf8_codecvt_facet::do_out( // How many char objects can I process to get <= max_limit // wchar_t objects? -BOOST_UTF8_DECL int utf8_codecvt_facet::do_length( - const std::mbstate_t &, +int utf8_codecvt_facet::do_length( + std::mbstate_t &, const char * from, const char * from_end, std::size_t max_limit @@ -198,11 +204,11 @@ BOOST_UTF8_DECL int utf8_codecvt_facet::do_length( last_octet_count = (get_octet_count(*from_next)); ++char_count; } - return static_cast(from_next-from_end); + return static_cast(from_next-from); } -BOOST_UTF8_DECL unsigned int utf8_codecvt_facet::get_octet_count( - unsigned char lead_octet +unsigned int utf8_codecvt_facet::get_octet_count( + unsigned char lead_octet ){ // if the 0-bit (MSB) is 0, then 1 character if (lead_octet <= 0x7f) return 1; @@ -273,7 +279,7 @@ int get_cont_octet_out_count_impl<4>(wchar_t word){ // How many "continuing octets" will be needed for this word // == total octets - 1. -BOOST_UTF8_DECL int utf8_codecvt_facet::get_cont_octet_out_count( +int utf8_codecvt_facet::get_cont_octet_out_count( wchar_t word ) const { return detail::get_cont_octet_out_count_impl(word); diff --git a/third_party/boost_parts/boost/detail/workaround.hpp b/third_party/boost_parts/boost/detail/workaround.hpp index 40b3423b..fb961158 100644 --- a/third_party/boost_parts/boost/detail/workaround.hpp +++ b/third_party/boost_parts/boost/detail/workaround.hpp @@ -3,265 +3,8 @@ // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef WORKAROUND_DWA2002126_HPP -# define WORKAROUND_DWA2002126_HPP +#define WORKAROUND_DWA2002126_HPP -// Compiler/library version workaround macro -// -// Usage: -// -// #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) -// // workaround for eVC4 and VC6 -// ... // workaround code here -// #endif -// -// When BOOST_STRICT_CONFIG is defined, expands to 0. Otherwise, the -// first argument must be undefined or expand to a numeric -// value. The above expands to: -// -// (BOOST_MSVC) != 0 && (BOOST_MSVC) < 1300 -// -// When used for workarounds that apply to the latest known version -// and all earlier versions of a compiler, the following convention -// should be observed: -// -// #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1301)) -// -// The version number in this case corresponds to the last version in -// which the workaround was known to have been required. When -// BOOST_DETECT_OUTDATED_WORKAROUNDS is not the defined, the macro -// BOOST_TESTED_AT(x) expands to "!= 0", which effectively activates -// the workaround for any version of the compiler. When -// BOOST_DETECT_OUTDATED_WORKAROUNDS is defined, a compiler warning or -// error will be issued if the compiler version exceeds the argument -// to BOOST_TESTED_AT(). This can be used to locate workarounds which -// may be obsoleted by newer versions. - -# ifndef BOOST_STRICT_CONFIG - -#include - -#ifndef __BORLANDC__ -#define __BORLANDC___WORKAROUND_GUARD 1 -#else -#define __BORLANDC___WORKAROUND_GUARD 0 -#endif -#ifndef __CODEGEARC__ -#define __CODEGEARC___WORKAROUND_GUARD 1 -#else -#define __CODEGEARC___WORKAROUND_GUARD 0 -#endif -#ifndef _MSC_VER -#define _MSC_VER_WORKAROUND_GUARD 1 -#else -#define _MSC_VER_WORKAROUND_GUARD 0 -#endif -#ifndef _MSC_FULL_VER -#define _MSC_FULL_VER_WORKAROUND_GUARD 1 -#else -#define _MSC_FULL_VER_WORKAROUND_GUARD 0 -#endif -#ifndef BOOST_MSVC -#define BOOST_MSVC_WORKAROUND_GUARD 1 -#else -#define BOOST_MSVC_WORKAROUND_GUARD 0 -#endif -#ifndef BOOST_MSVC_FULL_VER -#define BOOST_MSVC_FULL_VER_WORKAROUND_GUARD 1 -#else -#define BOOST_MSVC_FULL_VER_WORKAROUND_GUARD 0 -#endif -#ifndef __GNUC__ -#define __GNUC___WORKAROUND_GUARD 1 -#else -#define __GNUC___WORKAROUND_GUARD 0 -#endif -#ifndef __GNUC_MINOR__ -#define __GNUC_MINOR___WORKAROUND_GUARD 1 -#else -#define __GNUC_MINOR___WORKAROUND_GUARD 0 -#endif -#ifndef __GNUC_PATCHLEVEL__ -#define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 1 -#else -#define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 0 -#endif -#ifndef __IBMCPP__ -#define __IBMCPP___WORKAROUND_GUARD 1 -#else -#define __IBMCPP___WORKAROUND_GUARD 0 -#endif -#ifndef __SUNPRO_CC -#define __SUNPRO_CC_WORKAROUND_GUARD 1 -#else -#define __SUNPRO_CC_WORKAROUND_GUARD 0 -#endif -#ifndef __DECCXX_VER -#define __DECCXX_VER_WORKAROUND_GUARD 1 -#else -#define __DECCXX_VER_WORKAROUND_GUARD 0 -#endif -#ifndef __MWERKS__ -#define __MWERKS___WORKAROUND_GUARD 1 -#else -#define __MWERKS___WORKAROUND_GUARD 0 -#endif -#ifndef __EDG__ -#define __EDG___WORKAROUND_GUARD 1 -#else -#define __EDG___WORKAROUND_GUARD 0 -#endif -#ifndef __EDG_VERSION__ -#define __EDG_VERSION___WORKAROUND_GUARD 1 -#else -#define __EDG_VERSION___WORKAROUND_GUARD 0 -#endif -#ifndef __HP_aCC -#define __HP_aCC_WORKAROUND_GUARD 1 -#else -#define __HP_aCC_WORKAROUND_GUARD 0 -#endif -#ifndef __hpxstd98 -#define __hpxstd98_WORKAROUND_GUARD 1 -#else -#define __hpxstd98_WORKAROUND_GUARD 0 -#endif -#ifndef _CRAYC -#define _CRAYC_WORKAROUND_GUARD 1 -#else -#define _CRAYC_WORKAROUND_GUARD 0 -#endif -#ifndef __DMC__ -#define __DMC___WORKAROUND_GUARD 1 -#else -#define __DMC___WORKAROUND_GUARD 0 -#endif -#ifndef MPW_CPLUS -#define MPW_CPLUS_WORKAROUND_GUARD 1 -#else -#define MPW_CPLUS_WORKAROUND_GUARD 0 -#endif -#ifndef __COMO__ -#define __COMO___WORKAROUND_GUARD 1 -#else -#define __COMO___WORKAROUND_GUARD 0 -#endif -#ifndef __COMO_VERSION__ -#define __COMO_VERSION___WORKAROUND_GUARD 1 -#else -#define __COMO_VERSION___WORKAROUND_GUARD 0 -#endif -#ifndef __INTEL_COMPILER -#define __INTEL_COMPILER_WORKAROUND_GUARD 1 -#else -#define __INTEL_COMPILER_WORKAROUND_GUARD 0 -#endif -#ifndef __ICL -#define __ICL_WORKAROUND_GUARD 1 -#else -#define __ICL_WORKAROUND_GUARD 0 -#endif -#ifndef _COMPILER_VERSION -#define _COMPILER_VERSION_WORKAROUND_GUARD 1 -#else -#define _COMPILER_VERSION_WORKAROUND_GUARD 0 -#endif - -#ifndef _RWSTD_VER -#define _RWSTD_VER_WORKAROUND_GUARD 1 -#else -#define _RWSTD_VER_WORKAROUND_GUARD 0 -#endif -#ifndef BOOST_RWSTD_VER -#define BOOST_RWSTD_VER_WORKAROUND_GUARD 1 -#else -#define BOOST_RWSTD_VER_WORKAROUND_GUARD 0 -#endif -#ifndef __GLIBCPP__ -#define __GLIBCPP___WORKAROUND_GUARD 1 -#else -#define __GLIBCPP___WORKAROUND_GUARD 0 -#endif -#ifndef _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC -#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 1 -#else -#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 0 -#endif -#ifndef __SGI_STL_PORT -#define __SGI_STL_PORT_WORKAROUND_GUARD 1 -#else -#define __SGI_STL_PORT_WORKAROUND_GUARD 0 -#endif -#ifndef _STLPORT_VERSION -#define _STLPORT_VERSION_WORKAROUND_GUARD 1 -#else -#define _STLPORT_VERSION_WORKAROUND_GUARD 0 -#endif -#ifndef __LIBCOMO_VERSION__ -#define __LIBCOMO_VERSION___WORKAROUND_GUARD 1 -#else -#define __LIBCOMO_VERSION___WORKAROUND_GUARD 0 -#endif -#ifndef _CPPLIB_VER -#define _CPPLIB_VER_WORKAROUND_GUARD 1 -#else -#define _CPPLIB_VER_WORKAROUND_GUARD 0 -#endif - -#ifndef BOOST_INTEL_CXX_VERSION -#define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 1 -#else -#define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 0 -#endif -#ifndef BOOST_INTEL_WIN -#define BOOST_INTEL_WIN_WORKAROUND_GUARD 1 -#else -#define BOOST_INTEL_WIN_WORKAROUND_GUARD 0 -#endif -#ifndef BOOST_DINKUMWARE_STDLIB -#define BOOST_DINKUMWARE_STDLIB_WORKAROUND_GUARD 1 -#else -#define BOOST_DINKUMWARE_STDLIB_WORKAROUND_GUARD 0 -#endif -#ifndef BOOST_INTEL -#define BOOST_INTEL_WORKAROUND_GUARD 1 -#else -#define BOOST_INTEL_WORKAROUND_GUARD 0 -#endif -// Always define to zero, if it's used it'll be defined my MPL: -#define BOOST_MPL_CFG_GCC_WORKAROUND_GUARD 0 - -# define BOOST_WORKAROUND(symbol, test) \ - ((symbol ## _WORKAROUND_GUARD + 0 == 0) && \ - (symbol != 0) && (1 % (( (symbol test) ) + 1))) -// ^ ^ ^ ^ -// The extra level of parenthesis nesting above, along with the -// BOOST_OPEN_PAREN indirection below, is required to satisfy the -// broken preprocessor in MWCW 8.3 and earlier. -// -// The basic mechanism works as follows: -// (symbol test) + 1 => if (symbol test) then 2 else 1 -// 1 % ((symbol test) + 1) => if (symbol test) then 1 else 0 -// -// The complication with % is for cooperation with BOOST_TESTED_AT(). -// When "test" is BOOST_TESTED_AT(x) and -// BOOST_DETECT_OUTDATED_WORKAROUNDS is #defined, -// -// symbol test => if (symbol <= x) then 1 else -1 -// (symbol test) + 1 => if (symbol <= x) then 2 else 0 -// 1 % ((symbol test) + 1) => if (symbol <= x) then 1 else divide-by-zero -// - -# ifdef BOOST_DETECT_OUTDATED_WORKAROUNDS -# define BOOST_OPEN_PAREN ( -# define BOOST_TESTED_AT(value) > value) ?(-1): BOOST_OPEN_PAREN 1 -# else -# define BOOST_TESTED_AT(value) != ((value)-(value)) -# endif - -# else - -# define BOOST_WORKAROUND(symbol, test) 0 - -# endif +#include #endif // WORKAROUND_DWA2002126_HPP diff --git a/third_party/boost_parts/boost/dynamic_bitset/dynamic_bitset.hpp b/third_party/boost_parts/boost/dynamic_bitset/dynamic_bitset.hpp index f6002d84..83fcb61a 100644 --- a/third_party/boost_parts/boost/dynamic_bitset/dynamic_bitset.hpp +++ b/third_party/boost_parts/boost/dynamic_bitset/dynamic_bitset.hpp @@ -86,7 +86,7 @@ class dynamic_bitset // the one and only non-copy ctor - reference(block_type & b, block_type pos) + reference(block_type & b, block_width_type pos) :m_block(b), m_mask( (assert(pos < bits_per_block), block_type(1) << pos ) @@ -305,6 +305,9 @@ class dynamic_bitset size_type num_blocks() const BOOST_NOEXCEPT; size_type max_size() const BOOST_NOEXCEPT; bool empty() const BOOST_NOEXCEPT; + size_type capacity() const BOOST_NOEXCEPT; + void reserve(size_type num_bits); + void shrink_to_fit(); bool is_subset_of(const dynamic_bitset& a) const; bool is_proper_subset_of(const dynamic_bitset& a) const; @@ -325,6 +328,10 @@ class dynamic_bitset friend bool operator<(const dynamic_bitset& a, const dynamic_bitset& b); + template + friend bool oplessthan(const dynamic_bitset& a, + const dynamic_bitset& b); + template friend void to_block_range(const dynamic_bitset& b, @@ -345,6 +352,10 @@ class dynamic_bitset #endif +public: + // forward declaration for optional zero-copy serialization support + class serialize_impl; + friend class serialize_impl; private: BOOST_STATIC_CONSTANT(block_width_type, ulong_width = std::numeric_limits::digits); @@ -750,15 +761,15 @@ push_back(bool bit) template void dynamic_bitset:: -pop_back() +pop_back() { const size_type old_num_blocks = num_blocks(); const size_type required_blocks = calc_num_blocks(m_num_bits - 1); - + if (required_blocks != old_num_blocks) { - m_bits.pop_back(); + m_bits.pop_back(); } - + --m_num_bits; m_zero_unused_bits(); } @@ -966,7 +977,7 @@ template dynamic_bitset& dynamic_bitset::set() { - std::fill(m_bits.begin(), m_bits.end(), ~Block(0)); + std::fill(m_bits.begin(), m_bits.end(), static_cast(~0)); m_zero_unused_bits(); return *this; } @@ -1045,7 +1056,7 @@ bool dynamic_bitset::all() const } const block_width_type extra_bits = count_extra_bits(); - block_type const all_ones = ~static_cast(0); + block_type const all_ones = static_cast(~0); if (extra_bits == 0) { for (size_type i = 0, e = num_blocks(); i < e; ++i) { @@ -1059,7 +1070,7 @@ bool dynamic_bitset::all() const return false; } } - block_type const mask = ~(~static_cast(0) << extra_bits); + const block_type mask = (block_type(1) << extra_bits) - 1; if (m_highest_block() != mask) { return false; } @@ -1267,6 +1278,27 @@ inline bool dynamic_bitset::empty() const BOOST_NOEXCEPT return size() == 0; } +template +inline typename dynamic_bitset::size_type +dynamic_bitset::capacity() const BOOST_NOEXCEPT +{ + return m_bits.capacity() * bits_per_block; +} + +template +inline void dynamic_bitset::reserve(size_type num_bits) +{ + m_bits.reserve(calc_num_blocks(num_bits)); +} + +template +void dynamic_bitset::shrink_to_fit() +{ + if (m_bits.size() < m_bits.capacity()) { + buffer_type(m_bits).swap(m_bits); + } +} + template bool dynamic_bitset:: is_subset_of(const dynamic_bitset& a) const @@ -1392,23 +1424,95 @@ template bool operator<(const dynamic_bitset& a, const dynamic_bitset& b) { - assert(a.size() == b.size()); - typedef typename dynamic_bitset::size_type size_type; +// assert(a.size() == b.size()); - //if (a.size() == 0) - // return false; + typedef BOOST_DEDUCED_TYPENAME dynamic_bitset::size_type size_type; + + size_type asize(a.size()); + size_type bsize(b.size()); - // Since we are storing the most significant bit - // at pos == size() - 1, we need to do the comparisons in reverse. - // - for (size_type ii = a.num_blocks(); ii > 0; --ii) { - size_type i = ii-1; - if (a.m_bits[i] < b.m_bits[i]) + if (!bsize) + { + return false; + } + else if (!asize) + { return true; - else if (a.m_bits[i] > b.m_bits[i]) + } + else if (asize == bsize) + { + for (size_type ii = a.num_blocks(); ii > 0; --ii) + { + size_type i = ii-1; + if (a.m_bits[i] < b.m_bits[i]) + return true; + else if (a.m_bits[i] > b.m_bits[i]) + return false; + } return false; - } - return false; + } + else + { + + size_type leqsize(std::min BOOST_PREVENT_MACRO_SUBSTITUTION(asize,bsize)); + + for (size_type ii = 0; ii < leqsize; ++ii,--asize,--bsize) + { + size_type i = asize-1; + size_type j = bsize-1; + if (a[i] < b[j]) + return true; + else if (a[i] > b[j]) + return false; + } + return (a.size() < b.size()); + } +} + +template +bool oplessthan(const dynamic_bitset& a, + const dynamic_bitset& b) +{ +// assert(a.size() == b.size()); + + typedef BOOST_DEDUCED_TYPENAME dynamic_bitset::size_type size_type; + + size_type asize(a.num_blocks()); + size_type bsize(b.num_blocks()); + assert(asize == 3); + assert(bsize == 4); + + if (!bsize) + { + return false; + } + else if (!asize) + { + return true; + } + else + { + + size_type leqsize(std::min BOOST_PREVENT_MACRO_SUBSTITUTION(asize,bsize)); + assert(leqsize == 3); + + //if (a.size() == 0) + // return false; + + // Since we are storing the most significant bit + // at pos == size() - 1, we need to do the comparisons in reverse. + // + for (size_type ii = 0; ii < leqsize; ++ii,--asize,--bsize) + { + size_type i = asize-1; + size_type j = bsize-1; + if (a.m_bits[i] < b.m_bits[j]) + return true; + else if (a.m_bits[i] > b.m_bits[j]) + return false; + } + return (a.num_blocks() < b.num_blocks()); + } } template @@ -1836,8 +1940,7 @@ inline void dynamic_bitset::m_zero_unused_bits() const block_width_type extra_bits = count_extra_bits(); if (extra_bits != 0) - m_highest_block() &= ~(~static_cast(0) << extra_bits); - + m_highest_block() &= (Block(1) << extra_bits) - 1; } // check class invariants @@ -1846,7 +1949,7 @@ bool dynamic_bitset::m_check_invariants() const { const block_width_type extra_bits = count_extra_bits(); if (extra_bits > 0) { - block_type const mask = (~static_cast(0) << extra_bits); + const block_type mask = block_type(~0) << extra_bits; if ((m_highest_block() & mask) != 0) return false; } diff --git a/third_party/boost_parts/boost/exception/detail/attribute_noreturn.hpp b/third_party/boost_parts/boost/exception/detail/attribute_noreturn.hpp deleted file mode 100644 index ae9f031e..00000000 --- a/third_party/boost_parts/boost/exception/detail/attribute_noreturn.hpp +++ /dev/null @@ -1,17 +0,0 @@ -//Copyright (c) 2009 Emil Dotchevski and Reverge Studios, Inc. - -//Distributed under the 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 UUID_61531AB0680611DEADD5846855D89593 -#define UUID_61531AB0680611DEADD5846855D89593 - -#if defined(_MSC_VER) -#define BOOST_ATTRIBUTE_NORETURN __declspec(noreturn) -#elif defined(__GNUC__) -#define BOOST_ATTRIBUTE_NORETURN __attribute__((__noreturn__)) -#else -#define BOOST_ATTRIBUTE_NORETURN -#endif - -#endif diff --git a/third_party/boost_parts/boost/exception/exception.hpp b/third_party/boost_parts/boost/exception/exception.hpp index 1f2bd9c2..c0fdaf9e 100644 --- a/third_party/boost_parts/boost/exception/exception.hpp +++ b/third_party/boost_parts/boost/exception/exception.hpp @@ -12,6 +12,14 @@ #pragma warning(push,1) #endif +#ifdef BOOST_EXCEPTION_MINI_BOOST +#include +namespace boost { namespace exception_detail { using std::shared_ptr; } } +#else +namespace boost { template class shared_ptr; }; +namespace boost { namespace exception_detail { using boost::shared_ptr; } } +#endif + namespace boost { @@ -144,9 +152,6 @@ boost # endif #endif - template - class shared_ptr; - namespace exception_detail { @@ -182,6 +187,18 @@ boost template <> struct get_info; + template + struct set_info_rv; + + template <> + struct set_info_rv; + + template <> + struct set_info_rv; + + template <> + struct set_info_rv; + char const * get_diagnostic_information( exception const &, char const * ); void copy_boost_exception( exception *, exception const * ); @@ -264,6 +281,11 @@ boost friend struct exception_detail::get_info; friend struct exception_detail::get_info; friend struct exception_detail::get_info; + template + friend struct exception_detail::set_info_rv; + friend struct exception_detail::set_info_rv; + friend struct exception_detail::set_info_rv; + friend struct exception_detail::set_info_rv; friend void exception_detail::copy_boost_exception( exception *, exception const * ); #endif mutable exception_detail::refcount_ptr data_; diff --git a/third_party/boost_parts/boost/function.hpp b/third_party/boost_parts/boost/function.hpp index b72842bb..68a25ab0 100644 --- a/third_party/boost_parts/boost/function.hpp +++ b/third_party/boost_parts/boost/function.hpp @@ -10,15 +10,21 @@ // William Kempf, Jesse Jones and Karl Nelson were all very helpful in the // design of this library. +#ifndef BOOST_FUNCTION_MAX_ARGS +# define BOOST_FUNCTION_MAX_ARGS 10 +#endif // BOOST_FUNCTION_MAX_ARGS + +#if !defined(BOOST_FUNCTION_MAX_ARGS_DEFINED) || (BOOST_FUNCTION_MAX_ARGS_DEFINED != BOOST_FUNCTION_MAX_ARGS) + +#if !defined(BOOST_FUNCTION_MAX_ARGS_DEFINED) +#define BOOST_FUNCTION_MAX_ARGS_DEFINED 0 +#endif + #include // unary_function, binary_function #include #include -#ifndef BOOST_FUNCTION_MAX_ARGS -# define BOOST_FUNCTION_MAX_ARGS 10 -#endif // BOOST_FUNCTION_MAX_ARGS - // Include the prologue here so that the use of file-level iteration // in anything that may be included by function_template.hpp doesn't break #include @@ -64,3 +70,5 @@ # include BOOST_PP_ITERATE() # undef BOOST_PP_ITERATION_PARAMS_1 #endif + +#endif // !defined(BOOST_FUNCTION_MAX_ARGS_DEFINED) || (BOOST_FUNCTION_MAX_ARGS_DEFINED != BOOST_FUNCTION_MAX_ARGS) diff --git a/third_party/boost_parts/boost/function/detail/gen_maybe_include.pl b/third_party/boost_parts/boost/function/detail/gen_maybe_include.pl index d0629205..bc409840 100644 --- a/third_party/boost_parts/boost/function/detail/gen_maybe_include.pl +++ b/third_party/boost_parts/boost/function/detail/gen_maybe_include.pl @@ -27,6 +27,8 @@ print OUT "#elif"; } print OUT " BOOST_FUNCTION_NUM_ARGS == $on_arg\n"; + print OUT "# undef BOOST_FUNCTION_MAX_ARGS_DEFINED\n"; + print OUT "# define BOOST_FUNCTION_MAX_ARGS_DEFINED $on_arg\n"; print OUT "# ifndef BOOST_FUNCTION_$on_arg\n"; print OUT "# define BOOST_FUNCTION_$on_arg\n"; print OUT "# include \n"; diff --git a/third_party/boost_parts/boost/function/detail/maybe_include.hpp b/third_party/boost_parts/boost/function/detail/maybe_include.hpp index 92f71bb2..ec88905d 100644 --- a/third_party/boost_parts/boost/function/detail/maybe_include.hpp +++ b/third_party/boost_parts/boost/function/detail/maybe_include.hpp @@ -8,256 +8,358 @@ // For more information, see http://www.boost.org #if BOOST_FUNCTION_NUM_ARGS == 0 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 0 # ifndef BOOST_FUNCTION_0 # define BOOST_FUNCTION_0 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 1 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 1 # ifndef BOOST_FUNCTION_1 # define BOOST_FUNCTION_1 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 2 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 2 # ifndef BOOST_FUNCTION_2 # define BOOST_FUNCTION_2 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 3 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 3 # ifndef BOOST_FUNCTION_3 # define BOOST_FUNCTION_3 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 4 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 4 # ifndef BOOST_FUNCTION_4 # define BOOST_FUNCTION_4 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 5 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 5 # ifndef BOOST_FUNCTION_5 # define BOOST_FUNCTION_5 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 6 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 6 # ifndef BOOST_FUNCTION_6 # define BOOST_FUNCTION_6 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 7 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 7 # ifndef BOOST_FUNCTION_7 # define BOOST_FUNCTION_7 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 8 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 8 # ifndef BOOST_FUNCTION_8 # define BOOST_FUNCTION_8 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 9 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 9 # ifndef BOOST_FUNCTION_9 # define BOOST_FUNCTION_9 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 10 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 10 # ifndef BOOST_FUNCTION_10 # define BOOST_FUNCTION_10 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 11 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 11 # ifndef BOOST_FUNCTION_11 # define BOOST_FUNCTION_11 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 12 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 12 # ifndef BOOST_FUNCTION_12 # define BOOST_FUNCTION_12 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 13 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 13 # ifndef BOOST_FUNCTION_13 # define BOOST_FUNCTION_13 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 14 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 14 # ifndef BOOST_FUNCTION_14 # define BOOST_FUNCTION_14 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 15 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 15 # ifndef BOOST_FUNCTION_15 # define BOOST_FUNCTION_15 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 16 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 16 # ifndef BOOST_FUNCTION_16 # define BOOST_FUNCTION_16 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 17 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 17 # ifndef BOOST_FUNCTION_17 # define BOOST_FUNCTION_17 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 18 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 18 # ifndef BOOST_FUNCTION_18 # define BOOST_FUNCTION_18 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 19 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 19 # ifndef BOOST_FUNCTION_19 # define BOOST_FUNCTION_19 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 20 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 20 # ifndef BOOST_FUNCTION_20 # define BOOST_FUNCTION_20 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 21 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 21 # ifndef BOOST_FUNCTION_21 # define BOOST_FUNCTION_21 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 22 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 22 # ifndef BOOST_FUNCTION_22 # define BOOST_FUNCTION_22 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 23 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 23 # ifndef BOOST_FUNCTION_23 # define BOOST_FUNCTION_23 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 24 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 24 # ifndef BOOST_FUNCTION_24 # define BOOST_FUNCTION_24 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 25 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 25 # ifndef BOOST_FUNCTION_25 # define BOOST_FUNCTION_25 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 26 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 26 # ifndef BOOST_FUNCTION_26 # define BOOST_FUNCTION_26 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 27 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 27 # ifndef BOOST_FUNCTION_27 # define BOOST_FUNCTION_27 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 28 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 28 # ifndef BOOST_FUNCTION_28 # define BOOST_FUNCTION_28 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 29 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 29 # ifndef BOOST_FUNCTION_29 # define BOOST_FUNCTION_29 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 30 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 30 # ifndef BOOST_FUNCTION_30 # define BOOST_FUNCTION_30 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 31 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 31 # ifndef BOOST_FUNCTION_31 # define BOOST_FUNCTION_31 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 32 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 32 # ifndef BOOST_FUNCTION_32 # define BOOST_FUNCTION_32 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 33 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 33 # ifndef BOOST_FUNCTION_33 # define BOOST_FUNCTION_33 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 34 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 34 # ifndef BOOST_FUNCTION_34 # define BOOST_FUNCTION_34 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 35 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 35 # ifndef BOOST_FUNCTION_35 # define BOOST_FUNCTION_35 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 36 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 36 # ifndef BOOST_FUNCTION_36 # define BOOST_FUNCTION_36 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 37 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 37 # ifndef BOOST_FUNCTION_37 # define BOOST_FUNCTION_37 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 38 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 38 # ifndef BOOST_FUNCTION_38 # define BOOST_FUNCTION_38 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 39 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 39 # ifndef BOOST_FUNCTION_39 # define BOOST_FUNCTION_39 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 40 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 40 # ifndef BOOST_FUNCTION_40 # define BOOST_FUNCTION_40 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 41 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 41 # ifndef BOOST_FUNCTION_41 # define BOOST_FUNCTION_41 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 42 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 42 # ifndef BOOST_FUNCTION_42 # define BOOST_FUNCTION_42 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 43 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 43 # ifndef BOOST_FUNCTION_43 # define BOOST_FUNCTION_43 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 44 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 44 # ifndef BOOST_FUNCTION_44 # define BOOST_FUNCTION_44 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 45 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 45 # ifndef BOOST_FUNCTION_45 # define BOOST_FUNCTION_45 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 46 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 46 # ifndef BOOST_FUNCTION_46 # define BOOST_FUNCTION_46 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 47 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 47 # ifndef BOOST_FUNCTION_47 # define BOOST_FUNCTION_47 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 48 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 48 # ifndef BOOST_FUNCTION_48 # define BOOST_FUNCTION_48 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 49 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 49 # ifndef BOOST_FUNCTION_49 # define BOOST_FUNCTION_49 # include # endif #elif BOOST_FUNCTION_NUM_ARGS == 50 +# undef BOOST_FUNCTION_MAX_ARGS_DEFINED +# define BOOST_FUNCTION_MAX_ARGS_DEFINED 50 # ifndef BOOST_FUNCTION_50 # define BOOST_FUNCTION_50 # include diff --git a/third_party/boost_parts/boost/function/function_base.hpp b/third_party/boost_parts/boost/function/function_base.hpp index 35c1995e..841affb4 100644 --- a/third_party/boost_parts/boost/function/function_base.hpp +++ b/third_party/boost_parts/boost/function/function_base.hpp @@ -16,9 +16,9 @@ #include #include #include -#include #include #include +#include #include #include #include @@ -41,28 +41,6 @@ # pragma warning( push ) # pragma warning( disable : 4793 ) // complaint about native code generation # pragma warning( disable : 4127 ) // "conditional expression is constant" -#endif - -// Define BOOST_FUNCTION_STD_NS to the namespace that contains type_info. -#ifdef BOOST_NO_STD_TYPEINFO -// Embedded VC++ does not have type_info in namespace std -# define BOOST_FUNCTION_STD_NS -#else -# define BOOST_FUNCTION_STD_NS std -#endif - -// Borrowed from Boost.Python library: determines the cases where we -// need to use std::type_info::name to compare instead of operator==. -#if defined( BOOST_NO_TYPEID ) -# define BOOST_FUNCTION_COMPARE_TYPE_ID(X,Y) ((X)==(Y)) -#elif defined(__GNUC__) \ - || defined(_AIX) \ - || ( defined(__sgi) && defined(__host_mips)) -# include -# define BOOST_FUNCTION_COMPARE_TYPE_ID(X,Y) \ - (std::strcmp((X).name(),(Y).name()) == 0) -# else -# define BOOST_FUNCTION_COMPARE_TYPE_ID(X,Y) ((X)==(Y)) #endif #if defined(__ICL) && __ICL <= 600 || defined(__MWERKS__) && __MWERKS__ < 0x2406 && !defined(BOOST_STRICT_CONFIG) @@ -87,15 +65,16 @@ namespace boost { * object pointers, and a structure that resembles a bound * member function pointer. */ - union function_buffer + union function_buffer_members { // For pointers to function objects - mutable void* obj_ptr; + typedef void* obj_ptr_t; + mutable obj_ptr_t obj_ptr; // For pointers to std::type_info objects struct type_t { // (get_functor_type_tag, check_functor_type_tag). - const detail::sp_typeinfo* type; + const boost::typeindex::type_info* type; // Whether the type is const-qualified. bool const_qualified; @@ -104,7 +83,8 @@ namespace boost { } type; // For function pointers of all kinds - mutable void (*func_ptr)(); + typedef void (*func_ptr_t)(); + mutable func_ptr_t func_ptr; // For bound member pointers struct bound_memfunc_ptr_t { @@ -119,9 +99,15 @@ namespace boost { bool is_const_qualified; bool is_volatile_qualified; } obj_ref; + }; + + union function_buffer + { + // Type-specific union members + mutable function_buffer_members members; // To relax aliasing constraints - mutable char data; + mutable char data[sizeof(function_buffer_members)]; }; /** @@ -188,45 +174,42 @@ namespace boost { struct reference_manager { static inline void - manage(const function_buffer& in_buffer, function_buffer& out_buffer, + manage(const function_buffer& in_buffer, function_buffer& out_buffer, functor_manager_operation_type op) { switch (op) { - case clone_functor_tag: - out_buffer.obj_ref = in_buffer.obj_ref; + case clone_functor_tag: + out_buffer.members.obj_ref = in_buffer.members.obj_ref; return; case move_functor_tag: - out_buffer.obj_ref = in_buffer.obj_ref; - in_buffer.obj_ref.obj_ptr = 0; + out_buffer.members.obj_ref = in_buffer.members.obj_ref; + in_buffer.members.obj_ref.obj_ptr = 0; return; case destroy_functor_tag: - out_buffer.obj_ref.obj_ptr = 0; + out_buffer.members.obj_ref.obj_ptr = 0; return; case check_functor_type_tag: { - const detail::sp_typeinfo& check_type - = *out_buffer.type.type; - // Check whether we have the same type. We can add // cv-qualifiers, but we can't take them away. - if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, BOOST_SP_TYPEID(F)) - && (!in_buffer.obj_ref.is_const_qualified - || out_buffer.type.const_qualified) - && (!in_buffer.obj_ref.is_volatile_qualified - || out_buffer.type.volatile_qualified)) - out_buffer.obj_ptr = in_buffer.obj_ref.obj_ptr; + if (*out_buffer.members.type.type == boost::typeindex::type_id() + && (!in_buffer.members.obj_ref.is_const_qualified + || out_buffer.members.type.const_qualified) + && (!in_buffer.members.obj_ref.is_volatile_qualified + || out_buffer.members.type.volatile_qualified)) + out_buffer.members.obj_ptr = in_buffer.members.obj_ref.obj_ptr; else - out_buffer.obj_ptr = 0; + out_buffer.members.obj_ptr = 0; } return; case get_functor_type_tag: - out_buffer.type.type = &BOOST_SP_TYPEID(F); - out_buffer.type.const_qualified = in_buffer.obj_ref.is_const_qualified; - out_buffer.type.volatile_qualified = in_buffer.obj_ref.is_volatile_qualified; + out_buffer.members.type.type = &boost::typeindex::type_id().type_info(); + out_buffer.members.type.const_qualified = in_buffer.members.obj_ref.is_const_qualified; + out_buffer.members.type.volatile_qualified = in_buffer.members.obj_ref.is_volatile_qualified; return; } } @@ -240,9 +223,9 @@ namespace boost { struct function_allows_small_object_optimization { BOOST_STATIC_CONSTANT - (bool, + (bool, value = ((sizeof(F) <= sizeof(function_buffer) && - (alignment_of::value + (alignment_of::value % alignment_of::value == 0)))); }; @@ -254,7 +237,7 @@ namespace boost { A(a) { } - + functor_wrapper(const functor_wrapper& f) : F(static_cast(f)), A(static_cast(f)) @@ -273,61 +256,57 @@ namespace boost { // Function pointers static inline void - manage_ptr(const function_buffer& in_buffer, function_buffer& out_buffer, + manage_ptr(const function_buffer& in_buffer, function_buffer& out_buffer, functor_manager_operation_type op) { if (op == clone_functor_tag) - out_buffer.func_ptr = in_buffer.func_ptr; + out_buffer.members.func_ptr = in_buffer.members.func_ptr; else if (op == move_functor_tag) { - out_buffer.func_ptr = in_buffer.func_ptr; - in_buffer.func_ptr = 0; + out_buffer.members.func_ptr = in_buffer.members.func_ptr; + in_buffer.members.func_ptr = 0; } else if (op == destroy_functor_tag) - out_buffer.func_ptr = 0; + out_buffer.members.func_ptr = 0; else if (op == check_functor_type_tag) { - const boost::detail::sp_typeinfo& check_type - = *out_buffer.type.type; - if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, BOOST_SP_TYPEID(Functor))) - out_buffer.obj_ptr = &in_buffer.func_ptr; + if (*out_buffer.members.type.type == boost::typeindex::type_id()) + out_buffer.members.obj_ptr = &in_buffer.members.func_ptr; else - out_buffer.obj_ptr = 0; + out_buffer.members.obj_ptr = 0; } else /* op == get_functor_type_tag */ { - out_buffer.type.type = &BOOST_SP_TYPEID(Functor); - out_buffer.type.const_qualified = false; - out_buffer.type.volatile_qualified = false; + out_buffer.members.type.type = &boost::typeindex::type_id().type_info(); + out_buffer.members.type.const_qualified = false; + out_buffer.members.type.volatile_qualified = false; } } // Function objects that fit in the small-object buffer. static inline void - manage_small(const function_buffer& in_buffer, function_buffer& out_buffer, + manage_small(const function_buffer& in_buffer, function_buffer& out_buffer, functor_manager_operation_type op) { if (op == clone_functor_tag || op == move_functor_tag) { - const functor_type* in_functor = - reinterpret_cast(&in_buffer.data); - new (reinterpret_cast(&out_buffer.data)) functor_type(*in_functor); + const functor_type* in_functor = + reinterpret_cast(in_buffer.data); + new (reinterpret_cast(out_buffer.data)) functor_type(*in_functor); if (op == move_functor_tag) { - functor_type* f = reinterpret_cast(&in_buffer.data); + functor_type* f = reinterpret_cast(in_buffer.data); (void)f; // suppress warning about the value of f not being used (MSVC) f->~Functor(); } } else if (op == destroy_functor_tag) { // Some compilers (Borland, vc6, ...) are unhappy with ~functor_type. - functor_type* f = reinterpret_cast(&out_buffer.data); + functor_type* f = reinterpret_cast(out_buffer.data); (void)f; // suppress warning about the value of f not being used (MSVC) f->~Functor(); } else if (op == check_functor_type_tag) { - const detail::sp_typeinfo& check_type - = *out_buffer.type.type; - if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, BOOST_SP_TYPEID(Functor))) - out_buffer.obj_ptr = &in_buffer.data; + if (*out_buffer.members.type.type == boost::typeindex::type_id()) + out_buffer.members.obj_ptr = in_buffer.data; else - out_buffer.obj_ptr = 0; + out_buffer.members.obj_ptr = 0; } else /* op == get_functor_type_tag */ { - out_buffer.type.type = &BOOST_SP_TYPEID(Functor); - out_buffer.type.const_qualified = false; - out_buffer.type.volatile_qualified = false; + out_buffer.members.type.type = &boost::typeindex::type_id().type_info(); + out_buffer.members.type.const_qualified = false; + out_buffer.members.type.volatile_qualified = false; } } }; @@ -340,7 +319,7 @@ namespace boost { // Function pointers static inline void - manager(const function_buffer& in_buffer, function_buffer& out_buffer, + manager(const function_buffer& in_buffer, function_buffer& out_buffer, functor_manager_operation_type op, function_ptr_tag) { functor_manager_common::manage_ptr(in_buffer,out_buffer,op); @@ -348,15 +327,15 @@ namespace boost { // Function objects that fit in the small-object buffer. static inline void - manager(const function_buffer& in_buffer, function_buffer& out_buffer, + manager(const function_buffer& in_buffer, function_buffer& out_buffer, functor_manager_operation_type op, mpl::true_) { functor_manager_common::manage_small(in_buffer,out_buffer,op); } - + // Function objects that require heap allocation static inline void - manager(const function_buffer& in_buffer, function_buffer& out_buffer, + manager(const function_buffer& in_buffer, function_buffer& out_buffer, functor_manager_operation_type op, mpl::false_) { if (op == clone_functor_tag) { @@ -366,29 +345,27 @@ namespace boost { // jewillco: Changing this to static_cast because GCC 2.95.3 is // obsolete. const functor_type* f = - static_cast(in_buffer.obj_ptr); + static_cast(in_buffer.members.obj_ptr); functor_type* new_f = new functor_type(*f); - out_buffer.obj_ptr = new_f; + out_buffer.members.obj_ptr = new_f; } else if (op == move_functor_tag) { - out_buffer.obj_ptr = in_buffer.obj_ptr; - in_buffer.obj_ptr = 0; + out_buffer.members.obj_ptr = in_buffer.members.obj_ptr; + in_buffer.members.obj_ptr = 0; } else if (op == destroy_functor_tag) { /* Cast from the void pointer to the functor pointer type */ functor_type* f = - static_cast(out_buffer.obj_ptr); + static_cast(out_buffer.members.obj_ptr); delete f; - out_buffer.obj_ptr = 0; + out_buffer.members.obj_ptr = 0; } else if (op == check_functor_type_tag) { - const detail::sp_typeinfo& check_type - = *out_buffer.type.type; - if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, BOOST_SP_TYPEID(Functor))) - out_buffer.obj_ptr = in_buffer.obj_ptr; + if (*out_buffer.members.type.type == boost::typeindex::type_id()) + out_buffer.members.obj_ptr = in_buffer.members.obj_ptr; else - out_buffer.obj_ptr = 0; + out_buffer.members.obj_ptr = 0; } else /* op == get_functor_type_tag */ { - out_buffer.type.type = &BOOST_SP_TYPEID(Functor); - out_buffer.type.const_qualified = false; - out_buffer.type.volatile_qualified = false; + out_buffer.members.type.type = &boost::typeindex::type_id().type_info(); + out_buffer.members.type.const_qualified = false; + out_buffer.members.type.volatile_qualified = false; } } @@ -396,7 +373,7 @@ namespace boost { // object can use the small-object optimization buffer or // whether we need to allocate it on the heap. static inline void - manager(const function_buffer& in_buffer, function_buffer& out_buffer, + manager(const function_buffer& in_buffer, function_buffer& out_buffer, functor_manager_operation_type op, function_obj_tag) { manager(in_buffer, out_buffer, op, @@ -405,7 +382,7 @@ namespace boost { // For member pointers, we use the small-object optimization buffer. static inline void - manager(const function_buffer& in_buffer, function_buffer& out_buffer, + manager(const function_buffer& in_buffer, function_buffer& out_buffer, functor_manager_operation_type op, member_ptr_tag) { manager(in_buffer, out_buffer, op, mpl::true_()); @@ -415,15 +392,15 @@ namespace boost { /* Dispatch to an appropriate manager based on whether we have a function pointer or a function object pointer. */ static inline void - manage(const function_buffer& in_buffer, function_buffer& out_buffer, + manage(const function_buffer& in_buffer, function_buffer& out_buffer, functor_manager_operation_type op) { typedef typename get_function_tag::type tag_type; switch (op) { case get_functor_type_tag: - out_buffer.type.type = &BOOST_SP_TYPEID(functor_type); - out_buffer.type.const_qualified = false; - out_buffer.type.volatile_qualified = false; + out_buffer.members.type.type = &boost::typeindex::type_id().type_info(); + out_buffer.members.type.const_qualified = false; + out_buffer.members.type.volatile_qualified = false; return; default: @@ -441,7 +418,7 @@ namespace boost { // Function pointers static inline void - manager(const function_buffer& in_buffer, function_buffer& out_buffer, + manager(const function_buffer& in_buffer, function_buffer& out_buffer, functor_manager_operation_type op, function_ptr_tag) { functor_manager_common::manage_ptr(in_buffer,out_buffer,op); @@ -449,57 +426,68 @@ namespace boost { // Function objects that fit in the small-object buffer. static inline void - manager(const function_buffer& in_buffer, function_buffer& out_buffer, + manager(const function_buffer& in_buffer, function_buffer& out_buffer, functor_manager_operation_type op, mpl::true_) { functor_manager_common::manage_small(in_buffer,out_buffer,op); } - + // Function objects that require heap allocation static inline void - manager(const function_buffer& in_buffer, function_buffer& out_buffer, + manager(const function_buffer& in_buffer, function_buffer& out_buffer, functor_manager_operation_type op, mpl::false_) { typedef functor_wrapper functor_wrapper_type; +#if defined(BOOST_NO_CXX11_ALLOCATOR) typedef typename Allocator::template rebind::other wrapper_allocator_type; typedef typename wrapper_allocator_type::pointer wrapper_allocator_pointer_type; +#else + using wrapper_allocator_type = typename std::allocator_traits::template rebind_alloc; + using wrapper_allocator_pointer_type = typename std::allocator_traits::pointer; +#endif if (op == clone_functor_tag) { // Clone the functor // GCC 2.95.3 gets the CV qualifiers wrong here, so we // can't do the static_cast that we should do. const functor_wrapper_type* f = - static_cast(in_buffer.obj_ptr); + static_cast(in_buffer.members.obj_ptr); wrapper_allocator_type wrapper_allocator(static_cast(*f)); wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1); +#if defined(BOOST_NO_CXX11_ALLOCATOR) wrapper_allocator.construct(copy, *f); +#else + std::allocator_traits::construct(wrapper_allocator, copy, *f); +#endif // Get back to the original pointer type functor_wrapper_type* new_f = static_cast(copy); - out_buffer.obj_ptr = new_f; + out_buffer.members.obj_ptr = new_f; } else if (op == move_functor_tag) { - out_buffer.obj_ptr = in_buffer.obj_ptr; - in_buffer.obj_ptr = 0; + out_buffer.members.obj_ptr = in_buffer.members.obj_ptr; + in_buffer.members.obj_ptr = 0; } else if (op == destroy_functor_tag) { /* Cast from the void pointer to the functor_wrapper_type */ functor_wrapper_type* victim = - static_cast(in_buffer.obj_ptr); + static_cast(in_buffer.members.obj_ptr); wrapper_allocator_type wrapper_allocator(static_cast(*victim)); +#if defined(BOOST_NO_CXX11_ALLOCATOR) wrapper_allocator.destroy(victim); +#else + std::allocator_traits::destroy(wrapper_allocator, victim); +#endif wrapper_allocator.deallocate(victim,1); - out_buffer.obj_ptr = 0; + out_buffer.members.obj_ptr = 0; } else if (op == check_functor_type_tag) { - const detail::sp_typeinfo& check_type - = *out_buffer.type.type; - if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, BOOST_SP_TYPEID(Functor))) - out_buffer.obj_ptr = in_buffer.obj_ptr; + if (*out_buffer.members.type.type == boost::typeindex::type_id()) + out_buffer.members.obj_ptr = in_buffer.members.obj_ptr; else - out_buffer.obj_ptr = 0; + out_buffer.members.obj_ptr = 0; } else /* op == get_functor_type_tag */ { - out_buffer.type.type = &BOOST_SP_TYPEID(Functor); - out_buffer.type.const_qualified = false; - out_buffer.type.volatile_qualified = false; + out_buffer.members.type.type = &boost::typeindex::type_id().type_info(); + out_buffer.members.type.const_qualified = false; + out_buffer.members.type.volatile_qualified = false; } } @@ -507,7 +495,7 @@ namespace boost { // object can use the small-object optimization buffer or // whether we need to allocate it on the heap. static inline void - manager(const function_buffer& in_buffer, function_buffer& out_buffer, + manager(const function_buffer& in_buffer, function_buffer& out_buffer, functor_manager_operation_type op, function_obj_tag) { manager(in_buffer, out_buffer, op, @@ -518,15 +506,15 @@ namespace boost { /* Dispatch to an appropriate manager based on whether we have a function pointer or a function object pointer. */ static inline void - manage(const function_buffer& in_buffer, function_buffer& out_buffer, + manage(const function_buffer& in_buffer, function_buffer& out_buffer, functor_manager_operation_type op) { typedef typename get_function_tag::type tag_type; switch (op) { case get_functor_type_tag: - out_buffer.type.type = &BOOST_SP_TYPEID(functor_type); - out_buffer.type.const_qualified = false; - out_buffer.type.volatile_qualified = false; + out_buffer.members.type.type = &boost::typeindex::type_id().type_info(); + out_buffer.members.type.const_qualified = false; + out_buffer.members.type.volatile_qualified = false; return; default: @@ -604,8 +592,8 @@ namespace boost { */ struct vtable_base { - void (*manager)(const function_buffer& in_buffer, - function_buffer& out_buffer, + void (*manager)(const function_buffer& in_buffer, + function_buffer& out_buffer, functor_manager_operation_type op); }; } // end namespace function @@ -625,15 +613,15 @@ class function_base /** Determine if the function is empty (i.e., has no target). */ bool empty() const { return !vtable; } - /** Retrieve the type of the stored function object, or BOOST_SP_TYPEID(void) + /** Retrieve the type of the stored function object, or type_id() if this is empty. */ - const detail::sp_typeinfo& target_type() const + const boost::typeindex::type_info& target_type() const { - if (!vtable) return BOOST_SP_TYPEID(void); + if (!vtable) return boost::typeindex::type_id().type_info(); detail::function::function_buffer type; get_vtable()->manager(functor, type, detail::function::get_functor_type_tag); - return *type.type.type; + return *type.members.type.type; } template @@ -642,12 +630,12 @@ class function_base if (!vtable) return 0; detail::function::function_buffer type_result; - type_result.type.type = &BOOST_SP_TYPEID(Functor); - type_result.type.const_qualified = is_const::value; - type_result.type.volatile_qualified = is_volatile::value; - get_vtable()->manager(functor, type_result, + type_result.members.type.type = &boost::typeindex::type_id().type_info(); + type_result.members.type.const_qualified = is_const::value; + type_result.members.type.volatile_qualified = is_volatile::value; + get_vtable()->manager(functor, type_result, detail::function::check_functor_type_tag); - return static_cast(type_result.obj_ptr); + return static_cast(type_result.members.obj_ptr); } template @@ -656,14 +644,14 @@ class function_base if (!vtable) return 0; detail::function::function_buffer type_result; - type_result.type.type = &BOOST_SP_TYPEID(Functor); - type_result.type.const_qualified = true; - type_result.type.volatile_qualified = is_volatile::value; - get_vtable()->manager(functor, type_result, + type_result.members.type.type = &boost::typeindex::type_id().type_info(); + type_result.members.type.const_qualified = true; + type_result.members.type.volatile_qualified = is_volatile::value; + get_vtable()->manager(functor, type_result, detail::function::check_functor_type_tag); // GCC 2.95.3 gets the CV qualifiers wrong here, so we // can't do the static_cast that we should do. - return static_cast(type_result.obj_ptr); + return static_cast(type_result.members.obj_ptr); } template @@ -714,6 +702,10 @@ class function_base mutable detail::function::function_buffer functor; }; +#if defined(BOOST_CLANG) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wweak-vtables" +#endif /** * The bad_function_call exception class is thrown when a boost::function * object is invoked @@ -723,6 +715,9 @@ class bad_function_call : public std::runtime_error public: bad_function_call() : std::runtime_error("call to empty boost::function") {} }; +#if defined(BOOST_CLANG) +# pragma clang diagnostic pop +#endif #ifndef BOOST_NO_SFINAE inline bool operator==(const function_base& f, @@ -883,10 +878,9 @@ namespace detail { } // end namespace boost #undef BOOST_FUNCTION_ENABLE_IF_NOT_INTEGRAL -#undef BOOST_FUNCTION_COMPARE_TYPE_ID #if defined(BOOST_MSVC) # pragma warning( pop ) -#endif +#endif #endif // BOOST_FUNCTION_BASE_HEADER diff --git a/third_party/boost_parts/boost/function/function_template.hpp b/third_party/boost_parts/boost/function/function_template.hpp index 211b81db..0b05940b 100644 --- a/third_party/boost_parts/boost/function/function_template.hpp +++ b/third_party/boost_parts/boost/function/function_template.hpp @@ -16,7 +16,7 @@ #if defined(BOOST_MSVC) # pragma warning( push ) # pragma warning( disable : 4127 ) // "conditional expression is constant" -#endif +#endif #define BOOST_FUNCTION_TEMPLATE_PARMS BOOST_PP_ENUM_PARAMS(BOOST_FUNCTION_NUM_ARGS, typename T) @@ -97,7 +97,7 @@ namespace boost { static R invoke(function_buffer& function_ptr BOOST_FUNCTION_COMMA BOOST_FUNCTION_PARMS) { - FunctionPtr f = reinterpret_cast(function_ptr.func_ptr); + FunctionPtr f = reinterpret_cast(function_ptr.members.func_ptr); return f(BOOST_FUNCTION_ARGS); } }; @@ -114,7 +114,7 @@ namespace boost { BOOST_FUNCTION_PARMS) { - FunctionPtr f = reinterpret_cast(function_ptr.func_ptr); + FunctionPtr f = reinterpret_cast(function_ptr.members.func_ptr); BOOST_FUNCTION_RETURN(f(BOOST_FUNCTION_ARGS)); } }; @@ -132,9 +132,9 @@ namespace boost { { FunctionObj* f; if (function_allows_small_object_optimization::value) - f = reinterpret_cast(&function_obj_ptr.data); + f = reinterpret_cast(function_obj_ptr.data); else - f = reinterpret_cast(function_obj_ptr.obj_ptr); + f = reinterpret_cast(function_obj_ptr.members.obj_ptr); return (*f)(BOOST_FUNCTION_ARGS); } }; @@ -153,9 +153,9 @@ namespace boost { { FunctionObj* f; if (function_allows_small_object_optimization::value) - f = reinterpret_cast(&function_obj_ptr.data); + f = reinterpret_cast(function_obj_ptr.data); else - f = reinterpret_cast(function_obj_ptr.obj_ptr); + f = reinterpret_cast(function_obj_ptr.members.obj_ptr); BOOST_FUNCTION_RETURN((*f)(BOOST_FUNCTION_ARGS)); } }; @@ -171,8 +171,8 @@ namespace boost { BOOST_FUNCTION_PARMS) { - FunctionObj* f = - reinterpret_cast(function_obj_ptr.obj_ptr); + FunctionObj* f = + reinterpret_cast(function_obj_ptr.members.obj_ptr); return (*f)(BOOST_FUNCTION_ARGS); } }; @@ -189,8 +189,8 @@ namespace boost { BOOST_FUNCTION_PARMS) { - FunctionObj* f = - reinterpret_cast(function_obj_ptr.obj_ptr); + FunctionObj* f = + reinterpret_cast(function_obj_ptr.members.obj_ptr); BOOST_FUNCTION_RETURN((*f)(BOOST_FUNCTION_ARGS)); } }; @@ -208,8 +208,8 @@ namespace boost { BOOST_FUNCTION_PARMS) { - MemberPtr* f = - reinterpret_cast(&function_obj_ptr.data); + MemberPtr* f = + reinterpret_cast(function_obj_ptr.data); return boost::mem_fn(*f)(BOOST_FUNCTION_ARGS); } }; @@ -226,8 +226,8 @@ namespace boost { BOOST_FUNCTION_PARMS) { - MemberPtr* f = - reinterpret_cast(&function_obj_ptr.data); + MemberPtr* f = + reinterpret_cast(function_obj_ptr.data); BOOST_FUNCTION_RETURN(boost::mem_fn(*f)(BOOST_FUNCTION_ARGS)); } }; @@ -322,7 +322,7 @@ namespace boost { /* Given the tag returned by get_function_tag, retrieve the actual invoker that will be used for the given function - object. + object. Each specialization contains an "apply" nested class template that accepts the function object, return type, function @@ -513,21 +513,21 @@ namespace boost { private: // Function pointers template - bool + bool assign_to(FunctionPtr f, function_buffer& functor, function_ptr_tag) const { this->clear(functor); if (f) { // should be a reinterpret cast, but some compilers insist // on giving cv-qualifiers to free functions - functor.func_ptr = reinterpret_cast(f); + functor.members.func_ptr = reinterpret_cast(f); return true; } else { return false; } } template - bool + bool assign_to_a(FunctionPtr f, function_buffer& functor, Allocator, function_ptr_tag) const { return assign_to(f,functor,function_ptr_tag()); @@ -566,13 +566,13 @@ namespace boost { // Function objects // Assign to a function object using the small object optimization template - void + void assign_functor(FunctionObj f, function_buffer& functor, mpl::true_) const { - new (reinterpret_cast(&functor.data)) FunctionObj(f); + new (reinterpret_cast(functor.data)) FunctionObj(f); } template - void + void assign_functor_a(FunctionObj f, function_buffer& functor, Allocator, mpl::true_) const { assign_functor(f,functor,mpl::true_()); @@ -580,32 +580,41 @@ namespace boost { // Assign to a function object allocated on the heap. template - void + void assign_functor(FunctionObj f, function_buffer& functor, mpl::false_) const { - functor.obj_ptr = new FunctionObj(f); + functor.members.obj_ptr = new FunctionObj(f); } template - void + void assign_functor_a(FunctionObj f, function_buffer& functor, Allocator a, mpl::false_) const { typedef functor_wrapper functor_wrapper_type; +#if defined(BOOST_NO_CXX11_ALLOCATOR) typedef typename Allocator::template rebind::other wrapper_allocator_type; typedef typename wrapper_allocator_type::pointer wrapper_allocator_pointer_type; +#else + using wrapper_allocator_type = typename std::allocator_traits::template rebind_alloc; + using wrapper_allocator_pointer_type = typename std::allocator_traits::pointer; +#endif wrapper_allocator_type wrapper_allocator(a); wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1); +#if defined(BOOST_NO_CXX11_ALLOCATOR) wrapper_allocator.construct(copy, functor_wrapper_type(f,a)); +#else + std::allocator_traits::construct(wrapper_allocator, copy, functor_wrapper_type(f,a)); +#endif functor_wrapper_type* new_f = static_cast(copy); - functor.obj_ptr = new_f; + functor.members.obj_ptr = new_f; } template - bool + bool assign_to(FunctionObj f, function_buffer& functor, function_obj_tag) const { if (!boost::detail::function::has_empty_target(boost::addressof(f))) { - assign_functor(f, functor, + assign_functor(f, functor, mpl::bool_<(function_allows_small_object_optimization::value)>()); return true; } else { @@ -613,7 +622,7 @@ namespace boost { } } template - bool + bool assign_to_a(FunctionObj f, function_buffer& functor, Allocator a, function_obj_tag) const { if (!boost::detail::function::has_empty_target(boost::addressof(f))) { @@ -627,18 +636,18 @@ namespace boost { // Reference to a function object template - bool - assign_to(const reference_wrapper& f, + bool + assign_to(const reference_wrapper& f, function_buffer& functor, function_obj_ref_tag) const { - functor.obj_ref.obj_ptr = (void *)(f.get_pointer()); - functor.obj_ref.is_const_qualified = is_const::value; - functor.obj_ref.is_volatile_qualified = is_volatile::value; + functor.members.obj_ref.obj_ptr = (void *)(f.get_pointer()); + functor.members.obj_ref.is_const_qualified = is_const::value; + functor.members.obj_ref.is_volatile_qualified = is_volatile::value; return true; } template - bool - assign_to_a(const reference_wrapper& f, + bool + assign_to_a(const reference_wrapper& f, function_buffer& functor, Allocator, function_obj_ref_tag) const { return assign_to(f,functor,function_obj_ref_tag()); @@ -656,17 +665,6 @@ namespace boost { BOOST_FUNCTION_TEMPLATE_PARMS > class BOOST_FUNCTION_FUNCTION : public function_base - -#if BOOST_FUNCTION_NUM_ARGS == 1 - - , public std::unary_function - -#elif BOOST_FUNCTION_NUM_ARGS == 2 - - , public std::binary_function - -#endif - { public: #ifndef BOOST_NO_VOID_RETURNS @@ -752,14 +750,14 @@ namespace boost { { this->assign_to_own(f); } - + #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES BOOST_FUNCTION_FUNCTION(BOOST_FUNCTION_FUNCTION&& f) : function_base() { this->move_assign(f); } #endif - + ~BOOST_FUNCTION_FUNCTION() { clear(); } result_type operator()(BOOST_FUNCTION_PARMS) const @@ -840,12 +838,11 @@ namespace boost { BOOST_CATCH_END return *this; } - + #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES // Move assignment from another BOOST_FUNCTION_FUNCTION BOOST_FUNCTION_FUNCTION& operator=(BOOST_FUNCTION_FUNCTION&& f) { - if (&f == this) return *this; @@ -922,10 +919,10 @@ namespace boost { typedef typename boost::detail::function::get_function_tag::type tag; typedef boost::detail::function::BOOST_FUNCTION_GET_INVOKER get_invoker; typedef typename get_invoker:: - template apply handler_type; - + typedef typename handler_type::invoker_type invoker_type; typedef typename handler_type::manager_type manager_type; @@ -933,7 +930,7 @@ namespace boost { // static initialization. Otherwise, we will have a race // condition here in multi-threaded code. See // http://thread.gmane.org/gmane.comp.lib.boost.devel/164902/. - static const vtable_type stored_vtable = + static const vtable_type stored_vtable = { { &manager_type::manage }, &invoker_type::invoke }; if (stored_vtable.assign_to(f, functor)) { @@ -944,7 +941,7 @@ namespace boost { boost::detail::function::function_allows_small_object_optimization::value) value |= static_cast(0x01); vtable = reinterpret_cast(value); - } else + } else vtable = 0; } @@ -956,11 +953,11 @@ namespace boost { typedef typename boost::detail::function::get_function_tag::type tag; typedef boost::detail::function::BOOST_FUNCTION_GET_INVOKER get_invoker; typedef typename get_invoker:: - template apply_a handler_type; - + typedef typename handler_type::invoker_type invoker_type; typedef typename handler_type::manager_type manager_type; @@ -971,7 +968,7 @@ namespace boost { static const vtable_type stored_vtable = { { &manager_type::manage }, &invoker_type::invoke }; - if (stored_vtable.assign_to_a(f, functor, a)) { + if (stored_vtable.assign_to_a(f, functor, a)) { std::size_t value = reinterpret_cast(&stored_vtable.base); // coverity[pointless_expression]: suppress coverity warnings on apparant if(const). if (boost::has_trivial_copy_constructor::value && @@ -979,15 +976,15 @@ namespace boost { boost::detail::function::function_allows_small_object_optimization::value) value |= static_cast(0x01); vtable = reinterpret_cast(value); - } else + } else vtable = 0; } - // Moves the value from the specified argument to *this. If the argument - // has its function object allocated on the heap, move_assign will pass - // its buffer to *this, and set the argument's buffer pointer to NULL. - void move_assign(BOOST_FUNCTION_FUNCTION& f) - { + // Moves the value from the specified argument to *this. If the argument + // has its function object allocated on the heap, move_assign will pass + // its buffer to *this, and set the argument's buffer pointer to NULL. + void move_assign(BOOST_FUNCTION_FUNCTION& f) + { if (&f == this) return; @@ -1098,7 +1095,7 @@ class function function(self_type&& f): base_type(static_cast(f)){} function(base_type&& f): base_type(static_cast(f)){} #endif - + self_type& operator=(const self_type& f) { self_type(f).swap(*this); @@ -1111,7 +1108,7 @@ class function self_type(static_cast(f)).swap(*this); return *this; } -#endif +#endif template #ifndef BOOST_NO_SFINAE @@ -1140,14 +1137,14 @@ class function self_type(f).swap(*this); return *this; } - + #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES self_type& operator=(base_type&& f) { self_type(static_cast(f)).swap(*this); return *this; } -#endif +#endif }; #undef BOOST_FUNCTION_PARTIAL_SPEC @@ -1187,4 +1184,4 @@ class function #if defined(BOOST_MSVC) # pragma warning( pop ) -#endif +#endif diff --git a/third_party/boost_parts/boost/functional/hash.hpp b/third_party/boost_parts/boost/functional/hash.hpp index 44983f19..327a3eca 100644 --- a/third_party/boost_parts/boost/functional/hash.hpp +++ b/third_party/boost_parts/boost/functional/hash.hpp @@ -3,5 +3,4 @@ // Distributed under the 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 diff --git a/third_party/boost_parts/boost/functional/hash_fwd.hpp b/third_party/boost_parts/boost/functional/hash_fwd.hpp index eea90738..62bc23c7 100644 --- a/third_party/boost_parts/boost/functional/hash_fwd.hpp +++ b/third_party/boost_parts/boost/functional/hash_fwd.hpp @@ -3,9 +3,4 @@ // Distributed under the 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 -#if defined(BOOST_HAS_PRAGMA_ONCE) -#pragma once -#endif - -#include +#include diff --git a/third_party/boost_parts/boost/fusion/container/deque/deque_fwd.hpp b/third_party/boost_parts/boost/fusion/container/deque/deque_fwd.hpp index ebbeb4c1..5b8ea56f 100644 --- a/third_party/boost_parts/boost/fusion/container/deque/deque_fwd.hpp +++ b/third_party/boost_parts/boost/fusion/container/deque/deque_fwd.hpp @@ -23,8 +23,7 @@ # endif #endif -// MSVC variadics at this point in time is not ready yet (ICE!) -#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1900)) +#if BOOST_WORKAROUND(BOOST_MSVC, < 1910) # if defined(BOOST_FUSION_HAS_VARIADIC_DEQUE) # undef BOOST_FUSION_HAS_VARIADIC_DEQUE # endif diff --git a/third_party/boost_parts/boost/fusion/container/map/map_fwd.hpp b/third_party/boost_parts/boost/fusion/container/map/map_fwd.hpp index 99239673..18e445b0 100644 --- a/third_party/boost_parts/boost/fusion/container/map/map_fwd.hpp +++ b/third_party/boost_parts/boost/fusion/container/map/map_fwd.hpp @@ -23,8 +23,7 @@ # endif #endif -// MSVC variadics at this point in time is not ready yet (ICE!) -#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1900)) +#if BOOST_WORKAROUND(BOOST_MSVC, < 1910) # if defined(BOOST_FUSION_HAS_VARIADIC_MAP) # undef BOOST_FUSION_HAS_VARIADIC_MAP # endif diff --git a/third_party/boost_parts/boost/fusion/container/vector/detail/config.hpp b/third_party/boost_parts/boost/fusion/container/vector/detail/config.hpp index 84f4605d..718b2d79 100644 --- a/third_party/boost_parts/boost/fusion/container/vector/detail/config.hpp +++ b/third_party/boost_parts/boost/fusion/container/vector/detail/config.hpp @@ -15,6 +15,8 @@ || defined(BOOST_NO_CXX11_RVALUE_REFERENCES) \ || defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) \ || defined(BOOST_NO_CXX11_DECLTYPE)) \ + || defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) \ + || defined(BOOST_FUSION_DISABLE_VARIADIC_VECTOR) \ || (defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)) # if defined(BOOST_FUSION_HAS_VARIADIC_VECTOR) # undef BOOST_FUSION_HAS_VARIADIC_VECTOR @@ -25,8 +27,7 @@ # endif #endif -// Sometimes, MSVC 12 shows compile error with std::size_t of template parameter. -#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1800)) +#if BOOST_WORKAROUND(BOOST_MSVC, < 1910) # if defined(BOOST_FUSION_HAS_VARIADIC_VECTOR) # undef BOOST_FUSION_HAS_VARIADIC_VECTOR # endif diff --git a/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector10.hpp b/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector10.hpp index 0b4e2574..12b7a570 100644 --- a/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector10.hpp +++ b/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector10.hpp @@ -65,7 +65,9 @@ namespace boost { namespace fusion # endif BOOST_FUSION_GPU_ENABLED explicit - vector(U0 && arg0) + vector(U0 && arg0 + , typename boost::disable_if_c::type>::value, detail::enabler_>::type = detail::enabler + ) : vec(std::forward( arg0)) {} # endif @@ -82,7 +84,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1) + vector(U0 && arg0 , U1 && arg1 + ) : vec(std::forward( arg0) , std::forward( arg1)) {} # endif @@ -99,7 +102,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2)) {} # endif @@ -116,7 +120,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3)) {} # endif @@ -133,7 +138,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4)) {} # endif @@ -150,7 +156,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5)) {} # endif @@ -167,7 +174,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6)) {} # endif @@ -184,7 +192,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7)) {} # endif @@ -201,7 +210,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8)) {} # endif @@ -218,7 +228,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9)) {} # endif template @@ -257,7 +268,10 @@ namespace boost { namespace fusion } template BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - vector& + typename boost::disable_if_c< + boost::is_same::type>::value + , vector& + >::type operator=(T&& rhs) { vec = std::forward( rhs); diff --git a/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector20.hpp b/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector20.hpp index 44e8832f..9c64ef05 100644 --- a/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector20.hpp +++ b/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector20.hpp @@ -65,7 +65,9 @@ namespace boost { namespace fusion # endif BOOST_FUSION_GPU_ENABLED explicit - vector(U0 && arg0) + vector(U0 && arg0 + , typename boost::disable_if_c::type>::value, detail::enabler_>::type = detail::enabler + ) : vec(std::forward( arg0)) {} # endif @@ -82,7 +84,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1) + vector(U0 && arg0 , U1 && arg1 + ) : vec(std::forward( arg0) , std::forward( arg1)) {} # endif @@ -99,7 +102,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2)) {} # endif @@ -116,7 +120,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3)) {} # endif @@ -133,7 +138,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4)) {} # endif @@ -150,7 +156,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5)) {} # endif @@ -167,7 +174,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6)) {} # endif @@ -184,7 +192,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7)) {} # endif @@ -201,7 +210,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8)) {} # endif @@ -218,7 +228,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9)) {} # endif @@ -235,7 +246,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10)) {} # endif @@ -252,7 +264,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11)) {} # endif @@ -269,7 +282,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12)) {} # endif @@ -286,7 +300,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13)) {} # endif @@ -303,7 +318,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14)) {} # endif @@ -320,7 +336,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15)) {} # endif @@ -337,7 +354,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16)) {} # endif @@ -354,7 +372,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17)) {} # endif @@ -371,7 +390,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18)) {} # endif @@ -388,7 +408,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19)) {} # endif template @@ -427,7 +448,10 @@ namespace boost { namespace fusion } template BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - vector& + typename boost::disable_if_c< + boost::is_same::type>::value + , vector& + >::type operator=(T&& rhs) { vec = std::forward( rhs); diff --git a/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector30.hpp b/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector30.hpp index 13f7a626..9df40b53 100644 --- a/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector30.hpp +++ b/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector30.hpp @@ -65,7 +65,9 @@ namespace boost { namespace fusion # endif BOOST_FUSION_GPU_ENABLED explicit - vector(U0 && arg0) + vector(U0 && arg0 + , typename boost::disable_if_c::type>::value, detail::enabler_>::type = detail::enabler + ) : vec(std::forward( arg0)) {} # endif @@ -82,7 +84,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1) + vector(U0 && arg0 , U1 && arg1 + ) : vec(std::forward( arg0) , std::forward( arg1)) {} # endif @@ -99,7 +102,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2)) {} # endif @@ -116,7 +120,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3)) {} # endif @@ -133,7 +138,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4)) {} # endif @@ -150,7 +156,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5)) {} # endif @@ -167,7 +174,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6)) {} # endif @@ -184,7 +192,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7)) {} # endif @@ -201,7 +210,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8)) {} # endif @@ -218,7 +228,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9)) {} # endif @@ -235,7 +246,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10)) {} # endif @@ -252,7 +264,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11)) {} # endif @@ -269,7 +282,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12)) {} # endif @@ -286,7 +300,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13)) {} # endif @@ -303,7 +318,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14)) {} # endif @@ -320,7 +336,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15)) {} # endif @@ -337,7 +354,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16)) {} # endif @@ -354,7 +372,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17)) {} # endif @@ -371,7 +390,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18)) {} # endif @@ -388,7 +408,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19)) {} # endif @@ -405,7 +426,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20)) {} # endif @@ -422,7 +444,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21)) {} # endif @@ -439,7 +462,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22)) {} # endif @@ -456,7 +480,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23)) {} # endif @@ -473,7 +498,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24)) {} # endif @@ -490,7 +516,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25)) {} # endif @@ -507,7 +534,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26)) {} # endif @@ -524,7 +552,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27)) {} # endif @@ -541,7 +570,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28)) {} # endif @@ -558,7 +588,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29)) {} # endif template @@ -597,7 +628,10 @@ namespace boost { namespace fusion } template BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - vector& + typename boost::disable_if_c< + boost::is_same::type>::value + , vector& + >::type operator=(T&& rhs) { vec = std::forward( rhs); diff --git a/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector40.hpp b/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector40.hpp index 1730d988..5da47eeb 100644 --- a/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector40.hpp +++ b/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector40.hpp @@ -65,7 +65,9 @@ namespace boost { namespace fusion # endif BOOST_FUSION_GPU_ENABLED explicit - vector(U0 && arg0) + vector(U0 && arg0 + , typename boost::disable_if_c::type>::value, detail::enabler_>::type = detail::enabler + ) : vec(std::forward( arg0)) {} # endif @@ -82,7 +84,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1) + vector(U0 && arg0 , U1 && arg1 + ) : vec(std::forward( arg0) , std::forward( arg1)) {} # endif @@ -99,7 +102,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2)) {} # endif @@ -116,7 +120,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3)) {} # endif @@ -133,7 +138,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4)) {} # endif @@ -150,7 +156,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5)) {} # endif @@ -167,7 +174,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6)) {} # endif @@ -184,7 +192,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7)) {} # endif @@ -201,7 +210,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8)) {} # endif @@ -218,7 +228,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9)) {} # endif @@ -235,7 +246,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10)) {} # endif @@ -252,7 +264,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11)) {} # endif @@ -269,7 +282,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12)) {} # endif @@ -286,7 +300,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13)) {} # endif @@ -303,7 +318,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14)) {} # endif @@ -320,7 +336,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15)) {} # endif @@ -337,7 +354,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16)) {} # endif @@ -354,7 +372,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17)) {} # endif @@ -371,7 +390,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18)) {} # endif @@ -388,7 +408,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19)) {} # endif @@ -405,7 +426,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20)) {} # endif @@ -422,7 +444,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21)) {} # endif @@ -439,7 +462,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22)) {} # endif @@ -456,7 +480,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23)) {} # endif @@ -473,7 +498,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24)) {} # endif @@ -490,7 +516,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25)) {} # endif @@ -507,7 +534,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26)) {} # endif @@ -524,7 +552,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27)) {} # endif @@ -541,7 +570,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28)) {} # endif @@ -558,7 +588,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29)) {} # endif @@ -575,7 +606,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30)) {} # endif @@ -592,7 +624,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31)) {} # endif @@ -609,7 +642,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32)) {} # endif @@ -626,7 +660,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33)) {} # endif @@ -643,7 +678,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34)) {} # endif @@ -660,7 +696,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35)) {} # endif @@ -677,7 +714,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36)) {} # endif @@ -694,7 +732,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36) , std::forward( arg37)) {} # endif @@ -711,7 +750,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36) , std::forward( arg37) , std::forward( arg38)) {} # endif @@ -728,7 +768,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36) , std::forward( arg37) , std::forward( arg38) , std::forward( arg39)) {} # endif template @@ -767,7 +808,10 @@ namespace boost { namespace fusion } template BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - vector& + typename boost::disable_if_c< + boost::is_same::type>::value + , vector& + >::type operator=(T&& rhs) { vec = std::forward( rhs); diff --git a/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector50.hpp b/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector50.hpp index fb334d1a..47e878bc 100644 --- a/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector50.hpp +++ b/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/preprocessed/vvector50.hpp @@ -65,7 +65,9 @@ namespace boost { namespace fusion # endif BOOST_FUSION_GPU_ENABLED explicit - vector(U0 && arg0) + vector(U0 && arg0 + , typename boost::disable_if_c::type>::value, detail::enabler_>::type = detail::enabler + ) : vec(std::forward( arg0)) {} # endif @@ -82,7 +84,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1) + vector(U0 && arg0 , U1 && arg1 + ) : vec(std::forward( arg0) , std::forward( arg1)) {} # endif @@ -99,7 +102,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2)) {} # endif @@ -116,7 +120,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3)) {} # endif @@ -133,7 +138,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4)) {} # endif @@ -150,7 +156,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5)) {} # endif @@ -167,7 +174,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6)) {} # endif @@ -184,7 +192,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7)) {} # endif @@ -201,7 +210,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8)) {} # endif @@ -218,7 +228,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9)) {} # endif @@ -235,7 +246,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10)) {} # endif @@ -252,7 +264,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11)) {} # endif @@ -269,7 +282,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12)) {} # endif @@ -286,7 +300,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13)) {} # endif @@ -303,7 +318,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14)) {} # endif @@ -320,7 +336,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15)) {} # endif @@ -337,7 +354,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16)) {} # endif @@ -354,7 +372,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17)) {} # endif @@ -371,7 +390,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18)) {} # endif @@ -388,7 +408,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19)) {} # endif @@ -405,7 +426,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20)) {} # endif @@ -422,7 +444,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21)) {} # endif @@ -439,7 +462,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22)) {} # endif @@ -456,7 +480,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23)) {} # endif @@ -473,7 +498,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24)) {} # endif @@ -490,7 +516,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25)) {} # endif @@ -507,7 +534,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26)) {} # endif @@ -524,7 +552,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27)) {} # endif @@ -541,7 +570,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28)) {} # endif @@ -558,7 +588,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29)) {} # endif @@ -575,7 +606,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30)) {} # endif @@ -592,7 +624,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31)) {} # endif @@ -609,7 +642,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32)) {} # endif @@ -626,7 +660,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33)) {} # endif @@ -643,7 +678,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34)) {} # endif @@ -660,7 +696,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35)) {} # endif @@ -677,7 +714,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36)) {} # endif @@ -694,7 +732,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36) , std::forward( arg37)) {} # endif @@ -711,7 +750,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36) , std::forward( arg37) , std::forward( arg38)) {} # endif @@ -728,7 +768,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36) , std::forward( arg37) , std::forward( arg38) , std::forward( arg39)) {} # endif @@ -745,7 +786,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36) , std::forward( arg37) , std::forward( arg38) , std::forward( arg39) , std::forward( arg40)) {} # endif @@ -762,7 +804,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36) , std::forward( arg37) , std::forward( arg38) , std::forward( arg39) , std::forward( arg40) , std::forward( arg41)) {} # endif @@ -779,7 +822,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 , U42 && arg42) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 , U42 && arg42 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36) , std::forward( arg37) , std::forward( arg38) , std::forward( arg39) , std::forward( arg40) , std::forward( arg41) , std::forward( arg42)) {} # endif @@ -796,7 +840,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 , U42 && arg42 , U43 && arg43) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 , U42 && arg42 , U43 && arg43 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36) , std::forward( arg37) , std::forward( arg38) , std::forward( arg39) , std::forward( arg40) , std::forward( arg41) , std::forward( arg42) , std::forward( arg43)) {} # endif @@ -813,7 +858,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 , U42 && arg42 , U43 && arg43 , U44 && arg44) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 , U42 && arg42 , U43 && arg43 , U44 && arg44 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36) , std::forward( arg37) , std::forward( arg38) , std::forward( arg39) , std::forward( arg40) , std::forward( arg41) , std::forward( arg42) , std::forward( arg43) , std::forward( arg44)) {} # endif @@ -830,7 +876,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 , U42 && arg42 , U43 && arg43 , U44 && arg44 , U45 && arg45) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 , U42 && arg42 , U43 && arg43 , U44 && arg44 , U45 && arg45 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36) , std::forward( arg37) , std::forward( arg38) , std::forward( arg39) , std::forward( arg40) , std::forward( arg41) , std::forward( arg42) , std::forward( arg43) , std::forward( arg44) , std::forward( arg45)) {} # endif @@ -847,7 +894,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 , U42 && arg42 , U43 && arg43 , U44 && arg44 , U45 && arg45 , U46 && arg46) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 , U42 && arg42 , U43 && arg43 , U44 && arg44 , U45 && arg45 , U46 && arg46 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36) , std::forward( arg37) , std::forward( arg38) , std::forward( arg39) , std::forward( arg40) , std::forward( arg41) , std::forward( arg42) , std::forward( arg43) , std::forward( arg44) , std::forward( arg45) , std::forward( arg46)) {} # endif @@ -864,7 +912,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 , U42 && arg42 , U43 && arg43 , U44 && arg44 , U45 && arg45 , U46 && arg46 , U47 && arg47) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 , U42 && arg42 , U43 && arg43 , U44 && arg44 , U45 && arg45 , U46 && arg46 , U47 && arg47 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36) , std::forward( arg37) , std::forward( arg38) , std::forward( arg39) , std::forward( arg40) , std::forward( arg41) , std::forward( arg42) , std::forward( arg43) , std::forward( arg44) , std::forward( arg45) , std::forward( arg46) , std::forward( arg47)) {} # endif @@ -881,7 +930,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 , U42 && arg42 , U43 && arg43 , U44 && arg44 , U45 && arg45 , U46 && arg46 , U47 && arg47 , U48 && arg48) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 , U42 && arg42 , U43 && arg43 , U44 && arg44 , U45 && arg45 , U46 && arg46 , U47 && arg47 , U48 && arg48 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36) , std::forward( arg37) , std::forward( arg38) , std::forward( arg39) , std::forward( arg40) , std::forward( arg41) , std::forward( arg42) , std::forward( arg43) , std::forward( arg44) , std::forward( arg45) , std::forward( arg46) , std::forward( arg47) , std::forward( arg48)) {} # endif @@ -898,7 +948,8 @@ namespace boost { namespace fusion BOOST_CXX14_CONSTEXPR # endif BOOST_FUSION_GPU_ENABLED - vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 , U42 && arg42 , U43 && arg43 , U44 && arg44 , U45 && arg45 , U46 && arg46 , U47 && arg47 , U48 && arg48 , U49 && arg49) + vector(U0 && arg0 , U1 && arg1 , U2 && arg2 , U3 && arg3 , U4 && arg4 , U5 && arg5 , U6 && arg6 , U7 && arg7 , U8 && arg8 , U9 && arg9 , U10 && arg10 , U11 && arg11 , U12 && arg12 , U13 && arg13 , U14 && arg14 , U15 && arg15 , U16 && arg16 , U17 && arg17 , U18 && arg18 , U19 && arg19 , U20 && arg20 , U21 && arg21 , U22 && arg22 , U23 && arg23 , U24 && arg24 , U25 && arg25 , U26 && arg26 , U27 && arg27 , U28 && arg28 , U29 && arg29 , U30 && arg30 , U31 && arg31 , U32 && arg32 , U33 && arg33 , U34 && arg34 , U35 && arg35 , U36 && arg36 , U37 && arg37 , U38 && arg38 , U39 && arg39 , U40 && arg40 , U41 && arg41 , U42 && arg42 , U43 && arg43 , U44 && arg44 , U45 && arg45 , U46 && arg46 , U47 && arg47 , U48 && arg48 , U49 && arg49 + ) : vec(std::forward( arg0) , std::forward( arg1) , std::forward( arg2) , std::forward( arg3) , std::forward( arg4) , std::forward( arg5) , std::forward( arg6) , std::forward( arg7) , std::forward( arg8) , std::forward( arg9) , std::forward( arg10) , std::forward( arg11) , std::forward( arg12) , std::forward( arg13) , std::forward( arg14) , std::forward( arg15) , std::forward( arg16) , std::forward( arg17) , std::forward( arg18) , std::forward( arg19) , std::forward( arg20) , std::forward( arg21) , std::forward( arg22) , std::forward( arg23) , std::forward( arg24) , std::forward( arg25) , std::forward( arg26) , std::forward( arg27) , std::forward( arg28) , std::forward( arg29) , std::forward( arg30) , std::forward( arg31) , std::forward( arg32) , std::forward( arg33) , std::forward( arg34) , std::forward( arg35) , std::forward( arg36) , std::forward( arg37) , std::forward( arg38) , std::forward( arg39) , std::forward( arg40) , std::forward( arg41) , std::forward( arg42) , std::forward( arg43) , std::forward( arg44) , std::forward( arg45) , std::forward( arg46) , std::forward( arg47) , std::forward( arg48) , std::forward( arg49)) {} # endif template @@ -937,7 +988,10 @@ namespace boost { namespace fusion } template BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - vector& + typename boost::disable_if_c< + boost::is_same::type>::value + , vector& + >::type operator=(T&& rhs) { vec = std::forward( rhs); diff --git a/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/vector.hpp b/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/vector.hpp index 8a7a4e5d..f5c3024e 100644 --- a/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/vector.hpp +++ b/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/vector.hpp @@ -1,5 +1,6 @@ /*============================================================================= Copyright (c) 2001-2011 Joel de Guzman + Copyright (c) 2017 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) @@ -22,6 +23,7 @@ #include #include #include +#include #include #include @@ -177,7 +179,10 @@ FUSION_HASH if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) template BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - vector& + typename boost::disable_if_c< + boost::is_same::type>::value + , vector& + >::type operator=(T&& rhs) { vec = BOOST_FUSION_FWD_ELEM(T, rhs); diff --git a/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/vector_forward_ctor.hpp b/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/vector_forward_ctor.hpp index 682f0ce3..3422e4b9 100644 --- a/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/vector_forward_ctor.hpp +++ b/third_party/boost_parts/boost/fusion/container/vector/detail/cpp03/vector_forward_ctor.hpp @@ -64,7 +64,11 @@ FUSION_HASH endif #if M == 1 explicit #endif - vector(BOOST_PP_ENUM_BINARY_PARAMS(M, U, && arg)) + vector(BOOST_PP_ENUM_BINARY_PARAMS(M, U, && arg) +#if M == 1 + , typename boost::disable_if_c::type>::value, detail::enabler_>::type = detail::enabler +#endif + ) : vec(BOOST_PP_ENUM(M, FUSION_FORWARD_CTOR_FORWARD, arg)) {} #endif #if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) diff --git a/third_party/boost_parts/boost/fusion/container/vector/detail/value_at_impl.hpp b/third_party/boost_parts/boost/fusion/container/vector/detail/value_at_impl.hpp index 6c8c41fb..a2b9b2f6 100644 --- a/third_party/boost_parts/boost/fusion/container/vector/detail/value_at_impl.hpp +++ b/third_party/boost_parts/boost/fusion/container/vector/detail/value_at_impl.hpp @@ -23,7 +23,6 @@ /////////////////////////////////////////////////////////////////////////////// #include #include -#include namespace boost { namespace fusion { @@ -31,8 +30,12 @@ namespace boost { namespace fusion namespace vector_detail { - template - struct vector_data; + template + struct store; + + template + static inline BOOST_FUSION_GPU_ENABLED + U value_at_impl(store const volatile*); } namespace extension @@ -46,8 +49,9 @@ namespace boost { namespace fusion template struct apply { - typedef typename boost::remove_cv::type seq; - typedef typename mpl::identity(boost::declval()))>::type::type type; + typedef + decltype(vector_detail::value_at_impl(boost::declval())) + type; }; }; } diff --git a/third_party/boost_parts/boost/fusion/container/vector/vector.hpp b/third_party/boost_parts/boost/fusion/container/vector/vector.hpp index 65bffd0b..4993e2eb 100644 --- a/third_party/boost_parts/boost/fusion/container/vector/vector.hpp +++ b/third_party/boost_parts/boost/fusion/container/vector/vector.hpp @@ -24,23 +24,21 @@ /////////////////////////////////////////////////////////////////////////////// #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 @@ -53,52 +51,48 @@ namespace boost { namespace fusion namespace vector_detail { struct each_elem {}; - struct copy_or_move {}; - template struct from_sequence {}; - template - struct make_indices_from_seq - : detail::make_index_sequence< - fusion::result_of::size::type>::value + template < + typename This, typename T, typename T_, std::size_t Size, bool IsSeq + > + struct can_convert_impl : false_type {}; + + template + struct can_convert_impl : true_type {}; + + template + struct can_convert_impl + : integral_constant< + bool + , !is_convertible< + Sequence + , typename fusion::extension::value_at_impl:: + template apply< This, mpl::int_<0> >::type + >::value > {}; - template - struct pure : remove_cv::type> {}; - - template ::value> - struct is_convertible_to_first - : boost::is_convertible::type> - {}; - - template - struct is_convertible_to_first - : mpl::false_ + template + struct can_convert + : can_convert_impl< + This, T, T_, Size, traits::is_sequence::value + > {}; - template - BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED - inline each_elem - dispatch(T const&...) BOOST_NOEXCEPT { return each_elem(); } - - template - BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED - inline copy_or_move - dispatch(This const&) BOOST_NOEXCEPT { return copy_or_move(); } + template + struct is_longer_sequence_impl : false_type {}; - template - BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED - inline from_sequence< - typename lazy_enable_if_c< - (traits::is_sequence::type>::value && - !is_same::type>::value && - !is_convertible_to_first::value) - , make_indices_from_seq - >::type - > - dispatch(Sequence&&) BOOST_NOEXCEPT - { return from_sequence::type>(); } + template + struct is_longer_sequence_impl + : integral_constant< + bool, (fusion::result_of::size::value >= Size) + > + {}; + template + struct is_longer_sequence + : is_longer_sequence_impl::value, Size> + {}; // forward_at_c allows to access Nth element even if ForwardSequence // since fusion::at_c requires RandomAccessSequence. @@ -139,51 +133,41 @@ namespace boost { namespace fusion BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED store(store const& rhs) - : elem(rhs.get()) + : elem(rhs.elem) {} BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED store& operator=(store const& rhs) { - elem = rhs.get(); + elem = rhs.elem; return *this; } BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED store(store&& rhs) - : elem(static_cast(rhs.get())) + : elem(static_cast(rhs.elem)) {} BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED store& operator=(store&& rhs) { - elem = static_cast(rhs.get()); + elem = static_cast(rhs.elem); return *this; } - template + template < + typename U + , typename = typename boost::disable_if< + is_base_of::type> + >::type + > BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED - store(U&& rhs - , typename disable_if::type, store>, detail::enabler_>::type = detail::enabler) + store(U&& rhs) : elem(std::forward(rhs)) {} - template - BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - typename disable_if::type, store>, store&>::type - operator=(U&& rhs) - { - elem = std::forward(rhs); - return *this; - } - - BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - T & get() { return elem; } - BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED - T const& get() const { return elem; } - T elem; }; @@ -203,24 +187,19 @@ namespace boost { namespace fusion typedef vector type_sequence; BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED - vector_data() - {} - - BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED - vector_data(copy_or_move, vector_data const& rhs) - : store(static_cast const&>(rhs))... - {} - - BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED - vector_data(copy_or_move, vector_data&& rhs) - : store(std::forward >(rhs))... - {} - - template + BOOST_DEFAULTED_FUNCTION(vector_data(), {}) + + template < + typename Sequence + , typename Sequence_ = typename remove_reference::type + , typename = typename boost::enable_if< + can_convert + >::type + > BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED explicit - vector_data(from_sequence >, Sequence&& rhs) - : store(forward_at_c(rhs))... + vector_data(each_elem, Sequence&& rhs) + : store(forward_at_c(std::forward(rhs)))... {} template @@ -230,6 +209,14 @@ namespace boost { namespace fusion : store(std::forward(var))... {} + template + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED + void + assign_sequence(Sequence&& seq) + { + assign(std::forward(seq), detail::index_sequence()); + } + template BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED void @@ -246,35 +233,31 @@ namespace boost { namespace fusion template static BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - auto at_detail(store* this_) -> decltype(this_->get()) + U& at_detail(store* this_) { - return this_->get(); + return this_->elem; } template static BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED - auto at_detail(store const* this_) -> decltype(this_->get()) + U const& at_detail(store const* this_) { - return this_->get(); + return this_->elem; } template BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - auto at_impl(J) -> decltype(at_detail(this)) + auto at_impl(J) -> decltype(at_detail(&std::declval())) { return at_detail(this); } template BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED - auto at_impl(J) const -> decltype(at_detail(this)) + auto at_impl(J) const -> decltype(at_detail(&std::declval())) { return at_detail(this); } - - template - static BOOST_FUSION_GPU_ENABLED - mpl::identity value_at_impl(store*); }; } // namespace boost::fusion::vector_detail @@ -291,18 +274,36 @@ namespace boost { namespace fusion > base; BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED - vector() - {} - - // rvalue-references is required here in order to forward any arguments to - // base: vector(T const&...) doesn't work with trailing void_ and - // vector(U const&...) cannot forward any arguments to base. - template + BOOST_DEFAULTED_FUNCTION(vector(), {}) + + template < + typename... U + , typename = typename boost::enable_if_c<( + sizeof...(U) >= 1 && + fusion::detail::and_...>::value && + !fusion::detail::and_< + is_base_of::type>... + >::value + )>::type + > // XXX: constexpr become error due to pull-request #79, booooo!! // In the (near) future release, should be fixed. /* BOOST_CONSTEXPR */ BOOST_FUSION_GPU_ENABLED - vector(U&&... u) - : base(vector_detail::dispatch(std::forward(u)...), std::forward(u)...) + explicit vector(U&&... u) + : base(vector_detail::each_elem(), std::forward(u)...) + {} + + template < + typename Sequence + , typename = typename boost::enable_if_c< + vector_detail::is_longer_sequence< + typename remove_reference::type, sizeof...(T) + >::value + >::type + > + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED + vector(Sequence&& seq) + : base(vector_detail::each_elem(), std::forward(seq)) {} template @@ -310,10 +311,7 @@ namespace boost { namespace fusion vector& operator=(Sequence&& rhs) { - typedef typename - vector_detail::make_indices_from_seq::type - indices; - base::assign(std::forward(rhs), indices()); + base::assign_sequence(std::forward(rhs)); return *this; } }; diff --git a/third_party/boost_parts/boost/fusion/support/detail/and.hpp b/third_party/boost_parts/boost/fusion/support/detail/and.hpp new file mode 100644 index 00000000..1b310dda --- /dev/null +++ b/third_party/boost_parts/boost/fusion/support/detail/and.hpp @@ -0,0 +1,39 @@ +/*============================================================================= + Copyright (c) 2016 Lee Clagett + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +==============================================================================*/ +#ifndef FUSION_AND_07152016_1625 +#define FUSION_AND_07152016_1625 + +#include +#include + +#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) +#error fusion::detail::and_ requires variadic templates +#endif + +namespace boost { namespace fusion { namespace detail { + template + struct and_impl : false_type {}; + + template + struct and_impl...> : true_type {}; + + // This specialization is necessary to avoid MSVC-12 variadics bug. + template + struct and_impl1 : and_impl...> {}; + + /* fusion::detail::and_ differs from mpl::and_ in the following ways: + - The empty set is valid and returns true + - A single element set is valid and returns the identity + - There is no upper bound on the set size + - The conditions are evaluated at once, and are not short-circuited. This + reduces instantations when returning true; the implementation is not + recursive. */ + template + struct and_ : and_impl1 {}; +}}} + +#endif // FUSION_AND_07152016_1625 diff --git a/third_party/boost_parts/boost/fusion/support/detail/is_mpl_sequence.hpp b/third_party/boost_parts/boost/fusion/support/detail/is_mpl_sequence.hpp index 1c485f91..24b86624 100644 --- a/third_party/boost_parts/boost/fusion/support/detail/is_mpl_sequence.hpp +++ b/third_party/boost_parts/boost/fusion/support/detail/is_mpl_sequence.hpp @@ -13,6 +13,7 @@ #include #include #include +#include #include namespace boost { namespace fusion { namespace detail @@ -20,7 +21,7 @@ namespace boost { namespace fusion { namespace detail template struct is_mpl_sequence : mpl::and_< - mpl::not_ > + mpl::not_, is_convertible > > , mpl::is_sequence > {}; }}} diff --git a/third_party/boost_parts/boost/fusion/support/is_sequence.hpp b/third_party/boost_parts/boost/fusion/support/is_sequence.hpp index 6b9b2118..af7c84e1 100644 --- a/third_party/boost_parts/boost/fusion/support/is_sequence.hpp +++ b/third_party/boost_parts/boost/fusion/support/is_sequence.hpp @@ -10,9 +10,11 @@ #include #include #include +#include +#include #include #include -#include +#include #include #include @@ -69,7 +71,10 @@ namespace boost { namespace fusion template struct is_native_fusion_sequence - : is_convertible + : mpl::and_< + is_complete, + is_convertible + > {}; } }} diff --git a/third_party/boost_parts/boost/graph/adjacency_iterator.hpp b/third_party/boost_parts/boost/graph/adjacency_iterator.hpp index d5006064..c134fe5a 100644 --- a/third_party/boost_parts/boost/graph/adjacency_iterator.hpp +++ b/third_party/boost_parts/boost/graph/adjacency_iterator.hpp @@ -10,6 +10,7 @@ #ifndef BOOST_ADJACENCY_ITERATOR_HPP #define BOOST_ADJACENCY_ITERATOR_HPP +#include #include #include diff --git a/third_party/boost_parts/boost/graph/adjacency_list.hpp b/third_party/boost_parts/boost/graph/adjacency_list.hpp index d7fbc06d..da80063d 100644 --- a/third_party/boost_parts/boost/graph/adjacency_list.hpp +++ b/third_party/boost_parts/boost/graph/adjacency_list.hpp @@ -20,14 +20,6 @@ #include -#if !defined BOOST_NO_SLIST -# ifdef BOOST_SLIST_HEADER -# include BOOST_SLIST_HEADER -# else -# include -# endif -#endif - #include #include @@ -52,10 +44,6 @@ namespace boost { // to map the selectors to the container type used to implement the // graph. -#if !defined BOOST_NO_SLIST - struct slistS {}; -#endif - struct vecS { }; struct listS { }; struct setS { }; @@ -74,12 +62,7 @@ namespace boost { struct container_gen { typedef std::list type; }; -#if !defined BOOST_NO_SLIST - template - struct container_gen { - typedef BOOST_STD_EXTENSION_NAMESPACE::slist type; - }; -#endif + template struct container_gen { typedef std::vector type; @@ -136,12 +119,6 @@ namespace boost { struct parallel_edge_traits { typedef allow_parallel_edge_tag type; }; -#if !defined BOOST_NO_SLIST - template <> - struct parallel_edge_traits { - typedef allow_parallel_edge_tag type; }; -#endif - template <> struct parallel_edge_traits { typedef disallow_parallel_edge_tag type; }; diff --git a/third_party/boost_parts/boost/graph/buffer_concepts.hpp b/third_party/boost_parts/boost/graph/buffer_concepts.hpp index 2bad8af3..233a7206 100644 --- a/third_party/boost_parts/boost/graph/buffer_concepts.hpp +++ b/third_party/boost_parts/boost/graph/buffer_concepts.hpp @@ -6,13 +6,13 @@ #ifndef BOOST_GRAPH_BUFFER_CONCEPTS_HPP #define BOOST_GRAPH_BUFFER_CONCEPTS_HPP 1 #include -#include #include #include #include #include #include +#include namespace boost { BOOST_concept(Buffer, (B)) @@ -87,5 +87,6 @@ namespace boost { }; } // end `namespace boost` +#include #endif // !BOOST_GRAPH_BUFFER_CONCEPTS_HPP diff --git a/third_party/boost_parts/boost/graph/depth_first_search.hpp b/third_party/boost_parts/boost/graph/depth_first_search.hpp index b002d367..cf60e1ac 100644 --- a/third_party/boost_parts/boost/graph/depth_first_search.hpp +++ b/third_party/boost_parts/boost/graph/depth_first_search.hpp @@ -64,19 +64,27 @@ namespace boost { template struct do_call_finish_edge { template - static void call_finish_edge(Vis& vis, const E& e, const G& g) { + static void call_finish_edge(Vis& vis, E e, const G& g) { vis.finish_edge(e, g); } }; template <> struct do_call_finish_edge { template - static void call_finish_edge(Vis&, const E&, const G&) {} + static void call_finish_edge(Vis&, E, const G&) {} }; template - void call_finish_edge(Vis& vis, const E& e, const G& g) { // Only call if method exists + void call_finish_edge(Vis& vis, E e, const G& g) { // Only call if method exists +#if ((defined(__GNUC__) && (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 9))) || \ + defined(__clang__) || \ + (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1200))) + do_call_finish_edge< + has_member_function_finish_edge >::value>::call_finish_edge(vis, e, g); +#else do_call_finish_edge::value>::call_finish_edge(vis, e, g); +#endif } @@ -137,6 +145,11 @@ namespace boost { src_e = back.second.first; boost::tie(ei, ei_end) = back.second.second; stack.pop_back(); + // finish_edge has to be called here, not after the + // loop. Think of the pop as the return from a recursive call. + if (src_e) { + call_finish_edge(vis, src_e.get(), g); + } while (ei != ei_end) { Vertex v = target(*ei, g); vis.examine_edge(*ei, g); @@ -164,7 +177,6 @@ namespace boost { } put(color, u, Color::black()); vis.finish_vertex(u, g); - if (src_e) call_finish_edge(vis, src_e.get(), g); } } diff --git a/third_party/boost_parts/boost/graph/detail/adjacency_list.hpp b/third_party/boost_parts/boost/graph/detail/adjacency_list.hpp index 1145d88d..3c3ab0ec 100644 --- a/third_party/boost_parts/boost/graph/detail/adjacency_list.hpp +++ b/third_party/boost_parts/boost/graph/detail/adjacency_list.hpp @@ -237,12 +237,6 @@ namespace boost { inline stored_edge() { } inline stored_edge(Vertex target, const no_property& = no_property()) : m_target(target) { } - // Need to write this explicitly so stored_edge_property can - // invoke Base::operator= (at least, for SGI MIPSPro compiler) - inline stored_edge& operator=(const stored_edge& x) { - m_target = x.m_target; - return *this; - } inline Vertex& get_target() const { return m_target; } inline const no_property& get_property() const { return s_prop; } inline bool operator==(const stored_edge& x) const @@ -258,7 +252,7 @@ namespace boost { template no_property stored_edge::s_prop; -#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) +#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || defined(BOOST_NO_CXX11_SMART_PTR) template class stored_edge_property : public stored_edge { typedef stored_edge_property self; @@ -270,12 +264,24 @@ namespace boost { const Property& p = Property()) : stored_edge(target), m_property(new Property(p)) { } stored_edge_property(const self& x) - : Base(x), m_property(const_cast(x).m_property) { } + : Base(static_cast< Base const& >(x)), m_property(const_cast(x).m_property) { } self& operator=(const self& x) { - Base::operator=(x); + // NOTE: avoid 'Base::operator=(x);' broken on SGI MIPSpro (bug 55771 of Mozilla). + static_cast(*this) = static_cast< Base const& >(x); m_property = const_cast(x).m_property; return *this; } +#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) + // NOTE Don't rely on default operators, their behavior is broken on several compilers (GCC 4.6). + stored_edge_property(self&& x) + : Base(static_cast< Base&& >(x)), m_property(std::move(x.m_property)) { } + self& operator=(self&& x) { + // NOTE: avoid 'Base::operator=(x);' broken on SGI MIPSpro (bug 55771 of Mozilla). + static_cast(*this) = static_cast< Base&& >(x); + m_property = std::move(x.m_property); + return *this; + } +#endif inline Property& get_property() { return *m_property; } inline const Property& get_property() const { return *m_property; } protected: @@ -296,27 +302,22 @@ namespace boost { inline stored_edge_property(Vertex target, const Property& p = Property()) : stored_edge(target), m_property(new Property(p)) { } -#if defined(BOOST_MSVC) || (defined(BOOST_GCC) && (BOOST_GCC / 100) < 406) - stored_edge_property(self&& x) : Base(static_cast< Base const& >(x)) { - m_property.swap(x.m_property); - } - stored_edge_property(self const& x) : Base(static_cast< Base const& >(x)) { - m_property.swap(const_cast(x).m_property); - } + stored_edge_property(self&& x) : Base(static_cast< Base&& >(x)), + m_property(std::move(x.m_property)) { } + stored_edge_property(self const& x) : Base(static_cast< Base const& >(x)), + m_property(std::move(const_cast(x).m_property)) { } self& operator=(self&& x) { - Base::operator=(static_cast< Base const& >(x)); + // NOTE: avoid 'Base::operator=(x);' broken on SGI MIPSpro (bug 55771 of Mozilla). + static_cast(*this) = static_cast< Base&& >(x); m_property = std::move(x.m_property); return *this; } self& operator=(self const& x) { - Base::operator=(static_cast< Base const& >(x)); + // NOTE: avoid 'Base::operator=(x);' broken on SGI MIPSpro (bug 55771 of Mozilla). + static_cast(*this) = static_cast< Base const& >(x); m_property = std::move(const_cast(x).m_property); return *this; } -#else - stored_edge_property(self&& x) = default; - self& operator=(self&& x) = default; -#endif inline Property& get_property() { return *m_property; } inline const Property& get_property() const { return *m_property; } protected: diff --git a/third_party/boost_parts/boost/graph/detail/edge.hpp b/third_party/boost_parts/boost/graph/detail/edge.hpp index badf28d4..3aba9f8d 100644 --- a/third_party/boost_parts/boost/graph/detail/edge.hpp +++ b/third_party/boost_parts/boost/graph/detail/edge.hpp @@ -13,6 +13,8 @@ #include +#include + namespace boost { namespace detail { diff --git a/third_party/boost_parts/boost/graph/distributed/unsafe_serialize.hpp b/third_party/boost_parts/boost/graph/distributed/unsafe_serialize.hpp deleted file mode 100644 index 38ad8a67..00000000 --- a/third_party/boost_parts/boost/graph/distributed/unsafe_serialize.hpp +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (C) 2006 The Trustees of Indiana University. - -// Use, modification and distribution is subject to the 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: Douglas Gregor -// Andrew Lumsdaine - -// This file contains the "unsafe_serialize" routine, which transforms -// types they may not be serializable (such as void*) into -// serializable equivalents. -#ifndef PBGL_UNSAFE_SERIALIZE_HPP -#define PBGL_UNSAFE_SERIALIZE_HPP - -#ifndef BOOST_GRAPH_USE_MPI -#error "Parallel BGL files should not be included unless has been included" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -BOOST_IS_BITWISE_SERIALIZABLE(void*) -namespace boost { namespace mpi { - template<> struct is_mpi_datatype : mpl::true_ { }; -} } // end namespace boost::mpi - -namespace boost { - typedef mpl::if_c<(sizeof(int) == sizeof(void*)), - int, - mpl::if_c<(sizeof(long) == sizeof(void*)), - long, - mpl::if_c<(sizeof(void*) <= sizeof(boost::intmax_t)), - boost::intmax_t, - void>::type - >::type - >::type ptr_serialize_type; - - BOOST_STATIC_ASSERT ((!boost::is_void::value)); - - template inline T& unsafe_serialize(T& x) { return x; } - - inline ptr_serialize_type& unsafe_serialize(void*& x) - { return reinterpret_cast(x); } - - // Force Boost.MPI to serialize a void* like a ptr_serialize_type - namespace mpi { - template<> inline MPI_Datatype get_mpi_datatype(void* const& x) - { - return get_mpi_datatype(); - } - } - - template - struct unsafe_pair - { - unsafe_pair() { } - unsafe_pair(const T& t, const U& u) : first(t), second(u) { } - unsafe_pair(const std::pair& p) : first(p.first), second(p.second) { } - T first; - U second; - - template - void serialize(Archiver& ar, const unsigned /*version*/) - { - ar & unsafe_serialize(first) & unsafe_serialize(second); - } - }; - - template - bool operator<(unsafe_pair const& x, unsafe_pair const& y) - { - return std::make_pair(x.first, x.second) < - std::make_pair(y.first, y.second); - } - -} // end namespace boost - -#endif // PBGL_UNSAFE_SERIALIZE_HPP diff --git a/third_party/boost_parts/boost/graph/dominator_tree.hpp b/third_party/boost_parts/boost/graph/dominator_tree.hpp index 9371eee0..e4a7eef5 100644 --- a/third_party/boost_parts/boost/graph/dominator_tree.hpp +++ b/third_party/boost_parts/boost/graph/dominator_tree.hpp @@ -70,29 +70,31 @@ namespace boost { /** * @param g [in] the target graph of the dominator tree * @param entry [in] the entry node of g + * @param indexMap [in] the vertex index map for g * @param domTreePredMap [out] the immediate dominator map * (parent map in dominator tree) */ dominator_visitor(const Graph& g, const Vertex& entry, + const IndexMap& indexMap, DomTreePredMap domTreePredMap) : semi_(num_vertices(g)), ancestor_(num_vertices(g), graph_traits::null_vertex()), samedom_(ancestor_), best_(semi_), semiMap_(make_iterator_property_map(semi_.begin(), - get(vertex_index, g))), + indexMap)), ancestorMap_(make_iterator_property_map(ancestor_.begin(), - get(vertex_index, g))), + indexMap)), bestMap_(make_iterator_property_map(best_.begin(), - get(vertex_index, g))), + indexMap)), buckets_(num_vertices(g)), bucketMap_(make_iterator_property_map(buckets_.begin(), - get(vertex_index, g))), + indexMap)), entry_(entry), domTreePredMap_(domTreePredMap), numOfVertices_(num_vertices(g)), samedomMap(make_iterator_property_map(samedom_.begin(), - get(vertex_index, g))) + indexMap)) { } @@ -237,7 +239,7 @@ namespace boost { lengauer_tarjan_dominator_tree_without_dfs (const Graph& g, const typename graph_traits::vertex_descriptor& entry, - const IndexMap& /*indexMap*/, + const IndexMap& indexMap, TimeMap dfnumMap, PredMap parentMap, VertexVector& verticesByDFNum, DomTreePredMap domTreePredMap) { @@ -252,7 +254,7 @@ namespace boost { // 1. Visit each vertex in reverse post order and calculate sdom. detail::dominator_visitor - visitor(g, entry, domTreePredMap); + visitor(g, entry, indexMap, domTreePredMap); VerticesSizeType i; for (i = 0; i < numOfVertices; ++i) diff --git a/third_party/boost_parts/boost/graph/filtered_graph.hpp b/third_party/boost_parts/boost/graph/filtered_graph.hpp index 74fea461..5426eac6 100644 --- a/third_party/boost_parts/boost/graph/filtered_graph.hpp +++ b/third_party/boost_parts/boost/graph/filtered_graph.hpp @@ -409,6 +409,26 @@ namespace boost { return n; } + template + typename enable_if::type, + typename filtered_graph::degree_size_type + >::type + degree(typename filtered_graph::vertex_descriptor u, + const filtered_graph& g) + { + return out_degree(u, g) + in_degree(u, g); + } + + template + typename disable_if::type, + typename filtered_graph::degree_size_type + >::type + degree(typename filtered_graph::vertex_descriptor u, + const filtered_graph& g) + { + return out_degree(u, g); + } + template std::pair::edge_descriptor, bool> edge(typename filtered_graph::vertex_descriptor u, diff --git a/third_party/boost_parts/boost/graph/graph_concepts.hpp b/third_party/boost_parts/boost/graph/graph_concepts.hpp index 875f8184..3b873a82 100644 --- a/third_party/boost_parts/boost/graph/graph_concepts.hpp +++ b/third_party/boost_parts/boost/graph/graph_concepts.hpp @@ -128,12 +128,14 @@ typename T::ThereReallyIsNoMemberByThisNameInT vertices(T const&); p = in_edges(v, g); n = in_degree(v, g); + n = degree(v, g); e = *p.first; const_constraints(g); } void const_constraints(const G& cg) { p = in_edges(v, cg); n = in_degree(v, cg); + n = degree(v, cg); e = *p.first; } std::pair p; diff --git a/third_party/boost_parts/boost/graph/named_function_params.hpp b/third_party/boost_parts/boost/graph/named_function_params.hpp index 26d3d5e4..a9a9add6 100644 --- a/third_party/boost_parts/boost/graph/named_function_params.hpp +++ b/third_party/boost_parts/boost/graph/named_function_params.hpp @@ -323,9 +323,17 @@ BOOST_BGL_DECLARE_NAMED_PARAMS struct edge_capacity_value { typedef bgl_named_params Params; - typedef typename detail::choose_impl_result::type, edge_capacity_t>::type CapacityEdgeMap; + typedef typename detail::choose_impl_result::type, edge_capacity_t>::type CapacityEdgeMap; typedef typename property_traits::value_type type; }; + // used in the max-flow algorithms + template + struct edge_weight_value + { + typedef bgl_named_params Params; + typedef typename detail::choose_impl_result::type, edge_weight_t>::type WeightMap; + typedef typename property_traits::value_type type; + }; } diff --git a/third_party/boost_parts/boost/graph/parallel/basic_reduce.hpp b/third_party/boost_parts/boost/graph/parallel/basic_reduce.hpp deleted file mode 100644 index ee23b3a9..00000000 --- a/third_party/boost_parts/boost/graph/parallel/basic_reduce.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2005 The Trustees of Indiana University. - -// Use, modification and distribution is subject to the 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: Douglas Gregor -// Andrew Lumsdaine - -#ifndef BOOST_PARALLEL_BASIC_REDUCE_HPP -#define BOOST_PARALLEL_BASIC_REDUCE_HPP - -#ifndef BOOST_GRAPH_USE_MPI -#error "Parallel BGL files should not be included unless has been included" -#endif - -namespace boost { namespace parallel { - -/** Reduction operation used to reconcile differences between local - * and remote values for a particular key in a property map. The - * type @c T is typically the @c value_type of the property - * map. This basic reduction returns a default-constructed @c T as - * the default value and always resolves to the remote value. - */ -template -struct basic_reduce -{ - BOOST_STATIC_CONSTANT(bool, non_default_resolver = false); - - /// Returns a default-constructed T object - template - T operator()(const Key&) const { return T(); } - - /// Returns the remote value - template - const T& operator()(const Key&, const T&, const T& remote) const - { return remote; } -}; - -} } // end namespace boost::parallel - -#endif // BOOST_PARALLEL_BASIC_REDUCE_HPP diff --git a/third_party/boost_parts/boost/graph/parallel/detail/untracked_pair.hpp b/third_party/boost_parts/boost/graph/parallel/detail/untracked_pair.hpp deleted file mode 100644 index 3554910f..00000000 --- a/third_party/boost_parts/boost/graph/parallel/detail/untracked_pair.hpp +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (C) 2007 Matthias Troyer -// -// Use, modification and distribution is subject to the Boost Software -// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// -// This file contains helper data structures for use in transmitting -// properties. The basic idea is to optimize away any storage for the -// properties when no properties are specified. -#ifndef BOOST_PARALLEL_DETAIL_UNTRACKED_PAIR_HPP -#define BOOST_PARALLEL_DETAIL_UNTRACKED_PAIR_HPP - -#ifndef BOOST_GRAPH_USE_MPI -#error "Parallel BGL files should not be included unless has been included" -#endif - -#include -#include // for std::pair -#include - -namespace boost { namespace parallel { namespace detail { - -/** - * This structure is like std::pair, with the only difference - * that tracking in the serialization library is turned off. - */ - -template -struct untracked_pair : public std::pair -{ - untracked_pair() {} - - untracked_pair(const T& t, const U& u) - : std::pair(t,u) {} - - template - untracked_pair(std::pair const& p) - : std::pair(p) {} -}; - -template -inline untracked_pair -make_untracked_pair(const T& t, const U& u) -{ - return untracked_pair(t,u); -} - -} } } // end namespace boost::parallel::detail - -namespace boost { namespace mpi { - -template -struct is_mpi_datatype > - : is_mpi_datatype > {}; - -} } // end namespace boost::mpi - -namespace boost { namespace serialization { - -// pair -template -inline void serialize( - Archive & ar, - boost::parallel::detail::untracked_pair & p, - const unsigned int /* file_version */ -){ - ar & boost::serialization::make_nvp("first", p.first); - ar & boost::serialization::make_nvp("second", p.second); -} - -template -struct is_bitwise_serializable< - boost::parallel::detail::untracked_pair > - : is_bitwise_serializable > {}; - -template -struct implementation_level > - : mpl::int_ {} ; - -template -struct tracking_level > - : mpl::int_ {} ; - -} } // end namespace boost::serialization - -#endif // BOOST_PARALLEL_DETAIL_UNTRACKED_PAIR_HPP diff --git a/third_party/boost_parts/boost/graph/parallel/properties.hpp b/third_party/boost_parts/boost/graph/parallel/properties.hpp index c6bb0bb0..852a7262 100644 --- a/third_party/boost_parts/boost/graph/parallel/properties.hpp +++ b/third_party/boost_parts/boost/graph/parallel/properties.hpp @@ -92,8 +92,10 @@ namespace boost { public: BOOST_STATIC_CONSTANT(bool, non_default_resolver = true); - T operator()(T key) const { return key; } - T operator()(T key, T, T y) const { return y; } + template + T operator()(Key key) const { return key; } + template + T operator()(Key key, T, T y) const { return y; } }; }; diff --git a/third_party/boost_parts/boost/graph/properties.hpp b/third_party/boost_parts/boost/graph/properties.hpp index ca6a4e9b..660102b4 100644 --- a/third_party/boost_parts/boost/graph/properties.hpp +++ b/third_party/boost_parts/boost/graph/properties.hpp @@ -324,13 +324,6 @@ namespace boost { } -#if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) && !defined (BOOST_GRAPH_NO_BUNDLED_PROPERTIES) -// This compiler cannot define a partial specialization based on a -// pointer-to-member type, as seen in boost/graph/subgraph.hpp line 985 (as of -// trunk r53912) -# define BOOST_GRAPH_NO_BUNDLED_PROPERTIES -#endif - // NOTE: These functions are declared, but never defined since they need to // be overloaded by graph implementations. However, we need them to be // declared for the functions below. diff --git a/third_party/boost_parts/boost/graph/reverse_graph.hpp b/third_party/boost_parts/boost/graph/reverse_graph.hpp index 24eb1c7c..56ffe72d 100644 --- a/third_party/boost_parts/boost/graph/reverse_graph.hpp +++ b/third_party/boost_parts/boost/graph/reverse_graph.hpp @@ -322,6 +322,13 @@ target(const detail::reverse_graph_edge_descriptor& e, const reverse_graph return source(e.underlying_descx, g.m_g); } +template +inline typename graph_traits::degree_size_type +degree(const typename graph_traits::vertex_descriptor u, + const reverse_graph& g) +{ + return degree(u, g.m_g); +} namespace detail { diff --git a/third_party/boost_parts/boost/integer_fwd.hpp b/third_party/boost_parts/boost/integer_fwd.hpp index 10577ae2..18519dd6 100644 --- a/third_party/boost_parts/boost/integer_fwd.hpp +++ b/third_party/boost_parts/boost/integer_fwd.hpp @@ -159,6 +159,8 @@ template #ifdef BOOST_NO_INTEGRAL_INT64_T @@ -180,6 +182,7 @@ template < typename IntegerType > template < typename IntegerType > class lcm_evaluator; +} // namespace integer } // namespace boost diff --git a/third_party/boost_parts/boost/intrusive/detail/config_begin.hpp b/third_party/boost_parts/boost/intrusive/detail/config_begin.hpp index cef86168..8bd57a3b 100644 --- a/third_party/boost_parts/boost/intrusive/detail/config_begin.hpp +++ b/third_party/boost_parts/boost/intrusive/detail/config_begin.hpp @@ -17,33 +17,20 @@ #ifdef BOOST_MSVC #pragma warning (push) - // - //'function' : resolved overload was found by argument-dependent lookup - //A function found by argument-dependent lookup (Koenig lookup) was eventually - //chosen by overload resolution. - // - //In Visual C++ .NET and earlier compilers, a different function would have - //been called. To pick the original function, use an explicitly qualified name. - // - - //warning C4275: non dll-interface class 'x' used as base for - //dll-interface class 'Y' - #pragma warning (disable : 4275) - //warning C4251: 'x' : class 'y' needs to have dll-interface to - //be used by clients of class 'z' - #pragma warning (disable : 4251) - #pragma warning (disable : 4675) - #pragma warning (disable : 4996) - #pragma warning (disable : 4503) + #pragma warning (disable : 4275) // non DLL-interface classkey "identifier" used as base for DLL-interface classkey "identifier" + #pragma warning (disable : 4251) // "identifier" : class "type" needs to have dll-interface to be used by clients of class "type2" + #pragma warning (disable : 4675) // "method" should be declared "static" and have exactly one parameter + #pragma warning (disable : 4996) // "function": was declared deprecated + #pragma warning (disable : 4503) // "identifier" : decorated name length exceeded, name was truncated #pragma warning (disable : 4284) // odd return type for operator-> #pragma warning (disable : 4244) // possible loss of data #pragma warning (disable : 4521) ////Disable "multiple copy constructors specified" #pragma warning (disable : 4127) //conditional expression is constant - #pragma warning (disable : 4146) + #pragma warning (disable : 4146) // unary minus operator applied to unsigned type, result still unsigned #pragma warning (disable : 4267) //conversion from 'X' to 'Y', possible loss of data #pragma warning (disable : 4541) //'typeid' used on polymorphic type 'boost::exception' with /GR- #pragma warning (disable : 4512) //'typeid' used on polymorphic type 'boost::exception' with /GR- - #pragma warning (disable : 4522) + #pragma warning (disable : 4522) // "class" : multiple assignment operators specified #pragma warning (disable : 4706) //assignment within conditional expression #pragma warning (disable : 4710) // function not inlined #pragma warning (disable : 4714) // "function": marked as __forceinline not inlined diff --git a/third_party/boost_parts/boost/intrusive/detail/has_member_function_callable_with.hpp b/third_party/boost_parts/boost/intrusive/detail/has_member_function_callable_with.hpp index 2e73305d..92ef60ee 100644 --- a/third_party/boost_parts/boost/intrusive/detail/has_member_function_callable_with.hpp +++ b/third_party/boost_parts/boost/intrusive/detail/has_member_function_callable_with.hpp @@ -11,13 +11,22 @@ #ifndef BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_CALLABLE_WITH_HPP #define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_CALLABLE_WITH_HPP -//Mark that we don't support 0 arg calls due to compiler ICE in GCC 3.4/4.0/4.1 and -//wrong SFINAE for GCC 4.2/4.3 -#if defined(__GNUC__) && !defined(__clang__) && ((__GNUC__*100 + __GNUC_MINOR__*10) >= 340) && ((__GNUC__*100 + __GNUC_MINOR__*10) <= 430) - #define BOOST_INTRUSIVE_DETAIL_HAS_MEMBER_FUNCTION_CALLABLE_WITH_0_ARGS_UNSUPPORTED -#elif defined(BOOST_INTEL) && (BOOST_INTEL < 1200 ) - #define BOOST_INTRUSIVE_DETAIL_HAS_MEMBER_FUNCTION_CALLABLE_WITH_0_ARGS_UNSUPPORTED +#ifndef BOOST_CONFIG_HPP +# include #endif + +//In case no decltype and no variadics, mark that we don't support 0 arg calls due to +//compiler ICE in GCC 3.4/4.0/4.1 and, wrong SFINAE for GCC 4.2/4.3/MSVC10/MSVC11 +#if defined(BOOST_NO_CXX11_DECLTYPE) && defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) +# if defined(BOOST_GCC) && (BOOST_GCC < 40400) +# define BOOST_INTRUSIVE_DETAIL_HAS_MEMBER_FUNCTION_CALLABLE_WITH_0_ARGS_UNSUPPORTED +# elif defined(BOOST_INTEL) && (BOOST_INTEL < 1200) +# define BOOST_INTRUSIVE_DETAIL_HAS_MEMBER_FUNCTION_CALLABLE_WITH_0_ARGS_UNSUPPORTED +# elif defined(BOOST_MSVC) && (BOOST_MSVC < 1800) +# define BOOST_INTRUSIVE_DETAIL_HAS_MEMBER_FUNCTION_CALLABLE_WITH_0_ARGS_UNSUPPORTED +# endif +#endif //#if defined(BOOST_NO_CXX11_DECLTYPE) && defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) + #include #include #include @@ -27,6 +36,11 @@ namespace boost_intrusive_hmfcw { typedef char yes_type; struct no_type{ char dummy[2]; }; +struct dont_care +{ + dont_care(...); +}; + #if defined(BOOST_NO_CXX11_DECLTYPE) #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) @@ -39,11 +53,6 @@ struct make_dontcare #endif -struct dont_care -{ - dont_care(...); -}; - struct private_type { static private_type p; @@ -56,7 +65,7 @@ yes_type is_private_type(private_type const &); #endif //#if defined(BOOST_NO_CXX11_DECLTYPE) -#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) +#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_NO_CXX11_DECLTYPE) template struct remove_cv { typedef T type; }; template struct remove_cv { typedef T type; }; @@ -124,7 +133,31 @@ BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG // declaration, special case and 0 arg specializaton // ///////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////// + + template + class BOOST_MOVE_CAT(has_member_function_named_, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME) + { + struct BaseMixin + { + void BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME() + {} //Some compilers require the definition or linker errors happen + }; + + struct Base + : public boost_intrusive_hmfcw::remove_cv::type, public BaseMixin + { //Declare the unneeded default constructor as some old compilers wrongly require it with is_convertible + Base(){} + }; + template class Helper{}; + + template + static boost_intrusive_hmfcw::no_type deduce + (U*, Helper* = 0); + static boost_intrusive_hmfcw::yes_type deduce(...); + + public: + static const bool value = sizeof(boost_intrusive_hmfcw::yes_type) == sizeof(deduce((Base*)0)); + }; #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) ///////////////////////////////////////////////////////// @@ -136,53 +169,45 @@ BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG ///////////////////////////////////////////////////////// //defined(BOOST_NO_CXX11_DECLTYPE) must be true - template + template struct FunWrapTmpl : Fun { using Fun::BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME; + FunWrapTmpl(); + template boost_intrusive_hmfcw::private_type BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME(DontCares...) const; }; + template + struct BOOST_MOVE_CAT(has_member_function_callable_with_impl_, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME); + + //No BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME member specialization template - struct BOOST_MOVE_CAT(has_member_function_callable_with_,BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME) + struct BOOST_MOVE_CAT(has_member_function_callable_with_impl_, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME) + { - typedef FunWrapTmpl::type...> FunWrap; + static const bool value = false; + }; - static bool const value = (sizeof(boost_intrusive_hmfcw::no_type) == - sizeof(boost_intrusive_hmfcw::is_private_type - ( (::boost::move_detail::declval< FunWrap >(). + template + struct BOOST_MOVE_CAT(has_member_function_callable_with_impl_,BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME) + { + static bool const value = (sizeof(boost_intrusive_hmfcw::no_type) == sizeof(boost_intrusive_hmfcw::is_private_type + ( (::boost::move_detail::declval + < FunWrapTmpl >(). BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME(::boost::move_detail::declval()...), 0) ) ) ); }; - #else //defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) - - //Preprocessor must be used to generate specializations instead of variadic templates - template - class BOOST_MOVE_CAT(has_member_function_named_, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME) - { - struct BaseMixin - { - void BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME() - {} //Some compilers require the definition or linker errors happen - }; - - struct Base - : public boost_intrusive_hmfcw::remove_cv::type, public BaseMixin - { //Declare the unneeded default constructor as some old compilers wrongly require it with is_convertible - Base(){} - }; - template class Helper{}; - - template - static boost_intrusive_hmfcw::no_type deduce - (U*, Helper* = 0); - static boost_intrusive_hmfcw::yes_type deduce(...); - - public: - static const bool value = sizeof(boost_intrusive_hmfcw::yes_type) == sizeof(deduce((Base*)0)); - }; + template + struct BOOST_MOVE_CAT(has_member_function_callable_with_, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME) + : public BOOST_MOVE_CAT(has_member_function_callable_with_impl_, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME) + ::value + , Args...> + {}; + #else //defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) ///////////////////////////////////////////////////////// ///////////////////////////////////////////////////////// @@ -222,24 +247,24 @@ BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG #if !defined(BOOST_INTRUSIVE_DETAIL_HAS_MEMBER_FUNCTION_CALLABLE_WITH_0_ARGS_UNSUPPORTED) - template().BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME(), 0)> - struct BOOST_MOVE_CAT(zeroarg_checker_, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME) - { boost_intrusive_hmfcw::yes_type dummy[N ? 1 : 2]; }; + template().BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME(), 0)> + struct BOOST_MOVE_CAT(zeroarg_checker_, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME) + { boost_intrusive_hmfcw::yes_type dummy[N ? 1 : 2]; }; - template - struct BOOST_MOVE_CAT(has_member_function_callable_with_impl_, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME) - { - template static BOOST_MOVE_CAT(zeroarg_checker_, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME) - Test(BOOST_MOVE_CAT(zeroarg_checker_, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME)*); - template static boost_intrusive_hmfcw::no_type Test(...); - static const bool value = sizeof(Test< Fun >(0)) == sizeof(boost_intrusive_hmfcw::yes_type); - }; + template + struct BOOST_MOVE_CAT(has_member_function_callable_with_impl_, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME) + { + template static BOOST_MOVE_CAT(zeroarg_checker_, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME) + Test(BOOST_MOVE_CAT(zeroarg_checker_, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME)*); + template static boost_intrusive_hmfcw::no_type Test(...); + static const bool value = sizeof(Test< Fun >(0)) == sizeof(boost_intrusive_hmfcw::yes_type); + }; #else //defined(BOOST_INTRUSIVE_DETAIL_HAS_MEMBER_FUNCTION_CALLABLE_WITH_0_ARGS_UNSUPPORTED) template struct BOOST_MOVE_CAT(has_member_function_callable_with_impl_, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME) - {//GCC [3.4-4.3) gives ICE when instantiating the 0 arg version so it is not supported. + { //Some compilers gives ICE when instantiating the 0 arg version so it is not supported. static const bool value = true; }; diff --git a/third_party/boost_parts/boost/intrusive/detail/memory_util.hpp b/third_party/boost_parts/boost/intrusive/detail/memory_util.hpp deleted file mode 100644 index bfc9b149..00000000 --- a/third_party/boost_parts/boost/intrusive/detail/memory_util.hpp +++ /dev/null @@ -1,292 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Pablo Halpern 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) -// -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2011-2013. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/intrusive for documentation. -// -////////////////////////////////////////////////////////////////////////////// - -#ifndef BOOST_INTRUSIVE_ALLOCATOR_MEMORY_UTIL_HPP -#define BOOST_INTRUSIVE_ALLOCATOR_MEMORY_UTIL_HPP - -#if (defined _MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif - -#include -#include -#include -#include - -namespace boost { -namespace intrusive { -namespace detail { - -template -inline T* addressof(T& obj) -{ - return static_cast - (static_cast - (const_cast - (&reinterpret_cast(obj)) - ) - ); -} - -template struct unvoid { typedef T type; }; -template <> struct unvoid { struct type { }; }; -template <> struct unvoid { struct type { }; }; - -template struct unvoid_ref { typedef T &type; }; -template <> struct unvoid_ref { struct type_impl { }; typedef type_impl & type; }; -template <> struct unvoid_ref { struct type_impl { }; typedef type_impl & type; }; - -template -struct LowPriorityConversion -{ - // Convertible from T with user-defined-conversion rank. - LowPriorityConversion(const T&) { } -}; - -// Infrastructure for providing a default type for T::TNAME if absent. -#define BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(TNAME) \ - template \ - struct boost_intrusive_default_type_ ## TNAME \ - { \ - template \ - static char test(int, typename X::TNAME*); \ - \ - template \ - static int test(boost::intrusive::detail:: \ - LowPriorityConversion, void*); \ - \ - struct DefaultWrap { typedef DefaultType TNAME; }; \ - \ - static const bool value = (1 == sizeof(test(0, 0))); \ - \ - typedef typename \ - ::boost::intrusive::detail::if_c \ - ::type::TNAME type; \ - }; \ - \ - template \ - struct boost_intrusive_eval_default_type_ ## TNAME \ - { \ - template \ - static char test(int, typename X::TNAME*); \ - \ - template \ - static int test(boost::intrusive::detail:: \ - LowPriorityConversion, void*); \ - \ - struct DefaultWrap \ - { typedef typename DefaultType::type TNAME; }; \ - \ - static const bool value = (1 == sizeof(test(0, 0))); \ - \ - typedef typename \ - ::boost::intrusive::detail::eval_if_c \ - < value \ - , ::boost::intrusive::detail::identity \ - , ::boost::intrusive::detail::identity \ - >::type::TNAME type; \ - }; \ -// - -#define BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(INSTANTIATION_NS_PREFIX, T, TNAME, TIMPL) \ - typename INSTANTIATION_NS_PREFIX \ - boost_intrusive_default_type_ ## TNAME< T, TIMPL >::type \ -// - -#define BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_EVAL_DEFAULT(INSTANTIATION_NS_PREFIX, T, TNAME, TIMPL) \ - typename INSTANTIATION_NS_PREFIX \ - boost_intrusive_eval_default_type_ ## TNAME< T, TIMPL >::type \ -// - -}}} //namespace boost::intrusive::detail - -#include - -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME pointer_to -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace intrusive { namespace detail { -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}} -#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 1, )) -#include BOOST_PP_ITERATE() - -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME static_cast_from -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace intrusive { namespace detail { -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}} -#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 1, )) -#include BOOST_PP_ITERATE() - -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME const_cast_from -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace intrusive { namespace detail { -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}} -#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 1, )) -#include BOOST_PP_ITERATE() - -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME dynamic_cast_from -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace intrusive { namespace detail { -#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}} -#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 1, )) -#include BOOST_PP_ITERATE() - -namespace boost { -namespace intrusive { -namespace detail { - -BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(element_type) -BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(difference_type) - -////////////////////// -//struct first_param -////////////////////// - -template struct first_param -{ typedef void type; }; - -#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) - - template
  • B3af=oEpj*HI z*&|v-#)wwnpF}^^*Z(TD7^?1~nSz$X{}8?pGs%o-wYwoZi&B;sDMh0I?V9O3k4!X% zI_cYk%F#JmMx)4l(H5CxKDP3O>N&bXHroHCQOeN_%0Ue%jyW39J=JuwPWII?GEo+) zLi1>jJ(@L zkd2b%jjPAxgw!-9{Xhw{>t?ncvQ^Z9YH0U?k-exDRiSUFp1waA?}};^)laPN7h7cY zYxVvC>6Wa_r>q*;rOFEEQHF-lEE+|%$cNfdR+&bQLP_X>dF#pA&@AigL3`*K#W7nt zN=7eixyhw(Q*9-y8PrNYqWocHwL?-lYJIDsHRPjRzhSsS=mcMA^IP?YOq0guT4WI=y%*gj-No+?e)#(f8#{D0j+NIk6CVY>b z>PGK8rKk!;qEwz`@S;1aJ1DzVo0f-$I+bO$OHnAJO<56oMT=+z1(2UPT2Pxi+k4OM z+c{|Ho++1Q^mJ&-DzaCyc(QA<0LyKrYLTUKoJXS<+WCFIfg_=+~szX`GK+U`! z--i0o2r5I>sE-rUx+d+75@ZxA>!IB_)iq>&QoCoeczV>L09C6}J-nQnKBFm4Ilq(b zpfNN;I}2r?1SjUrGHkB9W>sc>>L?XKcN*%?IzF- z)oD~nwFy~N(;GEP12WM7YDIC3vQO5XPbH17#l%4}0v2~|JYA^J!)0hLhgAUkB_eQqEwP->B8 zdnuN#&;->xWTSJmPLBn$QszCUT1oX2)w&Ow*F^bf0ewR@`iY)U@<)xAjyBN;G>Sf> zel&sBke@kT$h>Tak7^|+oi(Tl^&lUbK%*!R6(ci6+x7)bpbJ#&RlD<4$%{Ur6ZDE= z)6~O4UKGv9{po5qkB-qLx}onb*&(w{9O$v@61qXzy#A4hs*vAS-^^Xfx7+8wyctOr z*i_ZuC8c#srKk%HAm4<>^Yy4l+o)vl+08ks!@a6Ll4Z~%3LOlo-FBb!JR(_5QkvT% z_?GyH@Rx8^w5a4OmM+?)9IAn4WyP(Ig5P=_dV}k4p3tXR-+5-}^x`&n=b1v|=#+ML zy@veIAmyMDRQp-garDtrX546>#*=+?w>NmF_3y%4Sxm6{?}BTN@T@z3Hl06}{0Y6I z`g5pHgr_$2;kXD-sq-1R%t}r8S|KHposil2dSY;iEO4bKxc#5h*LeNn9$JmGYd2Nh zM_FjDMAZ^xAPbqvYWGN%%Nz%+V3o`&)SA!97RlyOZK+0XM}5eORCST;Yq_%ZGHIHu zjLbx5RO66=&X~i9)_8vQZe^6R8{|bv^tfddKUE7A1axUFkR38d3zwT8-JuVRyl7}G z*<>wb2D(FKsp|2ZA{CO|bE!sBEkR!Ni2U?eAiGD^T+&wsy7aS9Av#2BXcpyhY-|i^ z&1d~m5z0glUsUz^q%GuSl#M}EACbMTt9s>ts#)|f+LcvxO5@x_`@ZW^ZJ|1Vyo}sV z4-@6zsP6-#{6b!;6Re4!T7to9b(j*_~QxR+p5HZm8Cb zXb(Li|DeW89+qZ?q)4(Cvhqn)D_uo+s+}9$IZ7L-ZA#4#QOmZokO)tM({b{fR%R?n zUu-ohcN%TbXa`-Rz=h^H-qH}8$U=b`Rez9Wy6XwPWLBit1josu+=T?cqX8X$Z|ZU0 zxOqjp)LD(3h00t-c#i)me4o_tRgH}ATJVQ}qX^GK=)N_0|MgGdKgFRtsCORQEx+^Z zqK9jBu0svz13S@Xy5~hrd`8vhD#DZCOw~*y11%w+s|ZiMbJv;g{K<7XpUgWmM0m2D zz~0v)*W6O@ZT+_H0ew?i&<$1Zk$SWugHhJe27PzXrK|9JYC`*MnM?XB>NwN{UAvlo z3B?^KyV{o~_N0$wE3P6ubIzf;Kq)^wMCjDWyQQh7(J6}BR`nw~K=!z*v$mrM&#bdk zyWJr8k+B^$IzoO>X-<<@ zHdLJ=iz4e;SJg%_D3f+pwAytuN(ZVyHa*6Xg^Xp5(udAgl})ZlPgHG`L)DH`yA%2@ zQ++{)RM(MFr@rR#n)^YRUb5MGRclZVnnJ!DwYx<*#mdgfz7J}Sidz?q2 zOJ)~6qTs%AZ^#2l8o9necLFwNI#*PUWVJg@ko>4JQQ0{?_RtElP&rDV@0X7{J2TL2 zSfTGqn+_{<8&gNM0+pdQ^jM_v&OS&cSv2jwQawTYs2dHV&Ma+j{hyD&@Vgt|1%K8} zdvYn;Y4^vUpPmnXMC3Qm{}6s4dFa(ReiWObEI?M7sjS%4*cR>DSdEW%d1MA^a#s_) z5k=*!|JMJZ$9X^M8P(3VW%rR=0quNLkB>9l9#3SChXYT}DMB(mTJyE$+s&pTXO3RB zBX}$(J3Z#Pt(ib~G1~G-vfWr^7Wz)RX4-kt)Vg{cqNgQg-gDi~Pm=kN!70`d>TvIM z-+AIDHA)up^0?TnRJFcJN3$^noo5nV%nrC$!9{n$;kRIg-yX-dY@waezCGv2iy6?QO{f+PqR;N* zh6qo-^MU7F9!R7k1J%)dKlDBS?>rwFX^=(_>ls7NDwa9_nL&kPT3IPsJ&Hy)?N+#) zv-t_5&O%)SU#T{7(!Wn;@!6a$jzHm9U$l#EJIC-S{%SbbNKjqXwQh}spS7Bqzx z&>2b`Ro@I$jXtuKwWx`$>?%$h`={_x*Fk2ZJv7ALs6+dx678TOW;1JaS#O8a z4N!e~&?BL$N9pOOR86%3dC@8DtVbOO6=eC0XY6RahYz9SK6LglLuS(MA$$!8RmT}+ z4HeyMl-6*M&@p6hDa+iJ43vxtk%gk3oHYk;FP$%1nsGNG!qe#lHe2Pd(dag-_(67n z;%e2-DwMX+Ci0^jv{bAfokh|lSrO_-o5)8GFMH%8YH}6fDR3Sr4igkQ!3u2y<(hlE zQW~s~ys6Ry*#PZ)398m6Nf%^S$U-LSOH>cU_^`c>v_S5P2507E^o%_pd zH+tvUte@9w2sB&UdU3|>e`|(L(J;zj3!+%J7ZssORF9_64EyUVT0HRiy_NK zcU1k1yoZ{o2FUWsN|FCn*9^nZY?gcNi|`Em-{E^cD_SLAq_jm=9~;U-xBtaqg>K;+ zW7IAte5DCh1971&R2`t|M>WVqtIT1uIRA!5PS}*5$PT|LyFmxETP8EfBFSQq?}v6u zvzvvVK?`j}{DVr#_tH3ztH+Sb*#6PZ*G$pVabe&h6b?^%8O zilNXxpW-HU+0}c`@n4(leAjIC$ZXc_Q5*818FYls(GBXq*2tyE$WXSHDSbsTs2epS zlfHd!7W`H#=RVQo0{z+mW%ASb{|yD{wN(H3)!4QWYS{}S;*I?QAYZuu`iN+t3&t$)fjY1^%fP~sYe4^ zqKCz`)H|*@Mkk~ebV#+F%tv;BtZwx+d!^}~wv_+3Bc4%&w zMlr|&wCksOiFQyV?W$2HGTJn96}oO$7U2HtkZJ;pEcVjG>kgX zK%?5#A*)&05xQzsmfj*&x{B~v&Qlo6l;+R^ieiWzREH{1fF3JkgUD-XdJCB>GYw@l zsofJgqDME`3ED(~CH2i+lbV;MMHE2AE2!sE6C*0#tBst>XC^C z&^jt9)OZF*SRv{~HK-j0X4Lm|R(eF1SJ@e|GnE-x(g*haK3O7J3i5I)ZgZ~Ib)r%H z)zUq>Lj5(WzK|KH3VlKYr~z438f682Mc3#XvU#`^PxeYyLY9hb?(x^zyHC@a_mr&o zSlQ%}^mHga?n}kUpRTNk%Oe@pq1`>TOG3k__Fh$cNO~NT%7>*^G>jI}JQ^HPkM>dN z7urWz%+ZM~)Q&Du(zwR!dRsH+Vq>hnYC!F7e9|h}DSAW?sBBO@deJwugf`Fs^EQ)p zqamu3Z)^UfIZ`=?UPLC^poc+^2DE{EsQ;%%&O<4WP8Q)=b?&%FY&EiZ=wSWSX|BPO ziFgNy2MiA+?<`qF09Zh#jLQ+d75>Q~ijmYz{Yi?Tbi z2joXh$Fc6KhKFC&!`#vFa=a@op<* z|0DPedxYns^L9Yfxs?lqH#>C0G{ml`a{K-se5TlW=lboxgrDyVDLE?@yFRwGcfr=|ku>h6vB*{}}ueeCfa!JbXegwfj4I-A$~{&_;M8 zC4aZ7l_|;wQ5Om}&zAQ>5OOh8|AV2cb_m=Dv`>!oZ z+gpt4d81K9w5oAvoN8r^sz0bsvnM}NO<=Ymj+}X_*|8cWaG))Up-1EF;hB9{AAO}LQBZr)9NeOqS$?9KT&6R z%R{$2k?eyq6o-D%qo+@!EcZyQ$d3$OPn;q9Mc>q3^);yeq-wOO+DI0lN8*4}{oQlj z?7Tr@mG<3e9__P|PV@zBB0qE8qL?pQ$porHt0)IW^{YoF3Q(OT`-Yy-SD*Ukp%!GL zVy+1`TRG6FzMr^l^wO@Ftf))vDv%$=(ykv(b4%RYuD;c%6ZNAhdTf(rlXW5k^`qq_ zomb?bCA5fU&?K@@N~f-Yacxp8*(|4u1FfnyqGzf$N~LyF=%wrB2mFvMRFadR04+iE`*MM^-~-JaoACx%<&G?ycGt)fm=i zv6Z*Tk7mlXf@Ac6Vk%V4N3B&(_J`;AhSR>_`P+Ms_pc{eJ(cR5>~;yBD7e{s&*EF> z(8=8$P3$4(mz|thzYglp|9$5fuGa96ZjX1KU+9DTmayO(fSfN7+x?{GwdKt4-g~Ow+Jv?&p1oP;>bjnq9(L~0w2_)sX%H(fn2>M(aSgaU!hAhk7iLbT0y7Caus~bj`I+rJx9|U zr~;LsSX7HTQGd2Zna+}C(N7eI5>RfYdZeKrhO*%wx>>v-YkE?)elOLcQS^~^m-M|M zD?*1qHOexYN9||>-90)zB0Q)67Cxi)GT06a{{BnDCO=D8v|B)4xB3rH@>Tr*8y+t1 zS{)t&=vJDedPlZ`eB3c*-l#_}RTBkJCkilf-HH0{o=Uf57AJ(|R86u)vJ|rDGmVmg zGTF9tG;^+Y7TUW~mU}7vB>RQNsm`K#s>h6XOm&)SBr8~^nti0%x?F|cer5ho;fv_w zv5Ms=dqvsAs${!oRKX9rQC&s5Z=%N%S^J`RhEC_z?i%eOKYB)0Zr|Vy>)Ucex4msN@y}?`i&^Out)h>p z4vix(GEgE5Pi3>7{hDL%t5ird^+W8KvtjV`ulf+xDC1KZl=s_`~yOxmmMUNTkk%>Md@3Y#CpjGq(O||HF=|U5(f|r}~eBHS7 z$M5`Eb^dJrbNKr>g3t4Xo(T;;&lh^j@j#=7TR_{E4ug32F{~Q|pC?6UsI5suWFs%S zrCkA86PiVSrtkl(@h*^`{q!B}qD0y~HmGk4>OrH(o3D0xZj9JSl&h z=f$lA@3-D6q5Ca+QrF+^kIpcEcs{(n4Kui_|L|PCbqVi!-@Mc3y(i|a5*lpQ)JnY5 z8rE8s%mt~Gc2B6XT75H1r3VyMuEo{9O&MNX`P=`4pTPXXWB%p;?>xP3&v%|96jPxY z@=zV>MIS2FuCq$=lckf{WLa!QJ+t+@3Vs#BzYkxKo9u`uSHWMga6W7ozvk?t-#sx$ z&J*6ZZt~8vmZdc;rb`24`(cI7oQlsvPYZ_L9K64+J-&ewazlMX)rXvrLOp62r45IT8rC(t^I;~@CCq#=H-NJg)2f0ve(Em3`PkG6N7 zdD;c$)b1C0M0xZ$ehux4(2Z>YStDvjrLKY>01UnC5d3Kp_OP9ztxrXx$;t*39Rtt=c2i#YLK;~HnfYDkwxE~NX?cSC1oM+tX5D; zwuW|4dbIjZ&|{rB{9iSSO*N7%6ZN41w1XZ|G9#CxDs=o)vo$|Tu}_j86+J6ELZ4og z-J#xJ%Fm2X ze)hvT?e~TLyz@*LP7970?r@X`Lpk|@|A0-B2-bK?11dG(#bfT{^|zrJniV3jy|+kt-&Ty zysO|3NjvB4F9gAp_|R7}COCOrt!C|Xj*;$R1sTrI@f{EpIKj0Wyz``uXy%wvX^dZUq~CVDj6Ei35mR`#`e?$LQO*OxA3(`bJ%$NeIR7Fam1;Oj`v1@0}i zkLfq98f-30O3s!}(Jop*39f=Su+FgK4BRN zs1}*%5#1siIgd(1=NPHtT%63pYT25B=(ADprqbKKtD3w;Zs0A$}6Lm6c z4?0Js%r(G@TTm~`KsRYxT{8+$-AA3j^d6?;Cr1&U1Lx)<|3Rg0j(_hjT|4TdG(muB z5?Kn0qPlCS#}|}^&R;e1S27>jGg*MlBpXD@tnVAwQlx$vTt*$cJXpUGT|h=VhvM zvRgFE5mC#fzlvti5IW$pEF`;Sl-N#PXHwdv^>!(%L&`)KRBuoPvYORns8#AlIj9KP zEov7}-)v;mt9sicnJATZ{j{^t6|!9gzbM{$D)>`_2J^a#@H9H5uatb0o}Ev+H-1(x z(^Z5g*7;`OZGuAQLA#$I;Iz1|Q|AEML07jrI$m$2IIP4q$jMSZ^sy-Q@gx*)+1y5=x|p zfu5<_DAuh;ct)KEFKaX}b~h=)^CeV@@c7&oEbtcHqjeOh)1nJUC9_ldIU;!nq%_(E zx|KDPUHFvk_DCJQ(zkv`;qOWh9dTBlN+$B6b+`FD&;1v*vr!GzXk;_#IScuUO3*Dm zE{2?u|L{D${P{h%e|R4M^8a_9Q@3UC1;RnC=7lVu?3`?stc0us`OtTE?h!qHpcUFJ zbHS{k)Gn<*>Ds(bs41^V7w1xUNneIuGA-FK2|V7^%S+X zhSnUq2}uYmG;bmLfS&2G&svt7wY|3|x(WGFugu%vDENes^F;R?&HZlao#)xrd(V%z z_q2spGyPfP)T3i&iELDLjH*pFhiax=(L2 zfk;)CxrNHER_6U6EmB>mQTF00_!cGSgW_qmDrKM=Iz}Tu)t{f#;{p9bR-UT&WbGf7 z-I0}{9ppt8JuI^4VvUlYFPZ+X;I$=m9l4|Wjp}!@xB~UqLnVdE`q3FmFH*G!J)%TL zZbH*2nmG#Qw7wb?kM3CgAsRqwvl&O6lmCb}M8xS!x%90#ql-ZqWleV!X>7jglQc z3_~|u)}bx}Kh+%+!w#^H)UKV49U)ssXDIntJwB0bGg};4G|EMT?4eC`i@c0nfx6L@ zs|ZijZ~ycE8r;O(6D?%P-DMG;wEs4InM|;6o;YA~IZURaw7-VXGP2MWx<{|5FJ7bA zKedqf7-g*}@TBTatg4TwiBYUd=hN~L9=~$}>NC`QkDI<^w21mp1u`Er=^TrDB(qTz z)lyW47HDUYSwA##9@QJNs(V$7Q5iB&D_TT03NYR^nQ^C)TTm74mdV!8Hj1HLD)Ldy zBs+F5f_I*6bcQ-!wStuw$s4|mLRYwxU&>6fHF{WNLu3nRj`3dE&qPMUC1o;_no$Yu)RU6ulL$Y1Y8j2Hi zS(>+cA=IMUnWUh5pxTB^s-IBOm3rhM1DS?%7xvDx6;Qh>WTBI5RX4~MP%G6G zl!NL~Bif_y64@5=vic|#i@I2|h1$-wKHu9BwyDgI8qSpEp)BfcouLv&iS}#W%de7u1Wh>#ewmE( z=9W7*2!4^xv>I(93z;Z;M(xZ8U9o(rQp>EWeP|4&gclb&Fg^|nQ560M>QqFpZv3}}>PW?Mpws2pXX zX4HoIkPq37n&TDaS<38qDVEIts-t9pEbv+FR>+dM6kf<$$kv&y7nPz&G>_7`!G2@~ zyJ(DKauj7C12rKtPHP@UkLV1&AU}Jf1=XQR^n<+{H>5doP|vWkHL^X_Ks6SbT#p9O z#9Osm<0Yd&xw7jjDW7U(g|ZQ3Rw_$GcT~O6s-|;I=_9L0z35AedK5QH^{9tx46>#cjksw;*51Cb>OG`8@Al_f6UrBLh{SO=P!gEwfx} zz0b-n$^6&K`liVJ{-X3WX`Oz{;VUB0|=J%@aN0iy8?3(Nz6;b_y z(%kWa?P&=EL$TIuchy`}a z?Ph`d`-oj!^cFj+j?7QCg`$1hwse$2^H=etnbN+ z=o=vOF-MbmQ0hF*lS8{Q6n&)GGEqLNLUqS#SAl9#6Y|p|;Z!}06X}r5KGS)|Hklti zqK~ucTZTT&Da%KXU!5%Yu8X%@yYRa%qWr3S`&%W2%EjL**;KavR{2Qf@^6(&D%*dn zSX8e5R_Syr!MCfs>kt0Q8(9Kdd{L?`enACg%DT}CX9j8LD|(?_16d$i=f=lWBV&{e zH_p5Fo(8W*mQa1*>$9Gb#dro9WwtBku(;%Ga)JPnNe^j76NDbL8V(J(qj z7Ajyo-<+NsHmLggw1Q09ZIivCD|C-yS#u4#E7N#^dCg{$#i1&cTdp4CC(!bt^0GlIPb&-2>y@QQbool^U-O`93MDDV2QDx=V?QkuJ%i>0$6R!171+ zEhhVjyvUx@$&`;D7xvOOaYofBbVs`v`g*DQK4{(&vaDH+vOpF?W)G;EPj*8VGpK4E zYC!X75$z)zouUrDtn~8p)78J)?ddSRQo$jewNvcK(WJ)P%QUmI672z?R=U+xCy=JI+dAih$ zF3@MMs+a2%$<8PyyK#eRB;y&+TIMpULw?#-v-Ax#gZz`as9MM8-OawFYBOF8Ta?f4 zNf=k(rWdWH23?}GWNn*oR6Szc><>@W+nIatdwGJ-#Jg>N_sk|aZ{MnpcKQe3TKab8 z7yb^P=fC{_oyQF5>hK}b>GQiMA@~ykp*MlWxk>OFUk$BiHby$9n#^h=(Q%U6Ez@p- zxz5=tb4=T}&&Z|7NA-a5Y_bVA`@=K;w>?rt>(@lBBS60wviJm5_u{1XSjkS2vQZT} zWLwKev<=pbF4e{-=@Y7-RaS%y^h{qH#Zpa0^KSJw&wmNOv32;-88!IfX6HSKqYs)U zFe>?eN+vRph3dxC?w-Ei?v?eqQ@!)-{7}|J<_|0M($G3Rs_)dU4rS4IlB~?lf}b&V z-c`O%$v)5!H`kJNiTnfZb#RO7B(ft_4FuF<^GfofF=U+uSr&n3{-*qXc}2)3B97*VUANSX7gNIUI@=!&>Nr2GhojrqhwD#a*@I6{bVWK>hVHWwy(Zk z6p02=0CjMsOhG1ULl&w;w~S&Iu`^0l-_$6LAquyYZBgArX;l4W zUiu!tRnaI*vbk=yt!j>Lv_W-tO;ro|P(JFU$1d49@}qj%m7{1>#%+g*vX``iPE?DQ zPy&ivR*zydg$zbsARDLeJlf?}?%RUK8~-Y;pkFB9S9KIUaCl9Tb)up<^=Lvq^qrBH zS%E#T9+BMQj#HgP`^+25L2nQ0iV!)S8vT#(&EU^TjrVn2ikpyZvH*RD=+TV~bb)+~ zQh{zRG;$vI+J|H(Xc3jrE)rEzHBlzYK?VwZ(Y#%QlF=^>Bl~-Ydj`=-Hh}Vx|3>Xj z$!rvd%pYpE>I=;l`taFsSfNuRe}`6Jwo2!nQaidvq1OA1@kZ30)&En)#)6iD(G<(J@*? zIj`y)Agd;8L9<-uKag>!zRP6i9N8Z^b^~O6WVNUj4WliT!^jq@L7&heJ*@uFWfVF# z_PJJ^q8l`bEadIcF3*5$mezD2!4y;zl5*Qdj!+Y=f9ua;GJg` z*678nT)Hi@W zx(a?SKJ?{R!7p8Q{`f71Ho^V4~>=mNhA0_N|9tcWNEBuv{>z?kZ)g?RN8@L z9!ZI`>m=Jk)}h*&^c_a4D3^90(Ky;c-%&Diq#@rI-PT#*Jsa8wzZ$efY`a3$V-#S)PsiFlNhlXhqbc+gU7#!X zkO_Xjf%A=M%kHuJyT^D89SOm|x6Xs^`tWfUI^tqD;ug8amT}G5LPn%EpbG7|ituFp zKjBCB{Y}o3o-H&n7PMt{v<7I3mC|CQJY=Cp+7+O0RBcpEb(Gl#kcHw<5q*s)tzd!m zeJ1Nbel$nB9`r)hAe%%zRA16GTR%EMeoiZH$!^dOst1NfnM2FSKrg9kH;^n%A^$gB zGBGKt7N9|t!zey?KmXy`eEV9x@SAD;v^F<1>X#&q+8-~y#7T8j7sCo&MZL7kr+Sm1 z9Eo;hr z%hDCqm=$F+Xb?Sw6}kf3VTJae%_woSvz9bU71f_)ztA!Ap)`7wqI^_`{9Lcb7d2Zo z8birwHLUO*URa^kcT)ADJw~?3Mo<%5`IS9+hxSn-`!ourp-g0OX?;ggT;?{}N3tlg zRgUaPj+_l!dt(j#+E(@vrJ!uueL$6H99df$C53FBQFf6JJ)vBBlylNrb+7TvYw0u~ zrITeK1C7wG?NU8TP#TItzb@2n7sXTkh?c1ik(p!{=Njc0ZJ~KIi<;32szl42LRz~T zxwSWRA`$wolup!(viH<3JDi11AzL^}x}s|H-8p*^&SR?#N%w&@{DErQO~^|%3Y|}Cycn{dWY5Tta!~w)`qqv~*05v` zNZC}!TXb3)NfsDYyF{`IWKmskvj|VN^UUE9L5&kU5#%`Eo0&eYq03xFcqW`zH##Uy zQ7UkHZBx3T6n<-Qgr~^)l-m#+9?8x)AqxySvj%^W^zD`4&<79d-9qqzS4!8foOEo9^4zD6_~eD-~wGq zUfTJ))Yo^XYT!))WyW{O%Xr2&Wj!bd`53tZ1==;+6|&J-hpGjr2bCZnJ#4ZcXaN;; zYP=dWiWbo!dO>r@&v=hyG42)xf7s4>)E;QlR2|Kdg%;60YHv}yI#hu&P%N5dj?`B5 zO+Zbk0hwqV4KT_gBVUo7({3NFpeWj9qhVBu#!#uHm3DoWlF2F?mDyDD-7NSPr_k>c z1ize+AozGVbn=-%{}=jSB7>@r%w+WTdd*ncAbmn<$WBq!sFwWnou%D9x<)pdu2bI@ zw8eP0HL6ykIFy0z=uw4yR2R`UO09K9{>}6Mh4)yF`~To8D(D$Cqi$4!Dp+{~@}gVX z?W1$#clF+5yxqTqEJwBxz=KoN+lJNfviGh{v_#?>Kq4e8VV$GO^|J%2C5fi$0&(v3Cc#3979=U+Hwm$ zplpu1Dl~&KPy;=VIo38xH1Y)UAq!obYPZXH(X6kO{Zf{rc4=h$dCKlkV!pC3xsHNA z{O7(&DN3b=0;vg=qZS7HX34y{wYK({ECcIhY*6}Sq&zbtfHevqwQmYpe8q5*W_RrMfC zIzgMr&QP@$eW03vW*E7U>?=A)HtUN)NoW;)Ltl`=C>P9jgPzbGhg=6*MXj!azpdh& z!R$n96U)#TGSLz`WUv-?qlG$HNDN1EBr-TYUgI=xHaGMB2c5*%k}V?Zms9{cj5I+{M2TSqk7bivRnnf@9ba0kHHq%-D$B}nSlmS3kp0rQw6`Q z{9l7}2VXG^{dwm}f7TN6ke`VoUsOG&x{NxhmLf08=hDnVHq{rDM0K3Zc31n(6aT0c zG@)r!N4uY7Hu9q$+V!JIssZGsS`*{!*9cF!^O|b4^8>^UJc2#uaqu;=4z$`@+Qpz< zsy4bpWrymUhzgK_%nh|$I+ps5q%4$*TG8m6=xd=0w17^S?EvkgtWC{3!TJt(2A~ZY zduq2wwv0OVRV_nX^!S1LsP2)alljTYk>A$Ht+X@IIn~QuwezC;9c3n4c}?|}>J{>% zc-oz#0Ha)?SoT3Y>f!ki`SQ^JTR&Xjh1msKzX+T@2adlCo{8H)Km>)>pM#MyIIQ?^J_# zX3qO&dI^UA5&lJlF8BS2y&A?wzAwuB0~#hKbhjM*rG-%E;0w_+YLPQ9Wg+v)aGwwj zxc!4q&JL>G>#StCqqxHcznI(^-QTGe8?=pM)4Z;NPXjtzGU@cXq3s0TN%w{5kBj%Xw2U;WeNT! zd$J{TgVsCLH=$ixXp?GCJ-VlduR-l5$u5z%RaLuE%41c(s+9GkwrXW{CV*KB;ejEg$F7?=4r=sE}UB&QT%N zQB=n$FJwbxezF0wZ>;K$ZM)_up5r)e;<&dsI?u@3Y3Jv-s(Gu{YCC#RU%j#ovLdc2 zd1UQ%Y8Q=CP&L{>`^aEFH!@p3b7Zj{weES#J5LiDUeLTfu7W?P?Fm2nU*IIfH>^f? zD0W2IC>lV4Ayo_MQI5LNRKMC)3`lomuPDo>Y5|%YIbQzbI=YYe)Ae zk#=pU0hOc4UT3@rPpR{IsyBrR@}*i=!4Cxf9)4wTf=2!XHEQ=tZOBMfW}yc(nXalY z+#~!FBVUzeQ}w2)otcu6>AbzdU(xEGUfw6Gx`IlPouq0XS!AX9J~B!IS%55?>?K>H z#O6p{d6G$1Pj*7~n5%YI$fR8{GEfETc@ur3kQwca9Q?^J=Le8$DFs};_dMLYF913h z@9klq`=Pqr7_BP@UAiL%-(vsL=I-C|NVO~ZrR+1=9hr?fUe&G{c~KpGHw=v&PZn_7 zMRg;g)_6{^IRFhp*m=EZ0vrFAGmbcTpOC8C{|gw8&md@v4q-4eCOPsGW9~sFZ2};~m6mybffbz>_W!^Gtdo zTTDo-b*@z{&#K-IW@I^EQPRtiVBe|QO;&{hSE^0~q*^qBOyou1P|mgb=A&5HbcAqpX%#HHag@|-A1p-kBTosql892IM;Z76dA6Dp3ndApsK~Tb#Up|BY#+- zH4lds8o8IMcSEBzqxo;jwl*ab`OqLTP#b-p$STQvXouORZ#73BYDD`emrEuKRd76S zh82Dvc39!9r24R^=YC>%7HFF4Bl~pxRBL%Xk=9WgNP{N9`z_JueHcFPfrs^PlcUG14 zqb_8ketP7h?@Q`C>MHoDHRsj!%SDxL!wT)t1;4T#G{2xMeqQp2-l4Hn+CQv&nAJc3-=o=cDRP}jW@=r*sD2;Z7=sPN!QjdmdDG}Md%F1S>L1d## zl*niwee>e0C`l!XrE7_wYs^{K}Q*%ewunf+>)iUQrrCc<-s?$_3lh2oI$ z*0)D}cUVCj+k4Eu`oJE~A61V-`-A%x{qba3=w?Li9?6!F56z+<=nCziXLQ57O~aa_ z3>gE;ELLzx^#P61?g<@^&beRGT|T5y_D~jj7*y3q-wKYVDP*B9Xb4rY?>EsbT0j;$ zM7X}SwoxJb&v(fn#fH0`ij)!zDnAxmda|SK!tQzDRtAM7Tr<3XOuvhdNh?wwh<@^y`!v$)ynY-YQ*{odIN>{9k3MhydZv@{$JrK^AHpi zOY1{>1ud4yIt+!-CKQn+S*nO3XcjuYAnQl8L9}UT6YJ_Yj4 z(k@fe8)%P;WL<&I;pgKwb54He&x^urQ8wBos3=#~cR8Y6s1oZIS`rGd9zz9r%JMj0 zbOY@dRE*U}E1~vpu>ORSSS!%Fe(9QLJtdCqz!;l<^c?-YEM={2_zj^A?8wi9?n4oNX)@3KwnD{ZzWQ1D`aX${p@MB`Ly!**KusUz z_Y6ueNb6h_^+IFI($>&A(2`5C)}vKG@1T8X0gA}ivZ5?+sFnXp+IzHMMp_DMJ(>rd zV(mkV(85qzI?*mb!IZ4M)1p=A2-<>D)cypjj1-%*DZ1sfKPCPtvrX*%_F0wBO|+g5 z(pI)ag=p8HcBq&vJ5V99W$%=wXkD~}mWTFkP1g5N8o%@SwXj@AXx}yzJO5tv1#J?V z##%}JYM@Ezl!&5P<+}qlLlJZemCY$4dM!$#U4T}hi0z-ADtN1i zd(ds@85BWf#Cnu_6>B%vQOX^gv}K%0ocmK|TnoolXtOh!*<5Ho+QfwXUO|;uYoPa7 zZ=ltZFa1(kHpfH}G(IZr4m1Ys4#|27Jsy_!0`j0uXohk>jwoUgI)zH{3n3p$lP`xF z6hP@0%KQ@gJSgoDYQfqFc~H-QA}$kg;Iuyyc}Xvxt9Uk1nioGg5dX$^#^c|=W`0ZZ z{-gWncqK5T;{UaABmE@0y|qW z>{mrsUp92wXYg~W{HOoc+HcR1pFUN@;a0bc$a^lW6RY=3+C69`B`tuyLJfVgCZTEQ z2r}imy5x~Ly^;Ue*6+m=o5jq0ceng{m3GjXvJwxWDrlyr)P3Nu=dmKZab46rd?ams z%xeFbxb-*hzW>L>{r~R&)4%zjmFQR=Gj~nn6_JEyv)o0GhHrTGLi-{$YwumG*g^^vT^U9>m%6!EJ=G>qR7+BOtG>2&_5xQuvd?NE`Iw3~QI zX2>u{(CSEbq$tU=BSncDDN6F}NKuk!M~ad>J5rS7DUBT|O7h~7!n^?{P!+E`I-B@$ zYTIu8WrMr3Rd7dM(Wo|*;oH*Qwu@ds&!9=D8(M>op+o3roAM1)TF@-*1Zx`Fgu0;X zt%?X+L;?BIXwRUxH{~}}*L20cd*mhB0X4WlW*<5xOJ7UnM|&54@2L0CW=UUF=87iK z=rz#>l&qI_!51|_cc7yivfhT;u1mWLVuDpfVy}y_KJj*0Lz=$AV~gNwf@w#Fj!nR6$*ah+!I3st~2Gzgt!D862hj=PC@^`-4C9v*v8I$N2lazxLdL1+~^gnmJOu3}rE8mJ&o z*6=_*^4g&&??jYB+xsCcy(@aUCrYA~Lsy_1&=@oTtwHnTE7@0OAG$$J*U@&MT&!ud zqa$U>g%+Sk&;zLLSP^~D21|Ysx&d`Vz9TafoXrdc8~JMFQm72N0{KuYbQek`Z5Hzl z5S#YVIi*dr7Jb&(bLb7U0{w*2(D+X+^X#dp`o znZ#@RRL#8Y|L4D}oDJwHGz3jUOHcsqe^QnssBv3bA2bAYe3NzHv&e%UL+O;PhiOsz zi|97mDcXgvvfhU}pepDw)Jm33v^8i5+J<~0>Yyal1WiNX3mxQK?^FGPe9TZ_)_HciaxmYVZO|jZExNdL6@FMTXovmM1?DL7u#DX<>+j}&v>0pc<#5vMNQC~dLa*bOa1$x zW+>u=IMp9iFAsVNO+jJ5{8m4T4xu*ILN`=6B)^40k^K#UoIs7|rZu8Jn!iV8SHe~z~1V$UWT z&3cJ@MLu~0z7yrWQI4okG+rcHfSyC)Ia!y`eilgk49!Cu=Vc9{39OHy0BVOks2duA zl2A995BYvp{-Vl_Xq6hQ$r4$;N>LDsMyf;}2BDBTzbgOWo{dPeZ0oDGerL@GNA2F>zEiRi zbpr&ap?FzJ*`PyGRmRgFJyZx2?X6O%xIpd~P;+9X|ko7Ts!7XVo8%5`# zPelB>DQn0!+ejZNu9h_q@}L{gbEp$4BFie;CA3LtF zI>)jF&@8mY*BlF4ly3v;Hs4&F#99gEv??M(vxk52`dH5#2*zvhJ+uMM6I;VNIuGq* zonQ|c)~dA6P;yA)>cXU~Lr^C)I4*1Rgy`*de7bzr>#l|z+K5^8;<(%PV$$I{-TC3~fP#CmFOir6dD zb7+qtzfBPrpr~D1zn5Qbuf@)wl|t7Yok?`s!ELavtixW!t-q}lKAVKGW?nL#l^DhP zEYjE3-lLT;Ky2StmR+ocXy5P1+KP67mLyAFAisN1HgxZytXIi0jCCFw>yTgFJ<$fV z2z5Y3L=0yRI^v=J8rpN{)t#p6w$+|>D)SE30jw{(WPRl5Y$D~_`(lr5Irl}mPz}@# zy@Xbv9q9CdvV@M#B=Y`C=8Dtj--10meqKK1F5UN2i#@1^^*@=boV!d3?18qS(j56k zFFV|B)6bW-k5)J;Yst8%ZcJ1TU4)j22%!g11C&d?kk}>YKGcBUK3Z}}HMjvigodEV zlV8!W=n9lwF6~^IXrBnPnYnhk1qDzK^c4C59YGPa&60nG4xnS`MN(^F>&~>RK`^Vj z{P-*iW<)h#L=E_Tan`em^X>mOb5NA3lvg=k5!x4Msak$*RiX#bBWMI#AmTN&3O$8F zC{64O>M{qNd#!RK`fCr`BH9zQ=THc3LA%g8Em})E_CSw6soZ&}YE9ZrM`shc$*fF^ zKEjq-msb)x!5TsNSg%0SSf8LRL46y_eC@p`8W4RzYlB`v4~Xr8@}LH&a8UU!L7!hp z`+_!$RsxkngHS)z2(3Y#EL*^q_za4m56~=>JEB@0Pgyb(u3i6r=@jz@2)xcSj(Ly| zJ%#%2DDOP zD7fgm5u+7r0Ve=?Pz~1fM2klMRH38jqO|X?hMYF-N!#geS+;Wx9-#R z9JdpZvJ&5*2r47<^EE{jK_U4zD5D38XoBG!)$fEAbH!7>h$ZhYmo|a*B{TO9_fSOiaQVr&FU%1wtr{i4iQx{4?#gGqmL37YA zsJLHQ9znCv&~sV)pexV^{PxhcSfVdz2ly2YC|?KU;g>V1Zl4b&+mdd{AEMoYhM&8VycXs@9(RE=NZOGR8jYe!pv-V-}Wov%Z^kO$p^w(n?AN!}LCqV=>- zyCo`M@Tr0PBW-#2(I(OQp$=$(GG?F>%4lp;4a#qc3b3Zp%ADU{5?j9~sl}(L1Gprw zDnT9z-eA3fwG8TMQABi86ku)L9&rs(drj7GOr53y?H<$xy?{obtG>HQEMkZ(Vhlv93Zp(4}hS+iHu~bmqEky%x}F znX93Z{K~1{Dq2m0$_?pPMXQP^g#voNHoOfhM*1Y_lj$J16PDCz;G~ zmW2lStwP_RUFh6(`4vJxZ&>XwiT%IrdRxw5-oW1&yTqNLB13W4Dp-%>a4`A7E#nF+WI+^@jH`v@-H%*WMz{~O|7B}&?YHXp&7`(ricKoWM zpGI6DVh=hur7XocqGsq3^o`7|ziS1B_T_n=uQ1r^b6cIXcQXI9@hI|}A>K2Z5Z6jtlZ>e*Lm!5d3w6X}0x*J-k_#&vUV zQ(lAk_oGFNvd+JY(aM))eZMLyjYR8MUt?`XYhICG61oI6 zKyy$UdPTlmO1p-&7wr_9gFZq>P(Z$ZXbPHu4v09$3JiKbQ&6C-$f0-=Ge*1k+xT$*YVhfE?3$pGuXRhnH%NG6V?{F28lMSGh`-P{X08+oZ!{s zj=lbr_>Y+y?N%s$tVJiOVX@ssWG45=)$X}vO=fDJOBijmxWZbn)j3-bS(}-xDDR*4 zK+3Gfvzb!81%;QmJ-PY7?B8dW-hBNeE;4+h-Bk3{o`ji?V#OwN)5o@Dy2dVLR-&Bt zSuC|Z=P!wtzda}q%XFB~+dkoH9=7RPM!*4SV|F|+#`l}^pd@s{wUJF?@6T$#pSq(# zHQCnS%BZ<5?c!zIU(I6tky(r``!i;L2JBB5|70bGxoW@LZWEl1-^*`~UQKx1glFTo z`ezPi{fkYmtn_QUjAs)ji?N+enAye|pKUB#&SK`_XDsVj%vJhKOmD_=CQ)P8)L8Yg zYmkk*TBwr1lKHfceg3eH_G>+|OKIjURcKE=3#EOv#z(X-P*J5KN}(&zRcHzNaH!H6 zR@I>b&c(k$W1LxEs8JbZPyqSRBs4#-c`_j@WuG>`_r~sJ&66@&nYB7^f41VEtik-VC5p(Y z(Qx{FOPh>et?i+O-hD{#_CCn32J)d6=m8Wx(YAE@RFv!$Jw`i*UP9ye)kEEN8qBsB z);>Z9&=GWvh_FVnX(*4a{sisnW%+r}RMS@IK2*dN+aa_OXd0S<@`$)i8FkcP3N1ON za_?SIT@J7wK{;6SpjIfEr)$f7BpOV+|C z=;2i@+eN4h>V#HZgxMAR>&&)P68~f+o)u{qH3XeNjm5IIL$5AKTSMzDk=Dp))rH@Q z+lyr-rpeq~sE9kzb4Qu4n#GR;xBQz-Ra5pSjDO4{q8S}-{(YZ!?hOpRpP%~U_$51TJk+TC%0@8ebZ_Ctg3rENd{;da|; z=nH;p&TB?dCT=5469 z?ltSmw$-RZ%^ApdbvG-)-Y=~@R)s!LwPLi;X=f9y?nt;9TPrjVjX{%82b2%hb7k&m zOw~Q0(T}0?Sc{-Ws0H$%G_(etK>3tg426`o#Y((^wn_&oUQ}0l09Acg?LEj3rM=!2 zW$%a{LY+`_Q!6TPbT(0Q#;)B0_nXZ8W+hf!PICfdr;e?-;>=NhJOjiGc=p(6%>FFe zLF((aDiHprP=ns|7gCiBy+o=Zn;4TgmL% zp$O{Emvu2$)R`k{!n#Mq9@a_d9h8Qe$@dJpPQGch&qNgGsoV*u8F~l}L#I$VnSJOg z^a8(GmSYV{m+8EwV^ymow_MsiXa(}287KvYb34SX#3i z#@YDuftmi;v8-PG9`aqUHdk-lrf6P;lJTzR@ZiFn;;Nt-X#2XhkjRlaQnZ8ax*ZcA z%_#mkl$^EN*~G3p`7|f7nQ}i)$@@EWb6VQruxJGuhLWGIx`t_n-atb=GbuSz?@`kA^katCsLNOkTV6nP9j*U?^}O+fFU0{r~@8o0g>C|~uI z?Golw+5eOo2G{>7GlrbRKUs62?3uo{b&oYy>&5w!78 z*@j&Xb2-tTKKUfA%Oo|YSN1wuiM`V1<_pZ$?f3#5NDE&b+Lzhopkk-Je2p%am zT_kI8a@l1G=XG!877?Es)dtmXWesm?%kH)3Q7L;K6&0%O(+k>TPcJE|{c5~3h_5IH zP}8FPZbPHcEVK*#f-Wy9wiXH=47z1GsZn3r<}5ecjZNl2+ztY1I|xj-sNQd((^hHo z^vaZ@vxyToFqj0H{hb+9G9AV>(V4_Y`(#E~AG-R~G>IadK3S)&8#3iDsIh9UOS|Q? zGl|dEy~men2-6FDpxH}t$x&t6CFhexY0c0U)WnLq2u(t5V~Xv`P&|X9AL{~H&QII! zVz#09lS<}wC-!1?f!)$-?3R}LqS0xqSluuUy)2bB+@(cL-iNv^nOO|~DsKF z%KV;5`1T~sTqMt|o8-UBRAld8X6|<1O{?fa==@h{MNl<#1?qx&ARkJSZwIXetrDt* zBG(M&@cZvGm0NS0r@345=gjjQ<7~tC)^%hatf+b3eiXffsy<0;d8{Togw`FMN!+&0 zQNJqpqeyf>0msmJtVK{G)B<@>8d`%+pnS?LhC)hP|9Rwwirhujs-;JZ^WvSFBK)f1 ztnpdkHnbI}CnaqTdhuQZ#N-oMd!aD~&jDz%7e8oybJCU8@>tezS#|M#)091ZJCi8< zb7loU#pM5{^E#J0C=k6xTZXA=v6lAwL>pZtlUZI7Y%zuBNe5v~?BXvc`#@Bje4YD;VS5N4m;v^mx&4=pF zWDY7kdx@nt-#VJd`7_sE%zZSbl%^Z)r8IK}?`)lUO6x-#WH94N=IAfYjLsju+9{5X zi;~Rpyyhaa5~*S>LU5pKIJLFXZa6xV$hY4sDEbJJr&>_d3vMxuSy#|2K8q$aL|ui9>gx;5Cuc zlodk$dF4%>swRgw?TBW+f*HTd%$zaVSDK~kbpAX_RQi{qd{3DoDEY%$%||!?lo@f} zI>8*d9xKp0r@-Vc8ng|y?P29;$}3gu;m^=*+iA40MAqoCnkrQ*WUlrJr;Qzu!6 z{DF3t`GeEU)epOe41JlJt|~C~T$+b=zF*oo=o@}JWI2U`>xxK^G-rzcbHWSb_Mgl$ z2Ro@zD;lCznvT>y$uX>tv}8XIWc9{nt#;a(M1x&DANS=n4~-L;9#&v6MNPQcnG=v+ z73Dv+S>h2De^_ng&I~WAy4R+xyKmu*^k?vkCL&*351q{H{d~8xy6Lpx+Xh9W4W=Iz7E*9Haj(6pJfZl9q_rM1e0SvcHjgvSQKmPx^z!1 z)cBXo9@adRmAMZS|CsMNmdY{Bb1QEzTFo5SS||Ut-GQ4EFDvAEis~ocJ7+J}oJlOk zPNqTsVvp~4-S3$DH92fUzf#sNd)==wN0)nA@|7#JxlGE;$w1}*VEVk77vlb!`5~F* z=EOC4sHO`ejr!qTY4f*iTbONcT-M;8tc_3zJ?)Tn1v-JQcFLNbRKDa(d(4=X_<;3X zm;9nP@(Wf)i&%T0F=&f@$QIfz6z!|D+-{Xo@WUQjna4viC+hK;ZECjBb(&~f5eo;R zdxxU*i8|L8w5FfZDxn+D2oy|ct9*m@1MMf&Jt@EBmf9fttQzd)?R23TE*`PwSNZ9Lg}}*erFO(cC-pv#5Gn> zDpaGS?ujDk_FHLp>1efdv?aP`#f1Fopa;-H=owvo@%J%;c^JlyFu`RF>-VmRyhrM2 zK7L6yz^F&oG4e$#%9pHBmK`WbM1WuPKv_JrBw7;9zc0Tu=VNI$gcKCH+Mh}M=fC#; z+3Ym`ll}RR@sD}5ilf0~ohta~rX8KktDja?{bT53v#bG)P~@y<661DQil|ePA?Q9d z0(mblX+&?+^330RkPnh z8phSMQT+aCv#+#QV0Z0LUVOF9+)^ynQvQIRUeF?J+c#IYTvDq? zcF|SYG?i1%Z!6dGvU+vn(+RgZq}`OhKPCRBOub4bLTB;0D4ag8#-6WNdAsgVZWLSi z$aj&^8(pNCF0hg23Z%P>6;;ctH`g|hc?OMXg-vf2xqU<_qjlV5W36OUs9n*QC9=DH?@7V!aBzfI_I8h;}l6*wwm;K8s4;YAsEE zkv0dleUs*Mugc%ip8fS#S$o_zXWp^%r?^9!t2~)sbJmXcedsBaT)pkqV#_fnJI-O8o>9Q%?u#!NaCdu433I!Ll2>d3n@RLQ%7eK2llFR zIY%tX5hd$69CU3TP*fFE0PPWR0OetAgswy3kS)VpB(Tl0HmpJ)LaA4Bnz0LfZB|Z~ zW<=?SqRVKXp&h99k^E9)qUv$cSgl5sG?zI#Cp8{CYtRwG)(ue$7e@T+(pI5i4)SV= z@KU;!=)bYopUk7cSkuk2*1VO~hmIGdofPSGcDPv72(7dz%R}hFO=*vyA?PKv4sAgp z6p-%*)C&zlqmW0e*QXkMelFU2qwzF=8lgPs#TBiYfVGu+tmF2&UQwF+4;Rp`K_2%X zJhwglIk9y$-sfbl6wR}dZ9*xoxJ7fen`EX~##dAxu;o^8!0TU7FGzD4Z6B?&SWD3e z-GaO(U6A+Pp_$oRx+{|}OB9(b6$S3##0)RY3RovcL6Q8@Nl_B57HVG7xE?WvhwPir zkLWxae&^aw5ONvp*A6>9|f&|CZh=n|BK zMk`c<{Bo5Me9&Gg8*Qyj)_Le2lsfd>_?J8py@Xniq*X(?kiV(9BhzH*LK}ws3#!2i zTDn+Th&8pN(w3kgFWc4c2(4^aepjJeP&YIMy?`d6a8Fr2qOBZATZGd1ZS2ch2i4$r z53K@i5-qi=*ecp854r~xgj(KCXr9;|==?k7JEe>^${mJ+hxxAkMxhiGLLZ?B>Y!cD zL5ENw?Q#POpr_Dds1iD6tu8@tp%6NRHlUtM>i2I-)rX#!h`bH;$sDXZ&?M9jjY2-u zM7|NUZm5r~?AcGPg%&6Y9kU&!p%7}s&x20cF4NF0j#7Uya;-zJu>Sb2dsu%!URuYUr+00HIjQ~U%-LPuKb!Lw^Q4>oX^(%h65sK!`=-dQ154&g ze;k>WxUeH(-JX-3Ot;Iq^=~8~J7)zg>z~W`3`|NOTWM{jl4lId#tD zF~{|p->k$TiN4|8;wqe#_~qivm6*nHm$i99t$#aPa|o7mM5!q|<-;tNJJ$;e0~a}o z|H=og%T4GaR}jKl+oI+L%8twtXnZBwJaqZpJ$3nard9ruX#a2jW+iSPD{XMirua)D z_*<8kxa2t(bB?j6u;_=Vpm^WadjCY)@Kx2z|9yRQU)F8Tz_z$@F>xSk^71{GZ+lEF znXZxcYe8+=a;S*(is;*%tdV=6l4;${nXx$oac9W;tJd4}A7@#2mIdC3^lD8RYiQwg zw>>^J6Pn%amPNPT^6+VXuek7?sC`rP6YJp>wNE3~UmNmELlF@rZtFG=gZ`cQ=%Jaj zNT3HTEGxyuH==U1ttDwsp&nNeGcDUS!ixoY&2S}d9;zfV$s)`xDk8WgO5!&hYCvhR z^R`p=Cyam0R~_3GGGAre#LVorj|VMcT8EWwhAIbOJYT+|(y?8b9oEm|r)`JTsQfC{;031s%=F8vMTT-yrP-zq-p>?dy(A zo!wKw+wLjg^n~K_$l60(nulZ3loZY1bQ{dAH=^`w(F?3ybJB{@_R-!uIvdZT$XsCy zur<9^4&oG+VYdo z5!P4GCR_dzH0a1YzHaB?4uncJ39Uo^n5-YsN~feH8JybPb7ej5*K=3##%8pi%^z1( zih(PgrwQu8kgUlO(F^=K(NfQ>^^Zgp)Yu1i?xqwl1AT`E2W0*HTr|)px{vi7+By6p zv>hlL>jNl+I?1<&_KVoMewDidJ%C<9Zy=9+H=uja9cYe-O_qEQ`b6^`kE#Y~V)q86 zO+ic02WT7W{!K3w+X7XvD!qO6@j0xQpc`1Hpi?LX?LrZh&5S?)rD{;Yvi(4tK)XU4 zBSuP}tHkFKm9EyIQsBJiQF=2<=IfyGanZ1I7;p}zuJH{vb552qn3=22 zA%(-CUGiaj$JK1d@gj%zIR`TZKK>WjlQRFNmMz>;Q{{ZQ= zoEcgcF~p6C+v z3u}j!?x(7{>?^V707NBdsG>_A=S9Q`Bples9MKz)=sEoP!WtXwK z+x6y+NA)+|K;QmeTk$N~H>kvyUoF%Ebwbn75EMe24a)M}X=cKJo3j7DQMMJxyDsh7 z4bd1{a#LO991-8Ko)U2xiin7sl&==88+rl#fU4X8Y+ls~t&;gNHFyU3oIyN=0?6kK z;t3S|CfY0;O452|&>iS8Gy=VVeCSz~dchF120gBpwFdH`_GVpZDuK4YX&4FX^xS8# zsGDN7JF=#r{b}{IWWBbDXj~C3OQI&ogC0TCQ2B%+@}XVw^`c$5s`@3V=@X~|s^nd$ zzlfNFrl0}Hhf-B4BjQb)h1JqhP&f1xnyryvVhsn73Xw=sT=a4W7h5(G?G@oPIuYZGYRw9;=lRlKN87go_%%5Zal-n z9NGTK?19Yu>NA-iGlwJol5A>2eYT!Vy(RHM=RX@?GdUu@-`s;>CO^kH%r&q$<9cj1 z$7A;A(EcQ|GNPFs7<(4kNrHP{RZTwAH!`I>$upw z@-TB5FmS)-R)hI(4rA@C?HV0p-m*8L%$q!%a(z^3e^FEsS`~B|dWYW^v{fiIsC>yT zOMfIj>T@J*PBQbUpfohtqtNa9qW*4CH`aW#eEe3>zC%f@_n}FsgM9DMeiB>zK;repQhF%l#o+aObzIAKOmkg-}t1m>+P0d2OJ0@)ht)WHMNyvi+pa7bJ zs%EqksM*w}&;X@Zr9F5js)76!X|K^GXe-bZRGqKb4`dmn&R4oM?2O$P4MN>mBeV&$X{ZhBGFlqifs**;LM_mJXa;%& z<-OI~?}8ejLns_m`!y{nVg>4hCZSUzcA*7!-aa${O+p@&exP2w@ml46g1YCV)$o+W z^1QTHkZ;~fWbbp9qa~psC?IpemlrN#m)KD#1x3uV`v&bpMLn92_IyS)D5H$%nzphR zv$EcYR-j}cYsj`*F)nQcN-=u4;kKBHBml|ql9C(ss@4FymGwZF&S`3c$rl#MkPYJ;Zm z+kKHK;NO=5n02hinxVVhhN_v?HEdUr1)x|jWFA|y$2LcYwzpj zYSu}ib23lXt!e(rmYbVdMXEF}{djOuk)ET!B*LFeEr}23BcA6<;XLG$o2#)<2)(2_ z)6h+*{-u`uXhd{C`yE5)u@*s%Pz&TiX=n{Pf$}N07z!z^=Duz5Gl>#AID2;7&1QTm zeXe!a@=O#!UZ1pqB0H#NB^n)_Nxc5onQO_fp2(>Is)GDGYL4g7Q)n65hVHg2U-Ghj zF2r27ch4($?smK3q63IK^+`}f4r%D9@GrA zKyRRc!QdU*4q7f+1l2aEjP7fqs8CIva%3iaxLG@U^>{(PFKw%UNGQo*>0g&$Kc)Kk zrOqpMpM2h^F6uq+Qb($@Z@5h^Pr8GxREOPQ%|j(_HpoV;Eyz5u<=zEfVec3XJA?Uf zmJ7;C>_cCnyiSb)kK75pd0-l?9=Zt~L&Zc?LAzv5;&%<}U9=}q3Yvyyp$OWCzC&w{ z%=PYs*+9&D)DoH7NPhfdzAfrI>{E6vRa(=9m7-yi_PS&N4~~0wYT~fVa?9rS?YpRFIy7nz z7Asi*%@#>ZK{pDe4Ht;Up=((0pbenCf;^tL?}Sp24|Sba8U4`sIcbZ~=X_}=P}04| zBJ(zf_)^dq@3k0$0_by|Qfxs!be^Refyp{}H~hfs00v?izv z+Tsl8$?0vkd5%F(eo506BC$i?^SBh2#?H$W6f?ocRRs*#{1BbHq9f^|A z0`w7T`7!90=-pRERDBWoCGmXD_$7ILSWC8L4UY7pvi(oemeKraS%=VSct272N_(1f zGxGChrCsLLfA^hsCNX5+H#di1t~SQk>kfZMy|(eD+gVeG6U?>95v86(tC^FQ13iXz zpk=6vYQ24_*sTo3$3CT4JBT>E%>W-y#Wi>RVT;I*i7cjF6+`NH1hw?rm zE`Z)(O+iUEg-x_4u8){uGSbQjsOjFaw3{m;e_G2igth>s=6L@8vJMi<$$W(e@9#o8 z_{|VoHm@u`)B^3|mwJugkm%O1D0*Von|XQBVSHqhc_giHMCM}X5%d&VCiPe7_A4!V zK2!{)+qJ;S=Q_p;o{IcMQS??vvboQs9pm>4N<$a%JB3nLb%QmTpRW%6Sot>bJ3;fi zt@V$@=;hA;Co_DlILXX*fpYIFNduI6C@rT)^d4&`)=sp>2lD%cR)$s&jY03BfP9B& zbx_mq8bD8=5L$ss$>&3Npf+fUh$`yb2;J$`5|y%IB4Y16lJydF8ES%BpnT{P^bQK| zDBopPU>g)+J%t+XD&ia3WwZk52DHEu-G8FkPUsqxsxNmP>=oJ}ROHM08NZKE1Qp=7 zk9IE_beUVvsT2RAJ4froP?%%d(_r#ZK~g)EnWrE z!ws0{&GH+7UPC{i^s*gk%x*3eCEtkVxDgVdC11%JK)0bPXpM-dPZ1^0Mf+$zW!#25 ztg~n-GT+9Uf^JPK^YbZD2NZu0++I<=hu<}aBK5DJa`HnKvLT$l3|bL%Up4_T4?!cK6%kek(G+=6#y+1VD2% z!S}!Rujpj<_GQsMXcSt2mZ36YE1(8w75e;GeeXMTqgPrJVY0YH5@y9sZkkKXkmr44z&3eo%x=xmNmuu;127?-FS3})vuD@G+F^; z#Rjp#CHb{eZiwc2FI?tFmQ}v{vhgtUO^T3ZKI_^MeISx(D^A@YoS~Ye>c#+LVHl> zmSR(*I^vv!=Ad@``ZpCZ2yH-1(8CS+1(S_#Rjr_%LI=>{uy&+HQ;K*KiqZ$UE=$2x zb^q|EhTPOW-C_5KMTgKabazJ9d(ih$X~$5@n6wTkf<8i3C2QmuSe$jqX&bzZrX$NMvS?Q5(azLwJwZ*=k8NsyVL1ATcRzZGZ| zdNCwx@|kD=trP9tpsW|6%aBjLH~sSK9T4S0Y4Q!FWUYgmp(E(@x%>*rd=2dZAFv)k$Iu=8u0TH21-*ju zphMdE1GETT?o^AX8&#L{_oVsPb&$9WrLSwO{eqT%Lw*HNB~$~=K{qMmOOwhigDN01 zVam0d`6!K}6f^_vK<0H#&TsU#mLu6D>PK6KPMdXTwLYwA$Ki-5XjbgzO;PHF2GeL8 z+7Ml6!H-ABJJ4Q3$54vL460fc8{81xLtBC>ZpqqCO;4zO)Ml;blBwNaTyB^9M`(su zQaz`r8R#n%tm_=s<3kQbjmnq4q#dsJQZHXp@HNmeWzRB`AGz-L1Yf+5k1J z-q5P5Ub5FB&8svjRD-5UQO{Fdhm4A)tyGC_m5BTtQGKq+`&{K}FpIUTK&2)7E1fm@ zTolzPV(^P7Skg08sa0v|$D*iTbZbDAejs|8ZA&|o_+Z~K-aueikDNLlif%YEZybp~ zlVZ;0G37jx(+*B0_NHls(=<-~Q1F{5v1w4rEcv!7fFFPBU+!c6aN0Xyy(_=A_&Ny{tb*8wR1S3z(F~PC9b|5X%ArpzQ9d=Tf<~bY=ong~ zVY_}WIaJP4CM(qj*B}q_p(juPU0^k?&;^#!zCtC`?$>R#9#=x|%3jJK@OBVrsWdPnTCXe-}F zoJ~x*lZFo~vZW}08ULauvIciV7w?Mp(V}kk!+x~99W6z4Usew~CG!@Pf*wJ^Z)#P! z9@+%jCUgoF-%>;kbOU+@bwN*{r)`RzN1MDYZ47$dF0BL#8uQ#hRe)au);zRlXvsj= zmJhIAp(TgO_YT^DYKZNGhMmxzIXmI)w7q)Z$<0;X_a#)CKu-itx}{+?J4)c#qX*>&>56gb&??dZ8g`16qLA zp&xIQ?;NzZDD5jWxgc%vt;p-qC{%@C4t^KWTG7%(>?|ou8`>cB8Y+IMGMb@BkWXE{ zQAR7}PC_ZhN~nUiYJ#3alh6|M7V3fySgSM86f^+sK@s$k{_+aC zby;odFKJwRb7;r9v+=WAnQ7bkE3z%))pSLX7obhDtwJ-9_gYy3w4(!!tFu^>HClgr zXx^M+>!Eh&0rVOgg=U~n^UAW1_I^Ry3iRx)w6Qm$kREgnzwcO2iMR{}kF*@W7M0}_ zS@N+~L8H(HbPRcvwn`b7smn7c$-ev=R74Nkq33jP2GR_bLmix{G(+W3Q>o5(E>rgf1Ll1t*@43^=s|DRw*`2MWxC=$j-@I?bp8Q@+%Bk*DsRF)O z_!{eTtdnRT&{E5a-KVHgvb=}(p@rWOP!Zopy!X2d=pvc@MV0mx3ZN9U1cgwNrkgrZ zmJn?f`UMrcCd*1(hN_@6eh-$EuL3HA@}O?Whl=QCJ9MArZC$bsZ|i!?()*j4gRQfP zF}+5u!zx*cx=qnBTG%Y@#J#BCZ2T?0%%FX_MYan!MSGp1W#|EP4{C&x&|9b+g?L4PZQhkQ8W#!jx8giezbzes^i!rQ4JS|yb4_i>TXh6^9hXj{h8}& z9&(7^pSk_Ff4BbIzgdZ&!itkMbMB3kfFTGA8w&|Iyu_$O+GWJ-RKFD;yf z_~t@XuGptnMd74g2+?v)S^vCUPv8?HricNj9WadNstIXr`c_r4#JSiUwX4d6DWPZ#X`1oHCKQM1*O}MbE z#5yz$HGfp$(WnaYp~w4!u4>JLvJSC;cc3s&jh*I$U2XZ&+RGFhO-ozI9dVhLUP&8; zif5#4L!YshkT02i%VlYRlIIj#bE09n18o&rWaR~AT2bK*)#?PTk4_U(Ms<$LUC$LA zqAjA`gXW`;bG+ggQw$2BDQq#agBZ9I4}Y_LX`s zzGI%dsO@E$h*>BFc|VoKqe=z5VXgcZ)_2+$?-4P9br1@m zp?NjOu$>o_x2_baN7{h=MqQU`#2RkzxP?vE%KEfkO%c{8_Hmu8yS}W~?xNihd0g@G zu2j3s$vRP3FY=p2!A((AEK0YElBLiE=%OfHE(-68(ic^ibf>iFz9@Vs3LcBRC!#PV zN`Dvmd!k@p6djAaU!o{i<$BMhr3XZ*5s^P33PMq8MihP)MQ=pGqA0l{iXu_!oycDo zMU|>cazk3WL7K;!_G_g1z9@~BzNFZsCki3IOj@c^LyqJSgbI#&^3*3!}$rVKf%i5@GBWeDkv`w_mRaw(>TE0`XU`g8OJNZ?w ziQYjkeqUwg+Hy!~Bg@KC0~JDtlo3INZxk^TxBQXG)nRU@1PN zJ(HNX?`KTMKjsYpW)gtyc<0MRsia2vzG7+VAGQkSAv^o_%6?3n&|Hb!i_u!qeCQH1 z26aQ5W;TMYQtCv@-F!jXb*K$0x@fJYW!;zSJ~$;S@!DlG&wJQs`O>`b>xgA9f5!%K zUIjg;fqmK|w?Ni>s1>?Q#5h?#VSNY9LKlcQKnu{kS6UB`$#?y=4pJJA)HoiLI+T`7 z2d)u6q7~uiq1EH(?J2@TTbO>KRq<8Ukl16i@6Z(Vitf8g_f4bSNAsa+=mi@=s!c5( zq1{Eh3^hRMVcj&SS+)nT=9oEt{b*L=%ZN-{Z|wvSbGtcy{KvdE)xF0ebOtlzWfU{y zIg6L0*N{COQ<`M5G1ETgGEMy6Q1kMt_~lsUI}9oHr*L2M--7pwI)=PiX%}CMyt|4R z#Jaa3>oW8JYJ|cG`6baRC#9vhIdTte3|fG;pdF|@RF?CQ2i=^KwF9kbMp``-;&(bN zYYCLTF73rDQ3uv%Xm8NM8}i$rjAFDV=sxrbI@hS!D^SDlGN4l^RjG(&D1;*DCzSq8 zv}7NYqOGQ&FVGLDkXAbfMOdq=RjXar?>A^2s>Ck|y``7*|E6)B_9giaS5>RFLXWL5 zKs$v#K;NMK-&q z|26Y(!2TPHf6NPw|AW1%Hdk+V^X8pyu^}t*&IwtG$2Vo#iZhtWIgL6b2(OEB8bnup zxtmK-v3s$c9r@dM-LGLftE z?t&6;|J#gV*SXL9d-K;^3X6ZT5}&E$m(hDBg$2>YCbeP#RXuK&mfI?79<}=+^S(j* ze&!O6m)Gy=f?kUwbMeE@4(dHpe;faOpnbCI`ceDu!}VJAsC16@chy&=d3B<&K-0RC zo+vC8rHbVj6-t{R%ODg$ht1kc)U-{wTD27^_Mk-ha!N&G6{3Q2(Z)s5)eE8?BHGb% zJy}zEqIcvwMLVA_YbDe~X~jfTRLO7bqUyZ9uG5Yd=%h?m@4c*7X`$g}t&g8v#t2R| zq9u7m?PhkqYau@=3a>Rf&ATCrd{MBaEK$9*WwOjdDJVH^x38>37g;txD9d+f^qaJt zucByMRQ^eH`=h8C?I(W8Iayc9_Y7?anuY2qt%!(AJIbD+C<@9QMyy)^@xIAQJ4~?2Snb8 zC>R%oQ=;^&$a^aamPO$^QF=qc!+G4S+eQ4uoGY!h}AzywzS-zn4 zo|m=Zoai>%uCFX3*|K_MnLw+{l{Gs@REkzXme!wY=OkI~pq>1ZbrtP1T35a5Qg|f4 z^g|5`7tj`uW$i;7N1M5(EFX5|7m?))TJOHB4SS;7XuDUHWh5`Pe-o9W zRgk51ThQcBRzkn$ZILxamOE%C zt+KA7eMal@RF}d=`2}RTfVS8qYaiM;+RQ~|`A{!EpDbU{dK+YI@I|-Lb}uN)NUf|M zStiixuF9HSCn`m&AWLhttVy!mK|86DbrtP1T34y+Qg}&z>HG8-w8aWp`_RVGW=fRh z!v*<8Wch;D>&e=1QFI$^w^&(5ie#OD>Pn<#7mG^KDu``8Cu@ot+(A1zFY7AWXSB6r zofcN@wz#9suu_NbeQ41eO|98L3+8pnxOh*o0Ut;2L`#0qsqs9TzpOHTq6I&7@^*b+ z`MhdPMH@m(zYknZ&u^;zPI$WM+wX`giruLZHD4BO@x)Vor`n+5mue6|_o2pY^^#q* zo2QD{P0BhsqI_j5T1p>khEj8~{)j}us%Ykt&1YVpnVGw1E*rZ!eD~hSXZ*7*=}e-} z-hh8kQy)Oj%-cNdhpv92)eY%9s>IzMO7-gGCAgynsrsZ97ePs^m$-hBW;RLLQ)O9L z(WcYEiWHR@Qc|X_VCzy3X-rK&5q8slkSz zaVR{_a}iw^wB#GriU?{%d04|GoiH?$zpmhqp&hTP1_4^?owRM};+nKps3)b&CB!ZzM>0!fu6@S$Hq52N zEPG)ynxAxrRQ!%m^F+S8k5S@&&8OJxg}%(MxdCEdCECb1>cYv}q8jp5K-1@yr4#b7Mrgy7@s?#?gnF3) z<>zT{REPHSylwET#PLVlN~R;ZVd=yvS&61kYQYpV!)#6e@;$d?51}ti?+bS|2XPAR z#YGJdPYz@qm{v>e?MXX??(R#ghHgT^Qj4oWEBWp(OM3{thTcN?L^Lu@@fq|ST61JJ zMEj|lcKfNCl>O*G|>*;yHR*iFr4*%e)m}Mq~7sLN$Ru!6-))q&l^@!IYXM znUWTT(mbeVQd(+4ejeJvd6ia>A9uNUcJ6MD=-aR&?)Qndp%VORvK3L=FTd;1_@K19 z%(T;Z$rmS7t7)v^s#Z)c<))t5*t3ZN_h?}7R7#IimWGtS)OlwmUiEc(@mn{|HAv@g zE-gNmU(hJ}#(S;(Cae9CAasL(_Fe_lKvy9DH$9M_Ps6UE6+V4HR5b>;#QnkgLo!6|&|)*P;8+8z@<+h>KOC zr_dW{2)`%LXROI;#ZF`W4(;Q2gw{bsIocMTYZp3!^62~_+VnXsd2N?!P=mDs8XH%) z?WN0a{XB9T&LA7?J1FYWNM6APHs&U9|2Z+7*;kvX;D1iEXjZuSFqX5QN$lF2UD1Jt zS^vxUcy6I56{-t@xH<7xC%i*dyLXYkGCm(eq4{ z|3l>zLLbx89()sBhvuM%-(_vz5nY8YLwV3X5d&yV(Ck-b`H9xE7i)3t4=Pe-l#NG# z@r)MJ6g2DTOyYn4>#hG}OsP=Ga;HS8X(cQ2XZp`(l0AAQ>(dF*@T4gHL=ANlt%14D z_s8USZ&Wl1rD*Q4oDs7S@!Bb|uR>^iA@`_B51>`?z+L*i-e6sEUfpx|oFy~q>F+al zSb__BhVB2S>dl(6X8V54T5G*}`@CKE+qHUibzQyFwRU>1t9rLTL3e+J{x)GoMF=y< zU=$D(kjM-Ih8bjvOfpJ9WD+q<3Nm%BEBPHhk2@Ux{=+$DxRNu8Vd?B)rbx5?6zvMC zd?7z~QE3~X4_K{y`CSw!-$;S9=I*d9!5it4MAgG;j&YNoXlZcXbf@jafU1Y&XYFJ} zeixT4PRPlPwCiHsJoO?ObV%b^lz=$r~c_KdP5yQ1m= zmErbFn><#m9Z|5LAsq7Rez_Y}avxh$18qA;UB9Ok*SjGlW=;G%dy8Qv^SR>FUx@r` zBZ|+;Q@o!mYN*t3nh_{_g>wOXxR*7gGCkL zGVtp6N^2GCvGvInrD%ZK`{b7j8K1(bbU)s8!2>z>V@rv@|A=LNjAuwZs}qcV;#r;Q z=`iU(Vup+lVyTfBtksCzQhQa7*`bMgn62uc4XI{J5d}-fqV?=O3Un+p>f)Y8xm%E3 zDQn*|QR+LzdcSg_*t&P>+sQg*X@IH|6z^MqR1vqAAq7iCqbhYPtyL?h)+{9}fl|BV z=YGqMif?aL@mZ;gI7|sC(dPKJ6#SZsZ>`SvCs9;tr!v{Eq_w|Lrh+qVoEN7etMPFZ z>)eSBi^7PYA>n~^COIo|GMnWzYe@TrwKX-a#UG>j^6%lNDZ@Wo;Wj@O9&{`4uYwAo zvmI5<+YjkptT+DKIrym_eb&QBclP3`{*DD?{?`5Q#DDj$^xxommx)9fzjWHkImL zJ&Hy%lhh3#sVsjQ zM8z+y4y!feDn2!$#6}D50IMO@8T2 z344+?70aR2XNoX*>t^#)X#Wb8m30xT%M1GJc&}!CaTt3)))QT^ zTZ^tU1`9PKWeH_Ip#%@oMt@r)kFt4{wlbp{EI`dr6?95X=g=Ie`-$?|pLHR(4b6m- zpgDS@1K9> zS3+-~ZK%jsL}!BHyTkGX#W$k0_~NvCvGwrJO893r{IeYY6TE2ou?p&eCZXgkS+6rh z-48`gnW9dn_*isJtHO}2;#O6(u0<8RqIrNOCmqVVwkKMIx^|?sK+b$p)Lqw5_ky&c zD((4Z(B_~W=m6?nRP0Z*WVC!}8d}>>tv*9Oz(P0$t2VXbwdv1(|r3_O=wA11vWB7E)Veg${6Z0#L(-BUe^8qLUbO9qQf`uO{&V6Ca}>>gCukl!%c3}iN`i;KHIhFv^FKsw!YigpfNL4K=>@PCd)UEIbf3$j`iu|t+lsF?;0&}l|>7!iCQH~z(z@JD?7TznH3pT|;O{}_uZ zesLAAw);C+Sc0v|3!Y!^6D47P8 z(?M2~GF!!|Q8$~->ToN1Ug1G(5bMjUa1#tJ${2=|7}D?tgU3$OzSWo%`(shkCPM{{ zy$#a`_lM&j1x;LQj^A?mf=6}a5q!|_OL(O{SY;7@Ky)bj22SveoOsOYu}U((i{{Xd zpxz_ZV|!2#1A3$G-elFGr&mzWEVSaGo3h1^W1^mEhNZxJIQlQd7f+af3g>5|!Y#)Hfx19wiDczlWt+ld94swB4YQ zG#pvYo0l5r5oyMuG{+aYXm%TZcd`ylOY5PGcbj1+C!VN}Uq6};pP1VwDwl`#rwql< zK&Q}llB~sO?P!gV1ua7Z&{~?Z)TD@BLl09!?SAYmdPIINQXa$>h&+dk_NJ)c(xN&A zS8Ky1YlU;;k!fm2^Q^dCMb31IGCM?%phl>=Q`Tu>e`5U(c~B`4$xt<=84R1p zrycV90ohC89wKoN-|rObsp`oP1+7*e^N=SQyTB> zQq`>v>ly9;32n6~-!*p(tqsL`!S^J>^LXo6w0t7kM_Yl`pj6&#k$J9&GV+z4hT8r3 zHRr@0#N>4ZAMk2IvmoQpj_PFNx5-M@hF6STooJ99h6PRUg>4M(4#q#=8eB_`Kj0fI zvHP!y-M7ykC~I7ke{EDW0y)q$^m9ypUg^U`Rf7xbVOkf{7L-X~D@FM!VPLRmG1`d* zyXF5H_LEZ|w(EYZE}`6ywMLd!EKX#Zj4UOQCHOwny`X);U9-rcBy#BDnNk}vp-$GS zcC(K@yw#wdqrF0V3(Y`ot}fPjM0^<3RGZC{b@GV@?l7XDiP6tFC-L_|Y`j3;X1Zts z?V?{<3m(hbktrH_D5|3*D@j^j6dQcYBEBf$UaTkn60hK37XCR5U+MKKS^jUKoK$IN zS!%(2M8Up1@jPXaCtB(mef>8p`WvKAYz4I>sfRisyG7R+{a+yk$Mmpbli?DI$v!oG z;X=MszeRSl$T<^P#~}p^x1!(5bNJ6iwg)kHFZB8=_NDqb{BZO8eWlojk`JUUd>7q( z6U}2C!CHh?grAR=f|d)7LLM|ozEiYpsNqmG_yLVVE6_eMRRCd z>#0gBgN~qXYGp7rSI@(UU~Bl#!Hv8JF>5e2+NYNdiO#w-ldIZQK>0&$SZ=1sbF{lX z9}rFUi`pR@>Vr0j@NZOZ7up1LK^YZ;%4{zx!j1N>4`P>SKIB4U8@ivf-K{J)y`u4V zq6z2-+U}7xAFUm&5wf6VXaK71QA zv@K|q`khhd9kl!nwbI~=vi7<(ldskeeU{b^H52;+tr~g_<>HqP{lt0!-9n4yBhfZk zGgK3iSrKk!!L_GoA;eE?KcHjCi75D094@>lp;>iQ!|%{TKjqO!+k^Y%H@e5Vx~fLM zgKTJIR#p%4kMvNII~Q7mmy0Fd<$OO@9bGCjKPoN-%7UIlrY*k$ZrR?vm39WLLN2sJ z>DqWqHFxD;KOp^srk!Q?I?YotjXw?H5u}WC`L1~ z(xNOMAcH4*#vvQZhu%L?Y#n4kzscuA=DBtfE?OhnIJ60Uhkiq8Kb7S~gxm_z4-(%uh?>i9ui0{JgBW4%1hgVW97Xf~A=NV82*C)N+S((D|O zOHB)j@UiYdSy+=Glgyv8m9G`D*p3R?)FP`{vQ_XiE%M83 z6d7X>S{c+ymbwP{IrSn7tp{3qEvpH+&^PGfg+^wqI;4BC|Kq>+{3G}g6TCVvev_oL zN**mW9tf?iUi>NO5V$!Sl$`fCoRMBMN@CM$`wrgluRC`U08I+@dCxvm~m_*C<$z zb=lda|MExFYo$Y?TIe;DiQnn4{C+}(_%-IKv{O@b2dz+-)B;)O3*!{uOdjStWAUe( z{)%PhJO6KDAxirvHRB*h0nVUKVdlKisM9JR%bE@4LM2cVRKR4fg)%agWdtT_06K+ceZ^kV-gC%<9`DI71M=xBZ%bBhPHo%xD$V&K zYCtSbZg^h_MijEWMQho^~2;- zMf^Ax6`qKip;qV&T85^e&tzF5^9j~1Xr3C>QY-6P~1yhX25Wev4>i%QZ|Q-4QUOh+}{Bw{Q{e%_Y+ ztoQOOOH<~H#AB`T^Lp=4es-Vy#y+cU_L`^~%7RMPWi=q@LZh{JDe9b3E1S?NAe+7_ ztdO6XoF0uda;G9-|L%V_s$@c=X zp++bJDxmKTD3|$Sool}AKuK7)e#!a?^3J5)q4`i!H0y%53Ws-68;|5(R}}76gJ*EV z7mjpB``LT3>bURym>u2h4E`J3V+(!-hxhP0q7=d7HDONU@o+Q&Z!sC6DL>j12Zj9C z#82p4cFjvs`43`0T6@jt6K7eyO4iN=O_qxhL<&Ce8J{~*e4Sq8}4_o(l ztn;4@f5%$?`M(chr!UkC&#FXEqu%w+Ttxf!Y{$JvQ z_w(1N4CAG!3Tmm9c2y@Djp#pO#-Ch?^$>gbc*I>Y&d<>DA)Au!80R@gcLK7QX_w5Z zySw+-;mWyktTh#?WdYhWS{B+bGy~0I=K5?(h1BZq?(Q@!&BOYMh%RV*PkV}tebMO$ z?QfQO0JL*QR&PsWqfJ0f#NGr~+`?bi_O__JKzpP2U!~>omK1BOCW@GulGSY1sbkNi zG<#e$Fd`~}+z-lD8MOPT?_ zgj%6*P|u_;r5y&>YQy>B_lxXdja%)Yv>K>yK$^*u-ziv+upW>(7wfY>8uWNr`EKyL zgVONZgg!!Z&@%LMaU^Qd5-m!ij8BYZJ~Re>fKJ}4R-=#sIl=Ysu-DuU(M*>prCU^z zr!8;1N1FFmbk-~C8PoV0tiyicjoQ2ao%%4KzlaIfXpUm(JyFdP1;+ut{h@n zX}DlYGp?$lx_m+#e6QMnxRZ6{R%`cSOdr$lMdT^C1Q6 zCgV#?gZCYD$drlG=Ur*3XfE1GR6ua!FP5kGGZUfdD=J&gXICH@Alwu%2n3>Hm>-~TyuRG)?c(fcJ)-6L&}7bDV4$cGMD zm6pXqxp}miA;o%>(TSEmEbDTE$Vn4zz7buwsM+)Jd$>VE!h5rJraa0rM2E?$w*l=X zg<7yQCVFDyg7OSYk)@p~Wi9@MM6fi$mr&kTP}yH!f^q*`SD zp=Y6%SZ*Dk9iJj0xET%El?wccwutr!?HAf5bO(9m%3^ect$7f8Q6Vk$j~_jEiuK_` z`Q2eXhQ3mR;zs%TFGKn}mKpzD8vhsmDyv}m;>*`^PJ!A|Wvqul=Sun*4JoaxdT= zj#&`}7wy9BEVWUuMzIXdF%$Q*JDsfizB7ogW73};mg_ptsG0cAhXYFd^6FO zf5~qMs)sDd|I>Q3M*3y}I$^w)29)`Xk^9jfYX68WU2(XcOwp@n{;&9Q3ux!i<1_g^hjtmY{c~9h zqxlrPx%LkY$@&mVAC~5z9SutBLvzub>u@gJiw%a?0Zp7vne1Pnuh2KhVBqHmwBu}P z7FlyD{$g7+^hQ=cDn3{(KO?J?xOEmkAv__r2hC4viMFJSc_LD+NLzw#KgwDN`IKR~ zvMxa$bOwzQyRoH+urBdiQwDW$(`0q2)jXT2^F`K7`e3^$?1SLEFnqZ7<$|1SLron1 z6l(Wkt)bKCB2Mqmf;Pw3m`tJ>l<41v!y4Q)PCSVgJRB80k+!j<3}cZ`aMBqjHxYiu z=R)xM!Gw@FW6oGnm^J-2>g=4)p%%P~@Q>pHj@LKwI>g8E@tT51S49(0I`jm;94I#` zB)E}EahZwCiF!TUP(stxE;i4T)`B$)&776>6;`J+JjMlgSEAPe;ABJHP#@$%`OH;o zS_L>0qC?1dC+!6^34MpM*%8h3Dx$eZWMDPWj-d(YGjs@*{>ca3^eOW&+CC8{XwCRN zf-0Z}Xa)KXT|pPnYiNU(S5B%fH&Y^ST-5kMln0eS)le;z1RX$|kkzexC5(}cHUk|) z{m?$N1f4{`mEf;HP5r#C}h(Y_?4c)8nHjW3FD(VnI$vz07zAP;IAQy=U!>Zp|2 zCC%y-8E8F;6O(ui%F#;Or<3&k) z8DVh4H~vdCc!)H5*0Lw@_d#sEOtG1JDr1ieSV@(#?m~h0pkxRC^zphnj?P^hdgPI?-JKlUVY`z^;x$%`e zEt>tYURp;(NWmjN3IE{oVfX|8x=}7q--wkkwt+>`!O)v74c*`c{|xJjlqE^{iAsx=zvFv0TYtS8NN~H1yq4H?HxaqM8jw zSZR6&{tnIdWVMNKO62!(Q`W;r($2}!kuL4}q39Uv+@fNK{(KfGqTtLhx^7w?{Y2he zlJ}R0f+y?4D~o|^{Q6eutUOZ5=O?bJ#$PKuALVJCmsdOFGeYHM>Yu3|`K={#B#u74 z(pvgNZGRpt;7c)M*UGZOyEHc`!?@8Dt%COIl+TBXUP-gdMCE8+wzRAQmDZml&HAcE z*@I}i&_0xDD#E-nqZ8)|H21r-IjrN*B-93ZM~dkAA*zFlpf6CWFTcuD(dMye2x}hJ zJhT-2*3o?E7OKZ@2+ASfC$uXfQctJ>R1P&keb6Cv2R)&TM^F#epY%Z$y;cs*FoH*n z{${a8IgW91U$j_7Cb7DuTq)kJQxyY6Tjh4%A2D*WK$jEyY%^dTfE~0^_igozD zQ+uImKU6Gh>79NX&p}hrDl}s#qA^KSlq`A+4Mo>t9>f|`L+kxmRLuLi#&a_vf8zahIzr zxnxBJ1PfvLEKvbuLiT|o{9{pJjz+C>HmqiFZhIo@F=RDK`v5u5rFEfALY=9~Z1BmU z(<(&_ybx_d*If3?#P2b51YJS)6J3H#ri@CglTZ^>$LJrR{etGHi&v)lO`_eQ-IU8( z49!7)wyeL?mdzx`oUq@rStL5k(8~b26lPGdfxH&qPa)m3d-L5#Eew5bZN`{74bk zALVC2CUeJclGSY&nQbCtMkm(QP+EpEXAn^U-9e|&7WB+k=4|LWH2;TsMDzpArv^h~%8~*N zXDgzDh)&3+R_1|TR(^!lqgIVr9mw5Pd)vQ?X3*?c(q6m{>F?O~pEK$BJuDZOnjJac zKqaKI)?~F9&}pp3x~#oeUC8id-C<(h{g7sT6fGQy8nKQ+9;LYq$}Lu7PqE*z8q~ne zlhwx0=Y87lpD9o(KkHnpRK2ItY9RNA2Kl2ezawAT8_0ybGx;U6nU3Zwv&$=VkE6Hi z2B%Bk$p@K`LH!KsJY1rD=8U7QMPvJ1SPC&8~<% z{4DZ$`?A(R-e+m0cgi=#d(hJ%YeRmW2ckV@V)rL$&gt!t&lhtmJ_Hj>TG;popLzAqJZIOj_4{HbcTw9q3 zE|kwGRIHOLGIQmZ%C_3k=68i3L)gV?Cdsb`zb44xAd=1(6-Y8fXnL}eoT8mWSCDy5 z^^R5fIkc;vvf6xd*K(z;W6eEOZ0|=|FYxoA^m193$d^ac*6FGXC_hgTZ=g(ucO1HE8=moVe7+2d|TYe*-wCKO(kF`bCSv0#% z+A*5hACPZ%`?3>$4AaTj0ZYQ4iFKUme>_^4 z&@ae?a#odZ5c0dF`L4)%Co+0Po+GmQL@wk*=6hLf$c22!BA)|&{t|9m!42(j>3#5l zgv5pM@Xt`V5dYz%O4yqa`A`zp?IF!HFQVY_jKq@s;M021()_ll&51X##V@PKDRu) zAQ-Hj_%Gq*VC!6$0}aUfDa|6%*pXHMRX{1cbuM>Ptr+ZA-HUm%);3z&fUH%}67R%X zOMJsP-s=``tgE98|Cj1wUy58_KUKmjsXCd!Mwd#n(I%kPPFd%mBj_2gvvOPHmx(qB zb@H;SI{Yl?9hBv0^4U-cGz9tm@=F~Ml|VIbRhOj%#ebC^Vx1?}gDRR7;U*{%fpweM z!Z-3ug&h2r@M}eLsq;0o4NbmR?fnL2u5OG|yasDnhsaz_Y$vo(r`RFrYpt|-sFN&p zWNw9~UMj*!M8s=QQ6tSwP+YrxA+5MdWJBZ77IXy_R4XEzEVYmWO+3fX64gQuv<#g< zkBPmiP;5b^s1X{0HlPbA_n9JILxWHsnQzPGmkrfI4pdntzYfTSigIPGgu3&j4WnK6 zYQA)~i|i-zGk0`RXb!T6r8y%aa~Jv|nnJUmO7ngdM!!3q-=g9h(RkkWtMH~u>XkHi zL{vR0vVQ3j)Kj!{$hZux!R_4t96VkTJU8}V5`Wsl|9y=AFIZ+pj>A7?4XA`O$b*Ki zWi{W4`pKHSx&(2;gg3Dm)0)TXq~g+ow%p~U{MXo$h^Pn4w_?IqN9CaZZW z%DPk*w_kJydC)d~UYGoG>E_dJX&sRJS!GygC3N!;U3y1mi;irgumHcbO#+nX1eN< zzo}SfLFAM9m^vRWhSp#!4!@hw9|^%#;W-7`#}lUvbphw)36wE^-o6zg4U2sYE!f=4XkXJ0QKhSuN{>cxJz1@C4mz_m4c zHoLlGwu|X8O_^-S>Q#hK#P*(weaWXrFUVX*M?UXQP7A+%{`=2Peo%G!1UXgGKK{|5 z*&110=9EXoHk$QO^Xvt*GpbnUooEwsp^-6JO}jkWp+2A2AXsmu?O`>`72%?Jx9XQo z^0|lVzf$_ebrkzOvi=owt^RPZ4E7Rst3uP+H!Pu<@0FyE&b{HN>O;@4=0bjwnpQv->D}IQ<|46a`K@Y`CVnCjfWHXq#(2g zePVWnhmnp*3bxl4^@%m9$(r<2NqVQG-C%VV6yc#A9V)__k~KBj#RpGF{*^e?+kYj_ zc2hou9>LDzK_CQgw2l7>p2TMNcX%5fd4n}y;c3B32I=BYb!lm7`HB?|wHfupUooVG zJavuF_k6t%YSqVc)%#{bS}){$R9h^x%x{Xgpq6LhTLMO?TM1-P%Zj1;($LS2#_g}z z)0XVPtm-y(C@Fg`PoqKc#)W6g{~RZDU=; z`V#HsFZmfzKJ*;=1o_Y$`BEsY5^E3I9rOu0fG#1Me1p(OXd3!OLP7 zoD|V;s^~e?2z5a{P}(0#Q|txWHkz}po~%Xtg5Mn0q|fqef_$viXeRU)@@U)qBh}>{ zludhA{!F12?M~~j!g7NvP~pjxd#Z{|MDy%Htl^>D{Rz!hqhI83LgaDavkGN3iXjd* zc8Roetk#USyv;v*M_1YnR__n7>AOYBR|t9RS>KZHW?K1rAq!gK5Rg)XK-w>Q!)lWDk#nbR&cJT5de9#E@~0GQWvIv352dw0521r}4fqN4C_`E?1O5ul z;g@d%lye-8`TbZ!;&VE|hjoAb(=x#avFAsc6pc{I4{83TPWg&Hs@iqe(oAR?YKMM8 z=JeC(JjO#iyipdnPu6X;KFEfWp`u>FW8>E$dF2pRLTPXrJ+Op%+k=p_W@j*uThv z^)pr%O2+D=O%AEo8m^SZycW4{MX6}t@be%CO2+RL?PIsfc+skSgOGP1%|`PF74i8{ z)`lZd)tPAhhv)=r7FvGfcP~~Rez(vxbkpdWuR!C}NDO`Om*tw5G9>k!&4WM^wK?xB4cRbBk&ie1kQ{epAa@Z=#a5`u3eKu&(>6ub^M zdN+Diq0-yk`o-Z4iryE?YI1?o8jjbnvEbSXqU9Bec^~hTHPBZ|e zP#2?D)<JIJqmg`t#S(2HK4bUL5EFk$=U&J_9=FY zovRCV_UQWQ7>9;rPA_Kmb!6E~99bU3diS*R+}IVhqGdw{)Q(>>ngy+{D2rF7r)=lY zj-b77}MJT}3RLAC7_G?>jX4UY0iOqXvdM?5tK6^t+Zccv9qw=NpsRP3ic2EKrv55 z{+Z|#w~^YQc}k_e3%vAHND>4X#}-pjq7EsK9DNyY%inJ#G)F z2C4L#`BQ!H8|w~~72Q?~UfKTpU;5N0tmjlo-S?t1$b$-~kkKK(w{%24jsAqyftrZ5 zzp1)k(R@$&rm%WY2F*WX61szmsHUk7H`kt`r9=J?mFwZR<|~WaCpv>XsP$M@`>D=k zlDf33^3jsZWgRRN%@FIc06&cuIkfx+t4YhJ7Q!-uw{AR0Jl&Jlqb;+5eT@|rdOtSy zAY9bqwuD~6do$u6G`bhN4&MuK7=E1MDWNH?N@v%H^jB;tsX4sGwi-zfV#y71v!L@P zY2|N3r&zyYZ9{8olwS_?0_Q-(31AGzi)zktkq~H^cM1I z$99|QJONeGwgbwoWAZm~M0^Nkd{bQ>LB-Hhs1@pjEXW|=DOwgLII4Ssd#31uc!5?v~3hnbL}0N~?t4*Gd~lvn*-Gwsx=2=d{!E!u?I^b2*tb z!Y>WogSRB#4|iHlap)DS&5IN(E%XU)NQ8-s2+!Ts@%JUKOZdxEf*SvJZO-7r)b$wL%wS80~&=^pnb?9UklU^ z^+CHt{Gt!isC|8j%I$tCG73d$MWRi#@6aW54GsSxVmqN~2FqdRvx~I~n!}pJCfx-2 zSgX-Y=q=>Yw)s-E;~kVudsnDc5jW$f9w}lkL*zrF52ZP6`h~reD$RpB(xqkLXSHkR z=uK$1(cK{}6|$a68-Y3@8+th{zlsS_^Oz_T>YbEU57}!kqbm>Z(Wa;5_YQgjy@nc~ zW~hR?{6Nb>%Z3V|N$NZeb&jhBHBdJ+`a#xKD4EhK(JbgCR6rTGXa-t3V;OIHE0W(qAt&%9;go*g089aEwtCK8Z1Bu(60em zx1nZgFpcIyi_j2dyn$?}9Wv>S^!F<5=A9_7OSIQ1s^}FxhMqxh`eZGGzGHoamIdWO zH_!}p2pvIZP(zPOdjpkpOG|^ELbbH50NSE{xA+-Y)1foyGvq-#kV9SCnpBrY=mILR zW&PeJGMYt;Eh6`&sH0W10-ZzYWT}M8A-7od7#C#yZHT1_-cJ4;af(nLC% zUnXlNn)^_i-=y;+8`^=UpfT2d*-$am3%!SaQ$|Cx4n|+=RjySj+C^)ie%nNJG|12A zqdQ$_2G1syki{xj#8b3dGLMmYnOUQSfS? zaMjmkv?mB&5SF1pFJ0uItwK(Utfi@I3(Y?rm>wOLLM%-nH%to};}?k+lqZ4edkjTTL_v?NzE`4QL;7pq+MY zcKvs%LC&pc25r%i-_y^^?0BLUC}~5Q*RO~tThel&8mQ`vtXYs{NLzr?lcZgtJwh9T zOnSpY`w7iLb@X#8WRI$hffdons_3LwE$SbaRxlyDnG}`0)#1h;kybn}azBbptgoSN z$XRcU&J4Dpn_0y!Lo0LA#_X`%;GxCn&TVU?1n=7JdlO}|*F+=l6!{7=x}@!*9YgI{ zuc1BY0P-QHUHR;H>b;Z>X-%CXqfL~HmPNqsYLegO z8Xm`*V)^=)I z1=T?HkWr<4J{K(q(Y{v8Itp!3T7848>5x+=&3U1_0LK4!K9~Bn zJeRicLev3uQ5QdYvg$#s|40|a_I~R`^XrxNZ#H|sE{~p`&gW+SXL)_m5a-;yp8oFL3lmVlZW(eOC#GpfPA~PS#PV zc~M#}bhjk!Gc>*`tqv;uEbVMvlurL_Zbt2Vn<#y2yREG5- z^b8uruNK;&jBaQEve-7p8nxX7J(BoVaXszXYY1)kVz0yB*~?ju5k3{NlI589{(JnB z66w}n@I*lT@yje4{jo(&ScNPWEY312c~JFhMO;HA_0rxz^H6uAtkqC9^r=BsvsPP+ zkLKVvM!rMJy`|V5dk0G?b`->IB6L$cwD^Vku$Z&jtmq-|_=bf?vuQk=uZ&Q`xTYQQM;^M|x-G?Umav?{c5$Y(Y^I#!mUlQ_k9jFGr7gF#m zCOlWG8JBzIi0B4d80T^3>Lq5E3!U`Jeeb=<-qkF;Kr`r9i+zhZE5GY^ zif#Bamp{r{-mQvcgo`lz=+{l~s+leY-gbySbc)O^&G|_`WAQU({dMSnFP0RJSQcIJGcpBt zw%#b|ZKEg+&HAe0e~-2gr8TL5>#!TE2Q;r!>ts3zA0gf@(AJ*zO69m*?#@7~f_$El z>g4qZXEjQ@5vJ`V?fFZkbt+ZqUugNYvesFmEMiZpq(C`+xN80P zaz*UrtJ&WwLhXL+I(n~{zo1iw?~yI|jC`dcYoH!-_@7k51;?USWs0aM3MtsPg=Z`_ zd)SW1^dL44dGl&&PO(z#L#y~1>^{Du-9dh@I=iJn#W#n=Uu3K8R-pJ1H|dEi&GQ z7ya(V=KekLdu}@tg6lWAx*quRhYoFRdD7DIMQ*Kn-K`7hAF+$|_?cVcTFp+O96Jj{ z_K+EsKU*a2MX_iQ8i&k2MOgi!_7X){Po-^@N;~dXr7MSJ9fiiBk0Y|af?C^j;&Y)z<{Y{o@$c0YRRPJ@E z=ooqzS?|S0;%}}CEZgWe2;GxF%4b+mezkNs)FjFIjHGOe$SyQ=or5_Ud-V} zuhV)E^Z2ev=Obm=K&yW&?J?R*$Y0R#JNuflpRt-eP_vHJhsF$LcK4O#@qx&i6Q!V4 zLKd6ZIex~mZZbdZ(L=o5_$BiIk&AW&wPP*ev8MGy)xf6Qt|Mvt-$V^i4|Mrm)?z3h z%7p5oxf+}hKMrT@gP2vQ&mJs7E>uL1U$>}?Stt+kqoeG-m=m6*Zq#dlY9JRfp^``O zio`c5zf}c|6$Y761C`swKa2 zXaVxqwV3S&&D@ig_F43rjl*X=k{VUo6X?1@S_)b&nz^rhmzAp3E9ggsv}0%%^4Rsb zZ&b!lVl!D9X;JPg{Mw*us2{&O%6LM)uTTf%_!{>;XLbcEc^aOIB zDPqMEl|nC|1!xWOiS;-;KCe`k*HAa)L%$#cIx17_F=xk1kjIwwAy0ml{75jqYF3$U zU34h_{zQJ}oHTn@bd@UWDU=;O4;6gLG+9wQgJ6T^WA)&>QIPmtvhCqCK>p3u%M<%J=N2 zH2X}HiFODjeNjXve(s4P474)n?pRja7ww@n5PPwy%q7&>gzBNa@5cy*v{nrocvR))gi{CG@@jHinSAKg$>|N+0#2Qo$^=xR2tQ{S{8tJuX&~xbg zgUWahIm33;r%qjbA0I#Oc>G1DgXTL$r1yxH(G19QWG(9#dEKIXw0Dqut??Kn*8ZY) zxZgxO@0H~X7uZ3%!7l7 zkO>(-mF0vMRiJf2AE9;V06K?qe<@!&lmnR;vc5)pM(xWX8^4#AidaKiLOVvAN6Uc* z$oC%Y88s-ZHd5;CDZvLq#|9giT7wpnNf zt+Z#<8_6B2{TzNPP(S44syBW-78%RRVx>#VTG5u5nJFzNLv+YTb8^VCiQhid`7n$K zZnZST57&vGWY&;6>o77ui0vir#Ke#0M`%71!OqkrldDIn!VZ-8P*xAW477)k!ES0W zSy{TFKFEgVpv4qLcxS4;$8IX?R+{aLR-xo$X%_UJEJ>%bZewl6+Kg6pBEK6n6Ri@O zfVQC~^8G?9gR1}30P2BepwCbi`JO?I&}(Roh(hXI1@+Nu73@$gcGXAF9JCC5h4!Ff zsQy}g^#WRkzESSTo%{x&H_#U-lll#xE20l-fQ*-#iJi>nzgOQy^-vb|`xR;TV%~$q$@W^U+|5m$N}5|C z1uv2hSAX2hY3E^$=p^e?s{)sxO|0)m<(CYlLG{omR08!vCe#QGEU7N#yQ;y>j>w0; zVr|%y)%Yy>6;behlyCvo;HFHQIDOiX=0Vw>G>86LMf0FE@*Qj`B7IfluZZT>MLU12 zQ01De^PWcM8=4OllBH@v5qFCs zG_OL(#Gz4T>E%rE1!Q2onpA9duOgD5UdVzP;0&N zd2AI64bsM;9CpElP!9d)RVm^HWWA6!0*yg+v#LSabNRi7RxN1{x{7X5N`4)inr7VSNLJ0*(!UL-Oqr=r+hG%rh+N^{UI3Kg*n zT`X&FW~_*^pic#gaDHhe_|FSb<)vupcbpQJv^JzQc%oJ!4i{BM9rP^`8$Ut4rZjU- zv1#)n@1w{M=_okK2GcS+V?%OVTvfE*%h*1(rXE8p+ON}>n+YID>-jZZ{o z#-qe&1kZWJzjFE@R-Ud2=aQ-=Tkh|mVUm^P#;x)0bPV|&LO-Fxq|o}0Slv{-W4Hg; zAY?ZZgAYF?EBGnur4jK9tq$#m*i5V*+Do)f zYGr*2YjrPH5nt2!cP!PiIuh?z{ZEN64_(fvgUvOKskbh&S4EfUs_U7nc3z>aWXL)U zdBo;q%9;!L&?@BZsI;1gil~J$A4xk!J4IXjtk^7S?@X(0E@LxwBfsC!-JP^@{Pv=L z3toec_Lhi!B2uBc#MFvUyfq>|5^*x6x)_De6LUORBnW-^q8gNKiw3tuW`=$VyJ>g9^e$D+DgQFXui`ZZd1 zovfE=F0mt6$DoE+iYSKG@}y-^gU(<2U2Bf2rqk5f$%kWL&#i`b^zJWA4YZdQ`73{~3q%}gx)cHHwIHh$` zXFsZQ@Zq&^m>>RDMeZ&|DQM?tHE4~{Y(&A=^TK3baL=dgi$kR?Y0sZmO=xyjl*+FdvfUi*F~&rP<04~5T(+!z(4!n_ zS24Vm(5gWf>aoqA{$@_tL3 zLpy?gzEc@{SMr;JT9{}h(B^mf?Xxb*SdcaX&Ci8e@ZeGSG}aPB;6PWA(}URAtWuPr z*`IaQu#t&2H7Gy7Ta@`uWOayIJ4MY<1LSqd>JqU+zD8)D%wHj^O|h$x(<*Ha?FxE= z_5Y{pKDruh*EYYe4m`EH-TQUBJ<;%89(Z})Qx81q<%z$6{aGxEoJFRHB2z?>Gl*C! zQi&oLP>7sCy);oQ>n6uzG~^9l+0bmd~L;KJyN6k+N3O1Yut?ON#Ue?H5vULqFR+n){_-c zl%pncpW5?rtW*koVds6$VW(^qk)=xM(pPCjnv>iyjBSlYk5W)q!Ez>B zYt#xdrI&ohy0cmH=bVT_-v|F6K0X#-okx%x38t+h^d%JONP3p$bD48g%C*TtpQ7_O z*x~f1s$bPR?YRS~PJ7*($jmR2Gmh-$?@W8CD2eKM3i3$5qz&m^YEIP%$?0si)w|!h zJM;WOZ3&D>k_O|+a-x9g$z5Yw8 zX=e90OVGB~oK{NqUWSTvjrF<7Hp|i13bbze4~{@gcz1t%ek5OmtJUb%Mkb{{+MGw( zYINjUi*n>g-m3QgVOvda$Q?wf?d06Bl6 z!FhDPfYP+^cqv;Wjx}G0GPe|?ZFu{bZ&iAfGW)4IhtY+!HA3bdMbXlf^hJvH(pM#I zY8IEW(|!7ay(mVjs+0yKw^o`yz=-!j)IEd>q;1I~m22#{^hdLJl(~G&*QkT$P1)rX z)%6)vHH)5=-AI|=sdh-`n#HXwpglR$%)vT1!Pw+Ubp8zmR9%xg)aRB~#u(A7eecx1 zZ?S8j$OZ z>+)bj*(T~*M?I=ms+ypxPg#dF?_pIhYs~T}tx5?6R7<7Je6k^Bp1<|VCBK*QAILnf zbM_GEl3rE4lk#+0?a`BkXPxr;bfP;id0&{>sT1NlW$u2i8Mm?mDcDOjRoTWaYfe-a z9H#GnhibDlEqOIIAZ_k5B3AP`rKCfufmr0dO|^ZsT*kFkbw}pzNwKQGGx8yke>hI= zsa8qOZC)b{Xl&q-zS{@1{Dk(D9Y|+Vw8qv-`KrDu%i3kTs~uc3kL@U{i#0Dv`%-Q< zRc9NsY$@|QsbJ1cWg8;f2>q?T{}}$2;lIM~KYje#@MAl(o-{-h`s?rZoBT5$qr%^db`8?y zwpBzq_U-#qUP@jqE7(NlY2?CPEBnz*wNLU_lEt^6L}_30OU``yian@QdXWw!cRjnU zt(6fSQf3?3t1{OlBYdh(NwwN_S*FmhCj7^bcc)Kmr$jj}BYWvtyX_(p#Or!pvwa)o z*o>3{16*0FA6HW74d%#ijTZNE3u^UpyG|KFKb5^mX{!EF*4oF2@6w}`p!=O|=}BrH zU~H|FCUr@fQf~uCyz7ZWp-vi*7Ns-kRZ4tjY=IQKSV<46;|J){o?kp`ocx3!_uCVv_!R8T96*4l4bhbd)za}?xVmO za(1#^e;4x3QVle6*#a$O{&kcpWo(eeZKC+!=(h*Csv`R!^hVx)`M7CLX^KouktX#v zv3ZwNF{jB=P*4l*D&Wd(OQV{2%0`DGKi8g~PRXyPIAt-?OgDSvReQ<3%h*`$S64il zC!ftXCXhX;8hqwXEf7ofH4c533V(9l`G;7+z2vH4r^MBwRb`%GM(j%g7u)sgQT5v% zW3zP|X;oIcPt_y+mJ)R&Hyo%>T9N`2ti`LV@35H>eUeM^=++#lrq8Y0wbw&-*oyij zm*m$hPVE<`W^uMKwpQ~!EAvZU%@WjF0zR%8Pc_%{`gbz_BG=`uvZ^Vn0o}*cOp|S? z>i@>Ry8Juqr*ABh zd|oL@$HBU`JL+Qv%~GEL%4e0put6KM+S=>^EbfdmtFYCM3e)-c!=99W~yrf9W z7aZ-Ce?KZJ>$;@sl`f>7ZXU7vgX)v^O`#uZjJ%rMwaVcivxEZ6s6$zwG%npsd(wo) z`d666-G*GcTAHMCX;gjPQtT|dEdB?YQ5G{t=6&XBiB(@hUgTg2eeUdELJwS_pFsYX zkMsK1@PGc{Sb1eg!7&duz2TQtLqDMVFOgIG{XeuU9?^0enPf2X0&Kz?9l55^xn_84 zq4yPa8$Oi+y4~z5dy@jXJ^bk8f+e=1OKD0Pk=#jx6UHG%3371w4%OtDLBqW zd>vxGf=!OHH)UJHRHr1*J6C;`IwinvhN;e-^VeXQDA>E6Sp!u^jp` zvQdMwL1o*T<$E4|&0o-HE_%>f`U}Wr@==XO3?-0xW6+ayDFv?B&rPxPRZ5%Ef^=}r zh;bbU-eWSqw(Cn`zJTsGs+F}RQr$aXtVe2*oKngmeeM7%)3I@_%qtzA(6=w;NxyWf z2A#$*+Bys;orHtYyTaGWR9h9oOES43d>9>y{2Q!l`UkBLdoM$AxUoE2S5a zT`8+lHeF10Na~Y3>T{OT7broG(yB(hl~LWQKo1)0)_lQos(;*QMI$a#$^6OaT>6|s zRwngHKcs6ZL-SQhgVIl_GmV*3B)63Qm8xI&NM2P7b?@lB;kpc}TAFt8~o~0V8sfWw)rpLj9F0!m96ujpICL?m@vZB(Q^i}d! zGBCawWmKVeRfCdS3hHI$8a-u+f8|2BZ&*myKR?csQdKIIx}@7T2Bu1-I;(j6L-kp5 zs_%<5CIvNft>lrabl-Ng!5L1Vi*5LITI$v74HJ4*rr2JiigJucPB+gY=b7JKjITT6 zqPImpkF=giX;rUxbcIWyKY|z;9Ggu?QdUG!j@`(MoL?*m{SiZzwj-rwl|1d7yv5s0 zp$|hv&QF6X9Y}uZR8u%RnBqd3lswW&J4gQl6d_1e9G!Q{8O9bIWAeeacj=?@=cGmb^h0+|a8&X~`7j$crql z>z++{4jFi_oc6kTl%p^5A*=(vHa45Yv^^&r#kuyE6q6~%O6^js zGQav#C9kfbz%+e5s=i3MGgM2YrdhHq$**dXGOx0Vc}Cp&QKj@%YEoa|2Yq!?k4~6< zT61uMzGzjSzLEK_*~!b1Ya+o%sqQ;^uRzCgz2jz zA0#fzq4Y({&5dMHj*ZAYhIf!rosr+1Y0+hvmfVs{>XsJ9S^S8yz$n?}7@Cq^B)8;} zaz+^8v^^I3Lz2o)B(IdGt(_^$7-W{ZtH?$Choe+k-VoJM$**dGWucELfBJY`!TYV* z-lhHXm4N{_Dk(>~6=+HF>)y|2igLV$-?|EYxc0A)+1INWRaA|xr3b0JhU$&fR7>_Q z&DN2P)uY-5^w1p9KOH6RnXmu9Klzzo%t7TTquF)A;V~Y$D{|#iTK$5Y%7W6JR9Qfu z_na#tsO(NEwE04B(*Ea*1g{m*pQ{Q*|9gw)mIh$X@=r zzoF*YXEmdGb?~dyDY^Ap$$@k+$}E8qRHdw6pTeK?QgxPbW6Vrsor$BYprV}Wt-U85 zx?BIlYkettr`*@ai01)jUXp@(WpN~yZN%R&i~kz!-JVq` z_FHV${+gD-jH9}v-B#Jsc%m5 zOC>MN5=h`Cm9Om26V(T4_L1zH^yh)>L2A7tJCi2v$-GNw`x+JBpgSq&mh8tB8ju2- zB{@hnsH|a`tWugbMLEtRH`(i-G^I)b$(zQZ9zRcCjP&X!^Ut8CAILd{;-*n>JiL>` zpU`QZB|G~@)}w4d%AKPxIEE6ns-1DNBdK?SY*#{9N7gA6v)gBs_b~NAo0NWUpruxZz`c#*^WVg;)I}*E~MW z<5Zs}P?!2H)t4hx4AM6$-S?BN_M!)=N!7hRs&&c=mARF*C~H*qqRgc%x{LV^yU~!c zM=42bNmgI2l&xw&Ble`A^wPsNzDP6DvUDnSNaNC8C$o%8Thed`)g>ue)pKQcQi(n% zF|BXbJN5Sw#+13fdF&zlx3Y76nWx^(b{k4jr8Fc3viZvkK^JENp7@JJm6HE}Y)5*L>Y{msa2?W@e2coJTB$|y+|&13Qlxe% zerIp=Tr$=pO-q;Os-B`%Wy2R_3r_Y+u#ar9A30M|Fadd!kS7kg z;?ZLoYLN!g$+|O8j|*L^Z%BQ8(z9mXlMbXdDPH=iRShJwjk81)>_v;ZyulT+oHZ09 zxnjwj>T}MJU9X~mG_C5LR5?rEoRle5OAFGe#s;MEa&8rm(wJ7YAbF%Qt$slANWmRe z^}36GNJ0Hwu;2#OhD{Xsg({T|NgnOL&UN~xlx1mbK-rr#scK1pu|duJv`zMP3!VK& zuTro2Ry50k zN1B%0m0Zn%TD0wFmeU_7Al0inAPs$s^hG(YA}`FvPB3tG9F0oe9J2IW^h@fLp7W^Q zO9lC4ZDS~)Tli}0gPp^qs5&!BU!1ZgDJhF;jx>=;RyKmphta)sq#r2@;E_5i(sn0DvOMa=RgR%Y!j^ypg z!(>GZr6V`T(NzOkpoHv3+0RC*gHl2hS(0=jEt&r5xb+2m_5+&XS6y1&4680j!EDr} zqis8d%r(K|`>c~JxW@|&Q~StY#m|lfmBqYM4Hj~-;*{-4KcwqtM%)%N!flFj3`Xt? znjdL$Nuv*B1NUf1%9qB~=gDTl(K+Z&dXNfpsTNCtQ$CJgo<}t?9|b!3a$&Z9ny;yg zZ1Rfr9ZSv=GG_)#aiQPJR@CQ};)3*TU7}=V{%$hQDe6*n_l)d8)z8XYQmwSn!-z(y zTw2ZKN~_W~{Q8>Q{sm*5=crKGxiY_Wbxhx`d- z$^yz7mEG&-HfQFU*{?rUUAI6s=STNHP=|CW^-9Sa@&1z$&IaVl<5p3kEK3T0r>|iO zRZ6qctu&z#0Usllq>6sB+5wcMEI|rNUa43ku9anVF^kW|<#2r^yQoLi%5J1X$s;+X z+d9U+)u36at(xpCh3y7&$+);g%mhQ=JC3hp))ir9oL2g!kM#SJvB4IUl@<^#iWQ}K>IHoH* zmsX{tOP;3%6F5%&P0W(gj9l7AjIsvli!Pg6`yiv8v7N1`Tbh<;rGT^}-ANBpSsU}E zN#CSSX-ztn{z%?#W*L;)rH4+cXbtv&fDeJ^J0 z4=KNdtV5cW7Nq=A`nshd$)mnv?Trp8puUPSW~q~&q<86?o4!5ij}%i*^`{h+E~J1) zxOGd(>tL+sL*cI%-+v`L&qqy?FORHFN|cUrsd^_H>=9x@nP(`@vb;m?1(HX|8oj7i z>Xn|QfSW#76&jc3q*dui`cln^Tg~DwCv#PzG3j3NXl%0nev7+;5zmrG^CkbCC9z-X zPA6<1OeK?f6OcO=RVN~+bg#Z*WtoywGuOs3HdZQ2A*)S8JJBfHiAt1tbt$h^_3GN1 zQ{R=Y%YkwBM#U)FmtIYOIehjb4BKOLEo)ozC+wfOXR6QA*%Mi>veZK!c{~RZMLG8V z`go5bT9aiwFfdixxhLyUc5*@HZbM(%kw+SpzDofQeW#~rxfPvD?^3+BF{2UA7Dg0k zzFB20%0?ugZF0)GQz_Zra`=|xJ@%sG;?o)PhyWms8>vKFaJ z^7|M&ax`H#lCx>D-6?ec9hE8TkybV0i&QIJoHDlVEUfUWWU(I#-}MD`0GDVj@!uGc zH;IO&RVhg$`ZZ!z3idK~`C!5>+g2Z$zYO`5#rKo7OTW6wN_xb8_FjY(D6 z^f|9M|M1@+?=?D9-?_A{zM(A5vcZTuWqv76V_oa?)zy8sD||MSS(c@97g>!opFvh2 z^=J>Jq(`bzj?~D`3u;N8=O){fH;pOIQjtH7r&lA&UQ?(ZNS9J-GS#1wGlr~78j`AF zsn$s8c5R1#S?O;j(U&F_=$LUy4btj0w<^DMD*3Odo=QhSGPe|vUZl-S^p_F<72Ac zXja<#ch*bh(R+Ja$`&P;-jtfvCr_OD%dDlJRy zY5FQ8=M34YvQA~)Qtm8$PRZ{in^HC-)z4AQmA0g9Y4`_y_0p|$FD?4%8m zA4~SE>{a@;LUls&#F1sLqHO6(a>Y}vTSN6y;xDorWkHP?R&_)w(`_|bDo$q>-wG!i zF}iPx(LIe*@AY5mRuR-^AiTNEa_vSP(vMQIMQKyFeV0BM;%Voe#+k&3ekt(C?YCXo zx>TpCTk4m}9vGV_Eld3aK080yyryqOn!O_X6GRVEi8QF+qVwzR?UZvyxb)U|jIzyR zszs9jh%8%Kw-oE)-tnvn9krlDoq$vKXmUa!xQyzvR)@+Lf(Ki{p&&OMga` zz3>5qlvflZl}hEqjCdGAvr=;>S-#|)XJ6H|QLS!9LyhQj9&#t5c**_3uPyrZcjq&G zWT#S<)FyRG>(Ybdlg=ftv?&Fj*;?QUx%Hcp+fx51)puo|l{HA;qylMBYLYyEZ|#wp zgAb_W9yLfeQr8{T31vT&xs`1xJCyFEN2x_4ejGFNs1!UR3znjmGIS#OD!2v4yQwBg zdD0hYR`N@iQb5WsXFmT9a{fla74)!-f|4tXY+gE*E~J=j`r@T5$va2&Mk@M2mNbi& z^sB`lX`_*9u~aWLN#oLqbSK3$F-yGUlJX_Dl-bOPMP)0}v2-R?YDA5+E5+0?UwRG7 zlFFrODXx~j8D&4DZD~&`(uh*2L28yRq?T&7Q6c42kDNbsTW~A?p zjP**jl3UuXr|()Cl!~MzDOGCx%Gfw*K!5$9#Z9%f0Ch=K(qlf=Ea_7EBgIJ#(u_2e z%Pb!0J%=nPeV4pat>l&xq!{TYoB0BgQ`HG&71Ds@l3JzREatnG2Bjh?^w;3+96VKO z%p{AGnq6d}ze{Q(LVu0a)FFlbnyY1@zx!zleV5jBl8nx!&^L0e8v1^yDfGoblPd}N zJL)V8wng;Gk?!>WU!gbB{)5BmcGcKf^TjbEBH@1vohy%?M6$m^jsNN6Jr$?h*%0~j zkHNU`{c8A(`c`sIX^ucx;cBduD5Xj+>EJtKucZ5KvdGrL-%o1RHU>2ILic5Xk9*1R zc5_s9PB4pGeI8|J(vEZ?{gl$B6sa!A%(J>DzSBMDxil|*mz-maP1G#6TAwdfdsmmE zMI*e*@-$zsR#2xsG_F}(+u^N+_e+JU#Tr|zY(_Ktq;cu!k~I%{QIoVPT}mx_EbwXU zo3df4PzvgDJnDY`QAb$29!H!XkL%$}bfQO;7|k-Ez7uIy>eQpcqV{;HW~r6Bq&bcF ztjCeP0Q%%?3eJ-IjHPd8kIa6 z8&o!~EKe&KP!`mhgUW7|rAk??tS?q;xoIP7RrRy9AvrZ7RoRO)CzWWvVJS}4ZDj*7 zoP!@}eXr7^l+?ib4kW*>H>djYX6TDk)wf4BsIm3sWIgJ;nI^m4MG0;+pnJjrRXvhV zD~Q#;f7NzpR6Va}KEJY9t!h)%qp$ScYL+vpTz$LhYf_dY9ce^BTB~E`MXg{}dQi1e zGv`Pf>MPK3u&n);r@mPAtyQr#r!-nYHY=4&jT#%PtWH^?ljCJa*GyLt^EFFZC1g#~ zzN&}CRI{W(=~x<-f>NI5i`=%t_oB~QOV$@=z9~el%05dQQmXVK%}FJiWmt++bz50d zHd{N8{94tyXVqIM^*2~z7Jo@&^IOReDORB#cJ%PvZG9@<;r%IH7U!H z)^uk3AXREa=$l%$-DRyR^sOw*)>4sE8cik({Zxqcg?_5Z6f4!)<^AMHn(Pn%xZ5Yk zp9w?ixFH(+{M8!%e%dF;P=n!>B=NlM--gbiJ~=K)W=gE5W1=@Q^JJGLy9}Rfw8TTt zdbcHYbD;^t+gj{yh#OcUUsgZdd~|On6Lk2VMr6BYWP}YgfSl&ATKkpck}*O^~=z z9ob_&>9*@$n`}ZqC3l*YnrH2LZ!cvg;;V+tga)fRS;a?2= z?M z3O(cCb=4N(>ak1b&NRfcE2c?YAScUudPoXLmPxWmmcShN2E3qSxiPZeE?7qNdT3$c zi#$cL1h&CXPy}*UY##SoX#a{} z^~{i*fz>~uQutavdo}D)3WgCb9nrJFJbn;#hOW49Pv}LE2yQ7oh7m5kaY^sEDj&cm z_`+3Lmur{wm8<)m#6{0op7osh?f5y!wj^iE?ldwP?lop}tY;KVfL|aLd}jC+ ziHl8CQo14Wl+{P>hB`@H;bnyHp*Bg}ENqD3li&q(L=bvuDe&+9^}mKj2YATp;db^d z$&Mpuvf**mE^%Pqwpl?b_|uYXl8>J7b>dI8;q_pFo>xuC<6ClyHT&ImQ+97!;_2sx zOHc7rUF4$sf zYpnSQyfUG4!Dg;xco&#qh3{Yxr2n>yoCIP)Cg=i*Th?4c(hA>*>&3_ zxnK@VgEi2=J#IP32Q6R(^a2;dD?mLM2a`0nk#v*zIRIh?Z1Dpmf$SfD|4dlfXGE+yIMTY+Lmp2rfVXWENSo6C{DHVk@13LP~pJ z1$2QXkjSWU5v4fSN=IRYho^GcZ$TxfnYYUx zAaO0(Q`C1#9jA72u1Ti3fR|u^JwH#<&V*mU7+3%+JOlj=re1AZ+gyY9AnwIVBkb@X zI0hZu(>3!9`52u0J}znK7yL)V?_+*)EKs@2^+c}!w@Aw;#~v@?B;|dSLVqOWUq8lp zcu8l!#*WX|-H)g3pB$s9Hp|huC4L@vV|nV`19Er`B!`zHobNU&kEFlJUd?EvImKhi zc&nj_q#6`}X|TvXIVV{q$zz^z7WRW=gB};~(eteJ@M>7cnVp#Kudy&nnYES_Q>x=E zww`2zUAH)I$KDHx>!&4kNp_}tuxb<59ot5KELzX_H!Iyv+AZ;U*^*^&)@}!U-HMee z!P$}}og|ImgquJ!$sSk-n;?S~CWFgkJ9JY?Jh^sp##0T~EG&zjx(mC2ji8uIkpUXH zcGeed@#WwLxMg?|7tj+Mx@QRA24XqG@RJOHU4~~e>WF#Vy!`lM!8Upu!C#ItXZUCF zK82p!+1gXV0GHTBlEvr>&&2kJh@*-FPhhZ^znX^^6Ne24tw)ogv&tHzu zZ;|K81(6{1$|;ADi-UNF(aW>eySts zVq0D?1Ae&d+M3TWtgjeyHf>v{zbtW)bTjIt+)9NclVFc|dbq2qs<7tdIzu-}BFS5o zl}14p7_GF@GH0X7B=g`E+%c*aOt7tLdScV$Z3=7z0b7 zcEfrGfRkJKSCV{C2>igsjVKe8fRh=!b)SL|QttXA7jieORf+JoBPa%0D86#N) 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Ƒx!A_#?M$(hg`rkAZ1BS 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