From 562599bf050ca3a2ffb277b1859859a5f2f557c7 Mon Sep 17 00:00:00 2001 From: ganchuantao Date: Tue, 9 Sep 2025 10:00:12 +0800 Subject: [PATCH] =?UTF-8?q?=20=20=20=20=E8=A7=A3=E5=8E=8B=E7=BC=A9abseil-c?= =?UTF-8?q?pp=20=20=20=20=20Signed-off-by:ganchuantao1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ganchuantao --- ABSEIL_ISSUE_TEMPLATE.md | 22 + BUILD.bazel | 35 + BUILD.gn | 276 -- CMake/AbseilDll.cmake | 915 ++++ CMake/AbseilHelpers.cmake | 460 ++ CMake/Googletest/CMakeLists.txt.in | 14 + CMake/Googletest/DownloadGTest.cmake | 41 + CMake/README.md | 188 + CMake/abslConfig.cmake.in | 8 + CMake/install_test_project/CMakeLists.txt | 25 + CMake/install_test_project/simple.cc | 32 + CMake/install_test_project/test.sh | 113 + CMakeLists.txt | 270 + CONTRIBUTING.md | 141 + FAQ.md | 167 + MODULE.bazel | 46 + PrivacyInfo.xcprivacy | 14 + README.md | 80 +- UPGRADES.md | 17 + WORKSPACE | 76 + WORKSPACE.bzlmod | 19 + abseil-cpp-20250127.0.tar.gz | Bin 2267275 -> 0 bytes absl/BUILD.bazel | 62 + absl/CMakeLists.txt | 44 + absl/abseil.podspec.gen.py | 243 + absl/algorithm/BUILD.bazel | 90 + absl/algorithm/CMakeLists.txt | 73 + absl/algorithm/algorithm.h | 64 + absl/algorithm/algorithm_test.cc | 60 + absl/algorithm/container.h | 1830 +++++++ absl/algorithm/container_test.cc | 1421 ++++++ absl/base/BUILD.bazel | 982 ++++ absl/base/CMakeLists.txt | 823 ++++ absl/base/attributes.h | 1008 ++++ absl/base/bit_cast_test.cc | 109 + absl/base/c_header_test.c | 30 + absl/base/call_once.h | 228 + absl/base/call_once_test.cc | 107 + absl/base/casts.h | 180 + absl/base/config.h | 985 ++++ absl/base/config_test.cc | 60 + absl/base/const_init.h | 76 + absl/base/dynamic_annotations.h | 480 ++ absl/base/exception_safety_testing_test.cc | 962 ++++ absl/base/inline_variable_test.cc | 64 + absl/base/inline_variable_test_a.cc | 27 + absl/base/inline_variable_test_b.cc | 27 + absl/base/internal/atomic_hook.h | 200 + absl/base/internal/atomic_hook_test.cc | 97 + absl/base/internal/atomic_hook_test_helper.cc | 32 + absl/base/internal/atomic_hook_test_helper.h | 34 + absl/base/internal/cmake_thread_test.cc | 22 + absl/base/internal/cycleclock.cc | 77 + absl/base/internal/cycleclock.h | 144 + absl/base/internal/cycleclock_config.h | 55 + absl/base/internal/direct_mmap.h | 170 + absl/base/internal/dynamic_annotations.h | 398 ++ absl/base/internal/endian.h | 283 ++ absl/base/internal/endian_test.cc | 263 + absl/base/internal/errno_saver.h | 43 + absl/base/internal/errno_saver_test.cc | 45 + .../base/internal/exception_safety_testing.cc | 79 + absl/base/internal/exception_safety_testing.h | 1109 +++++ absl/base/internal/exception_testing.h | 42 + absl/base/internal/fast_type_id.h | 50 + absl/base/internal/fast_type_id_test.cc | 123 + absl/base/internal/hide_ptr.h | 51 + absl/base/internal/identity.h | 39 + absl/base/internal/inline_variable.h | 108 + absl/base/internal/inline_variable_testing.h | 46 + absl/base/internal/invoke.h | 241 + absl/base/internal/low_level_alloc.cc | 631 +++ absl/base/internal/low_level_alloc.h | 127 + absl/base/internal/low_level_alloc_test.cc | 180 + absl/base/internal/low_level_scheduling.h | 134 + absl/base/internal/nullability_impl.h | 69 + absl/base/internal/per_thread_tls.h | 52 + absl/base/internal/poison.cc | 84 + absl/base/internal/poison.h | 59 + absl/base/internal/poison_test.cc | 41 + absl/base/internal/pretty_function.h | 33 + absl/base/internal/raw_logging.cc | 280 ++ absl/base/internal/raw_logging.h | 217 + absl/base/internal/scheduling_mode.h | 58 + absl/base/internal/scoped_set_env.cc | 81 + absl/base/internal/scoped_set_env.h | 45 + absl/base/internal/scoped_set_env_test.cc | 99 + absl/base/internal/spinlock.cc | 232 + absl/base/internal/spinlock.h | 275 ++ absl/base/internal/spinlock_akaros.inc | 35 + absl/base/internal/spinlock_benchmark.cc | 80 + absl/base/internal/spinlock_linux.inc | 71 + absl/base/internal/spinlock_posix.inc | 46 + absl/base/internal/spinlock_wait.cc | 81 + absl/base/internal/spinlock_wait.h | 95 + absl/base/internal/spinlock_win32.inc | 40 + absl/base/internal/strerror.cc | 88 + absl/base/internal/strerror.h | 39 + absl/base/internal/strerror_benchmark.cc | 29 + absl/base/internal/strerror_test.cc | 88 + absl/base/internal/sysinfo.cc | 503 ++ absl/base/internal/sysinfo.h | 74 + absl/base/internal/sysinfo_test.cc | 88 + absl/base/internal/thread_identity.cc | 163 + absl/base/internal/thread_identity.h | 273 ++ .../internal/thread_identity_benchmark.cc | 38 + absl/base/internal/thread_identity_test.cc | 129 + absl/base/internal/throw_delegate.cc | 203 + absl/base/internal/throw_delegate.h | 75 + absl/base/internal/tracing.cc | 39 + absl/base/internal/tracing.h | 81 + absl/base/internal/tracing_strong_test.cc | 117 + absl/base/internal/tracing_weak_test.cc | 34 + absl/base/internal/tsan_mutex_interface.h | 68 + absl/base/internal/unaligned_access.h | 89 + absl/base/internal/unique_small_name_test.cc | 77 + absl/base/internal/unscaledcycleclock.cc | 130 + absl/base/internal/unscaledcycleclock.h | 108 + .../base/internal/unscaledcycleclock_config.h | 62 + absl/base/invoke_test.cc | 331 ++ absl/base/log_severity.cc | 56 + absl/base/log_severity.h | 185 + absl/base/log_severity_test.cc | 251 + absl/base/macros.h | 220 + absl/base/no_destructor.h | 212 + absl/base/no_destructor_benchmark.cc | 165 + absl/base/no_destructor_test.cc | 209 + absl/base/nullability.h | 306 ++ absl/base/nullability_default_nonnull_test.cc | 44 + absl/base/nullability_test.cc | 129 + absl/base/optimization.h | 312 ++ absl/base/optimization_test.cc | 141 + absl/base/options.h | 263 + absl/base/policy_checks.h | 115 + absl/base/port.h | 25 + absl/base/prefetch.h | 209 + absl/base/prefetch_test.cc | 64 + absl/base/raw_logging_test.cc | 83 + absl/base/spinlock_test_common.cc | 285 ++ absl/base/thread_annotations.h | 333 ++ absl/base/throw_delegate_test.cc | 175 + absl/cleanup/BUILD.bazel | 73 + absl/cleanup/CMakeLists.txt | 56 + absl/cleanup/cleanup.h | 140 + absl/cleanup/cleanup_test.cc | 311 ++ absl/cleanup/internal/cleanup.h | 100 + absl/container/BUILD.bazel | 1128 +++++ absl/container/CMakeLists.txt | 1032 ++++ absl/container/btree_benchmark.cc | 764 +++ absl/container/btree_map.h | 889 ++++ absl/container/btree_set.h | 824 ++++ absl/container/btree_test.cc | 3462 +++++++++++++ absl/container/btree_test.h | 166 + absl/container/fixed_array.h | 557 +++ absl/container/fixed_array_benchmark.cc | 67 + .../fixed_array_exception_safety_test.cc | 201 + absl/container/fixed_array_test.cc | 857 ++++ absl/container/flat_hash_map.h | 687 +++ absl/container/flat_hash_map_test.cc | 458 ++ absl/container/flat_hash_set.h | 575 +++ absl/container/flat_hash_set_test.cc | 357 ++ absl/container/hash_container_defaults.h | 45 + absl/container/inlined_vector.h | 1016 ++++ absl/container/inlined_vector_benchmark.cc | 829 ++++ .../inlined_vector_exception_safety_test.cc | 508 ++ absl/container/inlined_vector_test.cc | 2229 +++++++++ absl/container/internal/btree.h | 3046 ++++++++++++ absl/container/internal/btree_container.h | 763 +++ absl/container/internal/common.h | 207 + .../container/internal/common_policy_traits.h | 152 + .../internal/common_policy_traits_test.cc | 157 + absl/container/internal/compressed_tuple.h | 271 ++ .../internal/compressed_tuple_test.cc | 482 ++ absl/container/internal/container_memory.h | 492 ++ .../internal/container_memory_test.cc | 318 ++ .../internal/hash_function_defaults.h | 276 ++ .../internal/hash_function_defaults_test.cc | 684 +++ .../internal/hash_generator_testing.cc | 78 + .../internal/hash_generator_testing.h | 182 + absl/container/internal/hash_policy_testing.h | 183 + .../internal/hash_policy_testing_test.cc | 45 + absl/container/internal/hash_policy_traits.h | 207 + .../internal/hash_policy_traits_test.cc | 144 + absl/container/internal/hashtable_debug.h | 102 + .../internal/hashtable_debug_hooks.h | 85 + absl/container/internal/hashtablez_sampler.cc | 300 ++ absl/container/internal/hashtablez_sampler.h | 275 ++ ...ashtablez_sampler_force_weak_definition.cc | 31 + .../internal/hashtablez_sampler_test.cc | 518 ++ absl/container/internal/inlined_vector.h | 1107 +++++ absl/container/internal/layout.h | 844 ++++ absl/container/internal/layout_benchmark.cc | 295 ++ absl/container/internal/layout_test.cc | 2034 ++++++++ absl/container/internal/node_slot_policy.h | 95 + .../internal/node_slot_policy_test.cc | 71 + absl/container/internal/raw_hash_map.h | 226 + absl/container/internal/raw_hash_set.cc | 671 +++ absl/container/internal/raw_hash_set.h | 4332 +++++++++++++++++ .../internal/raw_hash_set_allocator_test.cc | 520 ++ .../internal/raw_hash_set_benchmark.cc | 687 +++ .../internal/raw_hash_set_probe_benchmark.cc | 597 +++ absl/container/internal/raw_hash_set_test.cc | 3751 ++++++++++++++ absl/container/internal/test_allocator.h | 387 ++ .../internal/test_instance_tracker.cc | 29 + .../internal/test_instance_tracker.h | 274 ++ .../internal/test_instance_tracker_test.cc | 184 + absl/container/internal/tracked.h | 83 + .../internal/unordered_map_constructor_test.h | 494 ++ .../internal/unordered_map_lookup_test.h | 117 + .../internal/unordered_map_members_test.h | 87 + .../internal/unordered_map_modifiers_test.h | 352 ++ absl/container/internal/unordered_map_test.cc | 50 + .../internal/unordered_set_constructor_test.h | 496 ++ .../internal/unordered_set_lookup_test.h | 91 + .../internal/unordered_set_members_test.h | 86 + .../internal/unordered_set_modifiers_test.h | 221 + absl/container/internal/unordered_set_test.cc | 41 + absl/container/node_hash_map.h | 682 +++ absl/container/node_hash_map_test.cc | 351 ++ absl/container/node_hash_set.h | 573 +++ absl/container/node_hash_set_test.cc | 189 + absl/container/sample_element_size_test.cc | 123 + absl/copts/AbseilConfigureCopts.cmake | 106 + absl/copts/GENERATED_AbseilCopts.cmake | 235 + absl/copts/GENERATED_copts.bzl | 236 + absl/copts/configure_copts.bzl | 39 + absl/copts/copts.py | 183 + absl/copts/generate_copts.py | 109 + absl/crc/BUILD.bazel | 225 + absl/crc/CMakeLists.txt | 177 + absl/crc/crc32c.cc | 99 + absl/crc/crc32c.h | 190 + absl/crc/crc32c_benchmark.cc | 183 + absl/crc/crc32c_test.cc | 227 + absl/crc/internal/cpu_detect.cc | 342 ++ absl/crc/internal/cpu_detect.h | 63 + absl/crc/internal/crc.cc | 437 ++ absl/crc/internal/crc.h | 83 + .../internal/crc32_x86_arm_combined_simd.h | 300 ++ absl/crc/internal/crc32c.h | 39 + absl/crc/internal/crc32c_inline.h | 72 + absl/crc/internal/crc_cord_state.cc | 131 + absl/crc/internal/crc_cord_state.h | 159 + absl/crc/internal/crc_cord_state_test.cc | 124 + absl/crc/internal/crc_internal.h | 177 + absl/crc/internal/crc_memcpy.h | 122 + absl/crc/internal/crc_memcpy_fallback.cc | 78 + absl/crc/internal/crc_memcpy_test.cc | 177 + .../internal/crc_memcpy_x86_arm_combined.cc | 454 ++ absl/crc/internal/crc_non_temporal_memcpy.cc | 93 + absl/crc/internal/crc_x86_arm_combined.cc | 737 +++ .../internal/non_temporal_arm_intrinsics.h | 79 + absl/crc/internal/non_temporal_memcpy.h | 195 + absl/crc/internal/non_temporal_memcpy_test.cc | 90 + absl/debugging/BUILD.bazel | 445 ++ absl/debugging/CMakeLists.txt | 410 ++ absl/debugging/failure_signal_handler.cc | 434 ++ absl/debugging/failure_signal_handler.h | 121 + absl/debugging/failure_signal_handler_test.cc | 166 + .../debugging/internal/address_is_readable.cc | 98 + absl/debugging/internal/address_is_readable.h | 32 + .../internal/bounded_utf8_length_sequence.h | 126 + .../bounded_utf8_length_sequence_test.cc | 126 + .../internal/decode_rust_punycode.cc | 258 + .../debugging/internal/decode_rust_punycode.h | 55 + .../internal/decode_rust_punycode_test.cc | 606 +++ absl/debugging/internal/demangle.cc | 2983 ++++++++++++ absl/debugging/internal/demangle.h | 76 + absl/debugging/internal/demangle_rust.cc | 925 ++++ absl/debugging/internal/demangle_rust.h | 42 + absl/debugging/internal/demangle_rust_test.cc | 584 +++ absl/debugging/internal/demangle_test.cc | 2042 ++++++++ absl/debugging/internal/elf_mem_image.cc | 413 ++ absl/debugging/internal/elf_mem_image.h | 141 + absl/debugging/internal/examine_stack.cc | 326 ++ absl/debugging/internal/examine_stack.h | 64 + absl/debugging/internal/stack_consumption.cc | 206 + absl/debugging/internal/stack_consumption.h | 50 + .../internal/stack_consumption_test.cc | 50 + .../internal/stacktrace_aarch64-inl.inc | 283 ++ .../debugging/internal/stacktrace_arm-inl.inc | 139 + absl/debugging/internal/stacktrace_config.h | 99 + .../internal/stacktrace_emscripten-inl.inc | 110 + .../internal/stacktrace_generic-inl.inc | 108 + .../internal/stacktrace_powerpc-inl.inc | 258 + .../internal/stacktrace_riscv-inl.inc | 194 + .../internal/stacktrace_unimplemented-inl.inc | 24 + .../internal/stacktrace_win32-inl.inc | 94 + .../debugging/internal/stacktrace_x86-inl.inc | 394 ++ absl/debugging/internal/symbolize.h | 153 + .../debugging/internal/utf8_for_code_point.cc | 70 + absl/debugging/internal/utf8_for_code_point.h | 47 + .../internal/utf8_for_code_point_test.cc | 175 + absl/debugging/internal/vdso_support.cc | 205 + absl/debugging/internal/vdso_support.h | 158 + absl/debugging/leak_check.cc | 73 + absl/debugging/leak_check.h | 150 + absl/debugging/leak_check_fail_test.cc | 41 + absl/debugging/leak_check_test.cc | 41 + absl/debugging/stacktrace.cc | 142 + absl/debugging/stacktrace.h | 231 + absl/debugging/stacktrace_benchmark.cc | 55 + absl/debugging/stacktrace_test.cc | 47 + absl/debugging/symbolize.cc | 44 + absl/debugging/symbolize.h | 99 + absl/debugging/symbolize_darwin.inc | 102 + absl/debugging/symbolize_elf.inc | 1764 +++++++ absl/debugging/symbolize_emscripten.inc | 75 + absl/debugging/symbolize_test.cc | 634 +++ absl/debugging/symbolize_unimplemented.inc | 40 + absl/debugging/symbolize_win32.inc | 82 + absl/flags/BUILD.bazel | 610 +++ absl/flags/CMakeLists.txt | 478 ++ absl/flags/commandlineflag.cc | 35 + absl/flags/commandlineflag.h | 218 + absl/flags/commandlineflag_test.cc | 236 + absl/flags/config.h | 68 + absl/flags/config_test.cc | 61 + absl/flags/declare.h | 68 + absl/flags/flag.h | 305 ++ absl/flags/flag_benchmark.cc | 251 + absl/flags/flag_benchmark.lds | 13 + absl/flags/flag_test.cc | 1381 ++++++ absl/flags/flag_test_defs.cc | 24 + absl/flags/internal/commandlineflag.cc | 26 + absl/flags/internal/commandlineflag.h | 68 + absl/flags/internal/flag.cc | 710 +++ absl/flags/internal/flag.h | 969 ++++ absl/flags/internal/parse.h | 70 + absl/flags/internal/path_util.h | 62 + absl/flags/internal/path_util_test.cc | 46 + .../flags/internal/private_handle_accessor.cc | 69 + absl/flags/internal/private_handle_accessor.h | 64 + absl/flags/internal/program_name.cc | 61 + absl/flags/internal/program_name.h | 50 + absl/flags/internal/program_name_test.cc | 61 + absl/flags/internal/registry.h | 97 + absl/flags/internal/sequence_lock.h | 187 + absl/flags/internal/sequence_lock_test.cc | 169 + absl/flags/internal/usage.cc | 558 +++ absl/flags/internal/usage.h | 106 + absl/flags/internal/usage_test.cc | 550 +++ absl/flags/marshalling.cc | 291 ++ absl/flags/marshalling.h | 361 ++ absl/flags/marshalling_test.cc | 1220 +++++ absl/flags/parse.cc | 946 ++++ absl/flags/parse.h | 130 + absl/flags/parse_test.cc | 1094 +++++ absl/flags/reflection.cc | 365 ++ absl/flags/reflection.h | 90 + absl/flags/reflection_test.cc | 268 + absl/flags/usage.cc | 66 + absl/flags/usage.h | 43 + absl/flags/usage_config.cc | 170 + absl/flags/usage_config.h | 135 + absl/flags/usage_config_test.cc | 205 + absl/functional/BUILD.bazel | 168 + absl/functional/CMakeLists.txt | 138 + absl/functional/any_invocable.h | 334 ++ absl/functional/any_invocable_test.cc | 1719 +++++++ absl/functional/bind_front.h | 194 + absl/functional/bind_front_test.cc | 227 + absl/functional/function_ref.h | 151 + absl/functional/function_ref_test.cc | 293 ++ absl/functional/function_type_benchmark.cc | 176 + absl/functional/internal/any_invocable.h | 891 ++++ absl/functional/internal/front_binder.h | 95 + absl/functional/internal/function_ref.h | 116 + absl/functional/overload.h | 92 + absl/functional/overload_test.cc | 213 + absl/hash/BUILD.bazel | 212 + absl/hash/CMakeLists.txt | 181 + absl/hash/hash.h | 448 ++ absl/hash/hash_benchmark.cc | 384 ++ absl/hash/hash_instantiated_test.cc | 224 + absl/hash/hash_test.cc | 1216 +++++ absl/hash/hash_testing.h | 380 ++ absl/hash/internal/city.cc | 349 ++ absl/hash/internal/city.h | 78 + absl/hash/internal/city_test.cc | 597 +++ absl/hash/internal/hash.cc | 69 + absl/hash/internal/hash.h | 1490 ++++++ absl/hash/internal/hash_test.h | 87 + absl/hash/internal/low_level_hash.cc | 148 + absl/hash/internal/low_level_hash.h | 54 + absl/hash/internal/low_level_hash_test.cc | 532 ++ absl/hash/internal/print_hash_of.cc | 23 + absl/hash/internal/spy_hash_state.h | 274 ++ absl/log/BUILD.bazel | 680 +++ absl/log/CMakeLists.txt | 1198 +++++ absl/log/absl_check.h | 117 + absl/log/absl_check_test.cc | 58 + absl/log/absl_log.h | 115 + absl/log/absl_log_basic_test.cc | 22 + absl/log/absl_vlog_is_on.h | 95 + absl/log/check.h | 209 + absl/log/check_test.cc | 58 + absl/log/check_test_impl.inc | 686 +++ absl/log/die_if_null.cc | 32 + absl/log/die_if_null.h | 76 + absl/log/die_if_null_test.cc | 107 + absl/log/flags.cc | 143 + absl/log/flags.h | 43 + absl/log/flags_test.cc | 188 + absl/log/globals.cc | 178 + absl/log/globals.h | 231 + absl/log/globals_test.cc | 156 + absl/log/initialize.cc | 38 + absl/log/initialize.h | 45 + absl/log/internal/BUILD.bazel | 547 +++ absl/log/internal/append_truncated.h | 47 + absl/log/internal/check_impl.h | 150 + absl/log/internal/check_op.cc | 143 + absl/log/internal/check_op.h | 484 ++ absl/log/internal/conditions.cc | 83 + absl/log/internal/conditions.h | 239 + absl/log/internal/config.h | 45 + absl/log/internal/flags.h | 59 + absl/log/internal/fnmatch.cc | 73 + absl/log/internal/fnmatch.h | 35 + absl/log/internal/fnmatch_benchmark.cc | 29 + absl/log/internal/fnmatch_test.cc | 59 + absl/log/internal/globals.cc | 145 + absl/log/internal/globals.h | 101 + absl/log/internal/log_format.cc | 205 + absl/log/internal/log_format.h | 78 + absl/log/internal/log_impl.h | 282 ++ absl/log/internal/log_message.cc | 742 +++ absl/log/internal/log_message.h | 426 ++ absl/log/internal/log_sink_set.cc | 296 ++ absl/log/internal/log_sink_set.h | 54 + absl/log/internal/nullguard.cc | 35 + absl/log/internal/nullguard.h | 88 + absl/log/internal/nullstream.h | 127 + absl/log/internal/proto.cc | 217 + absl/log/internal/proto.h | 298 ++ absl/log/internal/stderr_log_sink_test.cc | 105 + absl/log/internal/strip.h | 108 + absl/log/internal/structured.h | 164 + absl/log/internal/structured_proto.cc | 115 + absl/log/internal/structured_proto.h | 107 + absl/log/internal/structured_proto_test.cc | 120 + absl/log/internal/test_actions.cc | 75 + absl/log/internal/test_actions.h | 90 + absl/log/internal/test_helpers.cc | 82 + absl/log/internal/test_helpers.h | 71 + absl/log/internal/test_matchers.cc | 216 + absl/log/internal/test_matchers.h | 94 + absl/log/internal/vlog_config.cc | 347 ++ absl/log/internal/vlog_config.h | 163 + absl/log/internal/vlog_config_benchmark.cc | 187 + absl/log/internal/voidify.h | 44 + absl/log/log.h | 365 ++ absl/log/log_basic_test.cc | 22 + absl/log/log_basic_test_impl.inc | 609 +++ absl/log/log_benchmark.cc | 164 + absl/log/log_entry.cc | 41 + absl/log/log_entry.h | 221 + absl/log/log_entry_test.cc | 468 ++ absl/log/log_format_test.cc | 1855 +++++++ absl/log/log_macro_hygiene_test.cc | 187 + absl/log/log_modifier_methods_test.cc | 224 + absl/log/log_sink.cc | 23 + absl/log/log_sink.h | 71 + absl/log/log_sink_registry.h | 64 + absl/log/log_sink_test.cc | 418 ++ absl/log/log_streamer.h | 181 + absl/log/log_streamer_test.cc | 438 ++ absl/log/scoped_mock_log.cc | 86 + absl/log/scoped_mock_log.h | 197 + absl/log/scoped_mock_log_test.cc | 295 ++ absl/log/stripping_test.cc | 502 ++ absl/log/structured.h | 75 + absl/log/structured_test.cc | 63 + absl/log/vlog_is_on.h | 74 + absl/log/vlog_is_on_test.cc | 233 + absl/memory/BUILD.bazel | 60 + absl/memory/CMakeLists.txt | 41 + absl/memory/memory.h | 278 ++ absl/memory/memory_test.cc | 222 + absl/meta/BUILD.bazel | 59 + absl/meta/CMakeLists.txt | 54 + absl/meta/type_traits.h | 670 +++ absl/meta/type_traits_test.cc | 841 ++++ absl/numeric/BUILD.bazel | 141 + absl/numeric/CMakeLists.txt | 102 + absl/numeric/bits.h | 196 + absl/numeric/bits_benchmark.cc | 73 + absl/numeric/bits_test.cc | 641 +++ absl/numeric/int128.cc | 396 ++ absl/numeric/int128.h | 1204 +++++ absl/numeric/int128_benchmark.cc | 282 ++ absl/numeric/int128_have_intrinsic.inc | 309 ++ absl/numeric/int128_no_intrinsic.inc | 349 ++ absl/numeric/int128_stream_test.cc | 1400 ++++++ absl/numeric/int128_test.cc | 1355 ++++++ absl/numeric/internal/bits.h | 362 ++ absl/numeric/internal/representation.h | 55 + absl/profiling/BUILD.bazel | 140 + absl/profiling/CMakeLists.txt | 93 + absl/profiling/internal/exponential_biased.cc | 93 + absl/profiling/internal/exponential_biased.h | 130 + .../internal/exponential_biased_test.cc | 203 + absl/profiling/internal/periodic_sampler.cc | 53 + absl/profiling/internal/periodic_sampler.h | 211 + .../internal/periodic_sampler_benchmark.cc | 79 + .../internal/periodic_sampler_test.cc | 177 + absl/profiling/internal/sample_recorder.h | 253 + .../internal/sample_recorder_test.cc | 184 + absl/random/BUILD.bazel | 548 +++ absl/random/CMakeLists.txt | 1249 +++++ absl/random/benchmarks.cc | 383 ++ absl/random/bernoulli_distribution.h | 202 + absl/random/bernoulli_distribution_test.cc | 217 + absl/random/beta_distribution.h | 429 ++ absl/random/beta_distribution_test.cc | 615 +++ absl/random/bit_gen_ref.h | 188 + absl/random/bit_gen_ref_test.cc | 102 + absl/random/discrete_distribution.cc | 108 + absl/random/discrete_distribution.h | 249 + absl/random/discrete_distribution_test.cc | 251 + absl/random/distributions.h | 452 ++ absl/random/distributions_test.cc | 516 ++ absl/random/examples_test.cc | 98 + absl/random/exponential_distribution.h | 166 + absl/random/exponential_distribution_test.cc | 426 ++ absl/random/gaussian_distribution.cc | 104 + absl/random/gaussian_distribution.h | 276 ++ absl/random/gaussian_distribution_test.cc | 561 +++ absl/random/generators_test.cc | 185 + absl/random/internal/BUILD.bazel | 864 ++++ absl/random/internal/chi_square.cc | 230 + absl/random/internal/chi_square.h | 89 + absl/random/internal/chi_square_test.cc | 364 ++ absl/random/internal/distribution_caller.h | 97 + .../random/internal/distribution_test_util.cc | 418 ++ absl/random/internal/distribution_test_util.h | 113 + .../internal/distribution_test_util_test.cc | 193 + absl/random/internal/explicit_seed_seq.h | 92 + .../random/internal/explicit_seed_seq_test.cc | 241 + absl/random/internal/fast_uniform_bits.h | 271 ++ .../random/internal/fast_uniform_bits_test.cc | 336 ++ absl/random/internal/fastmath.h | 57 + absl/random/internal/fastmath_test.cc | 97 + .../gaussian_distribution_gentables.cc | 142 + absl/random/internal/generate_real.h | 144 + absl/random/internal/generate_real_test.cc | 496 ++ absl/random/internal/iostream_state_saver.h | 248 + .../internal/iostream_state_saver_test.cc | 373 ++ absl/random/internal/mock_helpers.h | 161 + absl/random/internal/mock_overload_set.h | 122 + absl/random/internal/mock_validators.h | 98 + absl/random/internal/nanobenchmark.cc | 804 +++ absl/random/internal/nanobenchmark.h | 172 + absl/random/internal/nanobenchmark_test.cc | 79 + absl/random/internal/nonsecure_base.h | 161 + absl/random/internal/nonsecure_base_test.cc | 228 + absl/random/internal/pcg_engine.h | 287 ++ absl/random/internal/pcg_engine_test.cc | 638 +++ absl/random/internal/platform.h | 171 + absl/random/internal/pool_urbg.cc | 253 + absl/random/internal/pool_urbg.h | 131 + absl/random/internal/pool_urbg_test.cc | 182 + absl/random/internal/randen.cc | 91 + absl/random/internal/randen.h | 96 + absl/random/internal/randen_benchmarks.cc | 175 + absl/random/internal/randen_detect.cc | 280 ++ absl/random/internal/randen_detect.h | 33 + absl/random/internal/randen_engine.h | 265 + absl/random/internal/randen_engine_test.cc | 655 +++ absl/random/internal/randen_hwaes.cc | 526 ++ absl/random/internal/randen_hwaes.h | 50 + absl/random/internal/randen_hwaes_test.cc | 99 + absl/random/internal/randen_round_keys.cc | 462 ++ absl/random/internal/randen_slow.cc | 471 ++ absl/random/internal/randen_slow.h | 40 + absl/random/internal/randen_slow_test.cc | 61 + absl/random/internal/randen_test.cc | 75 + absl/random/internal/randen_traits.h | 88 + absl/random/internal/salted_seed_seq.h | 165 + absl/random/internal/salted_seed_seq_test.cc | 172 + absl/random/internal/seed_material.cc | 267 + absl/random/internal/seed_material.h | 104 + absl/random/internal/seed_material_test.cc | 202 + absl/random/internal/sequence_urbg.h | 60 + absl/random/internal/traits.h | 149 + absl/random/internal/traits_test.cc | 123 + absl/random/internal/uniform_helper.h | 244 + absl/random/internal/uniform_helper_test.cc | 279 ++ absl/random/internal/wide_multiply.h | 95 + absl/random/internal/wide_multiply_test.cc | 119 + absl/random/log_uniform_int_distribution.h | 253 + .../log_uniform_int_distribution_test.cc | 277 ++ absl/random/mock_distributions.h | 269 + absl/random/mock_distributions_test.cc | 280 ++ absl/random/mocking_bit_gen.h | 239 + absl/random/mocking_bit_gen_test.cc | 403 ++ absl/random/poisson_distribution.h | 262 + absl/random/poisson_distribution_test.cc | 569 +++ absl/random/random.h | 189 + absl/random/seed_gen_exception.cc | 45 + absl/random/seed_gen_exception.h | 55 + absl/random/seed_sequences.cc | 29 + absl/random/seed_sequences.h | 112 + absl/random/seed_sequences_test.cc | 126 + absl/random/uniform_int_distribution.h | 276 ++ absl/random/uniform_int_distribution_test.cc | 259 + absl/random/uniform_real_distribution.h | 204 + absl/random/uniform_real_distribution_test.cc | 394 ++ absl/random/zipf_distribution.h | 273 ++ absl/random/zipf_distribution_test.cc | 423 ++ absl/status/BUILD.bazel | 168 + absl/status/CMakeLists.txt | 143 + absl/status/internal/status_internal.cc | 252 + absl/status/internal/status_internal.h | 132 + absl/status/internal/status_matchers.cc | 68 + absl/status/internal/status_matchers.h | 246 + absl/status/internal/statusor_internal.h | 494 ++ absl/status/status.cc | 421 ++ absl/status/status.h | 943 ++++ absl/status/status_matchers.h | 118 + absl/status/status_matchers_test.cc | 119 + absl/status/status_payload_printer.cc | 36 + absl/status/status_payload_printer.h | 52 + absl/status/status_test.cc | 579 +++ absl/status/statusor.cc | 106 + absl/status/statusor.h | 796 +++ absl/status/statusor_test.cc | 1802 +++++++ absl/strings/BUILD.bazel | 1477 ++++++ absl/strings/CMakeLists.txt | 1198 +++++ absl/strings/ascii.cc | 296 ++ absl/strings/ascii.h | 284 ++ absl/strings/ascii_benchmark.cc | 160 + absl/strings/ascii_test.cc | 374 ++ absl/strings/atod_manual_test.cc | 193 + absl/strings/char_formatting_test.cc | 169 + absl/strings/charconv.cc | 1443 ++++++ absl/strings/charconv.h | 123 + absl/strings/charconv_benchmark.cc | 204 + absl/strings/charconv_test.cc | 787 +++ absl/strings/charset.h | 163 + absl/strings/charset_benchmark.cc | 57 + absl/strings/charset_test.cc | 181 + absl/strings/cord.cc | 1581 ++++++ absl/strings/cord.h | 1753 +++++++ absl/strings/cord_analysis.cc | 196 + absl/strings/cord_analysis.h | 63 + absl/strings/cord_buffer.cc | 30 + absl/strings/cord_buffer.h | 572 +++ absl/strings/cord_buffer_test.cc | 322 ++ absl/strings/cord_test.cc | 3398 +++++++++++++ absl/strings/cord_test_helpers.h | 122 + absl/strings/cordz_test.cc | 468 ++ absl/strings/cordz_test_helpers.h | 153 + absl/strings/escaping.cc | 1022 ++++ absl/strings/escaping.h | 186 + absl/strings/escaping_benchmark.cc | 125 + absl/strings/escaping_test.cc | 750 +++ absl/strings/has_absl_stringify.h | 64 + absl/strings/has_absl_stringify_test.cc | 40 + absl/strings/has_ostream_operator.h | 42 + absl/strings/has_ostream_operator_test.cc | 41 + absl/strings/internal/charconv_bigint.cc | 357 ++ absl/strings/internal/charconv_bigint.h | 433 ++ absl/strings/internal/charconv_bigint_test.cc | 260 + absl/strings/internal/charconv_parse.cc | 504 ++ absl/strings/internal/charconv_parse.h | 99 + absl/strings/internal/charconv_parse_test.cc | 357 ++ absl/strings/internal/cord_data_edge.h | 63 + absl/strings/internal/cord_data_edge_test.cc | 130 + absl/strings/internal/cord_internal.cc | 70 + absl/strings/internal/cord_internal.h | 944 ++++ absl/strings/internal/cord_rep_btree.cc | 1241 +++++ absl/strings/internal/cord_rep_btree.h | 944 ++++ .../internal/cord_rep_btree_navigator.cc | 187 + .../internal/cord_rep_btree_navigator.h | 267 + .../internal/cord_rep_btree_navigator_test.cc | 346 ++ .../strings/internal/cord_rep_btree_reader.cc | 69 + absl/strings/internal/cord_rep_btree_reader.h | 212 + .../internal/cord_rep_btree_reader_test.cc | 293 ++ absl/strings/internal/cord_rep_btree_test.cc | 1568 ++++++ absl/strings/internal/cord_rep_consume.cc | 64 + absl/strings/internal/cord_rep_consume.h | 47 + absl/strings/internal/cord_rep_crc.cc | 56 + absl/strings/internal/cord_rep_crc.h | 103 + absl/strings/internal/cord_rep_crc_test.cc | 130 + absl/strings/internal/cord_rep_flat.h | 195 + absl/strings/internal/cord_rep_test_util.h | 205 + absl/strings/internal/cordz_functions.cc | 102 + absl/strings/internal/cordz_functions.h | 87 + absl/strings/internal/cordz_functions_test.cc | 147 + absl/strings/internal/cordz_handle.cc | 165 + absl/strings/internal/cordz_handle.h | 98 + absl/strings/internal/cordz_handle_test.cc | 265 + absl/strings/internal/cordz_info.cc | 422 ++ absl/strings/internal/cordz_info.h | 303 ++ .../internal/cordz_info_statistics_test.cc | 510 ++ absl/strings/internal/cordz_info_test.cc | 342 ++ absl/strings/internal/cordz_sample_token.cc | 64 + absl/strings/internal/cordz_sample_token.h | 97 + .../internal/cordz_sample_token_test.cc | 208 + absl/strings/internal/cordz_statistics.h | 88 + absl/strings/internal/cordz_update_scope.h | 71 + .../internal/cordz_update_scope_test.cc | 49 + absl/strings/internal/cordz_update_tracker.h | 123 + .../internal/cordz_update_tracker_test.cc | 147 + .../internal/damerau_levenshtein_distance.cc | 93 + .../internal/damerau_levenshtein_distance.h | 34 + .../damerau_levenshtein_distance_test.cc | 99 + absl/strings/internal/escaping.cc | 209 + absl/strings/internal/escaping.h | 57 + absl/strings/internal/escaping_test_common.h | 133 + absl/strings/internal/memutil.cc | 48 + absl/strings/internal/memutil.h | 40 + absl/strings/internal/memutil_benchmark.cc | 128 + absl/strings/internal/memutil_test.cc | 41 + absl/strings/internal/numbers_test_common.h | 184 + absl/strings/internal/ostringstream.cc | 43 + absl/strings/internal/ostringstream.h | 114 + .../internal/ostringstream_benchmark.cc | 106 + absl/strings/internal/ostringstream_test.cc | 131 + absl/strings/internal/pow10_helper.cc | 122 + absl/strings/internal/pow10_helper.h | 40 + absl/strings/internal/pow10_helper_test.cc | 122 + absl/strings/internal/resize_uninitialized.h | 119 + .../internal/resize_uninitialized_test.cc | 133 + absl/strings/internal/stl_type_traits.h | 248 + absl/strings/internal/str_format/arg.cc | 671 +++ absl/strings/internal/str_format/arg.h | 671 +++ absl/strings/internal/str_format/arg_test.cc | 162 + absl/strings/internal/str_format/bind.cc | 275 ++ absl/strings/internal/str_format/bind.h | 237 + absl/strings/internal/str_format/bind_test.cc | 157 + absl/strings/internal/str_format/checker.h | 100 + .../internal/str_format/checker_test.cc | 176 + .../internal/str_format/constexpr_parser.h | 357 ++ .../internal/str_format/convert_test.cc | 1462 ++++++ absl/strings/internal/str_format/extension.cc | 75 + absl/strings/internal/str_format/extension.h | 456 ++ .../internal/str_format/extension_test.cc | 109 + .../internal/str_format/float_conversion.cc | 1458 ++++++ .../internal/str_format/float_conversion.h | 37 + absl/strings/internal/str_format/output.cc | 72 + absl/strings/internal/str_format/output.h | 97 + .../internal/str_format/output_test.cc | 79 + absl/strings/internal/str_format/parser.cc | 140 + absl/strings/internal/str_format/parser.h | 269 + .../internal/str_format/parser_test.cc | 446 ++ absl/strings/internal/str_join_internal.h | 338 ++ absl/strings/internal/str_split_internal.h | 520 ++ absl/strings/internal/string_constant.h | 72 + absl/strings/internal/string_constant_test.cc | 60 + absl/strings/internal/stringify_sink.cc | 28 + absl/strings/internal/stringify_sink.h | 57 + absl/strings/internal/utf8.cc | 53 + absl/strings/internal/utf8.h | 50 + absl/strings/internal/utf8_test.cc | 66 + absl/strings/match.cc | 133 + absl/strings/match.h | 129 + absl/strings/match_test.cc | 291 ++ absl/strings/numbers.cc | 1146 +++++ absl/strings/numbers.h | 317 ++ absl/strings/numbers_benchmark.cc | 288 ++ absl/strings/numbers_test.cc | 1740 +++++++ absl/strings/str_cat.cc | 243 + absl/strings/str_cat.h | 628 +++ absl/strings/str_cat_benchmark.cc | 265 + absl/strings/str_cat_test.cc | 697 +++ absl/strings/str_format.h | 887 ++++ absl/strings/str_format_test.cc | 1236 +++++ absl/strings/str_join.h | 301 ++ absl/strings/str_join_benchmark.cc | 107 + absl/strings/str_join_test.cc | 645 +++ absl/strings/str_replace.cc | 91 + absl/strings/str_replace.h | 222 + absl/strings/str_replace_benchmark.cc | 122 + absl/strings/str_replace_test.cc | 345 ++ absl/strings/str_split.cc | 144 + absl/strings/str_split.h | 582 +++ absl/strings/str_split_benchmark.cc | 181 + absl/strings/str_split_test.cc | 1069 ++++ absl/strings/string_view.cc | 262 + absl/strings/string_view.h | 771 +++ absl/strings/string_view_benchmark.cc | 382 ++ absl/strings/string_view_test.cc | 1398 ++++++ absl/strings/strip.h | 99 + absl/strings/strip_test.cc | 198 + absl/strings/substitute.cc | 186 + absl/strings/substitute.h | 767 +++ absl/strings/substitute_test.cc | 288 ++ absl/synchronization/BUILD.bazel | 406 ++ absl/synchronization/CMakeLists.txt | 291 ++ absl/synchronization/barrier.cc | 52 + absl/synchronization/barrier.h | 79 + absl/synchronization/barrier_test.cc | 75 + absl/synchronization/blocking_counter.cc | 73 + absl/synchronization/blocking_counter.h | 107 + .../blocking_counter_benchmark.cc | 84 + absl/synchronization/blocking_counter_test.cc | 146 + .../internal/create_thread_identity.cc | 152 + .../internal/create_thread_identity.h | 56 + absl/synchronization/internal/futex.h | 177 + absl/synchronization/internal/futex_waiter.cc | 111 + absl/synchronization/internal/futex_waiter.h | 63 + absl/synchronization/internal/graphcycles.cc | 717 +++ absl/synchronization/internal/graphcycles.h | 146 + .../internal/graphcycles_benchmark.cc | 44 + .../internal/graphcycles_test.cc | 482 ++ .../internal/kernel_timeout.cc | 225 + .../synchronization/internal/kernel_timeout.h | 178 + .../internal/kernel_timeout_test.cc | 396 ++ .../internal/per_thread_sem.cc | 106 + .../synchronization/internal/per_thread_sem.h | 119 + .../internal/per_thread_sem_test.cc | 194 + .../internal/pthread_waiter.cc | 167 + .../synchronization/internal/pthread_waiter.h | 60 + absl/synchronization/internal/sem_waiter.cc | 122 + absl/synchronization/internal/sem_waiter.h | 65 + .../synchronization/internal/stdcpp_waiter.cc | 91 + absl/synchronization/internal/stdcpp_waiter.h | 56 + absl/synchronization/internal/thread_pool.h | 96 + absl/synchronization/internal/waiter.h | 69 + absl/synchronization/internal/waiter_base.cc | 42 + absl/synchronization/internal/waiter_base.h | 90 + absl/synchronization/internal/waiter_test.cc | 183 + absl/synchronization/internal/win32_waiter.cc | 151 + absl/synchronization/internal/win32_waiter.h | 72 + absl/synchronization/lifetime_test.cc | 180 + absl/synchronization/mutex.cc | 2821 +++++++++++ absl/synchronization/mutex.h | 1219 +++++ absl/synchronization/mutex_benchmark.cc | 339 ++ .../mutex_method_pointer_test.cc | 138 + absl/synchronization/mutex_test.cc | 2037 ++++++++ absl/synchronization/notification.cc | 85 + absl/synchronization/notification.h | 133 + absl/synchronization/notification_test.cc | 230 + absl/time/BUILD.bazel | 156 + absl/time/CMakeLists.txt | 141 + absl/time/civil_time.cc | 199 + absl/time/civil_time.h | 589 +++ absl/time/civil_time_benchmark.cc | 130 + absl/time/civil_time_test.cc | 1262 +++++ absl/time/clock.cc | 604 +++ absl/time/clock.h | 78 + absl/time/clock_benchmark.cc | 74 + absl/time/clock_test.cc | 122 + absl/time/duration.cc | 913 ++++ absl/time/duration_benchmark.cc | 464 ++ absl/time/duration_test.cc | 1905 ++++++++ absl/time/flag_test.cc | 147 + absl/time/format.cc | 162 + absl/time/format_benchmark.cc | 64 + absl/time/format_test.cc | 441 ++ absl/time/internal/cctz/BUILD.bazel | 178 + .../internal/cctz/include/cctz/civil_time.h | 332 ++ .../cctz/include/cctz/civil_time_detail.h | 632 +++ .../internal/cctz/include/cctz/time_zone.h | 460 ++ .../cctz/include/cctz/zone_info_source.h | 102 + absl/time/internal/cctz/src/cctz_benchmark.cc | 922 ++++ .../internal/cctz/src/civil_time_detail.cc | 94 + .../time/internal/cctz/src/civil_time_test.cc | 1066 ++++ .../time/internal/cctz/src/time_zone_fixed.cc | 140 + absl/time/internal/cctz/src/time_zone_fixed.h | 52 + .../internal/cctz/src/time_zone_format.cc | 1029 ++++ .../cctz/src/time_zone_format_test.cc | 1774 +++++++ absl/time/internal/cctz/src/time_zone_if.cc | 47 + absl/time/internal/cctz/src/time_zone_if.h | 80 + absl/time/internal/cctz/src/time_zone_impl.cc | 115 + absl/time/internal/cctz/src/time_zone_impl.h | 97 + absl/time/internal/cctz/src/time_zone_info.cc | 1070 ++++ absl/time/internal/cctz/src/time_zone_info.h | 128 + absl/time/internal/cctz/src/time_zone_libc.cc | 333 ++ absl/time/internal/cctz/src/time_zone_libc.h | 60 + .../internal/cctz/src/time_zone_lookup.cc | 335 ++ .../cctz/src/time_zone_lookup_test.cc | 1405 ++++++ .../time/internal/cctz/src/time_zone_posix.cc | 159 + absl/time/internal/cctz/src/time_zone_posix.h | 132 + absl/time/internal/cctz/src/tzfile.h | 120 + .../internal/cctz/src/zone_info_source.cc | 116 + .../internal/cctz/testdata/README.zoneinfo | 38 + absl/time/internal/cctz/testdata/version | 1 + .../cctz/testdata/zoneinfo/Africa/Abidjan | Bin 0 -> 130 bytes .../cctz/testdata/zoneinfo/Africa/Accra | Bin 0 -> 700 bytes .../cctz/testdata/zoneinfo/Africa/Addis_Ababa | Bin 0 -> 151 bytes .../cctz/testdata/zoneinfo/Africa/Algiers | Bin 0 -> 470 bytes .../cctz/testdata/zoneinfo/Africa/Asmara | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Asmera | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Africa/Bamako | Bin 0 -> 158 bytes .../cctz/testdata/zoneinfo/Africa/Bangui | Bin 0 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Banjul | Bin 0 -> 168 bytes .../cctz/testdata/zoneinfo/Africa/Bissau | Bin 0 -> 149 bytes .../cctz/testdata/zoneinfo/Africa/Blantyre | Bin 0 -> 165 bytes .../cctz/testdata/zoneinfo/Africa/Brazzaville | Bin 0 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Bujumbura | Bin 0 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Cairo | Bin 0 -> 1309 bytes .../cctz/testdata/zoneinfo/Africa/Casablanca | Bin 0 -> 1919 bytes .../cctz/testdata/zoneinfo/Africa/Ceuta | Bin 0 -> 562 bytes .../cctz/testdata/zoneinfo/Africa/Conakry | Bin 0 -> 158 bytes .../cctz/testdata/zoneinfo/Africa/Dakar | Bin 0 -> 149 bytes .../testdata/zoneinfo/Africa/Dar_es_Salaam | Bin 0 -> 161 bytes .../cctz/testdata/zoneinfo/Africa/Djibouti | Bin 0 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Douala | Bin 0 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/El_Aaiun | Bin 0 -> 1830 bytes .../cctz/testdata/zoneinfo/Africa/Freetown | Bin 0 -> 324 bytes .../cctz/testdata/zoneinfo/Africa/Gaborone | Bin 0 -> 180 bytes .../cctz/testdata/zoneinfo/Africa/Harare | Bin 0 -> 131 bytes .../testdata/zoneinfo/Africa/Johannesburg | Bin 0 -> 190 bytes .../cctz/testdata/zoneinfo/Africa/Juba | Bin 0 -> 458 bytes .../cctz/testdata/zoneinfo/Africa/Kampala | Bin 0 -> 182 bytes .../cctz/testdata/zoneinfo/Africa/Khartoum | Bin 0 -> 458 bytes .../cctz/testdata/zoneinfo/Africa/Kigali | Bin 0 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Kinshasa | Bin 0 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Lagos | Bin 0 -> 180 bytes .../cctz/testdata/zoneinfo/Africa/Libreville | Bin 0 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Lome | Bin 0 -> 130 bytes .../cctz/testdata/zoneinfo/Africa/Luanda | Bin 0 -> 146 bytes .../cctz/testdata/zoneinfo/Africa/Lubumbashi | Bin 0 -> 150 bytes .../cctz/testdata/zoneinfo/Africa/Lusaka | Bin 0 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Malabo | Bin 0 -> 150 bytes .../cctz/testdata/zoneinfo/Africa/Maputo | Bin 0 -> 131 bytes .../cctz/testdata/zoneinfo/Africa/Maseru | Bin 0 -> 157 bytes .../cctz/testdata/zoneinfo/Africa/Mbabane | Bin 0 -> 133 bytes .../cctz/testdata/zoneinfo/Africa/Mogadishu | Bin 0 -> 161 bytes .../cctz/testdata/zoneinfo/Africa/Monrovia | Bin 0 -> 164 bytes .../cctz/testdata/zoneinfo/Africa/Nairobi | Bin 0 -> 191 bytes .../cctz/testdata/zoneinfo/Africa/Ndjamena | Bin 0 -> 160 bytes .../cctz/testdata/zoneinfo/Africa/Niamey | Bin 0 -> 169 bytes .../cctz/testdata/zoneinfo/Africa/Nouakchott | Bin 0 -> 158 bytes .../cctz/testdata/zoneinfo/Africa/Ouagadougou | Bin 0 -> 130 bytes .../cctz/testdata/zoneinfo/Africa/Porto-Novo | Bin 0 -> 150 bytes .../cctz/testdata/zoneinfo/Africa/Sao_Tome | Bin 0 -> 173 bytes .../cctz/testdata/zoneinfo/Africa/Timbuktu | Bin 0 -> 158 bytes .../cctz/testdata/zoneinfo/Africa/Tripoli | Bin 0 -> 431 bytes .../cctz/testdata/zoneinfo/Africa/Tunis | Bin 0 -> 449 bytes .../cctz/testdata/zoneinfo/Africa/Windhoek | Bin 0 -> 638 bytes .../cctz/testdata/zoneinfo/America/Adak | Bin 0 -> 969 bytes .../cctz/testdata/zoneinfo/America/Anchorage | Bin 0 -> 977 bytes .../cctz/testdata/zoneinfo/America/Anguilla | Bin 0 -> 130 bytes .../cctz/testdata/zoneinfo/America/Antigua | Bin 0 -> 149 bytes .../cctz/testdata/zoneinfo/America/Araguaina | Bin 0 -> 592 bytes .../zoneinfo/America/Argentina/Buenos_Aires | Bin 0 -> 708 bytes .../zoneinfo/America/Argentina/Catamarca | Bin 0 -> 708 bytes .../zoneinfo/America/Argentina/ComodRivadavia | Bin 0 -> 708 bytes .../zoneinfo/America/Argentina/Cordoba | Bin 0 -> 708 bytes .../testdata/zoneinfo/America/Argentina/Jujuy | Bin 0 -> 690 bytes .../zoneinfo/America/Argentina/La_Rioja | Bin 0 -> 717 bytes .../zoneinfo/America/Argentina/Mendoza | Bin 0 -> 708 bytes .../zoneinfo/America/Argentina/Rio_Gallegos | Bin 0 -> 708 bytes .../testdata/zoneinfo/America/Argentina/Salta | Bin 0 -> 690 bytes .../zoneinfo/America/Argentina/San_Juan | Bin 0 -> 717 bytes .../zoneinfo/America/Argentina/San_Luis | Bin 0 -> 717 bytes .../zoneinfo/America/Argentina/Tucuman | Bin 0 -> 726 bytes .../zoneinfo/America/Argentina/Ushuaia | Bin 0 -> 708 bytes .../cctz/testdata/zoneinfo/America/Aruba | Bin 0 -> 151 bytes .../cctz/testdata/zoneinfo/America/Asuncion | Bin 0 -> 1085 bytes .../cctz/testdata/zoneinfo/America/Atikokan | Bin 0 -> 224 bytes .../cctz/testdata/zoneinfo/America/Atka | Bin 0 -> 969 bytes .../cctz/testdata/zoneinfo/America/Bahia | Bin 0 -> 682 bytes .../testdata/zoneinfo/America/Bahia_Banderas | Bin 0 -> 700 bytes .../cctz/testdata/zoneinfo/America/Barbados | Bin 0 -> 278 bytes .../cctz/testdata/zoneinfo/America/Belem | Bin 0 -> 394 bytes .../cctz/testdata/zoneinfo/America/Belize | Bin 0 -> 1045 bytes .../testdata/zoneinfo/America/Blanc-Sablon | Bin 0 -> 205 bytes .../cctz/testdata/zoneinfo/America/Boa_Vista | Bin 0 -> 430 bytes .../cctz/testdata/zoneinfo/America/Bogota | Bin 0 -> 179 bytes .../cctz/testdata/zoneinfo/America/Boise | Bin 0 -> 999 bytes .../testdata/zoneinfo/America/Buenos_Aires | Bin 0 -> 708 bytes .../testdata/zoneinfo/America/Cambridge_Bay | Bin 0 -> 883 bytes .../testdata/zoneinfo/America/Campo_Grande | Bin 0 -> 952 bytes .../cctz/testdata/zoneinfo/America/Cancun | Bin 0 -> 538 bytes .../cctz/testdata/zoneinfo/America/Caracas | Bin 0 -> 190 bytes .../cctz/testdata/zoneinfo/America/Catamarca | Bin 0 -> 708 bytes .../cctz/testdata/zoneinfo/America/Cayenne | Bin 0 -> 151 bytes .../cctz/testdata/zoneinfo/America/Cayman | Bin 0 -> 149 bytes .../cctz/testdata/zoneinfo/America/Chicago | Bin 0 -> 1754 bytes .../cctz/testdata/zoneinfo/America/Chihuahua | Bin 0 -> 691 bytes .../testdata/zoneinfo/America/Ciudad_Juarez | Bin 0 -> 718 bytes .../testdata/zoneinfo/America/Coral_Harbour | Bin 0 -> 224 bytes .../cctz/testdata/zoneinfo/America/Cordoba | Bin 0 -> 708 bytes .../cctz/testdata/zoneinfo/America/Costa_Rica | Bin 0 -> 232 bytes .../cctz/testdata/zoneinfo/America/Creston | Bin 0 -> 158 bytes .../cctz/testdata/zoneinfo/America/Cuiaba | Bin 0 -> 934 bytes .../cctz/testdata/zoneinfo/America/Curacao | Bin 0 -> 151 bytes .../testdata/zoneinfo/America/Danmarkshavn | Bin 0 -> 447 bytes .../cctz/testdata/zoneinfo/America/Dawson | Bin 0 -> 1029 bytes .../testdata/zoneinfo/America/Dawson_Creek | Bin 0 -> 683 bytes .../cctz/testdata/zoneinfo/America/Denver | Bin 0 -> 1042 bytes .../cctz/testdata/zoneinfo/America/Detroit | Bin 0 -> 899 bytes .../cctz/testdata/zoneinfo/America/Dominica | Bin 0 -> 130 bytes .../cctz/testdata/zoneinfo/America/Edmonton | Bin 0 -> 970 bytes .../cctz/testdata/zoneinfo/America/Eirunepe | Bin 0 -> 436 bytes .../testdata/zoneinfo/America/El_Salvador | Bin 0 -> 176 bytes .../cctz/testdata/zoneinfo/America/Ensenada | Bin 0 -> 1079 bytes .../testdata/zoneinfo/America/Fort_Nelson | Bin 0 -> 1448 bytes .../cctz/testdata/zoneinfo/America/Fort_Wayne | Bin 0 -> 531 bytes .../cctz/testdata/zoneinfo/America/Fortaleza | Bin 0 -> 484 bytes .../cctz/testdata/zoneinfo/America/Glace_Bay | Bin 0 -> 880 bytes .../cctz/testdata/zoneinfo/America/Godthab | Bin 0 -> 965 bytes .../cctz/testdata/zoneinfo/America/Goose_Bay | Bin 0 -> 1580 bytes .../cctz/testdata/zoneinfo/America/Grand_Turk | Bin 0 -> 853 bytes .../cctz/testdata/zoneinfo/America/Grenada | Bin 0 -> 130 bytes .../cctz/testdata/zoneinfo/America/Guadeloupe | Bin 0 -> 130 bytes .../cctz/testdata/zoneinfo/America/Guatemala | Bin 0 -> 212 bytes .../cctz/testdata/zoneinfo/America/Guayaquil | Bin 0 -> 179 bytes .../cctz/testdata/zoneinfo/America/Guyana | Bin 0 -> 181 bytes .../cctz/testdata/zoneinfo/America/Halifax | Bin 0 -> 1672 bytes .../cctz/testdata/zoneinfo/America/Havana | Bin 0 -> 1117 bytes .../cctz/testdata/zoneinfo/America/Hermosillo | Bin 0 -> 258 bytes .../zoneinfo/America/Indiana/Indianapolis | Bin 0 -> 531 bytes .../testdata/zoneinfo/America/Indiana/Knox | Bin 0 -> 1016 bytes .../testdata/zoneinfo/America/Indiana/Marengo | Bin 0 -> 567 bytes .../zoneinfo/America/Indiana/Petersburg | Bin 0 -> 683 bytes .../zoneinfo/America/Indiana/Tell_City | Bin 0 -> 522 bytes .../testdata/zoneinfo/America/Indiana/Vevay | Bin 0 -> 369 bytes .../zoneinfo/America/Indiana/Vincennes | Bin 0 -> 558 bytes .../testdata/zoneinfo/America/Indiana/Winamac | Bin 0 -> 603 bytes .../testdata/zoneinfo/America/Indianapolis | Bin 0 -> 531 bytes .../cctz/testdata/zoneinfo/America/Inuvik | Bin 0 -> 817 bytes .../cctz/testdata/zoneinfo/America/Iqaluit | Bin 0 -> 855 bytes .../cctz/testdata/zoneinfo/America/Jamaica | Bin 0 -> 339 bytes .../cctz/testdata/zoneinfo/America/Jujuy | Bin 0 -> 690 bytes .../cctz/testdata/zoneinfo/America/Juneau | Bin 0 -> 966 bytes .../zoneinfo/America/Kentucky/Louisville | Bin 0 -> 1242 bytes .../zoneinfo/America/Kentucky/Monticello | Bin 0 -> 972 bytes .../cctz/testdata/zoneinfo/America/Knox_IN | Bin 0 -> 1016 bytes .../cctz/testdata/zoneinfo/America/Kralendijk | Bin 0 -> 151 bytes .../cctz/testdata/zoneinfo/America/La_Paz | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/America/Lima | Bin 0 -> 283 bytes .../testdata/zoneinfo/America/Los_Angeles | Bin 0 -> 1294 bytes .../cctz/testdata/zoneinfo/America/Louisville | Bin 0 -> 1242 bytes .../testdata/zoneinfo/America/Lower_Princes | Bin 0 -> 151 bytes .../cctz/testdata/zoneinfo/America/Maceio | Bin 0 -> 502 bytes .../cctz/testdata/zoneinfo/America/Managua | Bin 0 -> 295 bytes .../cctz/testdata/zoneinfo/America/Manaus | Bin 0 -> 412 bytes .../cctz/testdata/zoneinfo/America/Marigot | Bin 0 -> 130 bytes .../cctz/testdata/zoneinfo/America/Martinique | Bin 0 -> 178 bytes .../cctz/testdata/zoneinfo/America/Matamoros | Bin 0 -> 437 bytes .../cctz/testdata/zoneinfo/America/Mazatlan | Bin 0 -> 690 bytes .../cctz/testdata/zoneinfo/America/Mendoza | Bin 0 -> 708 bytes .../cctz/testdata/zoneinfo/America/Menominee | Bin 0 -> 917 bytes .../cctz/testdata/zoneinfo/America/Merida | Bin 0 -> 654 bytes .../cctz/testdata/zoneinfo/America/Metlakatla | Bin 0 -> 586 bytes .../testdata/zoneinfo/America/Mexico_City | Bin 0 -> 773 bytes .../cctz/testdata/zoneinfo/America/Miquelon | Bin 0 -> 550 bytes .../cctz/testdata/zoneinfo/America/Moncton | Bin 0 -> 1493 bytes .../cctz/testdata/zoneinfo/America/Monterrey | Bin 0 -> 709 bytes .../cctz/testdata/zoneinfo/America/Montevideo | Bin 0 -> 969 bytes .../cctz/testdata/zoneinfo/America/Montreal | Bin 0 -> 1717 bytes .../cctz/testdata/zoneinfo/America/Montserrat | Bin 0 -> 130 bytes .../cctz/testdata/zoneinfo/America/Nassau | Bin 0 -> 1006 bytes .../cctz/testdata/zoneinfo/America/New_York | Bin 0 -> 1744 bytes .../cctz/testdata/zoneinfo/America/Nipigon | Bin 0 -> 1717 bytes .../cctz/testdata/zoneinfo/America/Nome | Bin 0 -> 975 bytes .../cctz/testdata/zoneinfo/America/Noronha | Bin 0 -> 484 bytes .../zoneinfo/America/North_Dakota/Beulah | Bin 0 -> 1043 bytes .../zoneinfo/America/North_Dakota/Center | Bin 0 -> 990 bytes .../zoneinfo/America/North_Dakota/New_Salem | Bin 0 -> 990 bytes .../cctz/testdata/zoneinfo/America/Nuuk | Bin 0 -> 965 bytes .../cctz/testdata/zoneinfo/America/Ojinaga | Bin 0 -> 718 bytes .../cctz/testdata/zoneinfo/America/Panama | Bin 0 -> 149 bytes .../testdata/zoneinfo/America/Pangnirtung | Bin 0 -> 855 bytes .../cctz/testdata/zoneinfo/America/Paramaribo | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/America/Phoenix | Bin 0 -> 240 bytes .../testdata/zoneinfo/America/Port-au-Prince | Bin 0 -> 565 bytes .../testdata/zoneinfo/America/Port_of_Spain | Bin 0 -> 130 bytes .../cctz/testdata/zoneinfo/America/Porto_Acre | Bin 0 -> 418 bytes .../testdata/zoneinfo/America/Porto_Velho | Bin 0 -> 394 bytes .../testdata/zoneinfo/America/Puerto_Rico | Bin 0 -> 177 bytes .../testdata/zoneinfo/America/Punta_Arenas | Bin 0 -> 1218 bytes .../testdata/zoneinfo/America/Rainy_River | Bin 0 -> 1294 bytes .../testdata/zoneinfo/America/Rankin_Inlet | Bin 0 -> 807 bytes .../cctz/testdata/zoneinfo/America/Recife | Bin 0 -> 484 bytes .../cctz/testdata/zoneinfo/America/Regina | Bin 0 -> 638 bytes .../cctz/testdata/zoneinfo/America/Resolute | Bin 0 -> 807 bytes .../cctz/testdata/zoneinfo/America/Rio_Branco | Bin 0 -> 418 bytes .../cctz/testdata/zoneinfo/America/Rosario | Bin 0 -> 708 bytes .../testdata/zoneinfo/America/Santa_Isabel | Bin 0 -> 1079 bytes .../cctz/testdata/zoneinfo/America/Santarem | Bin 0 -> 409 bytes .../cctz/testdata/zoneinfo/America/Santiago | Bin 0 -> 1354 bytes .../testdata/zoneinfo/America/Santo_Domingo | Bin 0 -> 317 bytes .../cctz/testdata/zoneinfo/America/Sao_Paulo | Bin 0 -> 952 bytes .../testdata/zoneinfo/America/Scoresbysund | Bin 0 -> 984 bytes .../cctz/testdata/zoneinfo/America/Shiprock | Bin 0 -> 1042 bytes .../cctz/testdata/zoneinfo/America/Sitka | Bin 0 -> 956 bytes .../testdata/zoneinfo/America/St_Barthelemy | Bin 0 -> 130 bytes .../cctz/testdata/zoneinfo/America/St_Johns | Bin 0 -> 1878 bytes .../cctz/testdata/zoneinfo/America/St_Kitts | Bin 0 -> 130 bytes .../cctz/testdata/zoneinfo/America/St_Lucia | Bin 0 -> 149 bytes .../cctz/testdata/zoneinfo/America/St_Thomas | Bin 0 -> 130 bytes .../cctz/testdata/zoneinfo/America/St_Vincent | Bin 0 -> 149 bytes .../testdata/zoneinfo/America/Swift_Current | Bin 0 -> 368 bytes .../testdata/zoneinfo/America/Tegucigalpa | Bin 0 -> 194 bytes .../cctz/testdata/zoneinfo/America/Thule | Bin 0 -> 455 bytes .../testdata/zoneinfo/America/Thunder_Bay | Bin 0 -> 1717 bytes .../cctz/testdata/zoneinfo/America/Tijuana | Bin 0 -> 1079 bytes .../cctz/testdata/zoneinfo/America/Toronto | Bin 0 -> 1717 bytes .../cctz/testdata/zoneinfo/America/Tortola | Bin 0 -> 130 bytes .../cctz/testdata/zoneinfo/America/Vancouver | Bin 0 -> 1330 bytes .../cctz/testdata/zoneinfo/America/Virgin | Bin 0 -> 130 bytes .../cctz/testdata/zoneinfo/America/Whitehorse | Bin 0 -> 1029 bytes .../cctz/testdata/zoneinfo/America/Winnipeg | Bin 0 -> 1294 bytes .../cctz/testdata/zoneinfo/America/Yakutat | Bin 0 -> 946 bytes .../testdata/zoneinfo/America/Yellowknife | Bin 0 -> 970 bytes .../cctz/testdata/zoneinfo/Antarctica/Casey | Bin 0 -> 287 bytes .../cctz/testdata/zoneinfo/Antarctica/Davis | Bin 0 -> 197 bytes .../zoneinfo/Antarctica/DumontDUrville | Bin 0 -> 152 bytes .../testdata/zoneinfo/Antarctica/Macquarie | Bin 0 -> 976 bytes .../cctz/testdata/zoneinfo/Antarctica/Mawson | Bin 0 -> 152 bytes .../cctz/testdata/zoneinfo/Antarctica/McMurdo | Bin 0 -> 768 bytes .../cctz/testdata/zoneinfo/Antarctica/Palmer | Bin 0 -> 887 bytes .../cctz/testdata/zoneinfo/Antarctica/Rothera | Bin 0 -> 132 bytes .../testdata/zoneinfo/Antarctica/South_Pole | Bin 0 -> 768 bytes .../cctz/testdata/zoneinfo/Antarctica/Syowa | Bin 0 -> 133 bytes .../cctz/testdata/zoneinfo/Antarctica/Troll | Bin 0 -> 158 bytes .../cctz/testdata/zoneinfo/Antarctica/Vostok | Bin 0 -> 170 bytes .../testdata/zoneinfo/Arctic/Longyearbyen | Bin 0 -> 676 bytes .../internal/cctz/testdata/zoneinfo/Asia/Aden | Bin 0 -> 133 bytes .../cctz/testdata/zoneinfo/Asia/Almaty | Bin 0 -> 618 bytes .../cctz/testdata/zoneinfo/Asia/Amman | Bin 0 -> 928 bytes .../cctz/testdata/zoneinfo/Asia/Anadyr | Bin 0 -> 743 bytes .../cctz/testdata/zoneinfo/Asia/Aqtau | Bin 0 -> 606 bytes .../cctz/testdata/zoneinfo/Asia/Aqtobe | Bin 0 -> 615 bytes .../cctz/testdata/zoneinfo/Asia/Ashgabat | Bin 0 -> 375 bytes .../cctz/testdata/zoneinfo/Asia/Ashkhabad | Bin 0 -> 375 bytes .../cctz/testdata/zoneinfo/Asia/Atyrau | Bin 0 -> 616 bytes .../cctz/testdata/zoneinfo/Asia/Baghdad | Bin 0 -> 630 bytes .../cctz/testdata/zoneinfo/Asia/Bahrain | Bin 0 -> 173 bytes .../internal/cctz/testdata/zoneinfo/Asia/Baku | Bin 0 -> 744 bytes .../cctz/testdata/zoneinfo/Asia/Bangkok | Bin 0 -> 152 bytes .../cctz/testdata/zoneinfo/Asia/Barnaul | Bin 0 -> 753 bytes .../cctz/testdata/zoneinfo/Asia/Beirut | Bin 0 -> 732 bytes .../cctz/testdata/zoneinfo/Asia/Bishkek | Bin 0 -> 618 bytes .../cctz/testdata/zoneinfo/Asia/Brunei | Bin 0 -> 154 bytes .../cctz/testdata/zoneinfo/Asia/Calcutta | Bin 0 -> 220 bytes .../cctz/testdata/zoneinfo/Asia/Chita | Bin 0 -> 750 bytes .../cctz/testdata/zoneinfo/Asia/Choibalsan | Bin 0 -> 594 bytes .../cctz/testdata/zoneinfo/Asia/Chongqing | Bin 0 -> 393 bytes .../cctz/testdata/zoneinfo/Asia/Chungking | Bin 0 -> 393 bytes .../cctz/testdata/zoneinfo/Asia/Colombo | Bin 0 -> 247 bytes .../cctz/testdata/zoneinfo/Asia/Dacca | Bin 0 -> 231 bytes .../cctz/testdata/zoneinfo/Asia/Damascus | Bin 0 -> 1234 bytes .../cctz/testdata/zoneinfo/Asia/Dhaka | Bin 0 -> 231 bytes .../internal/cctz/testdata/zoneinfo/Asia/Dili | Bin 0 -> 170 bytes .../cctz/testdata/zoneinfo/Asia/Dubai | Bin 0 -> 133 bytes .../cctz/testdata/zoneinfo/Asia/Dushanbe | Bin 0 -> 366 bytes .../cctz/testdata/zoneinfo/Asia/Famagusta | Bin 0 -> 940 bytes .../internal/cctz/testdata/zoneinfo/Asia/Gaza | Bin 0 -> 2950 bytes .../cctz/testdata/zoneinfo/Asia/Harbin | Bin 0 -> 393 bytes .../cctz/testdata/zoneinfo/Asia/Hebron | Bin 0 -> 2968 bytes .../cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh | Bin 0 -> 236 bytes .../cctz/testdata/zoneinfo/Asia/Hong_Kong | Bin 0 -> 775 bytes .../internal/cctz/testdata/zoneinfo/Asia/Hovd | Bin 0 -> 594 bytes .../cctz/testdata/zoneinfo/Asia/Irkutsk | Bin 0 -> 760 bytes .../cctz/testdata/zoneinfo/Asia/Istanbul | Bin 0 -> 1200 bytes .../cctz/testdata/zoneinfo/Asia/Jakarta | Bin 0 -> 248 bytes .../cctz/testdata/zoneinfo/Asia/Jayapura | Bin 0 -> 171 bytes .../cctz/testdata/zoneinfo/Asia/Jerusalem | Bin 0 -> 1074 bytes .../cctz/testdata/zoneinfo/Asia/Kabul | Bin 0 -> 159 bytes .../cctz/testdata/zoneinfo/Asia/Kamchatka | Bin 0 -> 727 bytes .../cctz/testdata/zoneinfo/Asia/Karachi | Bin 0 -> 266 bytes .../cctz/testdata/zoneinfo/Asia/Kashgar | Bin 0 -> 133 bytes .../cctz/testdata/zoneinfo/Asia/Kathmandu | Bin 0 -> 161 bytes .../cctz/testdata/zoneinfo/Asia/Katmandu | Bin 0 -> 161 bytes .../cctz/testdata/zoneinfo/Asia/Khandyga | Bin 0 -> 775 bytes .../cctz/testdata/zoneinfo/Asia/Kolkata | Bin 0 -> 220 bytes .../cctz/testdata/zoneinfo/Asia/Krasnoyarsk | Bin 0 -> 741 bytes .../cctz/testdata/zoneinfo/Asia/Kuala_Lumpur | Bin 0 -> 256 bytes .../cctz/testdata/zoneinfo/Asia/Kuching | Bin 0 -> 320 bytes .../cctz/testdata/zoneinfo/Asia/Kuwait | Bin 0 -> 133 bytes .../cctz/testdata/zoneinfo/Asia/Macao | Bin 0 -> 791 bytes .../cctz/testdata/zoneinfo/Asia/Macau | Bin 0 -> 791 bytes .../cctz/testdata/zoneinfo/Asia/Magadan | Bin 0 -> 751 bytes .../cctz/testdata/zoneinfo/Asia/Makassar | Bin 0 -> 190 bytes .../cctz/testdata/zoneinfo/Asia/Manila | Bin 0 -> 274 bytes .../cctz/testdata/zoneinfo/Asia/Muscat | Bin 0 -> 133 bytes .../cctz/testdata/zoneinfo/Asia/Nicosia | Bin 0 -> 597 bytes .../cctz/testdata/zoneinfo/Asia/Novokuznetsk | Bin 0 -> 726 bytes .../cctz/testdata/zoneinfo/Asia/Novosibirsk | Bin 0 -> 753 bytes .../internal/cctz/testdata/zoneinfo/Asia/Omsk | Bin 0 -> 741 bytes .../internal/cctz/testdata/zoneinfo/Asia/Oral | Bin 0 -> 625 bytes .../cctz/testdata/zoneinfo/Asia/Phnom_Penh | Bin 0 -> 200 bytes .../cctz/testdata/zoneinfo/Asia/Pontianak | Bin 0 -> 247 bytes .../cctz/testdata/zoneinfo/Asia/Pyongyang | Bin 0 -> 183 bytes .../cctz/testdata/zoneinfo/Asia/Qatar | Bin 0 -> 152 bytes .../cctz/testdata/zoneinfo/Asia/Qostanay | Bin 0 -> 624 bytes .../cctz/testdata/zoneinfo/Asia/Qyzylorda | Bin 0 -> 624 bytes .../cctz/testdata/zoneinfo/Asia/Rangoon | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Riyadh | Bin 0 -> 133 bytes .../cctz/testdata/zoneinfo/Asia/Saigon | Bin 0 -> 236 bytes .../cctz/testdata/zoneinfo/Asia/Sakhalin | Bin 0 -> 755 bytes .../cctz/testdata/zoneinfo/Asia/Samarkand | Bin 0 -> 366 bytes .../cctz/testdata/zoneinfo/Asia/Seoul | Bin 0 -> 415 bytes .../cctz/testdata/zoneinfo/Asia/Shanghai | Bin 0 -> 393 bytes .../cctz/testdata/zoneinfo/Asia/Singapore | Bin 0 -> 256 bytes .../cctz/testdata/zoneinfo/Asia/Srednekolymsk | Bin 0 -> 742 bytes .../cctz/testdata/zoneinfo/Asia/Taipei | Bin 0 -> 511 bytes .../cctz/testdata/zoneinfo/Asia/Tashkent | Bin 0 -> 366 bytes .../cctz/testdata/zoneinfo/Asia/Tbilisi | Bin 0 -> 629 bytes .../cctz/testdata/zoneinfo/Asia/Tehran | Bin 0 -> 812 bytes .../cctz/testdata/zoneinfo/Asia/Tel_Aviv | Bin 0 -> 1074 bytes .../cctz/testdata/zoneinfo/Asia/Thimbu | Bin 0 -> 154 bytes .../cctz/testdata/zoneinfo/Asia/Thimphu | Bin 0 -> 154 bytes .../cctz/testdata/zoneinfo/Asia/Tokyo | Bin 0 -> 213 bytes .../cctz/testdata/zoneinfo/Asia/Tomsk | Bin 0 -> 753 bytes .../cctz/testdata/zoneinfo/Asia/Ujung_Pandang | Bin 0 -> 190 bytes .../cctz/testdata/zoneinfo/Asia/Ulaanbaatar | Bin 0 -> 594 bytes .../cctz/testdata/zoneinfo/Asia/Ulan_Bator | Bin 0 -> 594 bytes .../cctz/testdata/zoneinfo/Asia/Urumqi | Bin 0 -> 133 bytes .../cctz/testdata/zoneinfo/Asia/Ust-Nera | Bin 0 -> 771 bytes .../cctz/testdata/zoneinfo/Asia/Vientiane | Bin 0 -> 218 bytes .../cctz/testdata/zoneinfo/Asia/Vladivostok | Bin 0 -> 742 bytes .../cctz/testdata/zoneinfo/Asia/Yakutsk | Bin 0 -> 741 bytes .../cctz/testdata/zoneinfo/Asia/Yangon | Bin 0 -> 187 bytes .../cctz/testdata/zoneinfo/Asia/Yekaterinburg | Bin 0 -> 760 bytes .../cctz/testdata/zoneinfo/Asia/Yerevan | Bin 0 -> 708 bytes .../cctz/testdata/zoneinfo/Atlantic/Azores | Bin 0 -> 1401 bytes .../cctz/testdata/zoneinfo/Atlantic/Bermuda | Bin 0 -> 1024 bytes .../cctz/testdata/zoneinfo/Atlantic/Canary | Bin 0 -> 478 bytes .../testdata/zoneinfo/Atlantic/Cape_Verde | Bin 0 -> 175 bytes .../cctz/testdata/zoneinfo/Atlantic/Faeroe | Bin 0 -> 441 bytes .../cctz/testdata/zoneinfo/Atlantic/Faroe | Bin 0 -> 441 bytes .../cctz/testdata/zoneinfo/Atlantic/Jan_Mayen | Bin 0 -> 676 bytes .../cctz/testdata/zoneinfo/Atlantic/Madeira | Bin 0 -> 1372 bytes .../cctz/testdata/zoneinfo/Atlantic/Reykjavik | Bin 0 -> 753 bytes .../testdata/zoneinfo/Atlantic/South_Georgia | Bin 0 -> 132 bytes .../cctz/testdata/zoneinfo/Atlantic/St_Helena | Bin 0 -> 149 bytes .../cctz/testdata/zoneinfo/Atlantic/Stanley | Bin 0 -> 789 bytes .../cctz/testdata/zoneinfo/Australia/ACT | Bin 0 -> 904 bytes .../cctz/testdata/zoneinfo/Australia/Adelaide | Bin 0 -> 921 bytes .../cctz/testdata/zoneinfo/Australia/Brisbane | Bin 0 -> 289 bytes .../testdata/zoneinfo/Australia/Broken_Hill | Bin 0 -> 941 bytes .../cctz/testdata/zoneinfo/Australia/Canberra | Bin 0 -> 904 bytes .../cctz/testdata/zoneinfo/Australia/Currie | Bin 0 -> 1003 bytes .../cctz/testdata/zoneinfo/Australia/Darwin | Bin 0 -> 234 bytes .../cctz/testdata/zoneinfo/Australia/Eucla | Bin 0 -> 314 bytes .../cctz/testdata/zoneinfo/Australia/Hobart | Bin 0 -> 1003 bytes .../cctz/testdata/zoneinfo/Australia/LHI | Bin 0 -> 692 bytes .../cctz/testdata/zoneinfo/Australia/Lindeman | Bin 0 -> 325 bytes .../testdata/zoneinfo/Australia/Lord_Howe | Bin 0 -> 692 bytes .../testdata/zoneinfo/Australia/Melbourne | Bin 0 -> 904 bytes .../cctz/testdata/zoneinfo/Australia/NSW | Bin 0 -> 904 bytes .../cctz/testdata/zoneinfo/Australia/North | Bin 0 -> 234 bytes .../cctz/testdata/zoneinfo/Australia/Perth | Bin 0 -> 306 bytes .../testdata/zoneinfo/Australia/Queensland | Bin 0 -> 289 bytes .../cctz/testdata/zoneinfo/Australia/South | Bin 0 -> 921 bytes .../cctz/testdata/zoneinfo/Australia/Sydney | Bin 0 -> 904 bytes .../cctz/testdata/zoneinfo/Australia/Tasmania | Bin 0 -> 1003 bytes .../cctz/testdata/zoneinfo/Australia/Victoria | Bin 0 -> 904 bytes .../cctz/testdata/zoneinfo/Australia/West | Bin 0 -> 306 bytes .../testdata/zoneinfo/Australia/Yancowinna | Bin 0 -> 941 bytes .../cctz/testdata/zoneinfo/Brazil/Acre | Bin 0 -> 418 bytes .../cctz/testdata/zoneinfo/Brazil/DeNoronha | Bin 0 -> 484 bytes .../cctz/testdata/zoneinfo/Brazil/East | Bin 0 -> 952 bytes .../cctz/testdata/zoneinfo/Brazil/West | Bin 0 -> 412 bytes absl/time/internal/cctz/testdata/zoneinfo/CET | Bin 0 -> 1103 bytes .../internal/cctz/testdata/zoneinfo/CST6CDT | Bin 0 -> 1754 bytes .../cctz/testdata/zoneinfo/Canada/Atlantic | Bin 0 -> 1672 bytes .../cctz/testdata/zoneinfo/Canada/Central | Bin 0 -> 1294 bytes .../cctz/testdata/zoneinfo/Canada/Eastern | Bin 0 -> 1717 bytes .../cctz/testdata/zoneinfo/Canada/Mountain | Bin 0 -> 970 bytes .../testdata/zoneinfo/Canada/Newfoundland | Bin 0 -> 1878 bytes .../cctz/testdata/zoneinfo/Canada/Pacific | Bin 0 -> 1330 bytes .../testdata/zoneinfo/Canada/Saskatchewan | Bin 0 -> 638 bytes .../cctz/testdata/zoneinfo/Canada/Yukon | Bin 0 -> 1029 bytes .../cctz/testdata/zoneinfo/Chile/Continental | Bin 0 -> 1354 bytes .../cctz/testdata/zoneinfo/Chile/EasterIsland | Bin 0 -> 1174 bytes .../time/internal/cctz/testdata/zoneinfo/Cuba | Bin 0 -> 1117 bytes absl/time/internal/cctz/testdata/zoneinfo/EET | Bin 0 -> 682 bytes absl/time/internal/cctz/testdata/zoneinfo/EST | Bin 0 -> 149 bytes .../internal/cctz/testdata/zoneinfo/EST5EDT | Bin 0 -> 1744 bytes .../internal/cctz/testdata/zoneinfo/Egypt | Bin 0 -> 1309 bytes .../time/internal/cctz/testdata/zoneinfo/Eire | Bin 0 -> 1496 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT | Bin 0 -> 111 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+0 | Bin 0 -> 111 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+1 | Bin 0 -> 113 bytes .../cctz/testdata/zoneinfo/Etc/GMT+10 | Bin 0 -> 114 bytes .../cctz/testdata/zoneinfo/Etc/GMT+11 | Bin 0 -> 114 bytes .../cctz/testdata/zoneinfo/Etc/GMT+12 | Bin 0 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+2 | Bin 0 -> 113 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+3 | Bin 0 -> 113 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+4 | Bin 0 -> 113 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+5 | Bin 0 -> 113 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+6 | Bin 0 -> 113 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+7 | Bin 0 -> 113 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+8 | Bin 0 -> 113 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT+9 | Bin 0 -> 113 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-0 | Bin 0 -> 111 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-1 | Bin 0 -> 114 bytes .../cctz/testdata/zoneinfo/Etc/GMT-10 | Bin 0 -> 115 bytes .../cctz/testdata/zoneinfo/Etc/GMT-11 | Bin 0 -> 115 bytes .../cctz/testdata/zoneinfo/Etc/GMT-12 | Bin 0 -> 115 bytes .../cctz/testdata/zoneinfo/Etc/GMT-13 | Bin 0 -> 115 bytes .../cctz/testdata/zoneinfo/Etc/GMT-14 | Bin 0 -> 115 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-2 | Bin 0 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-3 | Bin 0 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-4 | Bin 0 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-5 | Bin 0 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-6 | Bin 0 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-7 | Bin 0 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-8 | Bin 0 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT-9 | Bin 0 -> 114 bytes .../internal/cctz/testdata/zoneinfo/Etc/GMT0 | Bin 0 -> 111 bytes .../cctz/testdata/zoneinfo/Etc/Greenwich | Bin 0 -> 111 bytes .../internal/cctz/testdata/zoneinfo/Etc/UCT | Bin 0 -> 111 bytes .../internal/cctz/testdata/zoneinfo/Etc/UTC | Bin 0 -> 111 bytes .../cctz/testdata/zoneinfo/Etc/Universal | Bin 0 -> 111 bytes .../internal/cctz/testdata/zoneinfo/Etc/Zulu | Bin 0 -> 111 bytes .../cctz/testdata/zoneinfo/Europe/Amsterdam | Bin 0 -> 1071 bytes .../cctz/testdata/zoneinfo/Europe/Andorra | Bin 0 -> 389 bytes .../cctz/testdata/zoneinfo/Europe/Astrakhan | Bin 0 -> 726 bytes .../cctz/testdata/zoneinfo/Europe/Athens | Bin 0 -> 682 bytes .../cctz/testdata/zoneinfo/Europe/Belfast | Bin 0 -> 1599 bytes .../cctz/testdata/zoneinfo/Europe/Belgrade | Bin 0 -> 478 bytes .../cctz/testdata/zoneinfo/Europe/Berlin | Bin 0 -> 705 bytes .../cctz/testdata/zoneinfo/Europe/Bratislava | Bin 0 -> 723 bytes .../cctz/testdata/zoneinfo/Europe/Brussels | Bin 0 -> 1103 bytes .../cctz/testdata/zoneinfo/Europe/Bucharest | Bin 0 -> 661 bytes .../cctz/testdata/zoneinfo/Europe/Budapest | Bin 0 -> 766 bytes .../cctz/testdata/zoneinfo/Europe/Busingen | Bin 0 -> 497 bytes .../cctz/testdata/zoneinfo/Europe/Chisinau | Bin 0 -> 755 bytes .../cctz/testdata/zoneinfo/Europe/Copenhagen | Bin 0 -> 623 bytes .../cctz/testdata/zoneinfo/Europe/Dublin | Bin 0 -> 1496 bytes .../cctz/testdata/zoneinfo/Europe/Gibraltar | Bin 0 -> 1220 bytes .../cctz/testdata/zoneinfo/Europe/Guernsey | Bin 0 -> 1611 bytes .../cctz/testdata/zoneinfo/Europe/Helsinki | Bin 0 -> 481 bytes .../cctz/testdata/zoneinfo/Europe/Isle_of_Man | Bin 0 -> 1599 bytes .../cctz/testdata/zoneinfo/Europe/Istanbul | Bin 0 -> 1200 bytes .../cctz/testdata/zoneinfo/Europe/Jersey | Bin 0 -> 1611 bytes .../cctz/testdata/zoneinfo/Europe/Kaliningrad | Bin 0 -> 904 bytes .../cctz/testdata/zoneinfo/Europe/Kiev | Bin 0 -> 558 bytes .../cctz/testdata/zoneinfo/Europe/Kirov | Bin 0 -> 735 bytes .../cctz/testdata/zoneinfo/Europe/Kyiv | Bin 0 -> 558 bytes .../cctz/testdata/zoneinfo/Europe/Lisbon | Bin 0 -> 1463 bytes .../cctz/testdata/zoneinfo/Europe/Ljubljana | Bin 0 -> 478 bytes .../cctz/testdata/zoneinfo/Europe/London | Bin 0 -> 1599 bytes .../cctz/testdata/zoneinfo/Europe/Luxembourg | Bin 0 -> 1087 bytes .../cctz/testdata/zoneinfo/Europe/Madrid | Bin 0 -> 897 bytes .../cctz/testdata/zoneinfo/Europe/Malta | Bin 0 -> 928 bytes .../cctz/testdata/zoneinfo/Europe/Mariehamn | Bin 0 -> 481 bytes .../cctz/testdata/zoneinfo/Europe/Minsk | Bin 0 -> 808 bytes .../cctz/testdata/zoneinfo/Europe/Monaco | Bin 0 -> 1114 bytes .../cctz/testdata/zoneinfo/Europe/Moscow | Bin 0 -> 908 bytes .../cctz/testdata/zoneinfo/Europe/Nicosia | Bin 0 -> 597 bytes .../cctz/testdata/zoneinfo/Europe/Oslo | Bin 0 -> 676 bytes .../cctz/testdata/zoneinfo/Europe/Paris | Bin 0 -> 1105 bytes .../cctz/testdata/zoneinfo/Europe/Podgorica | Bin 0 -> 478 bytes .../cctz/testdata/zoneinfo/Europe/Prague | Bin 0 -> 723 bytes .../cctz/testdata/zoneinfo/Europe/Riga | Bin 0 -> 694 bytes .../cctz/testdata/zoneinfo/Europe/Rome | Bin 0 -> 947 bytes .../cctz/testdata/zoneinfo/Europe/Samara | Bin 0 -> 732 bytes .../cctz/testdata/zoneinfo/Europe/San_Marino | Bin 0 -> 947 bytes .../cctz/testdata/zoneinfo/Europe/Sarajevo | Bin 0 -> 478 bytes .../cctz/testdata/zoneinfo/Europe/Saratov | Bin 0 -> 726 bytes .../cctz/testdata/zoneinfo/Europe/Simferopol | Bin 0 -> 865 bytes .../cctz/testdata/zoneinfo/Europe/Skopje | Bin 0 -> 478 bytes .../cctz/testdata/zoneinfo/Europe/Sofia | Bin 0 -> 592 bytes .../cctz/testdata/zoneinfo/Europe/Stockholm | Bin 0 -> 497 bytes .../cctz/testdata/zoneinfo/Europe/Tallinn | Bin 0 -> 675 bytes .../cctz/testdata/zoneinfo/Europe/Tirane | Bin 0 -> 604 bytes .../cctz/testdata/zoneinfo/Europe/Tiraspol | Bin 0 -> 755 bytes .../cctz/testdata/zoneinfo/Europe/Ulyanovsk | Bin 0 -> 760 bytes .../cctz/testdata/zoneinfo/Europe/Uzhgorod | Bin 0 -> 558 bytes .../cctz/testdata/zoneinfo/Europe/Vaduz | Bin 0 -> 478 bytes .../cctz/testdata/zoneinfo/Europe/Vatican | Bin 0 -> 947 bytes .../cctz/testdata/zoneinfo/Europe/Vienna | Bin 0 -> 658 bytes .../cctz/testdata/zoneinfo/Europe/Vilnius | Bin 0 -> 676 bytes .../cctz/testdata/zoneinfo/Europe/Volgograd | Bin 0 -> 753 bytes .../cctz/testdata/zoneinfo/Europe/Warsaw | Bin 0 -> 923 bytes .../cctz/testdata/zoneinfo/Europe/Zagreb | Bin 0 -> 478 bytes .../cctz/testdata/zoneinfo/Europe/Zaporozhye | Bin 0 -> 558 bytes .../cctz/testdata/zoneinfo/Europe/Zurich | Bin 0 -> 497 bytes .../internal/cctz/testdata/zoneinfo/Factory | Bin 0 -> 113 bytes absl/time/internal/cctz/testdata/zoneinfo/GB | Bin 0 -> 1599 bytes .../internal/cctz/testdata/zoneinfo/GB-Eire | Bin 0 -> 1599 bytes absl/time/internal/cctz/testdata/zoneinfo/GMT | Bin 0 -> 111 bytes .../internal/cctz/testdata/zoneinfo/GMT+0 | Bin 0 -> 111 bytes .../internal/cctz/testdata/zoneinfo/GMT-0 | Bin 0 -> 111 bytes .../time/internal/cctz/testdata/zoneinfo/GMT0 | Bin 0 -> 111 bytes .../internal/cctz/testdata/zoneinfo/Greenwich | Bin 0 -> 111 bytes absl/time/internal/cctz/testdata/zoneinfo/HST | Bin 0 -> 221 bytes .../internal/cctz/testdata/zoneinfo/Hongkong | Bin 0 -> 775 bytes .../internal/cctz/testdata/zoneinfo/Iceland | Bin 0 -> 753 bytes .../testdata/zoneinfo/Indian/Antananarivo | Bin 0 -> 160 bytes .../cctz/testdata/zoneinfo/Indian/Chagos | Bin 0 -> 152 bytes .../cctz/testdata/zoneinfo/Indian/Christmas | Bin 0 -> 133 bytes .../cctz/testdata/zoneinfo/Indian/Cocos | Bin 0 -> 140 bytes .../cctz/testdata/zoneinfo/Indian/Comoro | Bin 0 -> 131 bytes .../cctz/testdata/zoneinfo/Indian/Kerguelen | Bin 0 -> 133 bytes .../cctz/testdata/zoneinfo/Indian/Mahe | Bin 0 -> 133 bytes .../cctz/testdata/zoneinfo/Indian/Maldives | Bin 0 -> 152 bytes .../cctz/testdata/zoneinfo/Indian/Mauritius | Bin 0 -> 179 bytes .../cctz/testdata/zoneinfo/Indian/Mayotte | Bin 0 -> 131 bytes .../cctz/testdata/zoneinfo/Indian/Reunion | Bin 0 -> 133 bytes .../time/internal/cctz/testdata/zoneinfo/Iran | Bin 0 -> 812 bytes .../internal/cctz/testdata/zoneinfo/Israel | Bin 0 -> 1074 bytes .../internal/cctz/testdata/zoneinfo/Jamaica | Bin 0 -> 339 bytes .../internal/cctz/testdata/zoneinfo/Japan | Bin 0 -> 213 bytes .../internal/cctz/testdata/zoneinfo/Kwajalein | Bin 0 -> 219 bytes .../internal/cctz/testdata/zoneinfo/Libya | Bin 0 -> 431 bytes absl/time/internal/cctz/testdata/zoneinfo/MET | Bin 0 -> 1103 bytes absl/time/internal/cctz/testdata/zoneinfo/MST | Bin 0 -> 240 bytes .../internal/cctz/testdata/zoneinfo/MST7MDT | Bin 0 -> 1042 bytes .../cctz/testdata/zoneinfo/Mexico/BajaNorte | Bin 0 -> 1079 bytes .../cctz/testdata/zoneinfo/Mexico/BajaSur | Bin 0 -> 690 bytes .../cctz/testdata/zoneinfo/Mexico/General | Bin 0 -> 773 bytes absl/time/internal/cctz/testdata/zoneinfo/NZ | Bin 0 -> 1043 bytes .../internal/cctz/testdata/zoneinfo/NZ-CHAT | Bin 0 -> 808 bytes .../internal/cctz/testdata/zoneinfo/Navajo | Bin 0 -> 1042 bytes absl/time/internal/cctz/testdata/zoneinfo/PRC | Bin 0 -> 393 bytes .../internal/cctz/testdata/zoneinfo/PST8PDT | Bin 0 -> 1294 bytes .../cctz/testdata/zoneinfo/Pacific/Apia | Bin 0 -> 407 bytes .../cctz/testdata/zoneinfo/Pacific/Auckland | Bin 0 -> 1043 bytes .../testdata/zoneinfo/Pacific/Bougainville | Bin 0 -> 201 bytes .../cctz/testdata/zoneinfo/Pacific/Chatham | Bin 0 -> 808 bytes .../cctz/testdata/zoneinfo/Pacific/Chuuk | Bin 0 -> 195 bytes .../cctz/testdata/zoneinfo/Pacific/Easter | Bin 0 -> 1174 bytes .../cctz/testdata/zoneinfo/Pacific/Efate | Bin 0 -> 342 bytes .../cctz/testdata/zoneinfo/Pacific/Enderbury | Bin 0 -> 172 bytes .../cctz/testdata/zoneinfo/Pacific/Fakaofo | Bin 0 -> 153 bytes .../cctz/testdata/zoneinfo/Pacific/Fiji | Bin 0 -> 396 bytes .../cctz/testdata/zoneinfo/Pacific/Funafuti | Bin 0 -> 134 bytes .../cctz/testdata/zoneinfo/Pacific/Galapagos | Bin 0 -> 175 bytes .../cctz/testdata/zoneinfo/Pacific/Gambier | Bin 0 -> 132 bytes .../testdata/zoneinfo/Pacific/Guadalcanal | Bin 0 -> 134 bytes .../cctz/testdata/zoneinfo/Pacific/Guam | Bin 0 -> 350 bytes .../cctz/testdata/zoneinfo/Pacific/Honolulu | Bin 0 -> 221 bytes .../cctz/testdata/zoneinfo/Pacific/Johnston | Bin 0 -> 221 bytes .../cctz/testdata/zoneinfo/Pacific/Kanton | Bin 0 -> 172 bytes .../cctz/testdata/zoneinfo/Pacific/Kiritimati | Bin 0 -> 174 bytes .../cctz/testdata/zoneinfo/Pacific/Kosrae | Bin 0 -> 242 bytes .../cctz/testdata/zoneinfo/Pacific/Kwajalein | Bin 0 -> 219 bytes .../cctz/testdata/zoneinfo/Pacific/Majuro | Bin 0 -> 218 bytes .../cctz/testdata/zoneinfo/Pacific/Marquesas | Bin 0 -> 139 bytes .../cctz/testdata/zoneinfo/Pacific/Midway | Bin 0 -> 169 bytes .../cctz/testdata/zoneinfo/Pacific/Nauru | Bin 0 -> 183 bytes .../cctz/testdata/zoneinfo/Pacific/Niue | Bin 0 -> 154 bytes .../cctz/testdata/zoneinfo/Pacific/Norfolk | Bin 0 -> 237 bytes .../cctz/testdata/zoneinfo/Pacific/Noumea | Bin 0 -> 198 bytes .../cctz/testdata/zoneinfo/Pacific/Pago_Pago | Bin 0 -> 146 bytes .../cctz/testdata/zoneinfo/Pacific/Palau | Bin 0 -> 148 bytes .../cctz/testdata/zoneinfo/Pacific/Pitcairn | Bin 0 -> 153 bytes .../cctz/testdata/zoneinfo/Pacific/Pohnpei | Bin 0 -> 214 bytes .../cctz/testdata/zoneinfo/Pacific/Ponape | Bin 0 -> 214 bytes .../testdata/zoneinfo/Pacific/Port_Moresby | Bin 0 -> 154 bytes .../cctz/testdata/zoneinfo/Pacific/Rarotonga | Bin 0 -> 406 bytes .../cctz/testdata/zoneinfo/Pacific/Saipan | Bin 0 -> 341 bytes .../cctz/testdata/zoneinfo/Pacific/Samoa | Bin 0 -> 146 bytes .../cctz/testdata/zoneinfo/Pacific/Tahiti | Bin 0 -> 133 bytes .../cctz/testdata/zoneinfo/Pacific/Tarawa | Bin 0 -> 134 bytes .../cctz/testdata/zoneinfo/Pacific/Tongatapu | Bin 0 -> 237 bytes .../cctz/testdata/zoneinfo/Pacific/Truk | Bin 0 -> 195 bytes .../cctz/testdata/zoneinfo/Pacific/Wake | Bin 0 -> 134 bytes .../cctz/testdata/zoneinfo/Pacific/Wallis | Bin 0 -> 134 bytes .../cctz/testdata/zoneinfo/Pacific/Yap | Bin 0 -> 195 bytes .../internal/cctz/testdata/zoneinfo/Poland | Bin 0 -> 923 bytes .../internal/cctz/testdata/zoneinfo/Portugal | Bin 0 -> 1463 bytes absl/time/internal/cctz/testdata/zoneinfo/ROC | Bin 0 -> 511 bytes absl/time/internal/cctz/testdata/zoneinfo/ROK | Bin 0 -> 415 bytes .../internal/cctz/testdata/zoneinfo/Singapore | Bin 0 -> 256 bytes .../internal/cctz/testdata/zoneinfo/Turkey | Bin 0 -> 1200 bytes absl/time/internal/cctz/testdata/zoneinfo/UCT | Bin 0 -> 111 bytes .../internal/cctz/testdata/zoneinfo/US/Alaska | Bin 0 -> 977 bytes .../cctz/testdata/zoneinfo/US/Aleutian | Bin 0 -> 969 bytes .../cctz/testdata/zoneinfo/US/Arizona | Bin 0 -> 240 bytes .../cctz/testdata/zoneinfo/US/Central | Bin 0 -> 1754 bytes .../cctz/testdata/zoneinfo/US/East-Indiana | Bin 0 -> 531 bytes .../cctz/testdata/zoneinfo/US/Eastern | Bin 0 -> 1744 bytes .../internal/cctz/testdata/zoneinfo/US/Hawaii | Bin 0 -> 221 bytes .../cctz/testdata/zoneinfo/US/Indiana-Starke | Bin 0 -> 1016 bytes .../cctz/testdata/zoneinfo/US/Michigan | Bin 0 -> 899 bytes .../cctz/testdata/zoneinfo/US/Mountain | Bin 0 -> 1042 bytes .../cctz/testdata/zoneinfo/US/Pacific | Bin 0 -> 1294 bytes .../internal/cctz/testdata/zoneinfo/US/Samoa | Bin 0 -> 146 bytes absl/time/internal/cctz/testdata/zoneinfo/UTC | Bin 0 -> 111 bytes .../internal/cctz/testdata/zoneinfo/Universal | Bin 0 -> 111 bytes .../time/internal/cctz/testdata/zoneinfo/W-SU | Bin 0 -> 908 bytes absl/time/internal/cctz/testdata/zoneinfo/WET | Bin 0 -> 1463 bytes .../time/internal/cctz/testdata/zoneinfo/Zulu | Bin 0 -> 111 bytes .../cctz/testdata/zoneinfo/iso3166.tab | 279 ++ .../cctz/testdata/zoneinfo/zone1970.tab | 374 ++ .../cctz/testdata/zoneinfo/zonenow.tab | 296 ++ .../time/internal/get_current_time_chrono.inc | 31 + absl/time/internal/get_current_time_posix.inc | 24 + absl/time/internal/test_util.cc | 32 + absl/time/internal/test_util.h | 33 + absl/time/time.cc | 507 ++ absl/time/time.h | 1920 ++++++++ absl/time/time_benchmark.cc | 321 ++ absl/time/time_test.cc | 1338 +++++ absl/time/time_zone_test.cc | 97 + absl/types/BUILD.bazel | 319 ++ absl/types/CMakeLists.txt | 323 ++ absl/types/any.h | 519 ++ absl/types/any_exception_safety_test.cc | 173 + absl/types/any_test.cc | 778 +++ absl/types/bad_any_cast.cc | 64 + absl/types/bad_any_cast.h | 75 + absl/types/bad_optional_access.cc | 66 + absl/types/bad_optional_access.h | 78 + absl/types/bad_variant_access.cc | 82 + absl/types/bad_variant_access.h | 82 + absl/types/compare.h | 505 ++ absl/types/compare_test.cc | 300 ++ absl/types/internal/optional.h | 352 ++ absl/types/internal/span.h | 140 + absl/types/internal/variant.h | 1622 ++++++ absl/types/optional.h | 781 +++ absl/types/optional_exception_safety_test.cc | 292 ++ absl/types/optional_test.cc | 1615 ++++++ absl/types/span.h | 796 +++ absl/types/span_test.cc | 888 ++++ absl/types/variant.h | 861 ++++ absl/types/variant_benchmark.cc | 222 + absl/types/variant_exception_safety_test.cc | 532 ++ absl/types/variant_test.cc | 2718 +++++++++++ absl/utility/BUILD.bazel | 86 + absl/utility/CMakeLists.txt | 68 + absl/utility/internal/if_constexpr.h | 70 + absl/utility/internal/if_constexpr_test.cc | 79 + absl/utility/utility.h | 230 + absl/utility/utility_test.cc | 239 + adapter-ohos.patch | 158 - bundle.json | 38 +- ci/absl_alternate_options.h | 30 + ci/cmake_common.sh | 19 + ci/cmake_install_test.sh | 58 + ci/linux_arm_clang-latest_libcxx_bazel.sh | 100 + ci/linux_clang-latest_libcxx_asan_bazel.sh | 102 + ci/linux_clang-latest_libcxx_bazel.sh | 100 + ci/linux_clang-latest_libcxx_tsan_bazel.sh | 97 + ci/linux_clang-latest_libstdcxx_bazel.sh | 95 + ci/linux_docker_containers.sh | 22 + ci/linux_gcc-floor_libstdcxx_bazel.sh | 92 + ci/linux_gcc-latest_libstdcxx_bazel.sh | 98 + ci/linux_gcc-latest_libstdcxx_cmake.sh | 79 + ci/linux_gcc_alpine_cmake.sh | 79 + ci/macos_xcode_bazel.sh | 69 + ci/macos_xcode_cmake.sh | 65 + ci/windows_clangcl_bazel.bat | 61 + ci/windows_msvc_bazel.bat | 52 + ci/windows_msvc_cmake.bat | 64 + conanfile.py | 51 + configure_copts.gni | 2 +- create_lts.py | 139 + fix-mac-complier-error.patch | 17 - fix-mingw-complier-error.patch | 12 - install.sh | 25 - install_for_mac.sh | 20 - install_no_lock.sh | 22 - lock_file.lock | 0 1550 files changed, 292735 insertions(+), 567 deletions(-) create mode 100644 ABSEIL_ISSUE_TEMPLATE.md create mode 100644 BUILD.bazel create mode 100644 CMake/AbseilDll.cmake create mode 100644 CMake/AbseilHelpers.cmake create mode 100644 CMake/Googletest/CMakeLists.txt.in create mode 100644 CMake/Googletest/DownloadGTest.cmake create mode 100644 CMake/README.md create mode 100644 CMake/abslConfig.cmake.in create mode 100644 CMake/install_test_project/CMakeLists.txt create mode 100644 CMake/install_test_project/simple.cc create mode 100644 CMake/install_test_project/test.sh create mode 100644 CMakeLists.txt create mode 100644 CONTRIBUTING.md create mode 100644 FAQ.md create mode 100644 MODULE.bazel create mode 100644 PrivacyInfo.xcprivacy create mode 100644 UPGRADES.md create mode 100644 WORKSPACE create mode 100644 WORKSPACE.bzlmod delete mode 100644 abseil-cpp-20250127.0.tar.gz create mode 100644 absl/BUILD.bazel create mode 100644 absl/CMakeLists.txt create mode 100644 absl/abseil.podspec.gen.py create mode 100644 absl/algorithm/BUILD.bazel create mode 100644 absl/algorithm/CMakeLists.txt create mode 100644 absl/algorithm/algorithm.h create mode 100644 absl/algorithm/algorithm_test.cc create mode 100644 absl/algorithm/container.h create mode 100644 absl/algorithm/container_test.cc create mode 100644 absl/base/BUILD.bazel create mode 100644 absl/base/CMakeLists.txt create mode 100644 absl/base/attributes.h create mode 100644 absl/base/bit_cast_test.cc create mode 100644 absl/base/c_header_test.c create mode 100644 absl/base/call_once.h create mode 100644 absl/base/call_once_test.cc create mode 100644 absl/base/casts.h create mode 100644 absl/base/config.h create mode 100644 absl/base/config_test.cc create mode 100644 absl/base/const_init.h create mode 100644 absl/base/dynamic_annotations.h create mode 100644 absl/base/exception_safety_testing_test.cc create mode 100644 absl/base/inline_variable_test.cc create mode 100644 absl/base/inline_variable_test_a.cc create mode 100644 absl/base/inline_variable_test_b.cc create mode 100644 absl/base/internal/atomic_hook.h create mode 100644 absl/base/internal/atomic_hook_test.cc create mode 100644 absl/base/internal/atomic_hook_test_helper.cc create mode 100644 absl/base/internal/atomic_hook_test_helper.h create mode 100644 absl/base/internal/cmake_thread_test.cc create mode 100644 absl/base/internal/cycleclock.cc create mode 100644 absl/base/internal/cycleclock.h create mode 100644 absl/base/internal/cycleclock_config.h create mode 100644 absl/base/internal/direct_mmap.h create mode 100644 absl/base/internal/dynamic_annotations.h create mode 100644 absl/base/internal/endian.h create mode 100644 absl/base/internal/endian_test.cc create mode 100644 absl/base/internal/errno_saver.h create mode 100644 absl/base/internal/errno_saver_test.cc create mode 100644 absl/base/internal/exception_safety_testing.cc create mode 100644 absl/base/internal/exception_safety_testing.h create mode 100644 absl/base/internal/exception_testing.h create mode 100644 absl/base/internal/fast_type_id.h create mode 100644 absl/base/internal/fast_type_id_test.cc create mode 100644 absl/base/internal/hide_ptr.h create mode 100644 absl/base/internal/identity.h create mode 100644 absl/base/internal/inline_variable.h create mode 100644 absl/base/internal/inline_variable_testing.h create mode 100644 absl/base/internal/invoke.h create mode 100644 absl/base/internal/low_level_alloc.cc create mode 100644 absl/base/internal/low_level_alloc.h create mode 100644 absl/base/internal/low_level_alloc_test.cc create mode 100644 absl/base/internal/low_level_scheduling.h create mode 100644 absl/base/internal/nullability_impl.h create mode 100644 absl/base/internal/per_thread_tls.h create mode 100644 absl/base/internal/poison.cc create mode 100644 absl/base/internal/poison.h create mode 100644 absl/base/internal/poison_test.cc create mode 100644 absl/base/internal/pretty_function.h create mode 100644 absl/base/internal/raw_logging.cc create mode 100644 absl/base/internal/raw_logging.h create mode 100644 absl/base/internal/scheduling_mode.h create mode 100644 absl/base/internal/scoped_set_env.cc create mode 100644 absl/base/internal/scoped_set_env.h create mode 100644 absl/base/internal/scoped_set_env_test.cc create mode 100644 absl/base/internal/spinlock.cc create mode 100644 absl/base/internal/spinlock.h create mode 100644 absl/base/internal/spinlock_akaros.inc create mode 100644 absl/base/internal/spinlock_benchmark.cc create mode 100644 absl/base/internal/spinlock_linux.inc create mode 100644 absl/base/internal/spinlock_posix.inc create mode 100644 absl/base/internal/spinlock_wait.cc create mode 100644 absl/base/internal/spinlock_wait.h create mode 100644 absl/base/internal/spinlock_win32.inc create mode 100644 absl/base/internal/strerror.cc create mode 100644 absl/base/internal/strerror.h create mode 100644 absl/base/internal/strerror_benchmark.cc create mode 100644 absl/base/internal/strerror_test.cc create mode 100644 absl/base/internal/sysinfo.cc create mode 100644 absl/base/internal/sysinfo.h create mode 100644 absl/base/internal/sysinfo_test.cc create mode 100644 absl/base/internal/thread_identity.cc create mode 100644 absl/base/internal/thread_identity.h create mode 100644 absl/base/internal/thread_identity_benchmark.cc create mode 100644 absl/base/internal/thread_identity_test.cc create mode 100644 absl/base/internal/throw_delegate.cc create mode 100644 absl/base/internal/throw_delegate.h create mode 100644 absl/base/internal/tracing.cc create mode 100644 absl/base/internal/tracing.h create mode 100644 absl/base/internal/tracing_strong_test.cc create mode 100644 absl/base/internal/tracing_weak_test.cc create mode 100644 absl/base/internal/tsan_mutex_interface.h create mode 100644 absl/base/internal/unaligned_access.h create mode 100644 absl/base/internal/unique_small_name_test.cc create mode 100644 absl/base/internal/unscaledcycleclock.cc create mode 100644 absl/base/internal/unscaledcycleclock.h create mode 100644 absl/base/internal/unscaledcycleclock_config.h create mode 100644 absl/base/invoke_test.cc create mode 100644 absl/base/log_severity.cc create mode 100644 absl/base/log_severity.h create mode 100644 absl/base/log_severity_test.cc create mode 100644 absl/base/macros.h create mode 100644 absl/base/no_destructor.h create mode 100644 absl/base/no_destructor_benchmark.cc create mode 100644 absl/base/no_destructor_test.cc create mode 100644 absl/base/nullability.h create mode 100644 absl/base/nullability_default_nonnull_test.cc create mode 100644 absl/base/nullability_test.cc create mode 100644 absl/base/optimization.h create mode 100644 absl/base/optimization_test.cc create mode 100644 absl/base/options.h create mode 100644 absl/base/policy_checks.h create mode 100644 absl/base/port.h create mode 100644 absl/base/prefetch.h create mode 100644 absl/base/prefetch_test.cc create mode 100644 absl/base/raw_logging_test.cc create mode 100644 absl/base/spinlock_test_common.cc create mode 100644 absl/base/thread_annotations.h create mode 100644 absl/base/throw_delegate_test.cc create mode 100644 absl/cleanup/BUILD.bazel create mode 100644 absl/cleanup/CMakeLists.txt create mode 100644 absl/cleanup/cleanup.h create mode 100644 absl/cleanup/cleanup_test.cc create mode 100644 absl/cleanup/internal/cleanup.h create mode 100644 absl/container/BUILD.bazel create mode 100644 absl/container/CMakeLists.txt create mode 100644 absl/container/btree_benchmark.cc create mode 100644 absl/container/btree_map.h create mode 100644 absl/container/btree_set.h create mode 100644 absl/container/btree_test.cc create mode 100644 absl/container/btree_test.h create mode 100644 absl/container/fixed_array.h create mode 100644 absl/container/fixed_array_benchmark.cc create mode 100644 absl/container/fixed_array_exception_safety_test.cc create mode 100644 absl/container/fixed_array_test.cc create mode 100644 absl/container/flat_hash_map.h create mode 100644 absl/container/flat_hash_map_test.cc create mode 100644 absl/container/flat_hash_set.h create mode 100644 absl/container/flat_hash_set_test.cc create mode 100644 absl/container/hash_container_defaults.h create mode 100644 absl/container/inlined_vector.h create mode 100644 absl/container/inlined_vector_benchmark.cc create mode 100644 absl/container/inlined_vector_exception_safety_test.cc create mode 100644 absl/container/inlined_vector_test.cc create mode 100644 absl/container/internal/btree.h create mode 100644 absl/container/internal/btree_container.h create mode 100644 absl/container/internal/common.h create mode 100644 absl/container/internal/common_policy_traits.h create mode 100644 absl/container/internal/common_policy_traits_test.cc create mode 100644 absl/container/internal/compressed_tuple.h create mode 100644 absl/container/internal/compressed_tuple_test.cc create mode 100644 absl/container/internal/container_memory.h create mode 100644 absl/container/internal/container_memory_test.cc create mode 100644 absl/container/internal/hash_function_defaults.h create mode 100644 absl/container/internal/hash_function_defaults_test.cc create mode 100644 absl/container/internal/hash_generator_testing.cc create mode 100644 absl/container/internal/hash_generator_testing.h create mode 100644 absl/container/internal/hash_policy_testing.h create mode 100644 absl/container/internal/hash_policy_testing_test.cc create mode 100644 absl/container/internal/hash_policy_traits.h create mode 100644 absl/container/internal/hash_policy_traits_test.cc create mode 100644 absl/container/internal/hashtable_debug.h create mode 100644 absl/container/internal/hashtable_debug_hooks.h create mode 100644 absl/container/internal/hashtablez_sampler.cc create mode 100644 absl/container/internal/hashtablez_sampler.h create mode 100644 absl/container/internal/hashtablez_sampler_force_weak_definition.cc create mode 100644 absl/container/internal/hashtablez_sampler_test.cc create mode 100644 absl/container/internal/inlined_vector.h create mode 100644 absl/container/internal/layout.h create mode 100644 absl/container/internal/layout_benchmark.cc create mode 100644 absl/container/internal/layout_test.cc create mode 100644 absl/container/internal/node_slot_policy.h create mode 100644 absl/container/internal/node_slot_policy_test.cc create mode 100644 absl/container/internal/raw_hash_map.h create mode 100644 absl/container/internal/raw_hash_set.cc create mode 100644 absl/container/internal/raw_hash_set.h create mode 100644 absl/container/internal/raw_hash_set_allocator_test.cc create mode 100644 absl/container/internal/raw_hash_set_benchmark.cc create mode 100644 absl/container/internal/raw_hash_set_probe_benchmark.cc create mode 100644 absl/container/internal/raw_hash_set_test.cc create mode 100644 absl/container/internal/test_allocator.h create mode 100644 absl/container/internal/test_instance_tracker.cc create mode 100644 absl/container/internal/test_instance_tracker.h create mode 100644 absl/container/internal/test_instance_tracker_test.cc create mode 100644 absl/container/internal/tracked.h create mode 100644 absl/container/internal/unordered_map_constructor_test.h create mode 100644 absl/container/internal/unordered_map_lookup_test.h create mode 100644 absl/container/internal/unordered_map_members_test.h create mode 100644 absl/container/internal/unordered_map_modifiers_test.h create mode 100644 absl/container/internal/unordered_map_test.cc create mode 100644 absl/container/internal/unordered_set_constructor_test.h create mode 100644 absl/container/internal/unordered_set_lookup_test.h create mode 100644 absl/container/internal/unordered_set_members_test.h create mode 100644 absl/container/internal/unordered_set_modifiers_test.h create mode 100644 absl/container/internal/unordered_set_test.cc create mode 100644 absl/container/node_hash_map.h create mode 100644 absl/container/node_hash_map_test.cc create mode 100644 absl/container/node_hash_set.h create mode 100644 absl/container/node_hash_set_test.cc create mode 100644 absl/container/sample_element_size_test.cc create mode 100644 absl/copts/AbseilConfigureCopts.cmake create mode 100644 absl/copts/GENERATED_AbseilCopts.cmake create mode 100644 absl/copts/GENERATED_copts.bzl create mode 100644 absl/copts/configure_copts.bzl create mode 100644 absl/copts/copts.py create mode 100644 absl/copts/generate_copts.py create mode 100644 absl/crc/BUILD.bazel create mode 100644 absl/crc/CMakeLists.txt create mode 100644 absl/crc/crc32c.cc create mode 100644 absl/crc/crc32c.h create mode 100644 absl/crc/crc32c_benchmark.cc create mode 100644 absl/crc/crc32c_test.cc create mode 100644 absl/crc/internal/cpu_detect.cc create mode 100644 absl/crc/internal/cpu_detect.h create mode 100644 absl/crc/internal/crc.cc create mode 100644 absl/crc/internal/crc.h create mode 100644 absl/crc/internal/crc32_x86_arm_combined_simd.h create mode 100644 absl/crc/internal/crc32c.h create mode 100644 absl/crc/internal/crc32c_inline.h create mode 100644 absl/crc/internal/crc_cord_state.cc create mode 100644 absl/crc/internal/crc_cord_state.h create mode 100644 absl/crc/internal/crc_cord_state_test.cc create mode 100644 absl/crc/internal/crc_internal.h create mode 100644 absl/crc/internal/crc_memcpy.h create mode 100644 absl/crc/internal/crc_memcpy_fallback.cc create mode 100644 absl/crc/internal/crc_memcpy_test.cc create mode 100644 absl/crc/internal/crc_memcpy_x86_arm_combined.cc create mode 100644 absl/crc/internal/crc_non_temporal_memcpy.cc create mode 100644 absl/crc/internal/crc_x86_arm_combined.cc create mode 100644 absl/crc/internal/non_temporal_arm_intrinsics.h create mode 100644 absl/crc/internal/non_temporal_memcpy.h create mode 100644 absl/crc/internal/non_temporal_memcpy_test.cc create mode 100644 absl/debugging/BUILD.bazel create mode 100644 absl/debugging/CMakeLists.txt create mode 100644 absl/debugging/failure_signal_handler.cc create mode 100644 absl/debugging/failure_signal_handler.h create mode 100644 absl/debugging/failure_signal_handler_test.cc create mode 100644 absl/debugging/internal/address_is_readable.cc create mode 100644 absl/debugging/internal/address_is_readable.h create mode 100644 absl/debugging/internal/bounded_utf8_length_sequence.h create mode 100644 absl/debugging/internal/bounded_utf8_length_sequence_test.cc create mode 100644 absl/debugging/internal/decode_rust_punycode.cc create mode 100644 absl/debugging/internal/decode_rust_punycode.h create mode 100644 absl/debugging/internal/decode_rust_punycode_test.cc create mode 100644 absl/debugging/internal/demangle.cc create mode 100644 absl/debugging/internal/demangle.h create mode 100644 absl/debugging/internal/demangle_rust.cc create mode 100644 absl/debugging/internal/demangle_rust.h create mode 100644 absl/debugging/internal/demangle_rust_test.cc create mode 100644 absl/debugging/internal/demangle_test.cc create mode 100644 absl/debugging/internal/elf_mem_image.cc create mode 100644 absl/debugging/internal/elf_mem_image.h create mode 100644 absl/debugging/internal/examine_stack.cc create mode 100644 absl/debugging/internal/examine_stack.h create mode 100644 absl/debugging/internal/stack_consumption.cc create mode 100644 absl/debugging/internal/stack_consumption.h create mode 100644 absl/debugging/internal/stack_consumption_test.cc create mode 100644 absl/debugging/internal/stacktrace_aarch64-inl.inc create mode 100644 absl/debugging/internal/stacktrace_arm-inl.inc create mode 100644 absl/debugging/internal/stacktrace_config.h create mode 100644 absl/debugging/internal/stacktrace_emscripten-inl.inc create mode 100644 absl/debugging/internal/stacktrace_generic-inl.inc create mode 100644 absl/debugging/internal/stacktrace_powerpc-inl.inc create mode 100644 absl/debugging/internal/stacktrace_riscv-inl.inc create mode 100644 absl/debugging/internal/stacktrace_unimplemented-inl.inc create mode 100644 absl/debugging/internal/stacktrace_win32-inl.inc create mode 100644 absl/debugging/internal/stacktrace_x86-inl.inc create mode 100644 absl/debugging/internal/symbolize.h create mode 100644 absl/debugging/internal/utf8_for_code_point.cc create mode 100644 absl/debugging/internal/utf8_for_code_point.h create mode 100644 absl/debugging/internal/utf8_for_code_point_test.cc create mode 100644 absl/debugging/internal/vdso_support.cc create mode 100644 absl/debugging/internal/vdso_support.h create mode 100644 absl/debugging/leak_check.cc create mode 100644 absl/debugging/leak_check.h create mode 100644 absl/debugging/leak_check_fail_test.cc create mode 100644 absl/debugging/leak_check_test.cc create mode 100644 absl/debugging/stacktrace.cc create mode 100644 absl/debugging/stacktrace.h create mode 100644 absl/debugging/stacktrace_benchmark.cc create mode 100644 absl/debugging/stacktrace_test.cc create mode 100644 absl/debugging/symbolize.cc create mode 100644 absl/debugging/symbolize.h create mode 100644 absl/debugging/symbolize_darwin.inc create mode 100644 absl/debugging/symbolize_elf.inc create mode 100644 absl/debugging/symbolize_emscripten.inc create mode 100644 absl/debugging/symbolize_test.cc create mode 100644 absl/debugging/symbolize_unimplemented.inc create mode 100644 absl/debugging/symbolize_win32.inc create mode 100644 absl/flags/BUILD.bazel create mode 100644 absl/flags/CMakeLists.txt create mode 100644 absl/flags/commandlineflag.cc create mode 100644 absl/flags/commandlineflag.h create mode 100644 absl/flags/commandlineflag_test.cc create mode 100644 absl/flags/config.h create mode 100644 absl/flags/config_test.cc create mode 100644 absl/flags/declare.h create mode 100644 absl/flags/flag.h create mode 100644 absl/flags/flag_benchmark.cc create mode 100644 absl/flags/flag_benchmark.lds create mode 100644 absl/flags/flag_test.cc create mode 100644 absl/flags/flag_test_defs.cc create mode 100644 absl/flags/internal/commandlineflag.cc create mode 100644 absl/flags/internal/commandlineflag.h create mode 100644 absl/flags/internal/flag.cc create mode 100644 absl/flags/internal/flag.h create mode 100644 absl/flags/internal/parse.h create mode 100644 absl/flags/internal/path_util.h create mode 100644 absl/flags/internal/path_util_test.cc create mode 100644 absl/flags/internal/private_handle_accessor.cc create mode 100644 absl/flags/internal/private_handle_accessor.h create mode 100644 absl/flags/internal/program_name.cc create mode 100644 absl/flags/internal/program_name.h create mode 100644 absl/flags/internal/program_name_test.cc create mode 100644 absl/flags/internal/registry.h create mode 100644 absl/flags/internal/sequence_lock.h create mode 100644 absl/flags/internal/sequence_lock_test.cc create mode 100644 absl/flags/internal/usage.cc create mode 100644 absl/flags/internal/usage.h create mode 100644 absl/flags/internal/usage_test.cc create mode 100644 absl/flags/marshalling.cc create mode 100644 absl/flags/marshalling.h create mode 100644 absl/flags/marshalling_test.cc create mode 100644 absl/flags/parse.cc create mode 100644 absl/flags/parse.h create mode 100644 absl/flags/parse_test.cc create mode 100644 absl/flags/reflection.cc create mode 100644 absl/flags/reflection.h create mode 100644 absl/flags/reflection_test.cc create mode 100644 absl/flags/usage.cc create mode 100644 absl/flags/usage.h create mode 100644 absl/flags/usage_config.cc create mode 100644 absl/flags/usage_config.h create mode 100644 absl/flags/usage_config_test.cc create mode 100644 absl/functional/BUILD.bazel create mode 100644 absl/functional/CMakeLists.txt create mode 100644 absl/functional/any_invocable.h create mode 100644 absl/functional/any_invocable_test.cc create mode 100644 absl/functional/bind_front.h create mode 100644 absl/functional/bind_front_test.cc create mode 100644 absl/functional/function_ref.h create mode 100644 absl/functional/function_ref_test.cc create mode 100644 absl/functional/function_type_benchmark.cc create mode 100644 absl/functional/internal/any_invocable.h create mode 100644 absl/functional/internal/front_binder.h create mode 100644 absl/functional/internal/function_ref.h create mode 100644 absl/functional/overload.h create mode 100644 absl/functional/overload_test.cc create mode 100644 absl/hash/BUILD.bazel create mode 100644 absl/hash/CMakeLists.txt create mode 100644 absl/hash/hash.h create mode 100644 absl/hash/hash_benchmark.cc create mode 100644 absl/hash/hash_instantiated_test.cc create mode 100644 absl/hash/hash_test.cc create mode 100644 absl/hash/hash_testing.h create mode 100644 absl/hash/internal/city.cc create mode 100644 absl/hash/internal/city.h create mode 100644 absl/hash/internal/city_test.cc create mode 100644 absl/hash/internal/hash.cc create mode 100644 absl/hash/internal/hash.h create mode 100644 absl/hash/internal/hash_test.h create mode 100644 absl/hash/internal/low_level_hash.cc create mode 100644 absl/hash/internal/low_level_hash.h create mode 100644 absl/hash/internal/low_level_hash_test.cc create mode 100644 absl/hash/internal/print_hash_of.cc create mode 100644 absl/hash/internal/spy_hash_state.h create mode 100644 absl/log/BUILD.bazel create mode 100644 absl/log/CMakeLists.txt create mode 100644 absl/log/absl_check.h create mode 100644 absl/log/absl_check_test.cc create mode 100644 absl/log/absl_log.h create mode 100644 absl/log/absl_log_basic_test.cc create mode 100644 absl/log/absl_vlog_is_on.h create mode 100644 absl/log/check.h create mode 100644 absl/log/check_test.cc create mode 100644 absl/log/check_test_impl.inc create mode 100644 absl/log/die_if_null.cc create mode 100644 absl/log/die_if_null.h create mode 100644 absl/log/die_if_null_test.cc create mode 100644 absl/log/flags.cc create mode 100644 absl/log/flags.h create mode 100644 absl/log/flags_test.cc create mode 100644 absl/log/globals.cc create mode 100644 absl/log/globals.h create mode 100644 absl/log/globals_test.cc create mode 100644 absl/log/initialize.cc create mode 100644 absl/log/initialize.h create mode 100644 absl/log/internal/BUILD.bazel create mode 100644 absl/log/internal/append_truncated.h create mode 100644 absl/log/internal/check_impl.h create mode 100644 absl/log/internal/check_op.cc create mode 100644 absl/log/internal/check_op.h create mode 100644 absl/log/internal/conditions.cc create mode 100644 absl/log/internal/conditions.h create mode 100644 absl/log/internal/config.h create mode 100644 absl/log/internal/flags.h create mode 100644 absl/log/internal/fnmatch.cc create mode 100644 absl/log/internal/fnmatch.h create mode 100644 absl/log/internal/fnmatch_benchmark.cc create mode 100644 absl/log/internal/fnmatch_test.cc create mode 100644 absl/log/internal/globals.cc create mode 100644 absl/log/internal/globals.h create mode 100644 absl/log/internal/log_format.cc create mode 100644 absl/log/internal/log_format.h create mode 100644 absl/log/internal/log_impl.h create mode 100644 absl/log/internal/log_message.cc create mode 100644 absl/log/internal/log_message.h create mode 100644 absl/log/internal/log_sink_set.cc create mode 100644 absl/log/internal/log_sink_set.h create mode 100644 absl/log/internal/nullguard.cc create mode 100644 absl/log/internal/nullguard.h create mode 100644 absl/log/internal/nullstream.h create mode 100644 absl/log/internal/proto.cc create mode 100644 absl/log/internal/proto.h create mode 100644 absl/log/internal/stderr_log_sink_test.cc create mode 100644 absl/log/internal/strip.h create mode 100644 absl/log/internal/structured.h create mode 100644 absl/log/internal/structured_proto.cc create mode 100644 absl/log/internal/structured_proto.h create mode 100644 absl/log/internal/structured_proto_test.cc create mode 100644 absl/log/internal/test_actions.cc create mode 100644 absl/log/internal/test_actions.h create mode 100644 absl/log/internal/test_helpers.cc create mode 100644 absl/log/internal/test_helpers.h create mode 100644 absl/log/internal/test_matchers.cc create mode 100644 absl/log/internal/test_matchers.h create mode 100644 absl/log/internal/vlog_config.cc create mode 100644 absl/log/internal/vlog_config.h create mode 100644 absl/log/internal/vlog_config_benchmark.cc create mode 100644 absl/log/internal/voidify.h create mode 100644 absl/log/log.h create mode 100644 absl/log/log_basic_test.cc create mode 100644 absl/log/log_basic_test_impl.inc create mode 100644 absl/log/log_benchmark.cc create mode 100644 absl/log/log_entry.cc create mode 100644 absl/log/log_entry.h create mode 100644 absl/log/log_entry_test.cc create mode 100644 absl/log/log_format_test.cc create mode 100644 absl/log/log_macro_hygiene_test.cc create mode 100644 absl/log/log_modifier_methods_test.cc create mode 100644 absl/log/log_sink.cc create mode 100644 absl/log/log_sink.h create mode 100644 absl/log/log_sink_registry.h create mode 100644 absl/log/log_sink_test.cc create mode 100644 absl/log/log_streamer.h create mode 100644 absl/log/log_streamer_test.cc create mode 100644 absl/log/scoped_mock_log.cc create mode 100644 absl/log/scoped_mock_log.h create mode 100644 absl/log/scoped_mock_log_test.cc create mode 100644 absl/log/stripping_test.cc create mode 100644 absl/log/structured.h create mode 100644 absl/log/structured_test.cc create mode 100644 absl/log/vlog_is_on.h create mode 100644 absl/log/vlog_is_on_test.cc create mode 100644 absl/memory/BUILD.bazel create mode 100644 absl/memory/CMakeLists.txt create mode 100644 absl/memory/memory.h create mode 100644 absl/memory/memory_test.cc create mode 100644 absl/meta/BUILD.bazel create mode 100644 absl/meta/CMakeLists.txt create mode 100644 absl/meta/type_traits.h create mode 100644 absl/meta/type_traits_test.cc create mode 100644 absl/numeric/BUILD.bazel create mode 100644 absl/numeric/CMakeLists.txt create mode 100644 absl/numeric/bits.h create mode 100644 absl/numeric/bits_benchmark.cc create mode 100644 absl/numeric/bits_test.cc create mode 100644 absl/numeric/int128.cc create mode 100644 absl/numeric/int128.h create mode 100644 absl/numeric/int128_benchmark.cc create mode 100644 absl/numeric/int128_have_intrinsic.inc create mode 100644 absl/numeric/int128_no_intrinsic.inc create mode 100644 absl/numeric/int128_stream_test.cc create mode 100644 absl/numeric/int128_test.cc create mode 100644 absl/numeric/internal/bits.h create mode 100644 absl/numeric/internal/representation.h create mode 100644 absl/profiling/BUILD.bazel create mode 100644 absl/profiling/CMakeLists.txt create mode 100644 absl/profiling/internal/exponential_biased.cc create mode 100644 absl/profiling/internal/exponential_biased.h create mode 100644 absl/profiling/internal/exponential_biased_test.cc create mode 100644 absl/profiling/internal/periodic_sampler.cc create mode 100644 absl/profiling/internal/periodic_sampler.h create mode 100644 absl/profiling/internal/periodic_sampler_benchmark.cc create mode 100644 absl/profiling/internal/periodic_sampler_test.cc create mode 100644 absl/profiling/internal/sample_recorder.h create mode 100644 absl/profiling/internal/sample_recorder_test.cc create mode 100644 absl/random/BUILD.bazel create mode 100644 absl/random/CMakeLists.txt create mode 100644 absl/random/benchmarks.cc create mode 100644 absl/random/bernoulli_distribution.h create mode 100644 absl/random/bernoulli_distribution_test.cc create mode 100644 absl/random/beta_distribution.h create mode 100644 absl/random/beta_distribution_test.cc create mode 100644 absl/random/bit_gen_ref.h create mode 100644 absl/random/bit_gen_ref_test.cc create mode 100644 absl/random/discrete_distribution.cc create mode 100644 absl/random/discrete_distribution.h create mode 100644 absl/random/discrete_distribution_test.cc create mode 100644 absl/random/distributions.h create mode 100644 absl/random/distributions_test.cc create mode 100644 absl/random/examples_test.cc create mode 100644 absl/random/exponential_distribution.h create mode 100644 absl/random/exponential_distribution_test.cc create mode 100644 absl/random/gaussian_distribution.cc create mode 100644 absl/random/gaussian_distribution.h create mode 100644 absl/random/gaussian_distribution_test.cc create mode 100644 absl/random/generators_test.cc create mode 100644 absl/random/internal/BUILD.bazel create mode 100644 absl/random/internal/chi_square.cc create mode 100644 absl/random/internal/chi_square.h create mode 100644 absl/random/internal/chi_square_test.cc create mode 100644 absl/random/internal/distribution_caller.h create mode 100644 absl/random/internal/distribution_test_util.cc create mode 100644 absl/random/internal/distribution_test_util.h create mode 100644 absl/random/internal/distribution_test_util_test.cc create mode 100644 absl/random/internal/explicit_seed_seq.h create mode 100644 absl/random/internal/explicit_seed_seq_test.cc create mode 100644 absl/random/internal/fast_uniform_bits.h create mode 100644 absl/random/internal/fast_uniform_bits_test.cc create mode 100644 absl/random/internal/fastmath.h create mode 100644 absl/random/internal/fastmath_test.cc create mode 100644 absl/random/internal/gaussian_distribution_gentables.cc create mode 100644 absl/random/internal/generate_real.h create mode 100644 absl/random/internal/generate_real_test.cc create mode 100644 absl/random/internal/iostream_state_saver.h create mode 100644 absl/random/internal/iostream_state_saver_test.cc create mode 100644 absl/random/internal/mock_helpers.h create mode 100644 absl/random/internal/mock_overload_set.h create mode 100644 absl/random/internal/mock_validators.h create mode 100644 absl/random/internal/nanobenchmark.cc create mode 100644 absl/random/internal/nanobenchmark.h create mode 100644 absl/random/internal/nanobenchmark_test.cc create mode 100644 absl/random/internal/nonsecure_base.h create mode 100644 absl/random/internal/nonsecure_base_test.cc create mode 100644 absl/random/internal/pcg_engine.h create mode 100644 absl/random/internal/pcg_engine_test.cc create mode 100644 absl/random/internal/platform.h create mode 100644 absl/random/internal/pool_urbg.cc create mode 100644 absl/random/internal/pool_urbg.h create mode 100644 absl/random/internal/pool_urbg_test.cc create mode 100644 absl/random/internal/randen.cc create mode 100644 absl/random/internal/randen.h create mode 100644 absl/random/internal/randen_benchmarks.cc create mode 100644 absl/random/internal/randen_detect.cc create mode 100644 absl/random/internal/randen_detect.h create mode 100644 absl/random/internal/randen_engine.h create mode 100644 absl/random/internal/randen_engine_test.cc create mode 100644 absl/random/internal/randen_hwaes.cc create mode 100644 absl/random/internal/randen_hwaes.h create mode 100644 absl/random/internal/randen_hwaes_test.cc create mode 100644 absl/random/internal/randen_round_keys.cc create mode 100644 absl/random/internal/randen_slow.cc create mode 100644 absl/random/internal/randen_slow.h create mode 100644 absl/random/internal/randen_slow_test.cc create mode 100644 absl/random/internal/randen_test.cc create mode 100644 absl/random/internal/randen_traits.h create mode 100644 absl/random/internal/salted_seed_seq.h create mode 100644 absl/random/internal/salted_seed_seq_test.cc create mode 100644 absl/random/internal/seed_material.cc create mode 100644 absl/random/internal/seed_material.h create mode 100644 absl/random/internal/seed_material_test.cc create mode 100644 absl/random/internal/sequence_urbg.h create mode 100644 absl/random/internal/traits.h create mode 100644 absl/random/internal/traits_test.cc create mode 100644 absl/random/internal/uniform_helper.h create mode 100644 absl/random/internal/uniform_helper_test.cc create mode 100644 absl/random/internal/wide_multiply.h create mode 100644 absl/random/internal/wide_multiply_test.cc create mode 100644 absl/random/log_uniform_int_distribution.h create mode 100644 absl/random/log_uniform_int_distribution_test.cc create mode 100644 absl/random/mock_distributions.h create mode 100644 absl/random/mock_distributions_test.cc create mode 100644 absl/random/mocking_bit_gen.h create mode 100644 absl/random/mocking_bit_gen_test.cc create mode 100644 absl/random/poisson_distribution.h create mode 100644 absl/random/poisson_distribution_test.cc create mode 100644 absl/random/random.h create mode 100644 absl/random/seed_gen_exception.cc create mode 100644 absl/random/seed_gen_exception.h create mode 100644 absl/random/seed_sequences.cc create mode 100644 absl/random/seed_sequences.h create mode 100644 absl/random/seed_sequences_test.cc create mode 100644 absl/random/uniform_int_distribution.h create mode 100644 absl/random/uniform_int_distribution_test.cc create mode 100644 absl/random/uniform_real_distribution.h create mode 100644 absl/random/uniform_real_distribution_test.cc create mode 100644 absl/random/zipf_distribution.h create mode 100644 absl/random/zipf_distribution_test.cc create mode 100644 absl/status/BUILD.bazel create mode 100644 absl/status/CMakeLists.txt create mode 100644 absl/status/internal/status_internal.cc create mode 100644 absl/status/internal/status_internal.h create mode 100644 absl/status/internal/status_matchers.cc create mode 100644 absl/status/internal/status_matchers.h create mode 100644 absl/status/internal/statusor_internal.h create mode 100644 absl/status/status.cc create mode 100644 absl/status/status.h create mode 100644 absl/status/status_matchers.h create mode 100644 absl/status/status_matchers_test.cc create mode 100644 absl/status/status_payload_printer.cc create mode 100644 absl/status/status_payload_printer.h create mode 100644 absl/status/status_test.cc create mode 100644 absl/status/statusor.cc create mode 100644 absl/status/statusor.h create mode 100644 absl/status/statusor_test.cc create mode 100644 absl/strings/BUILD.bazel create mode 100644 absl/strings/CMakeLists.txt create mode 100644 absl/strings/ascii.cc create mode 100644 absl/strings/ascii.h create mode 100644 absl/strings/ascii_benchmark.cc create mode 100644 absl/strings/ascii_test.cc create mode 100644 absl/strings/atod_manual_test.cc create mode 100644 absl/strings/char_formatting_test.cc create mode 100644 absl/strings/charconv.cc create mode 100644 absl/strings/charconv.h create mode 100644 absl/strings/charconv_benchmark.cc create mode 100644 absl/strings/charconv_test.cc create mode 100644 absl/strings/charset.h create mode 100644 absl/strings/charset_benchmark.cc create mode 100644 absl/strings/charset_test.cc create mode 100644 absl/strings/cord.cc create mode 100644 absl/strings/cord.h create mode 100644 absl/strings/cord_analysis.cc create mode 100644 absl/strings/cord_analysis.h create mode 100644 absl/strings/cord_buffer.cc create mode 100644 absl/strings/cord_buffer.h create mode 100644 absl/strings/cord_buffer_test.cc create mode 100644 absl/strings/cord_test.cc create mode 100644 absl/strings/cord_test_helpers.h create mode 100644 absl/strings/cordz_test.cc create mode 100644 absl/strings/cordz_test_helpers.h create mode 100644 absl/strings/escaping.cc create mode 100644 absl/strings/escaping.h create mode 100644 absl/strings/escaping_benchmark.cc create mode 100644 absl/strings/escaping_test.cc create mode 100644 absl/strings/has_absl_stringify.h create mode 100644 absl/strings/has_absl_stringify_test.cc create mode 100644 absl/strings/has_ostream_operator.h create mode 100644 absl/strings/has_ostream_operator_test.cc create mode 100644 absl/strings/internal/charconv_bigint.cc create mode 100644 absl/strings/internal/charconv_bigint.h create mode 100644 absl/strings/internal/charconv_bigint_test.cc create mode 100644 absl/strings/internal/charconv_parse.cc create mode 100644 absl/strings/internal/charconv_parse.h create mode 100644 absl/strings/internal/charconv_parse_test.cc create mode 100644 absl/strings/internal/cord_data_edge.h create mode 100644 absl/strings/internal/cord_data_edge_test.cc create mode 100644 absl/strings/internal/cord_internal.cc create mode 100644 absl/strings/internal/cord_internal.h create mode 100644 absl/strings/internal/cord_rep_btree.cc create mode 100644 absl/strings/internal/cord_rep_btree.h create mode 100644 absl/strings/internal/cord_rep_btree_navigator.cc create mode 100644 absl/strings/internal/cord_rep_btree_navigator.h create mode 100644 absl/strings/internal/cord_rep_btree_navigator_test.cc create mode 100644 absl/strings/internal/cord_rep_btree_reader.cc create mode 100644 absl/strings/internal/cord_rep_btree_reader.h create mode 100644 absl/strings/internal/cord_rep_btree_reader_test.cc create mode 100644 absl/strings/internal/cord_rep_btree_test.cc create mode 100644 absl/strings/internal/cord_rep_consume.cc create mode 100644 absl/strings/internal/cord_rep_consume.h create mode 100644 absl/strings/internal/cord_rep_crc.cc create mode 100644 absl/strings/internal/cord_rep_crc.h create mode 100644 absl/strings/internal/cord_rep_crc_test.cc create mode 100644 absl/strings/internal/cord_rep_flat.h create mode 100644 absl/strings/internal/cord_rep_test_util.h create mode 100644 absl/strings/internal/cordz_functions.cc create mode 100644 absl/strings/internal/cordz_functions.h create mode 100644 absl/strings/internal/cordz_functions_test.cc create mode 100644 absl/strings/internal/cordz_handle.cc create mode 100644 absl/strings/internal/cordz_handle.h create mode 100644 absl/strings/internal/cordz_handle_test.cc create mode 100644 absl/strings/internal/cordz_info.cc create mode 100644 absl/strings/internal/cordz_info.h create mode 100644 absl/strings/internal/cordz_info_statistics_test.cc create mode 100644 absl/strings/internal/cordz_info_test.cc create mode 100644 absl/strings/internal/cordz_sample_token.cc create mode 100644 absl/strings/internal/cordz_sample_token.h create mode 100644 absl/strings/internal/cordz_sample_token_test.cc create mode 100644 absl/strings/internal/cordz_statistics.h create mode 100644 absl/strings/internal/cordz_update_scope.h create mode 100644 absl/strings/internal/cordz_update_scope_test.cc create mode 100644 absl/strings/internal/cordz_update_tracker.h create mode 100644 absl/strings/internal/cordz_update_tracker_test.cc create mode 100644 absl/strings/internal/damerau_levenshtein_distance.cc create mode 100644 absl/strings/internal/damerau_levenshtein_distance.h create mode 100644 absl/strings/internal/damerau_levenshtein_distance_test.cc create mode 100644 absl/strings/internal/escaping.cc create mode 100644 absl/strings/internal/escaping.h create mode 100644 absl/strings/internal/escaping_test_common.h create mode 100644 absl/strings/internal/memutil.cc create mode 100644 absl/strings/internal/memutil.h create mode 100644 absl/strings/internal/memutil_benchmark.cc create mode 100644 absl/strings/internal/memutil_test.cc create mode 100644 absl/strings/internal/numbers_test_common.h create mode 100644 absl/strings/internal/ostringstream.cc create mode 100644 absl/strings/internal/ostringstream.h create mode 100644 absl/strings/internal/ostringstream_benchmark.cc create mode 100644 absl/strings/internal/ostringstream_test.cc create mode 100644 absl/strings/internal/pow10_helper.cc create mode 100644 absl/strings/internal/pow10_helper.h create mode 100644 absl/strings/internal/pow10_helper_test.cc create mode 100644 absl/strings/internal/resize_uninitialized.h create mode 100644 absl/strings/internal/resize_uninitialized_test.cc create mode 100644 absl/strings/internal/stl_type_traits.h create mode 100644 absl/strings/internal/str_format/arg.cc create mode 100644 absl/strings/internal/str_format/arg.h create mode 100644 absl/strings/internal/str_format/arg_test.cc create mode 100644 absl/strings/internal/str_format/bind.cc create mode 100644 absl/strings/internal/str_format/bind.h create mode 100644 absl/strings/internal/str_format/bind_test.cc create mode 100644 absl/strings/internal/str_format/checker.h create mode 100644 absl/strings/internal/str_format/checker_test.cc create mode 100644 absl/strings/internal/str_format/constexpr_parser.h create mode 100644 absl/strings/internal/str_format/convert_test.cc create mode 100644 absl/strings/internal/str_format/extension.cc create mode 100644 absl/strings/internal/str_format/extension.h create mode 100644 absl/strings/internal/str_format/extension_test.cc create mode 100644 absl/strings/internal/str_format/float_conversion.cc create mode 100644 absl/strings/internal/str_format/float_conversion.h create mode 100644 absl/strings/internal/str_format/output.cc create mode 100644 absl/strings/internal/str_format/output.h create mode 100644 absl/strings/internal/str_format/output_test.cc create mode 100644 absl/strings/internal/str_format/parser.cc create mode 100644 absl/strings/internal/str_format/parser.h create mode 100644 absl/strings/internal/str_format/parser_test.cc create mode 100644 absl/strings/internal/str_join_internal.h create mode 100644 absl/strings/internal/str_split_internal.h create mode 100644 absl/strings/internal/string_constant.h create mode 100644 absl/strings/internal/string_constant_test.cc create mode 100644 absl/strings/internal/stringify_sink.cc create mode 100644 absl/strings/internal/stringify_sink.h create mode 100644 absl/strings/internal/utf8.cc create mode 100644 absl/strings/internal/utf8.h create mode 100644 absl/strings/internal/utf8_test.cc create mode 100644 absl/strings/match.cc create mode 100644 absl/strings/match.h create mode 100644 absl/strings/match_test.cc create mode 100644 absl/strings/numbers.cc create mode 100644 absl/strings/numbers.h create mode 100644 absl/strings/numbers_benchmark.cc create mode 100644 absl/strings/numbers_test.cc create mode 100644 absl/strings/str_cat.cc create mode 100644 absl/strings/str_cat.h create mode 100644 absl/strings/str_cat_benchmark.cc create mode 100644 absl/strings/str_cat_test.cc create mode 100644 absl/strings/str_format.h create mode 100644 absl/strings/str_format_test.cc create mode 100644 absl/strings/str_join.h create mode 100644 absl/strings/str_join_benchmark.cc create mode 100644 absl/strings/str_join_test.cc create mode 100644 absl/strings/str_replace.cc create mode 100644 absl/strings/str_replace.h create mode 100644 absl/strings/str_replace_benchmark.cc create mode 100644 absl/strings/str_replace_test.cc create mode 100644 absl/strings/str_split.cc create mode 100644 absl/strings/str_split.h create mode 100644 absl/strings/str_split_benchmark.cc create mode 100644 absl/strings/str_split_test.cc create mode 100644 absl/strings/string_view.cc create mode 100644 absl/strings/string_view.h create mode 100644 absl/strings/string_view_benchmark.cc create mode 100644 absl/strings/string_view_test.cc create mode 100644 absl/strings/strip.h create mode 100644 absl/strings/strip_test.cc create mode 100644 absl/strings/substitute.cc create mode 100644 absl/strings/substitute.h create mode 100644 absl/strings/substitute_test.cc create mode 100644 absl/synchronization/BUILD.bazel create mode 100644 absl/synchronization/CMakeLists.txt create mode 100644 absl/synchronization/barrier.cc create mode 100644 absl/synchronization/barrier.h create mode 100644 absl/synchronization/barrier_test.cc create mode 100644 absl/synchronization/blocking_counter.cc create mode 100644 absl/synchronization/blocking_counter.h create mode 100644 absl/synchronization/blocking_counter_benchmark.cc create mode 100644 absl/synchronization/blocking_counter_test.cc create mode 100644 absl/synchronization/internal/create_thread_identity.cc create mode 100644 absl/synchronization/internal/create_thread_identity.h create mode 100644 absl/synchronization/internal/futex.h create mode 100644 absl/synchronization/internal/futex_waiter.cc create mode 100644 absl/synchronization/internal/futex_waiter.h create mode 100644 absl/synchronization/internal/graphcycles.cc create mode 100644 absl/synchronization/internal/graphcycles.h create mode 100644 absl/synchronization/internal/graphcycles_benchmark.cc create mode 100644 absl/synchronization/internal/graphcycles_test.cc create mode 100644 absl/synchronization/internal/kernel_timeout.cc create mode 100644 absl/synchronization/internal/kernel_timeout.h create mode 100644 absl/synchronization/internal/kernel_timeout_test.cc create mode 100644 absl/synchronization/internal/per_thread_sem.cc create mode 100644 absl/synchronization/internal/per_thread_sem.h create mode 100644 absl/synchronization/internal/per_thread_sem_test.cc create mode 100644 absl/synchronization/internal/pthread_waiter.cc create mode 100644 absl/synchronization/internal/pthread_waiter.h create mode 100644 absl/synchronization/internal/sem_waiter.cc create mode 100644 absl/synchronization/internal/sem_waiter.h create mode 100644 absl/synchronization/internal/stdcpp_waiter.cc create mode 100644 absl/synchronization/internal/stdcpp_waiter.h create mode 100644 absl/synchronization/internal/thread_pool.h create mode 100644 absl/synchronization/internal/waiter.h create mode 100644 absl/synchronization/internal/waiter_base.cc create mode 100644 absl/synchronization/internal/waiter_base.h create mode 100644 absl/synchronization/internal/waiter_test.cc create mode 100644 absl/synchronization/internal/win32_waiter.cc create mode 100644 absl/synchronization/internal/win32_waiter.h create mode 100644 absl/synchronization/lifetime_test.cc create mode 100644 absl/synchronization/mutex.cc create mode 100644 absl/synchronization/mutex.h create mode 100644 absl/synchronization/mutex_benchmark.cc create mode 100644 absl/synchronization/mutex_method_pointer_test.cc create mode 100644 absl/synchronization/mutex_test.cc create mode 100644 absl/synchronization/notification.cc create mode 100644 absl/synchronization/notification.h create mode 100644 absl/synchronization/notification_test.cc create mode 100644 absl/time/BUILD.bazel create mode 100644 absl/time/CMakeLists.txt create mode 100644 absl/time/civil_time.cc create mode 100644 absl/time/civil_time.h create mode 100644 absl/time/civil_time_benchmark.cc create mode 100644 absl/time/civil_time_test.cc create mode 100644 absl/time/clock.cc create mode 100644 absl/time/clock.h create mode 100644 absl/time/clock_benchmark.cc create mode 100644 absl/time/clock_test.cc create mode 100644 absl/time/duration.cc create mode 100644 absl/time/duration_benchmark.cc create mode 100644 absl/time/duration_test.cc create mode 100644 absl/time/flag_test.cc create mode 100644 absl/time/format.cc create mode 100644 absl/time/format_benchmark.cc create mode 100644 absl/time/format_test.cc create mode 100644 absl/time/internal/cctz/BUILD.bazel create mode 100644 absl/time/internal/cctz/include/cctz/civil_time.h create mode 100644 absl/time/internal/cctz/include/cctz/civil_time_detail.h create mode 100644 absl/time/internal/cctz/include/cctz/time_zone.h create mode 100644 absl/time/internal/cctz/include/cctz/zone_info_source.h create mode 100644 absl/time/internal/cctz/src/cctz_benchmark.cc create mode 100644 absl/time/internal/cctz/src/civil_time_detail.cc create mode 100644 absl/time/internal/cctz/src/civil_time_test.cc create mode 100644 absl/time/internal/cctz/src/time_zone_fixed.cc create mode 100644 absl/time/internal/cctz/src/time_zone_fixed.h create mode 100644 absl/time/internal/cctz/src/time_zone_format.cc create mode 100644 absl/time/internal/cctz/src/time_zone_format_test.cc create mode 100644 absl/time/internal/cctz/src/time_zone_if.cc create mode 100644 absl/time/internal/cctz/src/time_zone_if.h create mode 100644 absl/time/internal/cctz/src/time_zone_impl.cc create mode 100644 absl/time/internal/cctz/src/time_zone_impl.h create mode 100644 absl/time/internal/cctz/src/time_zone_info.cc create mode 100644 absl/time/internal/cctz/src/time_zone_info.h create mode 100644 absl/time/internal/cctz/src/time_zone_libc.cc create mode 100644 absl/time/internal/cctz/src/time_zone_libc.h create mode 100644 absl/time/internal/cctz/src/time_zone_lookup.cc create mode 100644 absl/time/internal/cctz/src/time_zone_lookup_test.cc create mode 100644 absl/time/internal/cctz/src/time_zone_posix.cc create mode 100644 absl/time/internal/cctz/src/time_zone_posix.h create mode 100644 absl/time/internal/cctz/src/tzfile.h create mode 100644 absl/time/internal/cctz/src/zone_info_source.cc create mode 100644 absl/time/internal/cctz/testdata/README.zoneinfo create mode 100644 absl/time/internal/cctz/testdata/version create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Abidjan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Accra create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Addis_Ababa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Algiers create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmara create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmera create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Bamako create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Bangui create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Banjul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Bissau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Blantyre create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Brazzaville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Bujumbura create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Cairo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Casablanca create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Ceuta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Conakry create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Dakar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Dar_es_Salaam create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Djibouti create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Douala create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/El_Aaiun create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Freetown create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Gaborone create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Harare create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Johannesburg create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Juba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Kampala create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Khartoum create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Kigali create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Kinshasa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Lagos create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Libreville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Lome create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Luanda create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Lubumbashi create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Lusaka create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Malabo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Maputo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Maseru create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Mbabane create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Mogadishu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Monrovia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Nairobi create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Ndjamena create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Niamey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Nouakchott create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Ouagadougou create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Porto-Novo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Sao_Tome create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Timbuktu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Tripoli create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Tunis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Africa/Windhoek create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Adak create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Anchorage create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Anguilla create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Antigua create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Araguaina create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Buenos_Aires create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Catamarca create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/ComodRivadavia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Cordoba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Jujuy create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/La_Rioja create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Mendoza create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Rio_Gallegos create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Salta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Juan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Luis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Tucuman create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Ushuaia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Aruba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Asuncion create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Atikokan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Atka create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Bahia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Barbados create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Belem create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Belize create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Blanc-Sablon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Boa_Vista create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Bogota create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Boise create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Buenos_Aires create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cambridge_Bay create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Campo_Grande create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cancun create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Caracas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Catamarca create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cayenne create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cayman create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Chicago create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Ciudad_Juarez create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Coral_Harbour create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cordoba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Costa_Rica create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Creston create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Cuiaba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Curacao create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Danmarkshavn create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Dawson create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Dawson_Creek create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Denver create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Detroit create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Dominica create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Edmonton create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Eirunepe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/El_Salvador create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Fort_Nelson create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Fort_Wayne create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Fortaleza create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Glace_Bay create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Godthab create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Goose_Bay create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Grand_Turk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Grenada create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Guadeloupe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Guatemala create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Guayaquil create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Guyana create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Halifax create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Havana create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Hermosillo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Indianapolis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Knox create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Marengo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Petersburg create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Tell_City create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Vevay create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Vincennes create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Winamac create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Indianapolis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Inuvik create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Iqaluit create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Jamaica create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Jujuy create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Juneau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Kentucky/Louisville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Kentucky/Monticello create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Knox_IN create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Kralendijk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/La_Paz create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Lima create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Los_Angeles create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Louisville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Lower_Princes create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Maceio create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Managua create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Manaus create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Marigot create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Martinique create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Matamoros create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Mazatlan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Mendoza create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Menominee create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Merida create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Metlakatla create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Mexico_City create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Miquelon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Moncton create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Monterrey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Montevideo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Montreal create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Montserrat create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Nassau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/New_York create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Nipigon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Nome create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Noronha create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Beulah create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Center create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/New_Salem create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Nuuk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Ojinaga create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Panama create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Pangnirtung create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Paramaribo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Phoenix create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Port-au-Prince create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Port_of_Spain create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Porto_Acre create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Porto_Velho create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Puerto_Rico create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Punta_Arenas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Rainy_River create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Rankin_Inlet create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Recife create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Regina create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Resolute create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Rio_Branco create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Rosario create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Santarem create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Santiago create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Santo_Domingo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Sao_Paulo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Scoresbysund create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Shiprock create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Sitka create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Barthelemy create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Johns create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Kitts create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Lucia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Thomas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/St_Vincent create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Swift_Current create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Tegucigalpa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Thule create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Thunder_Bay create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Toronto create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Tortola create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Vancouver create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Virgin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Whitehorse create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Winnipeg create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Yakutat create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/America/Yellowknife create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Casey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Davis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/DumontDUrville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Macquarie create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Mawson create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/McMurdo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Palmer create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Rothera create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/South_Pole create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Syowa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Troll create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Vostok create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Arctic/Longyearbyen create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Aden create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Almaty create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Amman create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Anadyr create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Aqtau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Aqtobe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashgabat create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashkhabad create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Atyrau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Baghdad create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Bahrain create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Baku create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Bangkok create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Barnaul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Beirut create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Bishkek create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Brunei create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Calcutta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Chita create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Choibalsan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Chongqing create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Chungking create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Colombo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Dacca create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Damascus create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Dhaka create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Dili create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Dubai create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Dushanbe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Famagusta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Gaza create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Harbin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Hebron create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Hong_Kong create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Hovd create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Irkutsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Istanbul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Jakarta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Jayapura create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Jerusalem create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kabul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kamchatka create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Karachi create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kashgar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kathmandu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Katmandu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Khandyga create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kolkata create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Krasnoyarsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuala_Lumpur create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuching create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuwait create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Macao create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Macau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Magadan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Makassar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Manila create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Muscat create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Nicosia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Novokuznetsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Novosibirsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Omsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Oral create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Phnom_Penh create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Pontianak create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Pyongyang create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Qatar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Qostanay create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Qyzylorda create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Rangoon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Riyadh create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Sakhalin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Samarkand create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Seoul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Shanghai create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Singapore create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Srednekolymsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Taipei create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tashkent create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tbilisi create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tel_Aviv create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Thimbu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Thimphu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tokyo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Tomsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ujung_Pandang create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ulaanbaatar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ulan_Bator create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Urumqi create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Ust-Nera create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Vientiane create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Vladivostok create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Yakutsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Yangon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Yekaterinburg create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Asia/Yerevan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Azores create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Bermuda create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Canary create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Cape_Verde create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Faeroe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Faroe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Jan_Mayen create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Madeira create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Reykjavik create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/South_Georgia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/St_Helena create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Stanley create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/ACT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Adelaide create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Brisbane create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Broken_Hill create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Canberra create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Currie create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Darwin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Eucla create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Hobart create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/LHI create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Lindeman create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Lord_Howe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Melbourne create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/NSW create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/North create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Perth create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Queensland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/South create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Sydney create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Tasmania create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Victoria create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/West create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Australia/Yancowinna create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Brazil/Acre create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Brazil/DeNoronha create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Brazil/East create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Brazil/West create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/CET create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/CST6CDT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Atlantic create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Central create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Eastern create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Mountain create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Newfoundland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Pacific create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Saskatchewan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Canada/Yukon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Chile/Continental create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Chile/EasterIsland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Cuba create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/EET create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/EST create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/EST5EDT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Egypt create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Eire create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+1 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+10 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+11 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+12 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+2 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+3 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+4 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+5 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+6 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+7 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+8 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+9 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-1 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-10 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-11 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-12 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-13 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-14 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-2 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-3 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-4 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-5 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-6 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-7 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-8 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-9 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/Greenwich create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/UCT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/UTC create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/Universal create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Etc/Zulu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Amsterdam create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Andorra create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Astrakhan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Athens create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Belfast create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Belgrade create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Berlin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Bratislava create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Brussels create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Bucharest create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Budapest create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Busingen create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Chisinau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Copenhagen create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Dublin create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Gibraltar create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Guernsey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Helsinki create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Isle_of_Man create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Istanbul create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Jersey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Kaliningrad create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Kiev create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Kirov create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Kyiv create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Lisbon create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Ljubljana create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/London create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Luxembourg create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Madrid create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Malta create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Mariehamn create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Minsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Monaco create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Moscow create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Nicosia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Oslo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Paris create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Podgorica create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Prague create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Riga create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Rome create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Samara create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/San_Marino create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Sarajevo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Saratov create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Simferopol create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Skopje create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Sofia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Stockholm create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Tallinn create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Tirane create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Ulyanovsk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Uzhgorod create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Vaduz create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Vatican create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Vienna create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Vilnius create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Volgograd create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Warsaw create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Zagreb create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Zaporozhye create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Europe/Zurich create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Factory create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GB create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GB-Eire create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GMT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GMT+0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GMT-0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/GMT0 create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Greenwich create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/HST create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Hongkong create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Iceland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Antananarivo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Chagos create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Christmas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Cocos create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Comoro create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Kerguelen create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Mahe create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Maldives create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Mauritius create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Mayotte create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Indian/Reunion create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Iran create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Israel create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Jamaica create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Japan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Kwajalein create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Libya create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/MET create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/MST create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/MST7MDT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaSur create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Mexico/General create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/NZ create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/NZ-CHAT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Navajo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/PRC create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/PST8PDT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Apia create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Auckland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Bougainville create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Chatham create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Chuuk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Easter create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Efate create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Enderbury create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fakaofo create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fiji create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Funafuti create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Galapagos create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Gambier create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Guadalcanal create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Guam create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Honolulu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Johnston create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kanton create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kiritimati create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kosrae create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kwajalein create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Majuro create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Marquesas create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Midway create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Nauru create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Niue create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Norfolk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Noumea create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pago_Pago create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Palau create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pitcairn create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pohnpei create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Ponape create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Port_Moresby create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Rarotonga create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Saipan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Samoa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tahiti create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tarawa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tongatapu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Truk create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wake create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wallis create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Pacific/Yap create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Poland create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Portugal create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/ROC create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/ROK create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Singapore create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Turkey create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/UCT create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Alaska create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Aleutian create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Arizona create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Central create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/East-Indiana create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Eastern create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Hawaii create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Indiana-Starke create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Michigan create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Mountain create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Pacific create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/US/Samoa create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/UTC create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Universal create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/W-SU create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/WET create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/Zulu create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/iso3166.tab create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab create mode 100644 absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab create mode 100644 absl/time/internal/get_current_time_chrono.inc create mode 100644 absl/time/internal/get_current_time_posix.inc create mode 100644 absl/time/internal/test_util.cc create mode 100644 absl/time/internal/test_util.h create mode 100644 absl/time/time.cc create mode 100644 absl/time/time.h create mode 100644 absl/time/time_benchmark.cc create mode 100644 absl/time/time_test.cc create mode 100644 absl/time/time_zone_test.cc create mode 100644 absl/types/BUILD.bazel create mode 100644 absl/types/CMakeLists.txt create mode 100644 absl/types/any.h create mode 100644 absl/types/any_exception_safety_test.cc create mode 100644 absl/types/any_test.cc create mode 100644 absl/types/bad_any_cast.cc create mode 100644 absl/types/bad_any_cast.h create mode 100644 absl/types/bad_optional_access.cc create mode 100644 absl/types/bad_optional_access.h create mode 100644 absl/types/bad_variant_access.cc create mode 100644 absl/types/bad_variant_access.h create mode 100644 absl/types/compare.h create mode 100644 absl/types/compare_test.cc create mode 100644 absl/types/internal/optional.h create mode 100644 absl/types/internal/span.h create mode 100644 absl/types/internal/variant.h create mode 100644 absl/types/optional.h create mode 100644 absl/types/optional_exception_safety_test.cc create mode 100644 absl/types/optional_test.cc create mode 100644 absl/types/span.h create mode 100644 absl/types/span_test.cc create mode 100644 absl/types/variant.h create mode 100644 absl/types/variant_benchmark.cc create mode 100644 absl/types/variant_exception_safety_test.cc create mode 100644 absl/types/variant_test.cc create mode 100644 absl/utility/BUILD.bazel create mode 100644 absl/utility/CMakeLists.txt create mode 100644 absl/utility/internal/if_constexpr.h create mode 100644 absl/utility/internal/if_constexpr_test.cc create mode 100644 absl/utility/utility.h create mode 100644 absl/utility/utility_test.cc delete mode 100644 adapter-ohos.patch create mode 100644 ci/absl_alternate_options.h create mode 100644 ci/cmake_common.sh create mode 100644 ci/cmake_install_test.sh create mode 100644 ci/linux_arm_clang-latest_libcxx_bazel.sh create mode 100644 ci/linux_clang-latest_libcxx_asan_bazel.sh create mode 100644 ci/linux_clang-latest_libcxx_bazel.sh create mode 100644 ci/linux_clang-latest_libcxx_tsan_bazel.sh create mode 100644 ci/linux_clang-latest_libstdcxx_bazel.sh create mode 100644 ci/linux_docker_containers.sh create mode 100644 ci/linux_gcc-floor_libstdcxx_bazel.sh create mode 100644 ci/linux_gcc-latest_libstdcxx_bazel.sh create mode 100644 ci/linux_gcc-latest_libstdcxx_cmake.sh create mode 100644 ci/linux_gcc_alpine_cmake.sh create mode 100644 ci/macos_xcode_bazel.sh create mode 100644 ci/macos_xcode_cmake.sh create mode 100644 ci/windows_clangcl_bazel.bat create mode 100644 ci/windows_msvc_bazel.bat create mode 100644 ci/windows_msvc_cmake.bat create mode 100644 conanfile.py create mode 100644 create_lts.py delete mode 100644 fix-mac-complier-error.patch delete mode 100644 fix-mingw-complier-error.patch delete mode 100755 install.sh delete mode 100755 install_for_mac.sh delete mode 100755 install_no_lock.sh delete mode 100644 lock_file.lock diff --git a/ABSEIL_ISSUE_TEMPLATE.md b/ABSEIL_ISSUE_TEMPLATE.md new file mode 100644 index 0000000..ed5461f --- /dev/null +++ b/ABSEIL_ISSUE_TEMPLATE.md @@ -0,0 +1,22 @@ +Please submit a new Abseil Issue using the template below: + +## [Short title of proposed API change(s)] + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- + +## Background + +[Provide the background information that is required in order to evaluate the +proposed API changes. No controversial claims should be made here. If there are +design constraints that need to be considered, they should be presented here +**along with justification for those constraints**. Linking to other docs is +good, but please keep the **pertinent information as self contained** as +possible in this section.] + +## Proposed API Change (s) + +[Please clearly describe the API change(s) being proposed. If multiple changes, +please keep them clearly distinguished. When possible, **use example code +snippets to illustrate before-after API usages**. List pros-n-cons. Highlight +the main questions that you want to be answered. Given the Abseil project compatibility requirements, describe why the API change is safe.] diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 index 0000000..03122a9 --- /dev/null +++ b/BUILD.bazel @@ -0,0 +1,35 @@ +# Copyright 2020 The Abseil Authors. +# +# 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 +# +# https://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. +# + +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) # Apache 2.0 + +# Expose license for external usage through bazel. +exports_files([ + "AUTHORS", + "LICENSE", +]) + +# For building with clang-cl. +# https://bazel.build/configure/windows#clang +platform( + name = "x64_windows-clang-cl", + constraint_values = [ + "@platforms//cpu:x86_64", + "@platforms//os:windows", + "@bazel_tools//tools/cpp:clang-cl", + ], +) diff --git a/BUILD.gn b/BUILD.gn index bc68cef..7c1964c 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -14,252 +14,6 @@ import("//build/ohos.gni") import("./configure_copts.gni") -action("abseil_cpp_action") { - if (host_os == "mac") { - script = "//third_party/abseil-cpp/install_for_mac.sh" - } else { - script = "//third_party/abseil-cpp/install.sh" - } - inputs = [ - "//third_party/abseil-cpp/abseil-cpp-20250127.0.tar.gz", - ] - outputs = [ - "${target_gen_dir}/abseil-cpp", - "${target_gen_dir}/abseil-cpp/absl", - "${target_gen_dir}/abseil-cpp/ci", - "${target_gen_dir}/abseil-cpp/CMake", - "${target_gen_dir}/abseil-cpp/absl/base/internal/cycleclock.cc", - "${target_gen_dir}/abseil-cpp/absl/base/internal/low_level_alloc.cc", - "${target_gen_dir}/abseil-cpp/absl/base/internal/raw_logging.cc", - "${target_gen_dir}/abseil-cpp/absl/base/internal/spinlock.cc", - "${target_gen_dir}/abseil-cpp/absl/base/internal/strerror.cc", - "${target_gen_dir}/abseil-cpp/absl/base/internal/sysinfo.cc", - "${target_gen_dir}/abseil-cpp/absl/base/internal/thread_identity.cc", - "${target_gen_dir}/abseil-cpp/absl/base/internal/throw_delegate.cc", - "${target_gen_dir}/abseil-cpp/absl/base/internal/tracing.cc", - "${target_gen_dir}/abseil-cpp/absl/base/internal/unscaledcycleclock.cc", - "${target_gen_dir}/abseil-cpp/absl/base/internal/poison.cc", - "${target_gen_dir}/abseil-cpp/absl/base/internal/scoped_set_env.cc", - "${target_gen_dir}/abseil-cpp/absl/base/internal/spinlock_wait.cc", - "${target_gen_dir}/abseil-cpp/absl/base/log_severity.cc", - "${target_gen_dir}/abseil-cpp/absl/container/internal/hashtablez_sampler.cc", - "${target_gen_dir}/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc", - "${target_gen_dir}/abseil-cpp/absl/container/internal/raw_hash_set.cc", - "${target_gen_dir}/abseil-cpp/absl/crc/crc32c.cc", - "${target_gen_dir}/abseil-cpp/absl/crc/internal/cpu_detect.cc", - "${target_gen_dir}/abseil-cpp/absl/crc/internal/crc.cc", - "${target_gen_dir}/abseil-cpp/absl/crc/internal/crc_cord_state.cc", - "${target_gen_dir}/abseil-cpp/absl/crc/internal/crc_memcpy_fallback.cc", - "${target_gen_dir}/abseil-cpp/absl/crc/internal/crc_memcpy_x86_arm_combined.cc", - "${target_gen_dir}/abseil-cpp/absl/crc/internal/crc_non_temporal_memcpy.cc", - "${target_gen_dir}/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc", - "${target_gen_dir}/abseil-cpp/absl/debugging/failure_signal_handler.cc", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/address_is_readable.cc", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/demangle.cc", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/demangle_rust.cc", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/elf_mem_image.cc", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/examine_stack.cc", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/stack_consumption.cc", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/utf8_for_code_point.cc", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/vdso_support.cc", - "${target_gen_dir}/abseil-cpp/absl/debugging/leak_check.cc", - "${target_gen_dir}/abseil-cpp/absl/debugging/stacktrace.cc", - "${target_gen_dir}/abseil-cpp/absl/debugging/symbolize.cc", - "${target_gen_dir}/abseil-cpp/absl/hash/internal/city.cc", - "${target_gen_dir}/abseil-cpp/absl/hash/internal/hash.cc", - "${target_gen_dir}/abseil-cpp/absl/hash/internal/low_level_hash.cc", - "${target_gen_dir}/abseil-cpp/absl/log/die_if_null.cc", - "${target_gen_dir}/abseil-cpp/absl/log/globals.cc", - "${target_gen_dir}/abseil-cpp/absl/log/initialize.cc", - "${target_gen_dir}/abseil-cpp/absl/log/internal/check_op.cc", - "${target_gen_dir}/abseil-cpp/absl/log/internal/conditions.cc", - "${target_gen_dir}/abseil-cpp/absl/log/internal/fnmatch.cc", - "${target_gen_dir}/abseil-cpp/absl/log/internal/globals.cc", - "${target_gen_dir}/abseil-cpp/absl/log/internal/log_format.cc", - "${target_gen_dir}/abseil-cpp/absl/log/internal/log_message.cc", - "${target_gen_dir}/abseil-cpp/absl/log/internal/log_sink_set.cc", - "${target_gen_dir}/abseil-cpp/absl/log/internal/nullguard.cc", - "${target_gen_dir}/abseil-cpp/absl/log/internal/proto.cc", - "${target_gen_dir}/abseil-cpp/absl/log/internal/structured_proto.cc", - "${target_gen_dir}/abseil-cpp/absl/log/internal/vlog_config.cc", - "${target_gen_dir}/abseil-cpp/absl/log/log_entry.cc", - "${target_gen_dir}/abseil-cpp/absl/log/log_sink.cc", - "${target_gen_dir}/abseil-cpp/absl/numeric/int128.cc", - "${target_gen_dir}/abseil-cpp/absl/profiling/internal/exponential_biased.cc", - "${target_gen_dir}/abseil-cpp/absl/profiling/internal/periodic_sampler.cc", - "${target_gen_dir}/abseil-cpp/absl/random/discrete_distribution.cc", - "${target_gen_dir}/abseil-cpp/absl/random/gaussian_distribution.cc", - "${target_gen_dir}/abseil-cpp/absl/random/internal/pool_urbg.cc", - "${target_gen_dir}/abseil-cpp/absl/random/internal/randen.cc", - "${target_gen_dir}/abseil-cpp/absl/random/internal/randen_detect.cc", - "${target_gen_dir}/abseil-cpp/absl/random/internal/randen_hwaes.cc", - "${target_gen_dir}/abseil-cpp/absl/random/internal/randen_round_keys.cc", - "${target_gen_dir}/abseil-cpp/absl/random/internal/randen_slow.cc", - "${target_gen_dir}/abseil-cpp/absl/random/internal/seed_material.cc", - "${target_gen_dir}/abseil-cpp/absl/random/seed_gen_exception.cc", - "${target_gen_dir}/abseil-cpp/absl/random/seed_sequences.cc", - "${target_gen_dir}/abseil-cpp/absl/status/internal/status_internal.cc", - "${target_gen_dir}/abseil-cpp/absl/status/status.cc", - "${target_gen_dir}/abseil-cpp/absl/status/status_payload_printer.cc", - "${target_gen_dir}/abseil-cpp/absl/status/statusor.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/ascii.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/charconv.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/cord.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/cord_analysis.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/cord_buffer.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/escaping.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/charconv_bigint.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/charconv_parse.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/cord_internal.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/cord_rep_btree.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/cord_rep_consume.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/cord_rep_crc.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/cordz_functions.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/cordz_handle.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/cordz_info.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/cordz_sample_token.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/escaping.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/memutil.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/ostringstream.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/pow10_helper.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/str_format/arg.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/str_format/bind.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/str_format/extension.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/str_format/output.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/str_format/parser.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/stringify_sink.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/utf8.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/match.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/numbers.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/str_cat.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/str_replace.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/str_split.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/string_view.cc", - "${target_gen_dir}/abseil-cpp/absl/strings/substitute.cc", - "${target_gen_dir}/abseil-cpp/absl/synchronization/barrier.cc", - "${target_gen_dir}/abseil-cpp/absl/synchronization/blocking_counter.cc", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/futex_waiter.cc", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/graphcycles.cc", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/sem_waiter.cc", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/waiter_base.cc", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/win32_waiter.cc", - "${target_gen_dir}/abseil-cpp/absl/synchronization/mutex.cc", - "${target_gen_dir}/abseil-cpp/absl/synchronization/notification.cc", - "${target_gen_dir}/abseil-cpp/absl/time/civil_time.cc", - "${target_gen_dir}/abseil-cpp/absl/time/clock.cc", - "${target_gen_dir}/abseil-cpp/absl/time/duration.cc", - "${target_gen_dir}/abseil-cpp/absl/time/format.cc", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc", - "${target_gen_dir}/abseil-cpp/absl/time/time.cc", - "${target_gen_dir}/abseil-cpp/absl/types/bad_any_cast.cc", - "${target_gen_dir}/abseil-cpp/absl/types/bad_optional_access.cc", - "${target_gen_dir}/abseil-cpp/absl/types/bad_variant_access.cc", - "${target_gen_dir}/abseil-cpp/absl/log/absl_check.h", - "${target_gen_dir}/abseil-cpp/absl/log/internal/nullguard.h", - "${target_gen_dir}/abseil-cpp/absl/base/internal/spinlock_akaros.inc", - "${target_gen_dir}/abseil-cpp/absl/base/internal/spinlock_linux.inc", - "${target_gen_dir}/abseil-cpp/absl/base/internal/spinlock_posix.inc", - "${target_gen_dir}/abseil-cpp/absl/base/internal/spinlock_win32.inc", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/address_is_readable.h", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/examine_stack.h", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/stacktrace_config.h", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc", - "${target_gen_dir}/abseil-cpp/absl/debugging/stacktrace.h", - "${target_gen_dir}/abseil-cpp/absl/debugging/internal/symbolize.h", - "${target_gen_dir}/abseil-cpp/absl/debugging/symbolize.h", - "${target_gen_dir}/abseil-cpp/absl/debugging/symbolize_darwin.inc", - "${target_gen_dir}/abseil-cpp/absl/debugging/symbolize_elf.inc", - "${target_gen_dir}/abseil-cpp/absl/debugging/symbolize_unimplemented.inc", - "${target_gen_dir}/abseil-cpp/absl/debugging/symbolize_win32.inc", - "${target_gen_dir}/abseil-cpp/absl/hash/internal/city.h", - "${target_gen_dir}/abseil-cpp/absl/hash/internal/hash.h", - "${target_gen_dir}/abseil-cpp/absl/hash/internal/low_level_hash.h", - "${target_gen_dir}/abseil-cpp/absl/hash/internal/print_hash_of.cc", - "${target_gen_dir}/abseil-cpp/absl/hash/internal/spy_hash_state.h", - "${target_gen_dir}/abseil-cpp/absl/numeric/int128_have_intrinsic.inc", - "${target_gen_dir}/abseil-cpp/absl/numeric/int128_no_intrinsic.inc", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/charconv_bigint.h", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/charconv_parse.h", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/memutil.h", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/stl_type_traits.h", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/str_join_internal.h", - "${target_gen_dir}/abseil-cpp/absl/strings/internal/str_split_internal.h", - "${target_gen_dir}/abseil-cpp/absl/strings/str_cat.h", - "${target_gen_dir}/abseil-cpp/absl/crc/crc32c.h", - "${target_gen_dir}/abseil-cpp/absl/crc/internal/crc32c.h", - "${target_gen_dir}/abseil-cpp/absl/crc/internal/crc32c_inline.h", - "${target_gen_dir}/abseil-cpp/absl/crc/internal/crc_memcpy.h", - "${target_gen_dir}/abseil-cpp/absl/synchronization/barrier.h", - "${target_gen_dir}/abseil-cpp/absl/synchronization/blocking_counter.h", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/create_thread_identity.h", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/futex.h", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/futex_waiter.h", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/graphcycles.h", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/kernel_timeout.h", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/per_thread_sem.h", - "${target_gen_dir}/abseil-cpp/absl/synchronization/internal/waiter_base.h", - "${target_gen_dir}/abseil-cpp/absl/synchronization/mutex.h", - "${target_gen_dir}/abseil-cpp/absl/synchronization/notification.h", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h", - "${target_gen_dir}/abseil-cpp/absl/time/internal/cctz/src/tzfile.h", - "${target_gen_dir}/abseil-cpp/absl/time/internal/get_current_time_chrono.inc", - "${target_gen_dir}/abseil-cpp/absl/time/internal/get_current_time_posix.inc", - "${target_gen_dir}/abseil-cpp/absl/flags/commandlineflag.cc", - "${target_gen_dir}/abseil-cpp/absl/flags/commandlineflag.h", - "${target_gen_dir}/abseil-cpp/absl/flags/internal/commandlineflag.cc", - "${target_gen_dir}/abseil-cpp/absl/flags/internal/commandlineflag.h", - "${target_gen_dir}/abseil-cpp/absl/flags/internal/flag.cc", - "${target_gen_dir}/abseil-cpp/absl/flags/internal/flag.h", - "${target_gen_dir}/abseil-cpp/absl/flags/internal/private_handle_accessor.cc", - "${target_gen_dir}/abseil-cpp/absl/flags/internal/private_handle_accessor.h", - "${target_gen_dir}/abseil-cpp/absl/flags/internal/program_name.cc", - "${target_gen_dir}/abseil-cpp/absl/flags/internal/program_name.h", - "${target_gen_dir}/abseil-cpp/absl/flags/marshalling.cc", - "${target_gen_dir}/abseil-cpp/absl/flags/marshalling.h", - "${target_gen_dir}/abseil-cpp/absl/flags/reflection.cc", - "${target_gen_dir}/abseil-cpp/absl/flags/reflection.h", - "${target_gen_dir}/abseil-cpp/absl/flags/usage_config.cc", - "${target_gen_dir}/abseil-cpp/absl/flags/usage_config.h", - "${target_gen_dir}/abseil-cpp/absl/random/internal/randen.h", - "${target_gen_dir}/abseil-cpp/absl/random/internal/randen_slow.h", - ] - abseil_cpp_src_path = rebase_path("//third_party/abseil-cpp") - abseil_cpp_gen_path = rebase_path("${target_gen_dir}", root_build_dir) - args = ["$abseil_cpp_gen_path", "$abseil_cpp_src_path"] -} - -ABSEIL_DIR = rebase_path("${target_gen_dir}/abseil-cpp") - config("absl_public_config") { include_dirs = [ "${ABSEIL_DIR}/" ] } @@ -277,16 +31,13 @@ ohos_shared_library("absl_base") { "${ABSEIL_DIR}/absl/base/internal/tracing.cc", "${ABSEIL_DIR}/absl/base/internal/unscaledcycleclock.cc", ] - include_dirs = [ "${ABSEIL_DIR}/" ] - cflags = ABSL_DEFAULT_COPTS public_configs = [ ":absl_public_config" ] deps = [ ":absl_log_severity", ":absl_raw_logging_internal", ":absl_spinlock_wait", - ":abseil_cpp_action", ] install_enable = true subsystem_name = "${THIRDPARTY_ABSEIL_SUBSYS_NAME}" @@ -444,7 +195,6 @@ ohos_static_library("absl_base_static") { include_dirs = [ "${ABSEIL_DIR}/" ] cflags = ABSL_DEFAULT_COPTS public_configs = [ ":absl_public_config" ] - deps = [":abseil_cpp_action",] subsystem_name = "${THIRDPARTY_ABSEIL_SUBSYS_NAME}" part_name = "${THIRDPARTY_ABSEIL_PART_NAME}" } @@ -457,7 +207,6 @@ ohos_shared_library("absl_raw_logging_internal") { public_configs = [ ":absl_public_config" ] deps = [ ":absl_log_severity", - ":abseil_cpp_action", ] install_enable = true innerapi_tags = [ "platformsdk_indirect" ] @@ -501,7 +250,6 @@ ohos_shared_library("absl_log") { ":absl_sync", ":absl_time", ":absl_time_zone", - ":abseil_cpp_action", ] install_enable = true innerapi_tags = [ "platformsdk_indirect" ] @@ -514,7 +262,6 @@ ohos_shared_library("absl_log_severity") { include_dirs = [ "${ABSEIL_DIR}/" ] cflags = ABSL_DEFAULT_COPTS install_enable = true - deps = [":abseil_cpp_action",] public_configs = [ ":absl_public_config" ] innerapi_tags = [ "platformsdk_indirect" ] subsystem_name = "${THIRDPARTY_ABSEIL_SUBSYS_NAME}" @@ -533,7 +280,6 @@ ohos_shared_library("absl_spinlock_wait") { include_dirs = [ "${ABSEIL_DIR}/" ] cflags = ABSL_DEFAULT_COPTS install_enable = true - deps = [":abseil_cpp_action",] subsystem_name = "${THIRDPARTY_ABSEIL_SUBSYS_NAME}" part_name = "${THIRDPARTY_ABSEIL_PART_NAME}" } @@ -546,7 +292,6 @@ ohos_shared_library("absl_throw_delegate") { cflags = ABSL_DEFAULT_COPTS deps = [ ":absl_raw_logging_internal", - ":abseil_cpp_action", ] public_configs = [ ":absl_public_config" ] install_enable = true @@ -580,7 +325,6 @@ ohos_shared_library("absl_stacktrace") { ":absl_base", ":absl_raw_logging_internal", ":absl_symbolize", - ":abseil_cpp_action", ] public_configs = [ ":absl_public_config" ] install_enable = true @@ -609,7 +353,6 @@ ohos_shared_library("absl_symbolize") { deps = [ ":absl_base", ":absl_raw_logging_internal", - ":abseil_cpp_action", ] public_configs = [ ":absl_public_config" ] install_enable = true @@ -635,7 +378,6 @@ ohos_shared_library("absl_hash") { ":absl_stacktrace", ":absl_symbolize", ":absl_time", - ":abseil_cpp_action", ] public_configs = [ ":absl_public_config" ] install_enable = true @@ -652,7 +394,6 @@ ohos_shared_library("absl_int128") { include_dirs = [ "${ABSEIL_DIR}/" ] cflags = ABSL_DEFAULT_COPTS install_enable = true - deps = [ ":abseil_cpp_action", ] public_configs = [ ":absl_public_config" ] innerapi_tags = [ "platformsdk_indirect" ] subsystem_name = "${THIRDPARTY_ABSEIL_SUBSYS_NAME}" @@ -680,7 +421,6 @@ ohos_shared_library("absl_status") { ":absl_raw_logging_internal", ":absl_spinlock_wait", ":absl_strings", - ":abseil_cpp_action", ] install_enable = true @@ -702,7 +442,6 @@ ohos_shared_library("absl_statusor") { ":absl_spinlock_wait", ":absl_status", ":absl_strings", - ":abseil_cpp_action", ] public_configs = [ ":absl_public_config" ] install_enable = true @@ -805,7 +544,6 @@ ohos_shared_library("absl_strings") { ":absl_int128", ":absl_raw_logging_internal", ":absl_strings_internal", - ":abseil_cpp_action", ] public_configs = [ ":absl_public_config" ] install_enable = true @@ -821,13 +559,10 @@ ohos_shared_library("absl_strings_internal") { "${ABSEIL_DIR}/absl/strings/internal/utf8.cc", ] include_dirs = [ "${ABSEIL_DIR}/" ] - configs = [ ":cflags_config" ] - deps = [ ":absl_raw_logging_internal", ":absl_throw_delegate", - ":abseil_cpp_action", ] install_enable = true innerapi_tags = [ "platformsdk_indirect" ] @@ -877,7 +612,6 @@ ohos_shared_library("absl_cord") { ":absl_sync", ":absl_throw_delegate", ":absl_time", - ":abseil_cpp_action", ] public_configs = [ ":absl_public_config" ] install_enable = true @@ -901,7 +635,6 @@ ohos_shared_library("absl_str_format_internal") { deps = [ ":absl_int128", ":absl_strings", - ":abseil_cpp_action", ] install_enable = true subsystem_name = "${THIRDPARTY_ABSEIL_SUBSYS_NAME}" @@ -941,7 +674,6 @@ ohos_shared_library("absl_sync") { ":absl_stacktrace", ":absl_symbolize", ":absl_time", - ":abseil_cpp_action", ] public_configs = [ ":absl_public_config" ] install_enable = true @@ -954,7 +686,6 @@ ohos_shared_library("absl_civil_time") { include_dirs = [ "${ABSEIL_DIR}/" ] install_enable = true cflags = ABSL_DEFAULT_COPTS - deps = [ ":abseil_cpp_action", ] subsystem_name = "${THIRDPARTY_ABSEIL_SUBSYS_NAME}" part_name = "${THIRDPARTY_ABSEIL_PART_NAME}" } @@ -966,7 +697,6 @@ ohos_shared_library("absl_container") { deps = [ ":absl_base", ":absl_hash", - ":abseil_cpp_action", ] install_enable = true @@ -997,7 +727,6 @@ ohos_shared_library("absl_time_zone") { include_dirs = [ "${ABSEIL_DIR}/" ] deps = [ ":absl_civil_time", - ":abseil_cpp_action", ] public_configs = [ ":absl_public_config" ] install_enable = true @@ -1024,7 +753,6 @@ ohos_shared_library("absl_time") { ":absl_raw_logging_internal", ":absl_strings", ":absl_time_zone", - ":abseil_cpp_action", ] public_configs = [ ":absl_public_config" ] install_enable = true @@ -1062,7 +790,6 @@ ohos_shared_library("absl_flags") { ":absl_str_format_internal", ":absl_strings", ":absl_sync", - ":abseil_cpp_action", ] cflags = ABSL_DEFAULT_COPTS public_configs = [ ":absl_public_config" ] @@ -1095,7 +822,6 @@ ohos_shared_library("absl_random") { ":absl_str_format_internal", ":absl_strings", ":absl_sync", - ":abseil_cpp_action", ] cflags = ABSL_DEFAULT_COPTS public_configs = [ ":absl_public_config" ] @@ -1110,7 +836,6 @@ ohos_shared_library("absl_bad_optional_access") { cflags = ABSL_DEFAULT_COPTS deps = [ ":absl_raw_logging_internal", - ":abseil_cpp_action", ] install_enable = true subsystem_name = "${THIRDPARTY_ABSEIL_SUBSYS_NAME}" @@ -1123,7 +848,6 @@ ohos_shared_library("absl_bad_variant_access") { cflags = ABSL_DEFAULT_COPTS deps = [ ":absl_raw_logging_internal", - ":abseil_cpp_action", ] install_enable = true subsystem_name = "${THIRDPARTY_ABSEIL_SUBSYS_NAME}" diff --git a/CMake/AbseilDll.cmake b/CMake/AbseilDll.cmake new file mode 100644 index 0000000..1b89569 --- /dev/null +++ b/CMake/AbseilDll.cmake @@ -0,0 +1,915 @@ +include(CMakeParseArguments) +include(GNUInstallDirs) + +set(ABSL_INTERNAL_DLL_FILES + "algorithm/algorithm.h" + "algorithm/container.h" + "base/attributes.h" + "base/call_once.h" + "base/casts.h" + "base/config.h" + "base/const_init.h" + "base/dynamic_annotations.h" + "base/internal/atomic_hook.h" + "base/internal/cycleclock.cc" + "base/internal/cycleclock.h" + "base/internal/cycleclock_config.h" + "base/internal/direct_mmap.h" + "base/internal/dynamic_annotations.h" + "base/internal/endian.h" + "base/internal/errno_saver.h" + "base/internal/fast_type_id.h" + "base/internal/hide_ptr.h" + "base/internal/identity.h" + "base/internal/invoke.h" + "base/internal/inline_variable.h" + "base/internal/low_level_alloc.cc" + "base/internal/low_level_alloc.h" + "base/internal/low_level_scheduling.h" + "base/internal/nullability_impl.h" + "base/internal/per_thread_tls.h" + "base/internal/poison.cc" + "base/internal/poison.h" + "base/prefetch.h" + "base/internal/pretty_function.h" + "base/internal/raw_logging.cc" + "base/internal/raw_logging.h" + "base/internal/scheduling_mode.h" + "base/internal/scoped_set_env.cc" + "base/internal/scoped_set_env.h" + "base/internal/strerror.h" + "base/internal/strerror.cc" + "base/internal/spinlock.cc" + "base/internal/spinlock.h" + "base/internal/spinlock_wait.cc" + "base/internal/spinlock_wait.h" + "base/internal/sysinfo.cc" + "base/internal/sysinfo.h" + "base/internal/thread_identity.cc" + "base/internal/thread_identity.h" + "base/internal/throw_delegate.cc" + "base/internal/throw_delegate.h" + "base/internal/tracing.cc" + "base/internal/tracing.h" + "base/internal/tsan_mutex_interface.h" + "base/internal/unaligned_access.h" + "base/internal/unscaledcycleclock.cc" + "base/internal/unscaledcycleclock.h" + "base/internal/unscaledcycleclock_config.h" + "base/log_severity.cc" + "base/log_severity.h" + "base/macros.h" + "base/no_destructor.h" + "base/nullability.h" + "base/optimization.h" + "base/options.h" + "base/policy_checks.h" + "base/port.h" + "base/thread_annotations.h" + "cleanup/cleanup.h" + "cleanup/internal/cleanup.h" + "container/btree_map.h" + "container/btree_set.h" + "container/hash_container_defaults.h" + "container/fixed_array.h" + "container/flat_hash_map.h" + "container/flat_hash_set.h" + "container/inlined_vector.h" + "container/internal/btree.h" + "container/internal/btree_container.h" + "container/internal/common.h" + "container/internal/common_policy_traits.h" + "container/internal/compressed_tuple.h" + "container/internal/container_memory.h" + "container/internal/hash_function_defaults.h" + "container/internal/hash_policy_traits.h" + "container/internal/hashtable_debug.h" + "container/internal/hashtable_debug_hooks.h" + "container/internal/hashtablez_sampler.cc" + "container/internal/hashtablez_sampler.h" + "container/internal/hashtablez_sampler_force_weak_definition.cc" + "container/internal/inlined_vector.h" + "container/internal/layout.h" + "container/internal/node_slot_policy.h" + "container/internal/raw_hash_map.h" + "container/internal/raw_hash_set.cc" + "container/internal/raw_hash_set.h" + "container/internal/tracked.h" + "container/node_hash_map.h" + "container/node_hash_set.h" + "crc/crc32c.cc" + "crc/crc32c.h" + "crc/internal/cpu_detect.cc" + "crc/internal/cpu_detect.h" + "crc/internal/crc32c.h" + "crc/internal/crc32c_inline.h" + "crc/internal/crc32_x86_arm_combined_simd.h" + "crc/internal/crc.cc" + "crc/internal/crc.h" + "crc/internal/crc_cord_state.cc" + "crc/internal/crc_cord_state.h" + "crc/internal/crc_internal.h" + "crc/internal/crc_x86_arm_combined.cc" + "crc/internal/crc_memcpy_fallback.cc" + "crc/internal/crc_memcpy.h" + "crc/internal/crc_memcpy_x86_arm_combined.cc" + "crc/internal/crc_non_temporal_memcpy.cc" + "crc/internal/crc_x86_arm_combined.cc" + "crc/internal/non_temporal_arm_intrinsics.h" + "crc/internal/non_temporal_memcpy.h" + "debugging/failure_signal_handler.cc" + "debugging/failure_signal_handler.h" + "debugging/leak_check.h" + "debugging/stacktrace.cc" + "debugging/stacktrace.h" + "debugging/symbolize.cc" + "debugging/symbolize.h" + "debugging/internal/address_is_readable.cc" + "debugging/internal/address_is_readable.h" + "debugging/internal/bounded_utf8_length_sequence.h" + "debugging/internal/decode_rust_punycode.cc" + "debugging/internal/decode_rust_punycode.h" + "debugging/internal/demangle.cc" + "debugging/internal/demangle.h" + "debugging/internal/demangle_rust.cc" + "debugging/internal/demangle_rust.h" + "debugging/internal/elf_mem_image.cc" + "debugging/internal/elf_mem_image.h" + "debugging/internal/examine_stack.cc" + "debugging/internal/examine_stack.h" + "debugging/internal/stack_consumption.cc" + "debugging/internal/stack_consumption.h" + "debugging/internal/stacktrace_config.h" + "debugging/internal/symbolize.h" + "debugging/internal/utf8_for_code_point.cc" + "debugging/internal/utf8_for_code_point.h" + "debugging/internal/vdso_support.cc" + "debugging/internal/vdso_support.h" + "functional/any_invocable.h" + "functional/internal/front_binder.h" + "functional/bind_front.h" + "functional/function_ref.h" + "functional/internal/any_invocable.h" + "functional/internal/function_ref.h" + "functional/overload.h" + "hash/hash.h" + "hash/internal/city.h" + "hash/internal/city.cc" + "hash/internal/hash.h" + "hash/internal/hash.cc" + "hash/internal/spy_hash_state.h" + "hash/internal/low_level_hash.h" + "hash/internal/low_level_hash.cc" + "log/absl_check.h" + "log/absl_log.h" + "log/absl_vlog_is_on.h" + "log/check.h" + "log/die_if_null.cc" + "log/die_if_null.h" + "log/globals.cc" + "log/globals.h" + "log/internal/append_truncated.h" + "log/internal/check_impl.h" + "log/internal/check_op.cc" + "log/internal/check_op.h" + "log/internal/conditions.cc" + "log/internal/conditions.h" + "log/internal/config.h" + "log/internal/fnmatch.h" + "log/internal/fnmatch.cc" + "log/internal/globals.cc" + "log/internal/globals.h" + "log/internal/log_format.cc" + "log/internal/log_format.h" + "log/internal/log_impl.h" + "log/internal/log_message.cc" + "log/internal/log_message.h" + "log/internal/log_sink_set.cc" + "log/internal/log_sink_set.h" + "log/internal/nullguard.cc" + "log/internal/nullguard.h" + "log/internal/nullstream.h" + "log/internal/proto.h" + "log/internal/proto.cc" + "log/internal/strip.h" + "log/internal/structured.h" + "log/internal/structured_proto.cc" + "log/internal/structured_proto.h" + "log/internal/vlog_config.cc" + "log/internal/vlog_config.h" + "log/internal/voidify.h" + "log/initialize.cc" + "log/initialize.h" + "log/log.h" + "log/log_entry.cc" + "log/log_entry.h" + "log/log_sink.cc" + "log/log_sink.h" + "log/log_sink_registry.h" + "log/log_streamer.h" + "log/structured.h" + "log/vlog_is_on.h" + "memory/memory.h" + "meta/type_traits.h" + "numeric/bits.h" + "numeric/int128.cc" + "numeric/int128.h" + "numeric/internal/bits.h" + "numeric/internal/representation.h" + "profiling/internal/exponential_biased.cc" + "profiling/internal/exponential_biased.h" + "profiling/internal/periodic_sampler.cc" + "profiling/internal/periodic_sampler.h" + "profiling/internal/sample_recorder.h" + "random/bernoulli_distribution.h" + "random/beta_distribution.h" + "random/bit_gen_ref.h" + "random/discrete_distribution.cc" + "random/discrete_distribution.h" + "random/distributions.h" + "random/exponential_distribution.h" + "random/gaussian_distribution.cc" + "random/gaussian_distribution.h" + "random/internal/distribution_caller.h" + "random/internal/fastmath.h" + "random/internal/fast_uniform_bits.h" + "random/internal/generate_real.h" + "random/internal/iostream_state_saver.h" + "random/internal/nonsecure_base.h" + "random/internal/pcg_engine.h" + "random/internal/platform.h" + "random/internal/pool_urbg.cc" + "random/internal/pool_urbg.h" + "random/internal/randen.cc" + "random/internal/randen.h" + "random/internal/randen_detect.cc" + "random/internal/randen_detect.h" + "random/internal/randen_engine.h" + "random/internal/randen_hwaes.cc" + "random/internal/randen_hwaes.h" + "random/internal/randen_round_keys.cc" + "random/internal/randen_slow.cc" + "random/internal/randen_slow.h" + "random/internal/randen_traits.h" + "random/internal/salted_seed_seq.h" + "random/internal/seed_material.cc" + "random/internal/seed_material.h" + "random/internal/sequence_urbg.h" + "random/internal/traits.h" + "random/internal/uniform_helper.h" + "random/internal/wide_multiply.h" + "random/log_uniform_int_distribution.h" + "random/poisson_distribution.h" + "random/random.h" + "random/seed_gen_exception.cc" + "random/seed_gen_exception.h" + "random/seed_sequences.cc" + "random/seed_sequences.h" + "random/uniform_int_distribution.h" + "random/uniform_real_distribution.h" + "random/zipf_distribution.h" + "status/internal/status_internal.h" + "status/internal/status_internal.cc" + "status/internal/statusor_internal.h" + "status/status.h" + "status/status.cc" + "status/statusor.h" + "status/statusor.cc" + "status/status_payload_printer.h" + "status/status_payload_printer.cc" + "strings/ascii.cc" + "strings/ascii.h" + "strings/charconv.cc" + "strings/charconv.h" + "strings/charset.h" + "strings/cord.cc" + "strings/cord.h" + "strings/cord_analysis.cc" + "strings/cord_analysis.h" + "strings/cord_buffer.cc" + "strings/cord_buffer.h" + "strings/escaping.cc" + "strings/escaping.h" + "strings/internal/charconv_bigint.cc" + "strings/internal/charconv_bigint.h" + "strings/internal/charconv_parse.cc" + "strings/internal/charconv_parse.h" + "strings/internal/cord_data_edge.h" + "strings/internal/cord_internal.cc" + "strings/internal/cord_internal.h" + "strings/internal/cord_rep_btree.cc" + "strings/internal/cord_rep_btree.h" + "strings/internal/cord_rep_btree_navigator.cc" + "strings/internal/cord_rep_btree_navigator.h" + "strings/internal/cord_rep_btree_reader.cc" + "strings/internal/cord_rep_btree_reader.h" + "strings/internal/cord_rep_crc.cc" + "strings/internal/cord_rep_crc.h" + "strings/internal/cord_rep_consume.h" + "strings/internal/cord_rep_consume.cc" + "strings/internal/cord_rep_flat.h" + "strings/internal/cordz_functions.cc" + "strings/internal/cordz_functions.h" + "strings/internal/cordz_handle.cc" + "strings/internal/cordz_handle.h" + "strings/internal/cordz_info.cc" + "strings/internal/cordz_info.h" + "strings/internal/cordz_sample_token.cc" + "strings/internal/cordz_sample_token.h" + "strings/internal/cordz_statistics.h" + "strings/internal/cordz_update_scope.h" + "strings/internal/cordz_update_tracker.h" + "strings/internal/damerau_levenshtein_distance.h" + "strings/internal/damerau_levenshtein_distance.cc" + "strings/internal/stl_type_traits.h" + "strings/internal/string_constant.h" + "strings/internal/stringify_sink.h" + "strings/internal/stringify_sink.cc" + "strings/has_absl_stringify.h" + "strings/has_ostream_operator.h" + "strings/match.cc" + "strings/match.h" + "strings/numbers.cc" + "strings/numbers.h" + "strings/str_format.h" + "strings/str_cat.cc" + "strings/str_cat.h" + "strings/str_join.h" + "strings/str_replace.cc" + "strings/str_replace.h" + "strings/str_split.cc" + "strings/str_split.h" + "strings/string_view.cc" + "strings/string_view.h" + "strings/strip.h" + "strings/substitute.cc" + "strings/substitute.h" + "strings/internal/escaping.h" + "strings/internal/escaping.cc" + "strings/internal/memutil.cc" + "strings/internal/memutil.h" + "strings/internal/ostringstream.cc" + "strings/internal/ostringstream.h" + "strings/internal/pow10_helper.cc" + "strings/internal/pow10_helper.h" + "strings/internal/resize_uninitialized.h" + "strings/internal/str_format/arg.cc" + "strings/internal/str_format/arg.h" + "strings/internal/str_format/bind.cc" + "strings/internal/str_format/bind.h" + "strings/internal/str_format/checker.h" + "strings/internal/str_format/constexpr_parser.h" + "strings/internal/str_format/extension.cc" + "strings/internal/str_format/extension.h" + "strings/internal/str_format/float_conversion.cc" + "strings/internal/str_format/float_conversion.h" + "strings/internal/str_format/output.cc" + "strings/internal/str_format/output.h" + "strings/internal/str_format/parser.cc" + "strings/internal/str_format/parser.h" + "strings/internal/str_join_internal.h" + "strings/internal/str_split_internal.h" + "strings/internal/utf8.cc" + "strings/internal/utf8.h" + "synchronization/barrier.cc" + "synchronization/barrier.h" + "synchronization/blocking_counter.cc" + "synchronization/blocking_counter.h" + "synchronization/mutex.cc" + "synchronization/mutex.h" + "synchronization/notification.cc" + "synchronization/notification.h" + "synchronization/internal/create_thread_identity.cc" + "synchronization/internal/create_thread_identity.h" + "synchronization/internal/futex.h" + "synchronization/internal/futex_waiter.h" + "synchronization/internal/futex_waiter.cc" + "synchronization/internal/graphcycles.cc" + "synchronization/internal/graphcycles.h" + "synchronization/internal/kernel_timeout.h" + "synchronization/internal/kernel_timeout.cc" + "synchronization/internal/per_thread_sem.cc" + "synchronization/internal/per_thread_sem.h" + "synchronization/internal/pthread_waiter.h" + "synchronization/internal/pthread_waiter.cc" + "synchronization/internal/sem_waiter.h" + "synchronization/internal/sem_waiter.cc" + "synchronization/internal/stdcpp_waiter.h" + "synchronization/internal/stdcpp_waiter.cc" + "synchronization/internal/thread_pool.h" + "synchronization/internal/waiter.h" + "synchronization/internal/waiter_base.h" + "synchronization/internal/waiter_base.cc" + "synchronization/internal/win32_waiter.h" + "synchronization/internal/win32_waiter.cc" + "time/civil_time.cc" + "time/civil_time.h" + "time/clock.cc" + "time/clock.h" + "time/duration.cc" + "time/format.cc" + "time/time.cc" + "time/time.h" + "time/internal/cctz/include/cctz/civil_time.h" + "time/internal/cctz/include/cctz/civil_time_detail.h" + "time/internal/cctz/include/cctz/time_zone.h" + "time/internal/cctz/include/cctz/zone_info_source.h" + "time/internal/cctz/src/civil_time_detail.cc" + "time/internal/cctz/src/time_zone_fixed.cc" + "time/internal/cctz/src/time_zone_fixed.h" + "time/internal/cctz/src/time_zone_format.cc" + "time/internal/cctz/src/time_zone_if.cc" + "time/internal/cctz/src/time_zone_if.h" + "time/internal/cctz/src/time_zone_impl.cc" + "time/internal/cctz/src/time_zone_impl.h" + "time/internal/cctz/src/time_zone_info.cc" + "time/internal/cctz/src/time_zone_info.h" + "time/internal/cctz/src/time_zone_libc.cc" + "time/internal/cctz/src/time_zone_libc.h" + "time/internal/cctz/src/time_zone_lookup.cc" + "time/internal/cctz/src/time_zone_posix.cc" + "time/internal/cctz/src/time_zone_posix.h" + "time/internal/cctz/src/tzfile.h" + "time/internal/cctz/src/zone_info_source.cc" + "types/any.h" + "types/bad_any_cast.cc" + "types/bad_any_cast.h" + "types/bad_optional_access.cc" + "types/bad_optional_access.h" + "types/bad_variant_access.cc" + "types/bad_variant_access.h" + "types/compare.h" + "types/internal/variant.h" + "types/optional.h" + "types/internal/optional.h" + "types/span.h" + "types/internal/span.h" + "types/variant.h" + "utility/internal/if_constexpr.h" + "utility/utility.h" + "debugging/leak_check.cc" +) + +if(NOT MSVC) + list(APPEND ABSL_INTERNAL_DLL_FILES + "flags/commandlineflag.cc" + "flags/commandlineflag.h" + "flags/config.h" + "flags/declare.h" + "flags/flag.h" + "flags/internal/commandlineflag.cc" + "flags/internal/commandlineflag.h" + "flags/internal/flag.cc" + "flags/internal/flag.h" + "flags/internal/parse.h" + "flags/internal/path_util.h" + "flags/internal/private_handle_accessor.cc" + "flags/internal/private_handle_accessor.h" + "flags/internal/program_name.cc" + "flags/internal/program_name.h" + "flags/internal/registry.h" + "flags/internal/sequence_lock.h" + "flags/internal/usage.cc" + "flags/internal/usage.h" + "flags/marshalling.cc" + "flags/marshalling.h" + "flags/parse.cc" + "flags/parse.h" + "flags/reflection.cc" + "flags/reflection.h" + "flags/usage.cc" + "flags/usage.h" + "flags/usage_config.cc" + "flags/usage_config.h" + "log/flags.cc" + "log/flags.h" + "log/internal/flags.h" + ) +endif() + +set(ABSL_INTERNAL_DLL_TARGETS + "absl_check" + "absl_log" + "absl_vlog_is_on" + "algorithm" + "algorithm_container" + "any" + "any_invocable" + "atomic_hook" + "bad_any_cast" + "bad_any_cast_impl" + "bad_optional_access" + "bad_variant_access" + "base" + "base_internal" + "bind_front" + "bits" + "btree" + "check" + "city" + "civil_time" + "compare" + "compressed_tuple" + "config" + "container" + "container_common" + "container_memory" + "cord" + "cord_internal" + "cordz_functions" + "cordz_handle" + "cordz_info" + "cordz_sample_token" + "core_headers" + "counting_allocator" + "crc_cord_state" + "crc_cpu_detect" + "crc_internal" + "crc32c" + "debugging" + "debugging_internal" + "demangle_internal" + "die_if_null" + "dynamic_annotations" + "endian" + "examine_stack" + "exponential_biased" + "failure_signal_handler" + "fixed_array" + "flat_hash_map" + "flat_hash_set" + "function_ref" + "graphcycles_internal" + "hash" + "hash_function_defaults" + "hash_policy_traits" + "hashtable_debug" + "hashtable_debug_hooks" + "hashtablez_sampler" + "inlined_vector" + "inlined_vector_internal" + "int128" + "kernel_timeout_internal" + "layout" + "leak_check" + "log_internal_check_impl" + "log_internal_check_op" + "log_internal_conditions" + "log_internal_config" + "log_internal_fnmatch" + "log_internal_format" + "log_internal_globals" + "log_internal_log_impl" + "log_internal_proto" + "log_internal_message" + "log_internal_log_sink_set" + "log_internal_nullguard" + "log_internal_nullstream" + "log_internal_strip" + "log_internal_voidify" + "log_internal_append_truncated" + "log_globals" + "log_initialize" + "log" + "log_entry" + "log_sink" + "log_sink_registry" + "log_streamer" + "log_internal_structured" + "log_severity" + "log_structured" + "low_level_hash" + "malloc_internal" + "memory" + "meta" + "node_hash_map" + "node_hash_set" + "node_slot_policy" + "non_temporal_arm_intrinsics" + "non_temporal_memcpy" + "numeric" + "optional" + "periodic_sampler" + "pow10_helper" + "pretty_function" + "random_bit_gen_ref" + "random_distributions" + "random_internal_distribution_caller" + "random_internal_distributions" + "random_internal_explicit_seed_seq" + "random_internal_fastmath" + "random_internal_fast_uniform_bits" + "random_internal_generate_real" + "random_internal_iostream_state_saver" + "random_internal_nonsecure_base" + "random_internal_pcg_engine" + "random_internal_platform" + "random_internal_pool_urbg" + "random_internal_randen" + "random_internal_randen_engine" + "random_internal_randen_hwaes" + "random_internal_randen_hwaes_impl" + "random_internal_randen_slow" + "random_internal_salted_seed_seq" + "random_internal_seed_material" + "random_internal_sequence_urbg" + "random_internal_traits" + "random_internal_uniform_helper" + "random_internal_wide_multiply" + "random_random" + "random_seed_gen_exception" + "random_seed_sequences" + "raw_hash_map" + "raw_hash_set" + "raw_logging_internal" + "sample_recorder" + "scoped_set_env" + "span" + "spinlock_wait" + "spy_hash_state" + "stack_consumption" + "stacktrace" + "status" + "statusor" + "str_format" + "str_format_internal" + "strerror" + "strings" + "strings_internal" + "string_view" + "symbolize" + "synchronization" + "thread_pool" + "throw_delegate" + "time" + "time_zone" + "tracked" + "type_traits" + "utility" + "variant" + "vlog_config_internal" + "vlog_is_on" +) + +if(NOT MSVC) + list(APPEND ABSL_INTERNAL_DLL_TARGETS + "flags" + "flags_commandlineflag" + "flags_commandlineflag_internal" + "flags_config" + "flags_internal" + "flags_marshalling" + "flags_parse" + "flags_path_util" + "flags_private_handle_accessor" + "flags_program_name" + "flags_reflection" + "flags_usage" + "flags_usage_internal" + "log_internal_flags" + "log_flags" + ) +endif() + +set(ABSL_INTERNAL_TEST_DLL_FILES + "hash/hash_testing.h" + "log/scoped_mock_log.cc" + "log/scoped_mock_log.h" + "random/internal/chi_square.cc" + "random/internal/chi_square.h" + "random/internal/distribution_test_util.cc" + "random/internal/distribution_test_util.h" + "random/internal/mock_helpers.h" + "random/internal/mock_overload_set.h" + "random/mocking_bit_gen.h" + "random/mock_distributions.h" + "status/status_matchers.h" + "status/internal/status_matchers.cc" + "status/internal/status_matchers.h" + "strings/cordz_test_helpers.h" + "strings/cord_test_helpers.h" +) + +set(ABSL_INTERNAL_TEST_DLL_TARGETS + "cord_test_helpers" + "cordz_test_helpers" + "hash_testing" + "random_mocking_bit_gen" + "random_internal_distribution_test_util" + "random_internal_mock_overload_set" + "scoped_mock_log" + "status_matchers" +) + +include(CheckCXXSourceCompiles) + +check_cxx_source_compiles( + [==[ +#ifdef _MSC_VER +# if _MSVC_LANG < 201703L +# error "The compiler defaults or is configured for C++ < 17" +# endif +#elif __cplusplus < 201703L +# error "The compiler defaults or is configured for C++ < 17" +#endif +int main() { return 0; } +]==] + ABSL_INTERNAL_AT_LEAST_CXX17) + +check_cxx_source_compiles( + [==[ +#ifdef _MSC_VER +# if _MSVC_LANG < 202002L +# error "The compiler defaults or is configured for C++ < 20" +# endif +#elif __cplusplus < 202002L +# error "The compiler defaults or is configured for C++ < 20" +#endif +int main() { return 0; } +]==] + ABSL_INTERNAL_AT_LEAST_CXX20) + +if(ABSL_INTERNAL_AT_LEAST_CXX20) + set(ABSL_INTERNAL_CXX_STD_FEATURE cxx_std_20) +elseif(ABSL_INTERNAL_AT_LEAST_CXX17) + set(ABSL_INTERNAL_CXX_STD_FEATURE cxx_std_17) +else() + set(ABSL_INTERNAL_CXX_STD_FEATURE cxx_std_14) +endif() + +function(absl_internal_dll_contains) + cmake_parse_arguments(ABSL_INTERNAL_DLL + "" + "OUTPUT;TARGET" + "" + ${ARGN} + ) + + STRING(REGEX REPLACE "^absl::" "" _target ${ABSL_INTERNAL_DLL_TARGET}) + + if (_target IN_LIST ABSL_INTERNAL_DLL_TARGETS) + set(${ABSL_INTERNAL_DLL_OUTPUT} 1 PARENT_SCOPE) + else() + set(${ABSL_INTERNAL_DLL_OUTPUT} 0 PARENT_SCOPE) + endif() +endfunction() + +function(absl_internal_test_dll_contains) + cmake_parse_arguments(ABSL_INTERNAL_TEST_DLL + "" + "OUTPUT;TARGET" + "" + ${ARGN} + ) + + STRING(REGEX REPLACE "^absl::" "" _target ${ABSL_INTERNAL_TEST_DLL_TARGET}) + + if (_target IN_LIST ABSL_INTERNAL_TEST_DLL_TARGETS) + set(${ABSL_INTERNAL_TEST_DLL_OUTPUT} 1 PARENT_SCOPE) + else() + set(${ABSL_INTERNAL_TEST_DLL_OUTPUT} 0 PARENT_SCOPE) + endif() +endfunction() + +function(absl_internal_dll_targets) + cmake_parse_arguments(ABSL_INTERNAL_DLL + "" + "OUTPUT" + "DEPS" + ${ARGN} + ) + + set(_deps "") + foreach(dep IN LISTS ABSL_INTERNAL_DLL_DEPS) + absl_internal_dll_contains(TARGET ${dep} OUTPUT _dll_contains) + absl_internal_test_dll_contains(TARGET ${dep} OUTPUT _test_dll_contains) + if (_dll_contains) + list(APPEND _deps abseil_dll) + elseif (_test_dll_contains) + list(APPEND _deps abseil_test_dll) + else() + list(APPEND _deps ${dep}) + endif() + endforeach() + + # Because we may have added the DLL multiple times + list(REMOVE_DUPLICATES _deps) + set(${ABSL_INTERNAL_DLL_OUTPUT} "${_deps}" PARENT_SCOPE) +endfunction() + +function(absl_make_dll) + cmake_parse_arguments(ABSL_INTERNAL_MAKE_DLL + "" + "TEST" + "" + ${ARGN} + ) + + if (ABSL_INTERNAL_MAKE_DLL_TEST) + set(_dll "abseil_test_dll") + set(_dll_files ${ABSL_INTERNAL_TEST_DLL_FILES}) + set(_dll_libs "abseil_dll" "GTest::gtest" "GTest::gmock") + set(_dll_compile_definitions "GTEST_LINKED_AS_SHARED_LIBRARY=1") + set(_dll_includes ${absl_gtest_src_dir}/googletest/include ${absl_gtest_src_dir}/googlemock/include) + set(_dll_consume "ABSL_CONSUME_TEST_DLL") + set(_dll_build "ABSL_BUILD_TEST_DLL") + else() + set(_dll "abseil_dll") + set(_dll_files ${ABSL_INTERNAL_DLL_FILES}) + set(_dll_libs + Threads::Threads + # TODO(#1495): Use $ once our + # minimum CMake version >= 3.24 + $<$:-Wl,-framework,CoreFoundation> + ) + set(_dll_compile_definitions "") + set(_dll_includes "") + set(_dll_consume "ABSL_CONSUME_DLL") + set(_dll_build "ABSL_BUILD_DLL") + endif() + + add_library( + ${_dll} + SHARED + ${_dll_files} + ) + target_link_libraries( + ${_dll} + PRIVATE + ${_dll_libs} + ${ABSL_DEFAULT_LINKOPTS} + $<$:-llog> + ) + set_target_properties(${_dll} PROPERTIES + LINKER_LANGUAGE "CXX" + SOVERSION ${ABSL_SOVERSION} + ) + target_include_directories( + ${_dll} + PUBLIC + "$" + $ + PRIVATE + ${_dll_includes} + ) + + target_compile_options( + ${_dll} + PRIVATE + ${ABSL_DEFAULT_COPTS} + ) + + foreach(cflag ${ABSL_CC_LIB_COPTS}) + if(${cflag} MATCHES "^(-Wno|/wd)") + # These flags are needed to suppress warnings that might fire in our headers. + set(PC_CFLAGS "${PC_CFLAGS} ${cflag}") + elseif(${cflag} MATCHES "^(-W|/w[1234eo])") + # Don't impose our warnings on others. + else() + set(PC_CFLAGS "${PC_CFLAGS} ${cflag}") + endif() + endforeach() + string(REPLACE ";" " " PC_LINKOPTS "${ABSL_CC_LIB_LINKOPTS}") + + FILE(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/lib/pkgconfig/${_dll}.pc" CONTENT "\ +prefix=${CMAKE_INSTALL_PREFIX}\n\ +exec_prefix=\${prefix}\n\ +libdir=${CMAKE_INSTALL_FULL_LIBDIR}\n\ +includedir=${CMAKE_INSTALL_FULL_INCLUDEDIR}\n\ +\n\ +Name: ${_dll}\n\ +Description: Abseil DLL library\n\ +URL: https://abseil.io/\n\ +Version: ${absl_VERSION}\n\ +Libs: -L\${libdir} $<$>:-l${_dll}> ${PC_LINKOPTS}\n\ +Cflags: -I\${includedir}${PC_CFLAGS}\n") + INSTALL(FILES "${CMAKE_BINARY_DIR}/lib/pkgconfig/${_dll}.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") + + target_compile_definitions( + ${_dll} + PUBLIC + ${_dll_compile_definitions} + PRIVATE + ${_dll_build} + NOMINMAX + INTERFACE + ${ABSL_CC_LIB_DEFINES} + ${_dll_consume} + ) + + if(ABSL_PROPAGATE_CXX_STD) + # Abseil libraries require C++14 as the current minimum standard. When + # compiled with a higher minimum (either because it is the compiler's + # default or explicitly requested), then Abseil requires that standard. + target_compile_features(${_dll} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE}) + endif() + + install(TARGETS ${_dll} EXPORT ${PROJECT_NAME}Targets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) + + add_library(absl::${_dll} ALIAS ${_dll}) +endfunction() diff --git a/CMake/AbseilHelpers.cmake b/CMake/AbseilHelpers.cmake new file mode 100644 index 0000000..02688f2 --- /dev/null +++ b/CMake/AbseilHelpers.cmake @@ -0,0 +1,460 @@ +# +# Copyright 2017 The Abseil Authors. +# +# 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 +# +# https://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(CMakeParseArguments) +include(AbseilConfigureCopts) +include(AbseilDll) + +# The IDE folder for Abseil that will be used if Abseil is included in a CMake +# project that sets +# set_property(GLOBAL PROPERTY USE_FOLDERS ON) +# For example, Visual Studio supports folders. +if(NOT DEFINED ABSL_IDE_FOLDER) + set(ABSL_IDE_FOLDER Abseil) +endif() + +if(ABSL_USE_SYSTEM_INCLUDES) + set(ABSL_INTERNAL_INCLUDE_WARNING_GUARD SYSTEM) +else() + set(ABSL_INTERNAL_INCLUDE_WARNING_GUARD "") +endif() + +# absl_cc_library() +# +# CMake function to imitate Bazel's cc_library rule. +# +# Parameters: +# NAME: name of target (see Note) +# HDRS: List of public header files for the library +# SRCS: List of source files for the library +# DEPS: List of other libraries to be linked in to the binary targets +# COPTS: List of private compile options +# DEFINES: List of public defines +# LINKOPTS: List of link options +# PUBLIC: Add this so that this library will be exported under absl:: +# Also in IDE, target will appear in Abseil folder while non PUBLIC will be in Abseil/internal. +# TESTONLY: When added, this target will only be built if both +# BUILD_TESTING=ON and ABSL_BUILD_TESTING=ON. +# +# Note: +# By default, absl_cc_library will always create a library named absl_${NAME}, +# and alias target absl::${NAME}. The absl:: form should always be used. +# This is to reduce namespace pollution. +# +# absl_cc_library( +# NAME +# awesome +# HDRS +# "a.h" +# SRCS +# "a.cc" +# ) +# absl_cc_library( +# NAME +# fantastic_lib +# SRCS +# "b.cc" +# DEPS +# absl::awesome # not "awesome" ! +# PUBLIC +# ) +# +# absl_cc_library( +# NAME +# main_lib +# ... +# DEPS +# absl::fantastic_lib +# ) +# +# TODO(b/320467376): Implement "ALWAYSLINK". +function(absl_cc_library) + cmake_parse_arguments(ABSL_CC_LIB + "DISABLE_INSTALL;PUBLIC;TESTONLY" + "NAME" + "HDRS;SRCS;COPTS;DEFINES;LINKOPTS;DEPS" + ${ARGN} + ) + + if(ABSL_CC_LIB_TESTONLY AND + NOT ((BUILD_TESTING AND ABSL_BUILD_TESTING) OR + (ABSL_BUILD_TEST_HELPERS AND ABSL_CC_LIB_PUBLIC))) + return() + endif() + + if(ABSL_ENABLE_INSTALL) + set(_NAME "${ABSL_CC_LIB_NAME}") + else() + set(_NAME "absl_${ABSL_CC_LIB_NAME}") + endif() + + # Check if this is a header-only library + # Note that as of February 2019, many popular OS's (for example, Ubuntu + # 16.04 LTS) only come with cmake 3.5 by default. For this reason, we can't + # use list(FILTER...) + set(ABSL_CC_SRCS "${ABSL_CC_LIB_SRCS}") + foreach(src_file IN LISTS ABSL_CC_SRCS) + if(${src_file} MATCHES ".*\\.(h|inc)") + list(REMOVE_ITEM ABSL_CC_SRCS "${src_file}") + endif() + endforeach() + + if(ABSL_CC_SRCS STREQUAL "") + set(ABSL_CC_LIB_IS_INTERFACE 1) + else() + set(ABSL_CC_LIB_IS_INTERFACE 0) + endif() + + # Determine this build target's relationship to the DLL. It's one of four things: + # 1. "dll" -- This target is part of the DLL + # 2. "dll_dep" -- This target is not part of the DLL, but depends on the DLL. + # Note that we assume any target not in the DLL depends on the + # DLL. This is not a technical necessity but a convenience + # which happens to be true, because nearly every target is + # part of the DLL. + # 3. "shared" -- This is a shared library, perhaps on a non-windows platform + # where DLL doesn't make sense. + # 4. "static" -- This target does not depend on the DLL and should be built + # statically. + if (${ABSL_BUILD_DLL}) + if(ABSL_ENABLE_INSTALL) + absl_internal_dll_contains(TARGET ${_NAME} OUTPUT _in_dll) + absl_internal_test_dll_contains(TARGET ${_NAME} OUTPUT _in_test_dll) + else() + absl_internal_dll_contains(TARGET ${ABSL_CC_LIB_NAME} OUTPUT _in_dll) + absl_internal_test_dll_contains(TARGET ${ABSL_CC_LIB_NAME} OUTPUT _in_test_dll) + endif() + if (${_in_dll} OR ${_in_test_dll}) + # This target should be replaced by the DLL + set(_build_type "dll") + set(ABSL_CC_LIB_IS_INTERFACE 1) + else() + # Building a DLL, but this target is not part of the DLL + set(_build_type "dll_dep") + endif() + elseif(BUILD_SHARED_LIBS) + set(_build_type "shared") + else() + set(_build_type "static") + endif() + + # Generate a pkg-config file for every library: + if(ABSL_ENABLE_INSTALL) + if(absl_VERSION) + set(PC_VERSION "${absl_VERSION}") + else() + set(PC_VERSION "head") + endif() + if(NOT _build_type STREQUAL "dll") + set(LNK_LIB "${LNK_LIB} -labsl_${_NAME}") + endif() + foreach(dep ${ABSL_CC_LIB_DEPS}) + if(${dep} MATCHES "^absl::(.*)") + # for DLL builds many libs are not created, but add + # the pkgconfigs nevertheless, pointing to the dll. + if(_build_type STREQUAL "dll") + # hide this MATCHES in an if-clause so it doesn't overwrite + # the CMAKE_MATCH_1 from (${dep} MATCHES "^absl::(.*)") + if(NOT PC_DEPS MATCHES "abseil_dll") + # Join deps with commas. + if(PC_DEPS) + set(PC_DEPS "${PC_DEPS},") + endif() + # don't duplicate dll-dep if it exists already + set(PC_DEPS "${PC_DEPS} abseil_dll = ${PC_VERSION}") + set(LNK_LIB "${LNK_LIB} -labseil_dll") + endif() + else() + # Join deps with commas. + if(PC_DEPS) + set(PC_DEPS "${PC_DEPS},") + endif() + set(PC_DEPS "${PC_DEPS} absl_${CMAKE_MATCH_1} = ${PC_VERSION}") + endif() + endif() + endforeach() + foreach(cflag ${ABSL_CC_LIB_COPTS}) + # Strip out the CMake-specific `SHELL:` prefix, which is used to construct + # a group of space-separated options. + # https://cmake.org/cmake/help/v3.30/command/target_compile_options.html#option-de-duplication + string(REGEX REPLACE "^SHELL:" "" cflag "${cflag}") + if(${cflag} MATCHES "^-Xarch_") + # An -Xarch_ flag implies that its successor only applies to the + # specified platform. Such option groups are each specified in a single + # `SHELL:`-prefixed string in the COPTS list, which we simply ignore. + elseif(${cflag} MATCHES "^(-Wno-|/wd)") + # These flags are needed to suppress warnings that might fire in our headers. + set(PC_CFLAGS "${PC_CFLAGS} ${cflag}") + elseif(${cflag} MATCHES "^(-W|/w[1234eo])") + # Don't impose our warnings on others. + elseif(${cflag} MATCHES "^-m") + # Don't impose CPU instruction requirements on others, as + # the code performs feature detection on runtime. + else() + set(PC_CFLAGS "${PC_CFLAGS} ${cflag}") + endif() + endforeach() + string(REPLACE ";" " " PC_LINKOPTS "${ABSL_CC_LIB_LINKOPTS}") + FILE(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/lib/pkgconfig/absl_${_NAME}.pc" CONTENT "\ +prefix=${CMAKE_INSTALL_PREFIX}\n\ +exec_prefix=\${prefix}\n\ +libdir=${CMAKE_INSTALL_FULL_LIBDIR}\n\ +includedir=${CMAKE_INSTALL_FULL_INCLUDEDIR}\n\ +\n\ +Name: absl_${_NAME}\n\ +Description: Abseil ${_NAME} library\n\ +URL: https://abseil.io/\n\ +Version: ${PC_VERSION}\n\ +Requires:${PC_DEPS}\n\ +Libs: -L\${libdir} $<$>:${LNK_LIB}> ${PC_LINKOPTS}\n\ +Cflags: -I\${includedir}${PC_CFLAGS}\n") + INSTALL(FILES "${CMAKE_BINARY_DIR}/lib/pkgconfig/absl_${_NAME}.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") + endif() + + if(NOT ABSL_CC_LIB_IS_INTERFACE) + if(_build_type STREQUAL "dll_dep") + # This target depends on the DLL. When adding dependencies to this target, + # any depended-on-target which is contained inside the DLL is replaced + # with a dependency on the DLL. + add_library(${_NAME} STATIC "") + target_sources(${_NAME} PRIVATE ${ABSL_CC_LIB_SRCS} ${ABSL_CC_LIB_HDRS}) + absl_internal_dll_targets( + DEPS ${ABSL_CC_LIB_DEPS} + OUTPUT _dll_deps + ) + target_link_libraries(${_NAME} + PUBLIC ${_dll_deps} + PRIVATE + ${ABSL_CC_LIB_LINKOPTS} + ${ABSL_DEFAULT_LINKOPTS} + ) + + if (ABSL_CC_LIB_TESTONLY) + set(_gtest_link_define "GTEST_LINKED_AS_SHARED_LIBRARY=1") + else() + set(_gtest_link_define) + endif() + + target_compile_definitions(${_NAME} + PUBLIC + ABSL_CONSUME_DLL + "${_gtest_link_define}" + ) + + elseif(_build_type STREQUAL "static" OR _build_type STREQUAL "shared") + add_library(${_NAME} STATIC "") + target_sources(${_NAME} PRIVATE ${ABSL_CC_LIB_SRCS} ${ABSL_CC_LIB_HDRS}) + if(APPLE) + set_target_properties(${_NAME} PROPERTIES + INSTALL_RPATH "@loader_path") + elseif(UNIX) + set_target_properties(${_NAME} PROPERTIES + INSTALL_RPATH "$ORIGIN") + endif() + target_link_libraries(${_NAME} + PUBLIC ${ABSL_CC_LIB_DEPS} + PRIVATE + ${ABSL_CC_LIB_LINKOPTS} + ${ABSL_DEFAULT_LINKOPTS} + ) + else() + message(FATAL_ERROR "Invalid build type: ${_build_type}") + endif() + + # Linker language can be inferred from sources, but in the case of DLLs we + # don't have any .cc files so it would be ambiguous. We could set it + # explicitly only in the case of DLLs but, because "CXX" is always the + # correct linker language for static or for shared libraries, we set it + # unconditionally. + set_property(TARGET ${_NAME} PROPERTY LINKER_LANGUAGE "CXX") + + target_include_directories(${_NAME} ${ABSL_INTERNAL_INCLUDE_WARNING_GUARD} + PUBLIC + "$" + $ + ) + target_compile_options(${_NAME} + PRIVATE ${ABSL_CC_LIB_COPTS}) + target_compile_definitions(${_NAME} PUBLIC ${ABSL_CC_LIB_DEFINES}) + + # Add all Abseil targets to a a folder in the IDE for organization. + if(ABSL_CC_LIB_PUBLIC) + set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER}) + elseif(ABSL_CC_LIB_TESTONLY) + set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER}/test) + else() + set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER}/internal) + endif() + + if(ABSL_PROPAGATE_CXX_STD) + # Abseil libraries require C++14 as the current minimum standard. When + # compiled with a higher standard (either because it is the compiler's + # default or explicitly requested), then Abseil requires that standard. + target_compile_features(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE}) + endif() + + # When being installed, we lose the absl_ prefix. We want to put it back + # to have properly named lib files. This is a no-op when we are not being + # installed. + if(ABSL_ENABLE_INSTALL) + set_target_properties(${_NAME} PROPERTIES + OUTPUT_NAME "absl_${_NAME}" + SOVERSION "${ABSL_SOVERSION}" + ) + endif() + else() + # Generating header-only library + add_library(${_NAME} INTERFACE) + target_include_directories(${_NAME} ${ABSL_INTERNAL_INCLUDE_WARNING_GUARD} + INTERFACE + "$" + $ + ) + + if (_build_type STREQUAL "dll") + set(ABSL_CC_LIB_DEPS abseil_dll) + endif() + + target_link_libraries(${_NAME} + INTERFACE + ${ABSL_CC_LIB_DEPS} + ${ABSL_CC_LIB_LINKOPTS} + ${ABSL_DEFAULT_LINKOPTS} + ) + target_compile_definitions(${_NAME} INTERFACE ${ABSL_CC_LIB_DEFINES}) + + if(ABSL_PROPAGATE_CXX_STD) + # Abseil libraries require C++14 as the current minimum standard. + # Top-level application CMake projects should ensure a consistent C++ + # standard for all compiled sources by setting CMAKE_CXX_STANDARD. + target_compile_features(${_NAME} INTERFACE ${ABSL_INTERNAL_CXX_STD_FEATURE}) + endif() + endif() + + if(ABSL_ENABLE_INSTALL) + install(TARGETS ${_NAME} EXPORT ${PROJECT_NAME}Targets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) + endif() + + add_library(absl::${ABSL_CC_LIB_NAME} ALIAS ${_NAME}) +endfunction() + +# absl_cc_test() +# +# CMake function to imitate Bazel's cc_test rule. +# +# Parameters: +# NAME: name of target (see Usage below) +# SRCS: List of source files for the binary +# DEPS: List of other libraries to be linked in to the binary targets +# COPTS: List of private compile options +# DEFINES: List of public defines +# LINKOPTS: List of link options +# +# Note: +# By default, absl_cc_test will always create a binary named absl_${NAME}. +# This will also add it to ctest list as absl_${NAME}. +# +# Usage: +# absl_cc_library( +# NAME +# awesome +# HDRS +# "a.h" +# SRCS +# "a.cc" +# PUBLIC +# ) +# +# absl_cc_test( +# NAME +# awesome_test +# SRCS +# "awesome_test.cc" +# DEPS +# absl::awesome +# GTest::gmock +# GTest::gtest_main +# ) +function(absl_cc_test) + if(NOT (BUILD_TESTING AND ABSL_BUILD_TESTING)) + return() + endif() + + cmake_parse_arguments(ABSL_CC_TEST + "" + "NAME" + "SRCS;COPTS;DEFINES;LINKOPTS;DEPS" + ${ARGN} + ) + + set(_NAME "absl_${ABSL_CC_TEST_NAME}") + + add_executable(${_NAME} "") + target_sources(${_NAME} PRIVATE ${ABSL_CC_TEST_SRCS}) + target_include_directories(${_NAME} + PUBLIC ${ABSL_COMMON_INCLUDE_DIRS} + PRIVATE ${absl_gtest_src_dir}/googletest/include ${absl_gtest_src_dir}/googlemock/include + ) + + if (${ABSL_BUILD_DLL}) + target_compile_definitions(${_NAME} + PUBLIC + ${ABSL_CC_TEST_DEFINES} + ABSL_CONSUME_DLL + ABSL_CONSUME_TEST_DLL + GTEST_LINKED_AS_SHARED_LIBRARY=1 + ) + + # Replace dependencies on targets inside the DLL with abseil_dll itself. + absl_internal_dll_targets( + DEPS ${ABSL_CC_TEST_DEPS} + OUTPUT ABSL_CC_TEST_DEPS + ) + absl_internal_dll_targets( + DEPS ${ABSL_CC_TEST_LINKOPTS} + OUTPUT ABSL_CC_TEST_LINKOPTS + ) + else() + target_compile_definitions(${_NAME} + PUBLIC + ${ABSL_CC_TEST_DEFINES} + ) + endif() + target_compile_options(${_NAME} + PRIVATE ${ABSL_CC_TEST_COPTS} + ) + + target_link_libraries(${_NAME} + PUBLIC ${ABSL_CC_TEST_DEPS} + PRIVATE ${ABSL_CC_TEST_LINKOPTS} + ) + # Add all Abseil targets to a folder in the IDE for organization. + set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER}/test) + + if(ABSL_PROPAGATE_CXX_STD) + # Abseil libraries require C++14 as the current minimum standard. + # Top-level application CMake projects should ensure a consistent C++ + # standard for all compiled sources by setting CMAKE_CXX_STANDARD. + target_compile_features(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE}) + endif() + + add_test(NAME ${_NAME} COMMAND ${_NAME}) +endfunction() diff --git a/CMake/Googletest/CMakeLists.txt.in b/CMake/Googletest/CMakeLists.txt.in new file mode 100644 index 0000000..3db4834 --- /dev/null +++ b/CMake/Googletest/CMakeLists.txt.in @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.16) + +project(googletest-external NONE) + +include(ExternalProject) +ExternalProject_Add(googletest + URL "${absl_gtest_download_url}" # May be empty + SOURCE_DIR "${absl_gtest_src_dir}" + BINARY_DIR "${absl_gtest_build_dir}" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" +) diff --git a/CMake/Googletest/DownloadGTest.cmake b/CMake/Googletest/DownloadGTest.cmake new file mode 100644 index 0000000..9d071c9 --- /dev/null +++ b/CMake/Googletest/DownloadGTest.cmake @@ -0,0 +1,41 @@ +# Integrates googletest at configure time. Based on the instructions at +# https://github.com/google/googletest/tree/master/googletest#incorporating-into-an-existing-cmake-project + +# Set up the external googletest project, downloading the latest from Github +# master if requested. +configure_file( + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt.in + ${CMAKE_BINARY_DIR}/googletest-external/CMakeLists.txt +) + +set(ABSL_SAVE_CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) +set(ABSL_SAVE_CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) +if (BUILD_SHARED_LIBS) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGTEST_CREATE_SHARED_LIBRARY=1") +endif() + +# Configure and build the googletest source. +execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-external ) +if(result) + message(FATAL_ERROR "CMake step for googletest failed: ${result}") +endif() + +execute_process(COMMAND ${CMAKE_COMMAND} --build . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-external) +if(result) + message(FATAL_ERROR "Build step for googletest failed: ${result}") +endif() + +set(CMAKE_CXX_FLAGS ${ABSL_SAVE_CMAKE_CXX_FLAGS}) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ABSL_SAVE_CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + +# Prevent overriding the parent project's compiler/linker settings on Windows +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) + +# Add googletest directly to our build. This defines the gtest and gtest_main +# targets. +add_subdirectory(${absl_gtest_src_dir} ${absl_gtest_build_dir} EXCLUDE_FROM_ALL) diff --git a/CMake/README.md b/CMake/README.md new file mode 100644 index 0000000..808edfe --- /dev/null +++ b/CMake/README.md @@ -0,0 +1,188 @@ +# Abseil CMake Build Instructions + +Abseil comes with a CMake build script ([CMakeLists.txt](../CMakeLists.txt)) +that can be used on a wide range of platforms ("C" stands for cross-platform.). +If you don't have CMake installed already, you can download it for free from +. + +CMake works by generating native makefiles or build projects that can +be used in the compiler environment of your choice. + +For API/ABI compatibility reasons, we strongly recommend building Abseil in a +subdirectory of your project or as an embedded dependency. + +## Incorporating Abseil Into a CMake Project + +The recommendations below are similar to those for using CMake within the +googletest framework +() + +### Step-by-Step Instructions + +1. If you want to build the Abseil tests, integrate the Abseil dependency +[Google Test](https://github.com/google/googletest) into your CMake +project. To disable Abseil tests, you have to pass either +`-DBUILD_TESTING=OFF` or `-DABSL_BUILD_TESTING=OFF` when configuring your +project with CMake. + +2. Download Abseil and copy it into a subdirectory in your CMake project or add +Abseil as a [git submodule](https://git-scm.com/docs/git-submodule) in your +CMake project. + +3. You can then use the CMake command +[`add_subdirectory()`](https://cmake.org/cmake/help/latest/command/add_subdirectory.html) +to include Abseil directly in your CMake project. + +4. Add the **absl::** target you wish to use to the +[`target_link_libraries()`](https://cmake.org/cmake/help/latest/command/target_link_libraries.html) +section of your executable or of your library.
+Here is a short CMakeLists.txt example of an application project using Abseil. + +```cmake +cmake_minimum_required(VERSION 3.16) +project(my_app_project) + +# Pick the C++ standard to compile with. +# Abseil currently supports C++14, C++17, and C++20. +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +add_subdirectory(abseil-cpp) + +add_executable(my_exe source.cpp) +target_link_libraries(my_exe absl::base absl::synchronization absl::strings) +``` + +Note that if you are developing a library designed for use by other clients, you +should instead leave `CMAKE_CXX_STANDARD` unset (or only set if being built as +the current top-level CMake project) and configure the minimum required C++ +standard at the target level. If you require a later minimum C++ standard than +Abseil does, it's a good idea to also enforce that `CMAKE_CXX_STANDARD` (which +will control Abseil library targets) is set to at least that minimum. For +example: + +```cmake +cmake_minimum_required(VERSION 3.16) +project(my_lib_project) + +# Leave C++ standard up to the root application, so set it only if this is the +# current top-level CMake project. +if(CMAKE_SOURCE_DIR STREQUAL my_lib_project_SOURCE_DIR) + set(CMAKE_CXX_STANDARD 17) + set(CMAKE_CXX_STANDARD_REQUIRED ON) +endif() + +add_subdirectory(abseil-cpp) + +add_library(my_lib source.cpp) +target_link_libraries(my_lib absl::base absl::synchronization absl::strings) + +# Enforce that my_lib requires C++17. Important to document for clients that they +# must set CMAKE_CXX_STANDARD to 17 or higher for proper Abseil ABI compatibility +# (since otherwise, Abseil library targets could be compiled with a lower C++ +# standard than my_lib). +target_compile_features(my_lib PUBLIC cxx_std_17) +if(CMAKE_CXX_STANDARD LESS 17) + message(FATAL_ERROR + "my_lib_project requires CMAKE_CXX_STANDARD >= 17 (got: ${CMAKE_CXX_STANDARD})") +endif() +``` + +Then the top-level application project that uses your library is responsible for +setting a consistent `CMAKE_CXX_STANDARD` that is sufficiently high. + +### Running Abseil Tests with CMake + +Use the `-DABSL_BUILD_TESTING=ON` flag to run Abseil tests. Note that +BUILD_TESTING must also be on (the default). + +You will need to provide Abseil with a Googletest dependency. There are two +options for how to do this: + +* Use `-DABSL_USE_GOOGLETEST_HEAD`. This will automatically download the latest +Googletest source into the build directory at configure time. Googletest will +then be compiled directly alongside Abseil's tests. +* Manually integrate Googletest with your build. See +https://github.com/google/googletest/blob/master/googletest/README.md#using-cmake +for more information on using Googletest in a CMake project. + +For example, to run just the Abseil tests, you could use this script: + +``` +cd path/to/abseil-cpp +mkdir build +cd build +cmake -DABSL_BUILD_TESTING=ON -DABSL_USE_GOOGLETEST_HEAD=ON .. +make -j +ctest +``` + +Currently, we only run our tests with CMake in a Linux environment, but we are +working on the rest of our supported platforms. See +https://github.com/abseil/abseil-cpp/projects/1 and +https://github.com/abseil/abseil-cpp/issues/109 for more information. + +### Available Abseil CMake Public Targets + +Here's a non-exhaustive list of Abseil CMake public targets: + +```cmake +absl::algorithm +absl::base +absl::debugging +absl::flat_hash_map +absl::flags +absl::memory +absl::meta +absl::numeric +absl::random_random +absl::strings +absl::synchronization +absl::time +absl::utility +``` + +## Traditional CMake Set-Up + +For larger projects, it may make sense to use the traditional CMake set-up where you build and install projects separately. + +First, you'd need to build and install Google Test: +``` +cmake -S /source/googletest -B /build/googletest -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/installation/dir -DBUILD_GMOCK=ON +cmake --build /build/googletest --target install +``` + +Then you need to configure and build Abseil. Make sure you enable `ABSL_USE_EXTERNAL_GOOGLETEST` and `ABSL_FIND_GOOGLETEST`. You also need to enable `ABSL_ENABLE_INSTALL` so that you can install Abseil itself. +``` +cmake -S /source/abseil-cpp -B /build/abseil-cpp -DCMAKE_PREFIX_PATH=/installation/dir -DCMAKE_INSTALL_PREFIX=/installation/dir -DABSL_ENABLE_INSTALL=ON -DABSL_USE_EXTERNAL_GOOGLETEST=ON -DABSL_FIND_GOOGLETEST=ON +cmake --build /temporary/build/abseil-cpp +``` + +(`CMAKE_PREFIX_PATH` is where you already have Google Test installed; `CMAKE_INSTALL_PREFIX` is where you want to have Abseil installed; they can be different.) + +Run the tests: +``` +ctest --test-dir /temporary/build/abseil-cpp +``` + +And finally install: +``` +cmake --build /temporary/build/abseil-cpp --target install +``` + +# CMake Option Synopsis + +## Enable Standard CMake Installation + +`-DABSL_ENABLE_INSTALL=ON` + +## Google Test Options + +`-DABSL_BUILD_TESTING=ON` must be set to enable testing + +- Have Abseil download and build Google Test for you: `-DABSL_USE_EXTERNAL_GOOGLETEST=OFF` (default) + - Download and build latest Google Test: `-DABSL_USE_GOOGLETEST_HEAD=ON` + - Download specific Google Test version (ZIP archive): `-DABSL_GOOGLETEST_DOWNLOAD_URL=https://.../version.zip` + - Use Google Test from specific local directory: `-DABSL_LOCAL_GOOGLETEST_DIR=/path/to/googletest` +- Use Google Test included elsewhere in your project: `-DABSL_USE_EXTERNAL_GOOGLETEST=ON` +- Use standard CMake `find_package(CTest)` to find installed Google Test: `-DABSL_USE_EXTERNAL_GOOGLETEST=ON -DABSL_FIND_GOOGLETEST=ON` diff --git a/CMake/abslConfig.cmake.in b/CMake/abslConfig.cmake.in new file mode 100644 index 0000000..62d246d --- /dev/null +++ b/CMake/abslConfig.cmake.in @@ -0,0 +1,8 @@ +# absl CMake configuration file. + +include(CMakeFindDependencyMacro) +find_dependency(Threads) + +@PACKAGE_INIT@ + +include ("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") diff --git a/CMake/install_test_project/CMakeLists.txt b/CMake/install_test_project/CMakeLists.txt new file mode 100644 index 0000000..3229887 --- /dev/null +++ b/CMake/install_test_project/CMakeLists.txt @@ -0,0 +1,25 @@ +# +# Copyright 2019 The Abseil Authors. +# +# 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 +# +# https://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 simple CMakeLists.txt for testing cmake installation + +cmake_minimum_required(VERSION 3.16) +project(absl_cmake_testing CXX) + +add_executable(simple simple.cc) + +find_package(absl REQUIRED) + +target_link_libraries(simple absl::strings absl::config) diff --git a/CMake/install_test_project/simple.cc b/CMake/install_test_project/simple.cc new file mode 100644 index 0000000..7daa7f0 --- /dev/null +++ b/CMake/install_test_project/simple.cc @@ -0,0 +1,32 @@ +// +// Copyright 2019 The Abseil Authors. +// +// 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 +// +// https://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 +#include "absl/base/config.h" +#include "absl/strings/substitute.h" + +#if !defined(ABSL_LTS_RELEASE_VERSION) || ABSL_LTS_RELEASE_VERSION != 99998877 +#error ABSL_LTS_RELEASE_VERSION is not set correctly. +#endif + +#if !defined(ABSL_LTS_RELEASE_PATCH_LEVEL) || ABSL_LTS_RELEASE_PATCH_LEVEL != 0 +#error ABSL_LTS_RELEASE_PATCH_LEVEL is not set correctly. +#endif + +int main(int argc, char** argv) { + for (int i = 0; i < argc; ++i) { + std::cout << absl::Substitute("Arg $0: $1\n", i, argv[i]); + } +} diff --git a/CMake/install_test_project/test.sh b/CMake/install_test_project/test.sh new file mode 100644 index 0000000..962bc8d --- /dev/null +++ b/CMake/install_test_project/test.sh @@ -0,0 +1,113 @@ +#!/bin/bash +# +# Copyright 2019 The Abseil Authors. +# +# 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 +# +# https://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. +# +# Unit and integration tests for Abseil LTS CMake installation + +# Fail on any error. Treat unset variables an error. Print commands as executed. +set -euox pipefail + +absl_dir=/abseil-cpp +absl_build_dir=/buildfs +googletest_builddir=/googletest_builddir +googletest_archive="googletest-${ABSL_GOOGLETEST_VERSION}.tar.gz" +project_dir="${absl_dir}/CMake/install_test_project" +project_build_dir=/buildfs/project-build + +build_shared_libs="OFF" +if [ "${LINK_TYPE:-}" = "DYNAMIC" ]; then + build_shared_libs="ON" +fi + +# Build and install GoogleTest +mkdir "${googletest_builddir}" +pushd "${googletest_builddir}" +curl -L "${ABSL_GOOGLETEST_DOWNLOAD_URL}" --output "${googletest_archive}" +tar -xz -f "${googletest_archive}" +pushd "googletest-${ABSL_GOOGLETEST_VERSION}" +mkdir build +pushd build +cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS="${build_shared_libs}" .. +make -j $(nproc) +make install +ldconfig +popd +popd +popd + +# Run the LTS transformations +./create_lts.py 99998877 + +# Build and install Abseil +pushd "${absl_build_dir}" +cmake "${absl_dir}" \ + -DABSL_USE_EXTERNAL_GOOGLETEST=ON \ + -DABSL_FIND_GOOGLETEST=ON \ + -DCMAKE_BUILD_TYPE=Release \ + -DABSL_BUILD_TESTING=ON \ + -DBUILD_SHARED_LIBS="${build_shared_libs}" +make -j $(nproc) +ctest -j $(nproc) --output-on-failure +make install +ldconfig +popd + +# Test the project against the installed Abseil +mkdir -p "${project_build_dir}" +pushd "${project_build_dir}" +cmake "${project_dir}" +cmake --build . --target simple + +output="$(${project_build_dir}/simple "printme" 2>&1)" +if [[ "${output}" != *"Arg 1: printme"* ]]; then + echo "Faulty output on simple project:" + echo "${output}" + exit 1 +fi + +popd + +if ! grep absl::strings "/usr/local/lib/cmake/absl/abslTargets.cmake"; then + cat "/usr/local/lib/cmake/absl/abslTargets.cmake" + echo "CMake targets named incorrectly" + exit 1 +fi + +pushd "${HOME}" +cat > hello-abseil.cc << EOF +#include + +#include "absl/strings/str_format.h" + +int main(int argc, char **argv) { + absl::PrintF("Hello Abseil!\n"); + return EXIT_SUCCESS; +} +EOF + +if [ "${LINK_TYPE:-}" != "DYNAMIC" ]; then + pc_args=($(pkg-config --cflags --libs --static absl_str_format)) + g++ -static -o hello-abseil hello-abseil.cc "${pc_args[@]}" +else + pc_args=($(pkg-config --cflags --libs absl_str_format)) + g++ -o hello-abseil hello-abseil.cc "${pc_args[@]}" +fi +hello="$(./hello-abseil)" +[[ "${hello}" == "Hello Abseil!" ]] + +popd + +echo "Install test complete!" +exit 0 diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..5b21ee7 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,270 @@ +# +# Copyright 2017 The Abseil Authors. +# +# 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 +# +# https://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. +# + +# https://github.com/google/oss-policies-info/blob/main/foundational-cxx-support-matrix.md +# As of 2024-07-01, CMake 3.16 is the minimum supported version. +cmake_minimum_required(VERSION 3.16) + +# Allow the user to specify the CMAKE_MSVC_DEBUG_INFORMATION_FORMAT +if (POLICY CMP0141) + cmake_policy(SET CMP0141 NEW) +endif (POLICY CMP0141) + +project(absl LANGUAGES CXX VERSION 20250127) +set(ABSL_SOVERSION "2501.0.0") +include(CTest) + +# Output directory is correct by default for most build setups. However, when +# building Abseil as a DLL, it is important to have the DLL in the same +# directory as the executable using it. Thus, we put all executables in a single +# /bin directory. +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +# when absl is included as subproject (i.e. using add_subdirectory(abseil-cpp)) +# in the source tree of a project that uses it, install rules are disabled. +if(NOT CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) + option(ABSL_ENABLE_INSTALL "Enable install rule" OFF) +else() + option(ABSL_ENABLE_INSTALL "Enable install rule" ON) +endif() + +set(CMAKE_INSTALL_RPATH "$ORIGIN") +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH ON) +set(CMAKE_BUILD_RPATH_USE_ORIGIN ON) + +option(ABSL_PROPAGATE_CXX_STD + "Use CMake C++ standard meta features (e.g. cxx_std_14) that propagate to targets that link to Abseil" + ON) + +option(ABSL_USE_SYSTEM_INCLUDES + "Silence warnings in Abseil headers by marking them as SYSTEM includes" + OFF) + +list(APPEND CMAKE_MODULE_PATH + ${CMAKE_CURRENT_LIST_DIR}/CMake + ${CMAKE_CURRENT_LIST_DIR}/absl/copts +) + +option(ABSL_MSVC_STATIC_RUNTIME + "Link static runtime libraries" + OFF) +if(ABSL_MSVC_STATIC_RUNTIME) + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") +else() + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL") +endif() + +include(CMakePackageConfigHelpers) +include(GNUInstallDirs) +include(AbseilDll) +include(AbseilHelpers) + + +## +## Using absl targets +## +## all public absl targets are +## exported with the absl:: prefix +## +## e.g absl::base absl::synchronization absl::strings .... +## +## DO NOT rely on the internal targets outside of the prefix + + +# include current path +list(APPEND ABSL_COMMON_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}) + +if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + set(ABSL_USING_CLANG ON) +else() + set(ABSL_USING_CLANG OFF) +endif() + +# find dependencies +## pthread +find_package(Threads REQUIRED) + +include(CMakeDependentOption) + +option(ABSL_BUILD_TESTING + "If ON, Abseil will build all of Abseil's own tests." OFF) + +option(ABSL_BUILD_TEST_HELPERS + "If ON, Abseil will build libraries that you can use to write tests against Abseil code. This option requires that Abseil is configured to use GoogleTest." + OFF) + +option(ABSL_USE_EXTERNAL_GOOGLETEST + "If ON, Abseil will assume that the targets for GoogleTest are already provided by the including project. This makes sense when Abseil is used with add_subdirectory." OFF) + +cmake_dependent_option(ABSL_FIND_GOOGLETEST + "If ON, Abseil will use find_package(GTest) rather than assuming that GoogleTest is already provided by the including project." + ON + "ABSL_USE_EXTERNAL_GOOGLETEST" + OFF) + + +option(ABSL_USE_GOOGLETEST_HEAD + "If ON, abseil will download HEAD from GoogleTest at config time." OFF) + +set(ABSL_GOOGLETEST_DOWNLOAD_URL "" CACHE STRING "If set, download GoogleTest from this URL") + +set(ABSL_LOCAL_GOOGLETEST_DIR "/usr/src/googletest" CACHE PATH + "If ABSL_USE_GOOGLETEST_HEAD is OFF and ABSL_GOOGLETEST_URL is not set, specifies the directory of a local GoogleTest checkout." + ) + +option(ABSL_BUILD_MONOLITHIC_SHARED_LIBS + "Build Abseil as a single shared library (always enabled for Windows)" + OFF +) +if(NOT BUILD_SHARED_LIBS AND ABSL_BUILD_MONOLITHIC_SHARED_LIBS) + message(WARNING "Not building a shared library because BUILD_SHARED_LIBS is not set. Ignoring ABSL_BUILD_MONOLITHIC_SHARED_LIBS.") +endif() + +if((BUILD_TESTING AND ABSL_BUILD_TESTING) OR ABSL_BUILD_TEST_HELPERS) + if (ABSL_USE_EXTERNAL_GOOGLETEST) + if (ABSL_FIND_GOOGLETEST) + find_package(GTest REQUIRED) + elseif(NOT TARGET GTest::gtest) + if(TARGET gtest) + # When Google Test is included directly rather than through find_package, the aliases are missing. + add_library(GTest::gtest ALIAS gtest) + add_library(GTest::gtest_main ALIAS gtest_main) + add_library(GTest::gmock ALIAS gmock) + add_library(GTest::gmock_main ALIAS gmock_main) + else() + message(FATAL_ERROR "ABSL_USE_EXTERNAL_GOOGLETEST is ON and ABSL_FIND_GOOGLETEST is OFF, which means that the top-level project must build the Google Test project. However, the target gtest was not found.") + endif() + endif() + else() + set(absl_gtest_build_dir ${CMAKE_BINARY_DIR}/googletest-build) + if(ABSL_USE_GOOGLETEST_HEAD AND ABSL_GOOGLETEST_DOWNLOAD_URL) + message(FATAL_ERROR "Do not set both ABSL_USE_GOOGLETEST_HEAD and ABSL_GOOGLETEST_DOWNLOAD_URL") + endif() + if(ABSL_USE_GOOGLETEST_HEAD) + set(absl_gtest_download_url "https://github.com/google/googletest/archive/main.zip") + elseif(ABSL_GOOGLETEST_DOWNLOAD_URL) + set(absl_gtest_download_url ${ABSL_GOOGLETEST_DOWNLOAD_URL}) + endif() + if(absl_gtest_download_url) + set(absl_gtest_src_dir ${CMAKE_BINARY_DIR}/googletest-src) + else() + set(absl_gtest_src_dir ${ABSL_LOCAL_GOOGLETEST_DIR}) + endif() + include(CMake/Googletest/DownloadGTest.cmake) + endif() +endif() + +add_subdirectory(absl) + +if(ABSL_ENABLE_INSTALL) + + + # install as a subdirectory only + install(EXPORT ${PROJECT_NAME}Targets + NAMESPACE absl:: + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" + ) + + configure_package_config_file( + CMake/abslConfig.cmake.in + "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" + ) + install(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" + ) + + # Abseil only has a version in LTS releases. This mechanism is accomplished + # Abseil's internal Copybara (https://github.com/google/copybara) workflows and + # isn't visible in the CMake buildsystem itself. + if(absl_VERSION) + write_basic_package_version_file( + "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" + COMPATIBILITY ExactVersion + ) + + install(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" + ) + endif() # absl_VERSION + + # Install the headers except for "options.h" which is installed separately. + install(DIRECTORY absl + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING + PATTERN "*.inc" + PATTERN "*.h" + PATTERN "options.h" EXCLUDE + PATTERN "copts" EXCLUDE + PATTERN "testdata" EXCLUDE + ) + + # Rewrite options.h to use the compiled ABI. + file(READ "absl/base/options.h" ABSL_INTERNAL_OPTIONS_H_CONTENTS) + + # Handle features that require at least C++20. + if (ABSL_INTERNAL_AT_LEAST_CXX20) + foreach(FEATURE "ORDERING") + string(REPLACE + "#define ABSL_OPTION_USE_STD_${FEATURE} 2" + "#define ABSL_OPTION_USE_STD_${FEATURE} 1" + ABSL_INTERNAL_OPTIONS_H_PINNED + "${ABSL_INTERNAL_OPTIONS_H_CONTENTS}") + set(ABSL_INTERNAL_OPTIONS_H_CONTENTS "${ABSL_INTERNAL_OPTIONS_H_PINNED}") + endforeach() + endif() + + # Handle features that require at least C++17. + if (ABSL_INTERNAL_AT_LEAST_CXX17) + foreach(FEATURE "ANY" "OPTIONAL" "STRING_VIEW" "VARIANT") + string(REPLACE + "#define ABSL_OPTION_USE_STD_${FEATURE} 2" + "#define ABSL_OPTION_USE_STD_${FEATURE} 1" + ABSL_INTERNAL_OPTIONS_H_PINNED + "${ABSL_INTERNAL_OPTIONS_H_CONTENTS}") + set(ABSL_INTERNAL_OPTIONS_H_CONTENTS "${ABSL_INTERNAL_OPTIONS_H_PINNED}") + endforeach() + endif() + + # Any feature that still has the value of 2 (because it was not handled above) + # should be set to 0. + string(REGEX REPLACE + "#define ABSL_OPTION_USE_STD_([^ ]*) 2" + "#define ABSL_OPTION_USE_STD_\\1 0" + ABSL_INTERNAL_OPTIONS_H_PINNED + "${ABSL_INTERNAL_OPTIONS_H_CONTENTS}") + + # If the file already exists, check if it matches the new contents. + # This avoids writing the file if it is already up-to-date when the CMake + # generation is triggered and triggering unnecessary rebuilds. + set(ABSL_INTERNAL_OPTIONS_H_PINNED_NEEDS_UPDATE TRUE) + if (EXISTS "${CMAKE_BINARY_DIR}/options-pinned.h") + file(READ "${CMAKE_BINARY_DIR}/options-pinned.h" ABSL_INTERNAL_OPTIONS_PINNED_H_CONTENTS) + if ("${ABSL_INTERNAL_OPTIONS_H_PINNED}" STREQUAL "${ABSL_INTERNAL_OPTIONS_PINNED_H_CONTENTS}") + set(ABSL_INTERNAL_OPTIONS_H_PINNED_NEEDS_UPDATE FALSE) + endif() + endif() + + # If the file needs an update, generate it. + if (ABSL_INTERNAL_OPTIONS_H_PINNED_NEEDS_UPDATE) + file(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/options-pinned.h" CONTENT "${ABSL_INTERNAL_OPTIONS_H_PINNED}") + endif() + + install(FILES "${CMAKE_BINARY_DIR}/options-pinned.h" + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/absl/base + RENAME "options.h") + +endif() # ABSL_ENABLE_INSTALL diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..a87254c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,141 @@ +# How to Contribute to Abseil + +We'd love to accept your patches and contributions to this project. There are +just a few small guidelines you need to follow. + +NOTE: If you are new to GitHub, please start by reading [Pull Request +howto](https://help.github.com/articles/about-pull-requests/) + +## Contributor License Agreement + +Contributions to this project must be accompanied by a Contributor License +Agreement. You (or your employer) retain the copyright to your contribution, +this simply gives us permission to use and redistribute your contributions as +part of the project. Head over to to see +your current agreements on file or to sign a new one. + +You generally only need to submit a CLA once, so if you've already submitted one +(even if it was for a different project), you probably don't need to do it +again. + +## Contribution Guidelines + +Potential contributors sometimes ask us if the Abseil project is the appropriate +home for their utility library code or for specific functions implementing +missing portions of the standard. Often, the answer to this question is "no". +We’d like to articulate our thinking on this issue so that our choices can be +understood by everyone and so that contributors can have a better intuition +about whether Abseil might be interested in adopting a new library. + +### Priorities + +Although our mission is to augment the C++ standard library, our goal is not to +provide a full forward-compatible implementation of the latest standard. For us +to consider a library for inclusion in Abseil, it is not enough that a library +is useful. We generally choose to release a library when it meets at least one +of the following criteria: + +* **Widespread usage** - Using our internal codebase to help gauge usage, most + of the libraries we've released have tens of thousands of users. +* **Anticipated widespread usage** - Pre-adoption of some standard-compliant + APIs may not have broad adoption initially but can be expected to pick up + usage when it replaces legacy APIs. `absl::from_chars`, for example, + replaces existing code that converts strings to numbers and will therefore + likely see usage growth. +* **High impact** - APIs that provide a key solution to a specific problem, + such as `absl::FixedArray`, have higher impact than usage numbers may signal + and are released because of their importance. +* **Direct support for a library that falls under one of the above** - When we + want access to a smaller library as an implementation detail for a + higher-priority library we plan to release, we may release it, as we did + with portions of `absl/meta/type_traits.h`. One consequence of this is that + the presence of a library in Abseil does not necessarily mean that other + similar libraries would be a high priority. + +### API Freeze Consequences + +Via the +[Abseil Compatibility Guidelines](https://abseil.io/about/compatibility), we +have promised a large degree of API stability. In particular, we will not make +backward-incompatible changes to released APIs without also shipping a tool or +process that can upgrade our users' code. We are not yet at the point of easily +releasing such tools. Therefore, at this time, shipping a library establishes an +API contract which is borderline unchangeable. (We can add new functionality, +but we cannot easily change existing behavior.) This constraint forces us to +very carefully review all APIs that we ship. + + +## Coding Style + +To keep the source consistent, readable, diffable and easy to merge, we use a +fairly rigid coding style, as defined by the +[google-styleguide](https://github.com/google/styleguide) project. All patches +will be expected to conform to the style outlined +[here](https://google.github.io/styleguide/cppguide.html). + +## Guidelines for Pull Requests + +* If you are a Googler, it is required that you send us a Piper CL instead of + using the GitHub pull-request process. The code propagation process will + deliver the change to GitHub. + +* Create **small PRs** that are narrowly focused on **addressing a single + concern**. We often receive PRs that are trying to fix several things at a + time, but if only one fix is considered acceptable, nothing gets merged and + both author's & review's time is wasted. Create more PRs to address + different concerns and everyone will be happy. + +* For speculative changes, consider opening an [Abseil + issue](https://github.com/abseil/abseil-cpp/issues) and discussing it first. + If you are suggesting a behavioral or API change, consider starting with an + [Abseil proposal template](ABSEIL_ISSUE_TEMPLATE.md). + +* Provide a good **PR description** as a record of **what** change is being + made and **why** it was made. Link to a GitHub issue if it exists. + +* Don't fix code style and formatting unless you are already changing that + line to address an issue. Formatting of modified lines may be done using + `git clang-format`. PRs with irrelevant changes won't be merged. If + you do want to fix formatting or style, do that in a separate PR. + +* Unless your PR is trivial, you should expect there will be reviewer comments + that you'll need to address before merging. We expect you to be reasonably + responsive to those comments, otherwise the PR will be closed after 2-3 + weeks of inactivity. + +* Maintain **clean commit history** and use **meaningful commit messages**. + PRs with messy commit history are difficult to review and won't be merged. + Use `rebase -i upstream/master` to curate your commit history and/or to + bring in latest changes from master (but avoid rebasing in the middle of a + code review). + +* Keep your PR up to date with upstream/master (if there are merge conflicts, + we can't really merge your change). + +* **All tests need to be passing** before your change can be merged. We + recommend you **run tests locally** (see below) + +* Exceptions to the rules can be made if there's a compelling reason for doing + so. That is - the rules are here to serve us, not the other way around, and + the rules need to be serving their intended purpose to be valuable. + +* All submissions, including submissions by project members, require review. + +## Running Tests + +If you have [Bazel](https://bazel.build/) installed, use `bazel test +--test_tag_filters="-benchmark" ...` to run the unit tests. + +If you are running the Linux operating system and have +[Docker](https://www.docker.com/) installed, you can also run the `linux_*.sh` +scripts under the `ci/`(https://github.com/abseil/abseil-cpp/tree/master/ci) +directory to test Abseil under a variety of conditions. + +## Abseil Committers + +The current members of the Abseil engineering team are the only committers at +present. + +## Release Process + +Abseil lives at head, where latest-and-greatest code can be found. diff --git a/FAQ.md b/FAQ.md new file mode 100644 index 0000000..fbd92ce --- /dev/null +++ b/FAQ.md @@ -0,0 +1,167 @@ +# Abseil FAQ + +## Is Abseil the right home for my utility library? + +Most often the answer to the question is "no." As both the [About +Abseil](https://abseil.io/about/) page and our [contributing +guidelines](https://github.com/abseil/abseil-cpp/blob/master/CONTRIBUTING.md#contribution-guidelines) +explain, Abseil contains a variety of core C++ library code that is widely used +at [Google](https://www.google.com/). As such, Abseil's primary purpose is to be +used as a dependency by Google's open source C++ projects. While we do hope that +Abseil is also useful to the C++ community at large, this added constraint also +means that we are unlikely to accept a contribution of utility code that isn't +already widely used by Google. + +## How to I set the C++ dialect used to build Abseil? + +The short answer is that whatever mechanism you choose, you need to make sure +that you set this option consistently at the global level for your entire +project. If, for example, you want to set the C++ dialect to C++17, with +[Bazel](https://bazel/build/) as the build system and `gcc` or `clang` as the +compiler, there several ways to do this: +* Pass `--cxxopt=-std=c++17` on the command line (for example, `bazel build + --cxxopt=-std=c++17 ...`) +* Set the environment variable `BAZEL_CXXOPTS` (for example, + `BAZEL_CXXOPTS=-std=c++17`) +* Add `build --cxxopt=-std=c++17` to your [`.bazelrc` + file](https://docs.bazel.build/versions/master/guide.html#bazelrc) + +If you are using CMake as the build system, you'll need to add a line like +`set(CMAKE_CXX_STANDARD 17)` to your top level `CMakeLists.txt` file. If you +are developing a library designed to be used by other clients, you should +instead leave `CMAKE_CXX_STANDARD` unset and configure the minimum C++ standard +required by each of your library targets via `target_compile_features`. See the +[CMake build +instructions](https://github.com/abseil/abseil-cpp/blob/master/CMake/README.md) +for more information. + +For a longer answer to this question and to understand why some other approaches +don't work, see the answer to ["What is ABI and why don't you recommend using a +pre-compiled version of +Abseil?"](#what-is-abi-and-why-dont-you-recommend-using-a-pre-compiled-version-of-abseil) + +## What is ABI and why don't you recommend using a pre-compiled version of Abseil? + +For the purposes of this discussion, you can think of +[ABI](https://en.wikipedia.org/wiki/Application_binary_interface) as the +compiled representation of the interfaces in code. This is in contrast to +[API](https://en.wikipedia.org/wiki/Application_programming_interface), which +you can think of as the interfaces as defined by the code itself. [Abseil has a +strong promise of API compatibility, but does not make any promise of ABI +compatibility](https://abseil.io/about/compatibility). Let's take a look at what +this means in practice. + +You might be tempted to do something like this in a +[Bazel](https://bazel.build/) `BUILD` file: + +``` +# DON'T DO THIS!!! +cc_library( + name = "my_library", + srcs = ["my_library.cc"], + copts = ["-std=c++17"], # May create a mixed-mode compile! + deps = ["@com_google_absl//absl/strings"], +) +``` + +Applying `-std=c++17` to an individual target in your `BUILD` file is going to +compile that specific target in C++17 mode, but it isn't going to ensure the +Abseil library is built in C++17 mode, since the Abseil library itself is a +different build target. If your code includes an Abseil header, then your +program may contain conflicting definitions of the same +class/function/variable/enum, etc. As a rule, all compile options that affect +the ABI of a program need to be applied to the entire build on a global basis. + +C++ has something called the [One Definition +Rule](https://en.wikipedia.org/wiki/One_Definition_Rule) (ODR). C++ doesn't +allow multiple definitions of the same class/function/variable/enum, etc. ODR +violations sometimes result in linker errors, but linkers do not always catch +violations. Uncaught ODR violations can result in strange runtime behaviors or +crashes that can be hard to debug. + +If you build the Abseil library and your code using different compile options +that affect ABI, there is a good chance you will run afoul of the One Definition +Rule. Examples of GCC compile options that affect ABI include (but aren't +limited to) language dialect (e.g. `-std=`), optimization level (e.g. `-O2`), +code generation flags (e.g. `-fexceptions`), and preprocessor defines +(e.g. `-DNDEBUG`). + +If you use a pre-compiled version of Abseil, (for example, from your Linux +distribution package manager or from something like +[vcpkg](https://github.com/microsoft/vcpkg)) you have to be very careful to +ensure ABI compatibility across the components of your program. The only way you +can be sure your program is going to be correct regarding ABI is to ensure +you've used the exact same compile options as were used to build the +pre-compiled library. This does not mean that Abseil cannot work as part of a +Linux distribution since a knowledgeable binary packager will have ensured that +all packages have been built with consistent compile options. This is one of the +reasons we warn against - though do not outright reject - using Abseil as a +pre-compiled library. + +Another possible way that you might afoul of ABI issues is if you accidentally +include two versions of Abseil in your program. Multiple versions of Abseil can +end up within the same binary if your program uses the Abseil library and +another library also transitively depends on Abseil (resulting in what is +sometimes called the diamond dependency problem). In cases such as this you must +structure your build so that all libraries use the same version of Abseil. +[Abseil's strong promise of API compatibility between +releases](https://abseil.io/about/compatibility) means the latest "HEAD" release +of Abseil is almost certainly the right choice if you are doing as we recommend +and building all of your code from source. + +For these reasons we recommend you avoid pre-compiled code and build the Abseil +library yourself in a consistent manner with the rest of your code. + +## What is "live at head" and how do I do it? + +From Abseil's point-of-view, "live at head" means that every Abseil source +release (which happens on an almost daily basis) is either API compatible with +the previous release, or comes with an automated tool that you can run over code +to make it compatible. In practice, the need to use an automated tool is +extremely rare. This means that upgrading from one source release to another +should be a routine practice that can and should be performed often. + +We recommend you update to the [latest commit in the `master` branch of +Abseil](https://github.com/abseil/abseil-cpp/commits/master) as often as +possible. Not only will you pick up bug fixes more quickly, but if you have good +automated testing, you will catch and be able to fix any [Hyrum's +Law](https://www.hyrumslaw.com/) dependency problems on an incremental basis +instead of being overwhelmed by them and having difficulty isolating them if you +wait longer between updates. + +If you are using the [Bazel](https://bazel.build/) build system and its +[external dependencies](https://docs.bazel.build/versions/master/external.html) +feature, updating the +[`http_archive`](https://docs.bazel.build/versions/master/repo/http.html#http_archive) +rule in your +[`WORKSPACE`](https://docs.bazel.build/versions/master/be/workspace.html) for +`com_google_abseil` to point to the [latest commit in the `master` branch of +Abseil](https://github.com/abseil/abseil-cpp/commits/master) is all you need to +do. For example, on February 11, 2020, the latest commit to the master branch +was `98eb410c93ad059f9bba1bf43f5bb916fc92a5ea`. To update to this commit, you +would add the following snippet to your `WORKSPACE` file: + +``` +http_archive( + name = "com_google_absl", + urls = ["https://github.com/abseil/abseil-cpp/archive/98eb410c93ad059f9bba1bf43f5bb916fc92a5ea.zip"], # 2020-02-11T18:50:53Z + strip_prefix = "abseil-cpp-98eb410c93ad059f9bba1bf43f5bb916fc92a5ea", + sha256 = "aabf6c57e3834f8dc3873a927f37eaf69975d4b28117fc7427dfb1c661542a87", +) +``` + +To get the `sha256` of this URL, run `curl -sL --output - +https://github.com/abseil/abseil-cpp/archive/98eb410c93ad059f9bba1bf43f5bb916fc92a5ea.zip +| sha256sum -`. + +You can commit the updated `WORKSPACE` file to your source control every time +you update, and if you have good automated testing, you might even consider +automating this. + +One thing we don't recommend is using GitHub's `master.zip` files (for example +[https://github.com/abseil/abseil-cpp/archive/master.zip](https://github.com/abseil/abseil-cpp/archive/master.zip)), +which are always the latest commit in the `master` branch, to implement live at +head. Since these `master.zip` URLs are not versioned, you will lose build +reproducibility. In addition, some build systems, including Bazel, will simply +cache this file, which means you won't actually be updating to the latest +release until your cache is cleared or invalidated. diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 0000000..8083c11 --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,46 @@ +# Copyright 2024 The Abseil Authors. +# +# 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 +# +# https://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. + +# https://bazel.build/external/overview#bzlmod + +module( + name = "abseil-cpp", + version = "20250127.0", + compatibility_level = 1, +) + +cc_configure = use_extension("@rules_cc//cc:extensions.bzl", + "cc_configure_extension", + dev_dependency = True) +use_repo(cc_configure, "local_config_cc") + +# Only direct dependencies need to be listed below. +# Please keep the versions in sync with the versions in the WORKSPACE file. + +bazel_dep(name = "rules_cc", version = "0.0.17") +bazel_dep(name = "bazel_skylib", version = "1.7.1") +bazel_dep(name = "platforms", version = "0.0.10") + +bazel_dep( + name = "google_benchmark", + version = "1.8.5", + dev_dependency = True, +) + +# Note: Googletest is NOT a dev_dependency. Some Abseil test utilities +# intended to be used by Abseil users depend on GoogleTest. +bazel_dep( + name = "googletest", + version = "1.15.2", +) diff --git a/PrivacyInfo.xcprivacy b/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..3ff4a9d --- /dev/null +++ b/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyTracking + + NSPrivacyCollectedDataTypes + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + diff --git a/README.md b/README.md index 85de569..f834fcd 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Abseil - C++ Common Libraries The repository contains the Abseil C++ library code. Abseil is an open-source -collection of C++ code (compliant to C++11) designed to augment the C++ +collection of C++ code (compliant to C++14) designed to augment the C++ standard library. ## Table of Contents @@ -9,7 +9,9 @@ standard library. - [About Abseil](#about) - [Quickstart](#quickstart) - [Building Abseil](#build) +- [Support](#support) - [Codemap](#codemap) +- [Releases](#releases) - [License](#license) - [Links](#links) @@ -42,46 +44,78 @@ the Abseil code, running tests, and getting a simple binary working. ## Building Abseil -[Bazel](https://bazel.build) is the official build system for Abseil, -which is supported on most major platforms (Linux, Windows, macOS, for example) -and compilers. See the [quickstart](https://abseil.io/docs/cpp/quickstart) for -more information on building Abseil using the Bazel build system. - - -If you require CMake support, please check the -[CMake build instructions](CMake/README.md). - +[Bazel](https://bazel.build) and [CMake](https://cmake.org/) are the official +build systems for Abseil. +See the [quickstart](https://abseil.io/docs/cpp/quickstart) for more information +on building Abseil using the Bazel build system. +If you require CMake support, please check the [CMake build +instructions](CMake/README.md) and [CMake +Quickstart](https://abseil.io/docs/cpp/quickstart-cmake). + + +## Support + +Abseil follows Google's [Foundational C++ Support +Policy](https://opensource.google/documentation/policies/cplusplus-support). See +[this +table](https://github.com/google/oss-policies-info/blob/main/foundational-cxx-support-matrix.md) +for a list of currently supported versions compilers, platforms, and build +tools. + + ## Codemap Abseil contains the following C++ library components: -* [`base`](absl/base/) Abseil Fundamentals +* [`base`](absl/base/)
The `base` library contains initialization code and other code which all other Abseil code depends on. Code within `base` may not depend on any other code (other than the C++ standard library). * [`algorithm`](absl/algorithm/)
The `algorithm` library contains additions to the C++ `` library and container-based versions of such algorithms. +* [`cleanup`](absl/cleanup/) +
The `cleanup` library contains the control-flow-construct-like type + `absl::Cleanup` which is used for executing a callback on scope exit. * [`container`](absl/container/)
The `container` library contains additional STL-style containers, including Abseil's unordered "Swiss table" containers. +* [`crc`](absl/crc/) The `crc` library contains code for + computing error-detecting cyclic redundancy checks on data. * [`debugging`](absl/debugging/)
The `debugging` library contains code useful for enabling leak checks, and stacktrace and symbolization utilities. +* [`flags`](absl/flags/) +
The `flags` library contains code for handling command line flags for + libraries and binaries built with Abseil. * [`hash`](absl/hash/)
The `hash` library contains the hashing framework and default hash functor implementations for hashable types in Abseil. +* [`log`](absl/log/) +
The `log` library contains `LOG` and `CHECK` macros and facilities + for writing logged messages out to disk, `stderr`, or user-extensible + destinations. * [`memory`](absl/memory/) -
The `memory` library contains C++11-compatible versions of - `std::make_unique()` and related memory management facilities. +
The `memory` library contains memory management facilities that augment + C++'s `` library. * [`meta`](absl/meta/) -
The `meta` library contains C++11-compatible versions of type checks +
The `meta` library contains compatible versions of type checks available within C++14 and C++17 versions of the C++ `` library. * [`numeric`](absl/numeric/) -
The `numeric` library contains C++11-compatible 128-bit integers. +
The `numeric` library contains 128-bit integer types as well as + implementations of C++20's bitwise math functions. +* [`profiling`](absl/profiling/) +
The `profiling` library contains utility code for profiling C++ + entities. It is currently a private dependency of other Abseil libraries. +* [`random`](absl/random/) +
The `random` library contains functions for generating psuedorandom + values. +* [`status`](absl/status/) +
The `status` library contains abstractions for error handling, + specifically `absl::Status` and `absl::StatusOr`. * [`strings`](absl/strings/)
The `strings` library contains a variety of strings routines and - utilities, including a C++11-compatible version of the C++17 + utilities, including a C++14-compatible version of the C++17 `std::string_view` type. * [`synchronization`](absl/synchronization/)
The `synchronization` library contains concurrency primitives (Abseil's @@ -93,15 +127,27 @@ Abseil contains the following C++ library components: time zones. * [`types`](absl/types/)
The `types` library contains non-container utility types, like a - C++11-compatible version of the C++17 `std::optional` type. + C++14-compatible version of the C++17 `std::optional` type. * [`utility`](absl/utility/)
The `utility` library contains utility and helper code. + +## Releases + +Abseil recommends users "live-at-head" (update to the latest commit from the +master branch as often as possible). However, we realize this philosophy doesn't +work for every project, so we also provide [Long Term Support +Releases](https://github.com/abseil/abseil-cpp/releases) to which we backport +fixes for severe bugs. See our [release +management](https://abseil.io/about/releases) document for more details. + + ## License The Abseil C++ library is licensed under the terms of the Apache license. See [LICENSE](LICENSE) for more information. + ## Links For more information about Abseil: diff --git a/UPGRADES.md b/UPGRADES.md new file mode 100644 index 0000000..3cac141 --- /dev/null +++ b/UPGRADES.md @@ -0,0 +1,17 @@ +# C++ Upgrade Tools + +Abseil may occasionally release API-breaking changes. As noted in our +[Compatibility Guidelines][compatibility-guide], we will aim to provide a tool +to do the work of effecting such API-breaking changes, when absolutely +necessary. + +These tools will be listed on the [C++ Upgrade Tools][upgrade-tools] guide on +https://abseil.io. + +For more information, the [C++ Automated Upgrade Guide][api-upgrades-guide] +outlines this process. + +[compatibility-guide]: https://abseil.io/about/compatibility +[api-upgrades-guide]: https://abseil.io/docs/cpp/tools/api-upgrades +[upgrade-tools]: https://abseil.io/docs/cpp/tools/upgrades/ + diff --git a/WORKSPACE b/WORKSPACE new file mode 100644 index 0000000..28e17c9 --- /dev/null +++ b/WORKSPACE @@ -0,0 +1,76 @@ +# +# Copyright 2019 The Abseil Authors. +# +# 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 +# +# https://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. +# + +workspace(name = "abseil-cpp") + +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +# GoogleTest/GoogleMock framework. Used by most unit-tests. +http_archive( + name = "googletest", + sha256 = "7b42b4d6ed48810c5362c265a17faebe90dc2373c885e5216439d37927f02926", + strip_prefix = "googletest-1.15.2", + # Keep this URL in sync with the version in ci/cmake_common.sh and + # ci/windows_msvc_cmake.bat. + urls = ["https://github.com/google/googletest/releases/download/v1.15.2/googletest-1.15.2.tar.gz"], + # Now that Abseil is using the canonical names from the Bazel Central Registry, map + # GoogleTest's old names to the new canonical names. + repo_mapping = { + "@com_google_absl": "@", + "@com_googlesource_code_re2": "@re2", + }, +) + +# RE2 (the regular expression library used by GoogleTest) +http_archive( + name = "re2", + sha256 = "eb2df807c781601c14a260a507a5bb4509be1ee626024cb45acbd57cb9d4032b", + strip_prefix = "re2-2024-07-02", + urls = ["https://github.com/google/re2/releases/download/2024-07-02/re2-2024-07-02.tar.gz"], +) + +# Google benchmark. +http_archive( + name = "google_benchmark", + sha256 = "d26789a2b46d8808a48a4556ee58ccc7c497fcd4c0af9b90197674a81e04798a", + strip_prefix = "benchmark-1.8.5", + urls = ["https://github.com/google/benchmark/archive/refs/tags/v1.8.5.tar.gz"], +) + +# Bazel Skylib. +http_archive( + name = "bazel_skylib", + sha256 = "bc283cdfcd526a52c3201279cda4bc298652efa898b10b4db0837dc51652756f", + urls = ["https://github.com/bazelbuild/bazel-skylib/releases/download/1.7.1/bazel-skylib-1.7.1.tar.gz"], +) + +# C++ rules for Bazel +http_archive( + name = "rules_cc", + urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.1.0/rules_cc-0.1.0.tar.gz"], + sha256 = "4b12149a041ddfb8306a8fd0e904e39d673552ce82e4296e96fac9cbf0780e59", + strip_prefix = "rules_cc-0.1.0", +) + +# Bazel platform rules. +http_archive( + name = "platforms", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.10/platforms-0.0.10.tar.gz", + "https://github.com/bazelbuild/platforms/releases/download/0.0.10/platforms-0.0.10.tar.gz", + ], + sha256 = "218efe8ee736d26a3572663b374a253c012b716d8af0c07e842e82f238a0a7ee", +) diff --git a/WORKSPACE.bzlmod b/WORKSPACE.bzlmod new file mode 100644 index 0000000..83e67ba --- /dev/null +++ b/WORKSPACE.bzlmod @@ -0,0 +1,19 @@ +# Copyright 2024 The Abseil Authors. +# +# 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 +# +# https://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. + +# https://bazel.build/external/migration#workspace.bzlmod +# +# This file is intentionally empty. When bzlmod is enabled and this +# file exists, the contents of WORKSPACE is ignored. This prevents +# bzlmod builds from unintentionally depending on the WORKSPACE file. diff --git a/abseil-cpp-20250127.0.tar.gz b/abseil-cpp-20250127.0.tar.gz deleted file mode 100644 index ed9da12690c33dbc33443500cbb2ea0577624502..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2267275 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

_ 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

i;XtFPC%ve=9FnX7RsI@tNKKv-|(4EdUwx#LOEX z+;y9ouPDoP<|Q!5enakqsjm=uDV;KkznLPn)1t!cEl=_E(2(Nv+Bk90_c%?%*s^f9 z`GFlduuo-WVVUg+F|)k*PGL)aaxDzfL^LgW3v)vXk4f~2@lrPpzOMv* zN*C=13&DUvB-OJFno2MeF%*ch%!Q{ z7!`yLY9vA?y?)W`dC-hZ&hLRVlvIq7%CJg7$zOOSIh9M*k*qq(`LrgSh97c6SGp!J zJX|qKLmUOVGsFgjmGJ^t6hu?&5;OIM0U;0M%|Lk-sn)|&*@xjEG(EaHQ7I-uWnIdM zYj)4`hhK7jkXy&c`_0_92rd7vwKF#5eWn&{a^yMkebFb|l1~tGHiNX~+B+J!elm*D zEt#i1JH^(|`$s5e7J3P%rOzBiET?}jrSc>oW|$~P+150hNfBV{=hpVt{{B=XNNk;f zANeAbKdR7}O_W);7U$6l3FW1BOC)J+mSzYK}&Z!CuhJ`F> z@8}W6!wucrV_P`v$Yg>?J4e;auG0gSQCq`1gEkjxE(mYNjmBhwB(~tQx__5k0{9KE zz{o=YMnVxwP}j~`DLW@KH_(da_cS^>BnOG`TqtURc>UN3MkF{U@ z3MWL1IFkaqLNHpt=+toBx(I9ObpAPvDBIjTd_}h{ok1F{+r{ZBBLWU)*eAg>#w2S= zT5ViXk^sqPR)*7+>;&Y~!b4*##~z`6BwtxUn`|M#58&XcErj!qj!U2e^>s2p8nc!k zr6X+2T$sij0iu1}+6hja+x_6ON<3zsISf5luwybiu`>hW#i?624zLUO))_EDgXsRC znC}`;607W5{W$%QTNiRHUiY_{lq!u0$3TRb-svXtB{#-A^-|>gPtDZox+~}co1no8 zG+dIs1^e}}Ph^h1waJ^W@>S^KMurxwQQj@Ifd37;)nrSI>^wLJp5{XKk!Z78P*Jkr zr1N6dlMLSla*e`pseoGrfQWQ{ZB2h=#BxJTDO z2JeR57RN%Yf>JKIE`ft?ovtPON4TacZRfnAAYc`E(_H~4i$DOis_vHn)~H6#Nthz? zDq?{PvzPccAhW4pg&Lj4OBeKqo2r0D_esHa+N4f$gN#v4L;8@woSK~z=S&8a$mO(R z!18zvk@fjXA8M>^HeG-h*>zsgQ?c6j5@0`rHjbFx$n>kW&w z>-FIN-ts%ga5;Eisth3tKeR;S%dDH%a~UxdJqbrgd{~^EHnkJ*FFRpKddH}M`mJtN ze)(%;tyzEVe6~PJS+gp2=@>h$70rsMLt9(7PLB@uw(So`M?WRB(wgJBr5Z_*@D)alZXHXIduKtGd;T`gTq80n*oYYSCN8VYNf)a^REe#%+@xRu{I zE4s%Pj=S56kKs$cKflL-bPi+|CVnwE_UCo^jpzoWP6j-TDP9j;eMv$?#vD4e@h!KXD}Rg*C&;xd9`G0Y9_Sw zeqgt+f&s>}CE}bhk{sU^Udz=I`KGvTg>#q{h%zPR{~7@cGvuHo86aG2h}YbroB=JT z>wdxux=Go+lt^E6eIP+E2tlhHc#8PU@^~aStHvFb|4~*T|ASiCb%PL4g34ODBtlN< zbjo5TLR%e^!}|*OMQm**;yy|Z__BtkW`@yDoq>&w@zk5J#i~hqY5@}hQ{P!HOwmsE zLnU>eOA-pA_ct#dsZ_=@r|ff0J#1u^UDQe0SZv>TF8Xl80{NHZtEDo0kP{JQ-SaQ` z9fKZ=Rn#`AcFr|sN{+M^=0xN@o;0k@aKwG(GE&aoIK;={!�@u2ejZXKHY~9kMdT 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

K~26e=tj8mXIk{l;wIKC!(20wTf^GK*-FAgFSz6 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 D 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

V3%E%vgW&dAnx1KJg?f>mo z`yu|veSBtTDL%1||IDL2GjpIKb0?^sTza6l2HkNYE{?}Bh81812+GCLfL=)Bevhgq z7~L$Ip;&P$s5mvy@PeFE1U?G@Ev#1)@`bo@HTN`1PEyD5f%}zS9<2Au%$a$bQ$d?y zvX67BXbm9ySgvu|Hx{tE5McIwsOMsMY8>Hi_WzA1K>kj*yRZQNshe1Xr_YUe zqse|v>P!W|B2m?vDLQ4URUua9%HIu0CSg=+{#%Q_htGdhTK`!t-=K|>^Z%vxawh)U z)2FSc59|Lud|#_(VA{KS21BfX5Ni>PO6uV#?PsXPdOC+x*uKFCu=u(uK;WA{6 zki}LpZmM!9ph*5B42TqC{BH`&fw7=;h7e4}-s2dmfrp!Qv=Pz|ir5k+By>D)7z8~k zh?mcmOG5Q~hzFJ)LvJt|It7)6Jw3(Ia%jbr8Y4eip6TT9aH4ws!#@lmpln=>7K~2p zUl!R4fA(HR7|osoa(M$x8-ua-{VyJwYZ9+UchQl%K8C|ybdiWGbFjkJ9p=5vY3=4q zPR6pC@mzU0etbBL_zN6HJRCpX^7+Nj-bX%0NH~5sE-?Ye?Z*}7B#tH{PnQc;>;w~lNzTnv7Y&{?2fF1x;g#W_{(2sWl^s`5~#(=j*0p&>$+Ujq+A7DlT zH7OO|QGnbO9b<~%o;fWm9v%JcEzpdo7&*A<_C(-ajE8p`^hd{&zMgT(1VcC`-q!Nd zR;xjO78_o(*_@#b`iq_4_{tKi~bHJFXG3V&xlzb}FF{Lp( z^)ZN=Hwb*B)0)S}M?K@bLml#9>{7|mY}xz;L9~8BsPwh{OG5_(?MDfv$mscFUxU+! zL=JGAoJhl~08Sk;{Y(kbU}{IaKcR#;7tp(YG(4d^eE!f5?n$}&Tqij{<0h_)+{saL z0UgTi^9!bp`32*U{z3^Xe(`D}(5p}hqNI$>Yjq8h54j}kyxe}Zv%76_mLWYWN#qL_ z#LZI~GmL8-;ksi4^QRdBlY#U~A|6ysqVAbmCYlm~{Bt%5+z53!!FX0U2AGzji$PpV1;v97X66DsRcn=w zRA+$d-f!LR{`j&VybAjuEH{U}El!106DB$eL5fjkLAdevI>up!{p;HxJ_!=fD#u}s zRZ%hwz_y4U;}Y4#ZT==~n)tM00|$s7IXSjGNQd`l&$j)rbl;O3O>6b&(=X~NXR z8VNSMNBN#a+nb(9`qWFe>g-Cx1IaI)po7tro_Lj2;v$_7J5IcyAq zh)fj;r*S!vnM$!Xf%%120||r)J>v;rWQ`ryKEaYP>pk|4KRsFfOe8**-4v}ro5!D4 zpM1vLS-if?Qq*yg@aogCu4VTbD^h&Pa46dR3=L_>Gc#yO@BF^Ghf`YEgi|LbIktM& z3Ce0d`w9Dvmj>n)Z?)?=hcbC*4$f1W%4iwj(gyoN#8M|ys|sq)y8PHPg=yJA)|BAj zX9?~(r&d+lsoIzH`POZ~ho7Gm7_C9Hga*Oe$OXBdgas%WVBqU)6>@=Kr6UedeH)^z zrhT9?L1k;v`iiwuYqYRcVV+~OPd4<*4a@D2wg*{YD$2bkb?X_utmw_e`&2OElxN20nGlqyDm)MVy4-Y0(E%n^!Ad`s8C4QJM5N!*v8j zlD<_+=O*+F#8o&T!Gdkfi0{c|GNY@=5=v>A!7cP_*e9b(DYbaggHd92P6NLe#2rc* zQ6oK9YD_{nO>sXKgzl^mUQn;_uB=h)nwMr#N0b^p=6xFn!`dTMYZI#%A!g@5)i0SG z$ul)7MGxsMJP|J?yg0z4y7QoeB*Jy7Ccl`l5z*#9B3M`GTQ7{MXoqTbI`xL9YSAE& zdgW1;YjzDf4HA{eO(n}tF5x$fQrAnMJnl}#fgU9d7ChBBl!=C#udz)+ZfF=KX{P`%oU?{G31K&h`)Jz&ia1)BVB1wgvw59$6+sJK z3hCHUX&AXIFZQV#W|RZe?Xidjq}z{@z}Z;+e}<~PUepx{FdPM;9FI_~Hv2QRf{b2o zVvP|f0oY~A;{XHTm=5*2Y(+7GqmhCT!GNV0f_)IPeLp^{Gzzltbq1m_^+=E+_86%1 z-1{_JaRfe>jevUC`EwGDDTnLq|Iq(tO+cAqkBvc7>XDq^jv;DzpVBZsPdjYdmrl%o ze9$5O#L5lK@iHh*-e(a3AOWV@q^|N; z1lrW2N}+&(TdEBIfEm2ZWgL>V1jbov5?BLF+V{;WP zK$O{{rdI7Hu1qL_F6SeRf@ z#`Ig;aSSXuYp=kxCXq!soec-W)&mg7xTnUX?k;5x6Q}C%I@G03hfF)24)&nap{+7? z2K1jMb>KRir6T=5?%qcB&uiuXe6q5%{E+|i9zG@GPgxL~NB%#9slER7r^NrSz0z9F z`2Rg=J;eXNkI&B@EaI1Ocyc=SfC1Wcx+Hddn-kcO#0iD{e-n0tAsW}wh7;40v^ny- z@JGC9c)yD?u6A?Lt6_mz@oE+mJ9Acd|B_726FNYYj(unn8__C&d&_>vr%bpqjWvAC zE%0{%B0Az71Fn>p(w;8LdH$FX#?R?^JW5s<7A`I>nm%FMjN+4pK9@`u-t25`@9uBU z1IAS6!>}KKsu~A>PQsYoFz7(BOGdQ5e}U_$e-a108vzt>{RuGzP7)oDFVKU5jBX+e zph+!>9;Sac3PgDN<;`yHdprBH-iyuso&5&D__%ZM`rU^E@8jm)-sbMX&h|d$L*06} z%T`+W^~&4a{k!+Ko!yrWx#*)G5#o>gx&fVoBGE9vtBC-v!L-kkH$KqMVS*=KCwSgO z4jHglCT{{d(H-_?e&$0&b|uJms+oUb!{I1tU2w3jF*x5i??q@2f4&j{gL{TaXsjcq z^DqgI!hSfuB+Y(dK|fd(?f|nw&pQS!jB-pqH%yzeLen0AV%S&C7WAg?Uk0Rc15b6& z%r~IJCQ?UFv?Y_G+A-VJKFz`$fFF23Gt=#YnsOBT@g*Zqn-N&&yQ4{mQ=|$YN!(4L zCljA9=(5djSGP%1pchjuXW>)Xeb#B7d)Xo3_n_RIxr*5S{!`Gq7mQM!VXj#~Cts7C z#^Y7yCC6Jj8(n3Cl=2~DqUVw~?yAJ`6$l)6HDxoe6rkp5ZV^oN=f{JNJb=s{sGQbw zAuqKvuscaO=&2gt&k(O>c)I!!i??xlYGuk`?k9hk_jZH_IpgkW-uu|U==7tL6P(&9 z_Atv1f#B!COESHy;Je2k3T3mz`t3-^Z-2 zMXW4}=Cfd3upzeDf9ZkZWA^(tnSF%bcY*Bn%b$e@~+5q#s~E7Zz4e z3{vF1rfq*Ekz%nFPGYoeg~KH5N<6blK|!6n)e;OMcRHi9lTOE;(uInGJtd}~iZ#(n zsG&s7cSVKO@=-3Pmg8+kfE3SRxmK9-IQ%EQ?fdabke=JFb>{XbdUEQ=Jy^FUL$nw# z-RbPlRRdz!G)05l7prOqXt-uOgvT97jO<7{nB6Iwi)P1nC$LMF)w>kG$lWlP&_Pps zle;H@E@sfqv17A~-u14{TE3(>y2k9NAajNhC`-`Pq^oZnnuUtgX}3($bSh?IN7?U* zf3rkgb@J71ax*CUIop%YQ84VD;uQ!{2Vs!E?Q`!So&;_sPF1>H!j92t)uL7!yU*W7 z=;sSqRu;d`S*_+Y2#vRR6L$gJPy*>ruO#Z?}1+ zz~xREQ{d6-mwO`Pi`$e9@Amh$3W~rg1TVK#t|F1y-cp>d;LXeJ_gsLEF;-DgF@CZ_ zV?2;%XIw?^fCjQBITRq%aQ0z=RXB%EY~jv6HI3Vjw=P5Bb*P*f?p%7C`&8pG+qR4c z(wt>Ha#?qc*SxZuLl0^v4r|F6fu3NEjM?yTN$k3(dJ(#C~f)8g=iUl^GoFn zV?|T%?GCuj^zyNz={w>QZLzZ-qH{f0%6j`}$Jh+DZD(pk9Vx;TB! zg@p_Y+8`ON~GVecaw1sTn|zC;KbM ze!}Hx|NZ9HcIU^#60`->Kow0WY)t1_Sz>q)p7QY;e&xf^{nJdqO zQB_?qdt)|CT@!m5m?9M7sK;o$xcu)Rj)J77-i!Ea9eB|2IN*)A0?%DnXh8uCazT{n zU?9MC`D&wP0I7Tbt9yWbHfTA&A+b?-%u&0dL4!nQI}+Co#M%U3ClaD)gv~Qg|3g*) zwv9g5>W4UK1>>-=q66>^Z)F*09>qAr<7g=l2>zCrOh$A?6$F5Y+11o^HCvDy8aGu* z4axtQsu!`dcQiSsd!@bJT?_#uE(ouiYGNQGyryP6LMqkj*Bq77O~)-*MnJBL zp>h&~sUR@0Mpi=kx_Cv1bIZ;#`qrGked~O0kPyRCq)6iRPZRE%dJ@YgqO5 z10?2lSb(jUc97vTR4Ya&)v$@S{x_#BfpGoG?(ZH&zv2GAkAvgzi|#dYnQ!!&ejlaA zw{v8%RGNMQ0M%0!Y!u$o@+7L9M`7=ghx??4SR(jIV$hl#UGhYMizO`#-CQxFYMW~g zzTTp+IHSuNBSnZX1~%7I*s!`1qfA&()%GXHKvh)M#C=8-mvndE$7yyP#6ki4jb8gw zVnPMbje;+rE}=@oMH}AX@uW|eGRYG^?jEj@B4SiRScz(sVnuOfRNFY(5rE+m0s>y< z6IHnAFNqi}QpaRrcyuVqXg7+#L?gT=Ffb7uN_3DyYeyq-X_ms%`CiO74uPZ`oa$Yz zADz_97VC94yE0)lyQT+unVdSyphx_z^esQ+}%L|4(n!M#=rZmDW-_v;SXQd5HgiAD@T)|HJ&I!vW$~pY`)(inssS&fz%PpJ_S%sFf;;P2uvme zoHbO|kB`DJTJgOE*a>6EQ4q? zqZCpU1UQ8mk6aRgdI5#VE6%PiLcC)AL4>i$VKwcB7*J>6Lz4qss9}c%K)4|}{uH9Z z)XpRYnlnF##~ATVq($1>>M%~7*PWT4Mfg|8E0=*tKLXV#4*Ws6&B#6<&$sr7L(|(g z2`wz#Hh(H*=GI}8W-Fl|DxN2njD{!uOAdVRA%QWL`8I%+ zt0x$HGA6#%6RS;Gmu&qg(w&Au*I=AY)r;oj+t7oyV8dFg}QU zSF3}fF0MtRZmg|?8ckW$G*8q$61bfjZyc{?Oqj}QNk8Y(O~~hJM4uPdnDI0&vWD7i z0RCL}tD)9+);vP!I1ce-pF&rwww_xC3)@&x7g1~-n_$ZxQOAHQxfTT4WaJ|7QwajH z@t?3EY=vIXoF z$-3Gcmz(|1#b;k;8##T%%BqvXVR|)Xzv{qt3dSzqU<|yx8x7}K5PO&hfWpQR%e!r= zP46XpY;-XqoOad_=GZ(-Y)yt1Jqr5KMIB>zk6{(RcgyNpiGlJiG$SE@xAeN~y;6}5 zZ@ock(Xy`Ah0GVhwoQ8oN0t}bxzcu+cFpOmwQJO}J?^4mQ9VhmMZ&Z+^bU>DJ+zDP zk}tw+(K4t9^H6AMY<_|VA+KIiLjzgQ6>%3M(+!|iKVtn~t56h`Un^*7G=&(9NFWenRN9(%P6 z>ik+t$*FDgYg7#(+vZYR*igv2ypxdia^~SFgra53 zwPjmo4k|lb>0HFUkYyMxoS3xty@0(e=u2#Vm9vrSYRR%ldK>J|0Vm#%YYVJ7MQKBp znx)sCq6o~GrRga;jd@q}&NS^_`+$jMq;-m*$7K`(^$ruHG!W?!ZTN>`|8~gd;<%6| zu+;-RyP&f$$H)+bOb-NQ3H2_*?WH!YO!Y$>kwc{VD56aOZ2^v9Udfat#`cqRWQ7od zL!10zYRx$`RAw0wG(bh+9uHIaWL_Q>3hLkPYO9y`O-$W32+(2Rj#u{sN>70)NGLm( zG82d~@_da6Ft=rBXuzBeF$EE?fE?fu$J#a9FqD12JHfz{WJ9yo;kS{6h-DIgU;OG^I(7mM2oC0J9pxeOl{~Sk)?J zjG!*q=7Qo}i63=@AdvIU*%{s(1_rK_QI)15?pAeIuOo^~H0t$c*-Q4SO2Gs@#EwaHFFHxJlG3^y_d^ z9y%6R6&<*1vKSneKGv*qf|-K}A4oXPQ16T<`FzsBlXNekfE)cPjb~V~Q8eJmmO`l|;c97$+D|9a!0xIPlMhWb{ z#O^5>_f}Vhg?r8bTuZ%3Ts9st&7;IyUl-da#zYu>Dp`A`I2@n(8E;b^^F}Od#{bqQ zn-8BVpGxQdRw#$*+bB8zUs_&lW%9o~`2XL}=i&VS;r##Z{QuW^&2=Bv%9H$Sy7u#h zLh+~i>8&oMgR*GxW*_f>5S{VY;Lkb&Tk{@24)yUA)gDcf(+=L?u36rir+&Oq3%&pJ+D}&GF^$pzBnq&a z(^1ijw;iR<)>Lm%KY#~wq!9$%EYKYh5w_2u83RKEwMA;c>?GPQG5U`tiPbyI-0mgb zstMZjjFw+UyV3aF2=qHNWFjU* zd9t~AwML4Wc1xXo9rXK=_c4n5z1eGy6E<2#bJdOV0kzHu5O%{$*Pec88R&J!m48sP z@YZ{T|H?novWnTEE~5C1+-!oex3S@Ez5n2KX&t2F2F#)?k@jSG0oV^71!E9tDbCr# zdT&9zUY~{ZS$;_8J7d3(fe+IisK{+p|GxQ+ULp2|G$cgu>*MFt^+#S?A9hq>&?#8d z&7{VDFqd63r&P5$1^iR^nf(0g# zS5a>1?h`|3oNg$u+ONdx76O3W8%gk^DA8H)GFb`xG?iGUKfcX_~0_J*aHHFJEJXAUo<*(N|<)djT;) z)XA-@a2{ues^b?626v^S94%3z!>C+`uLz|IBTsD<7D|!E&8Z#V?27vW8Qwd~!Yb~; zQH~-^P24v>^2uyvesptVnjND_+zp(}s8nbic{~DE6sClNlVSMhB%m$Tr_UR9rE4+` zBU4=*Sx41~Ve=#yc+q%P5lpT-5+N?Jw!#tWLNQijo~Qu5Q{XYCnzb1kO8C~xya zR>@(S-f)A*rwZacp_E_EbA~(-N_?%35mH53S-v)4+RUA5EGwV+q~*B@p_xpM;2Upp z(%8-$cs0^*8L<>Ar_NP!WUx`nwX@JiFnKbZ56-SV8Pj(W%fz&O`>?!ZkvLafavV=( zPNlMkQJEH|*F8)Qma-Xm{kfLGu89;(rMEXZE5F zzs$dAE~9N3wnTK)^J%I5S#IW++WJ~VGz=1Stsew~1a=5mwBaqX6JT`AXEdaiZ2$3o zd+VUH{a-bghL<&?G9(L3%2PgLB6#Ni+FDxi{i}L)Ourl-e;Z_1+Ws^DXnDy(7T6;W z2IwA*eqD%pbH;5QUuuh^LK>X#bLy^wI32vN&MdF=dQX2{4y?}ff?Ms(QVaGc_tv9U zYw5Um^rWkMv^n&`{jL2Sz=Hnl1%A&%0|{PupbYTuUw&v>=P~G9^$fQGgWjj*XV@)y zezEvvv4z~%UBrJEuluitmQ$v+TmjB=c4Q)P2%&ApWoJow$D*^_>IaYGEC~bMAM5bY zIvq^)0#Uj$54RgLIsEjp{c7dO;;%@$0<1HL zOuPK}j;%0hPC`xmd$<~P{;5NE7oJNyA-jesi9x7*Dk!3>wgpsu>ZqC0DP@CBkRDBBwJ1$00 z_d>iVm~>sbK;))@RlCx0EknyCms=z_(Jqk{EC zuQ5T*IhrFm37=I_(>>QTp!7*Odd!E)`@@x3Vc#HFS3Vt1nromS%fF(+P|PZ6?ui>SqxhE=1sbMjF!*Ie=kqkiB#=*z3Z8E!h_ zcGYuhzEPdR2`6%zl%7V<)vR{#e79j^t3x~+h^9xJhq&mJ&jgvBof_SS2`rG;pfPZs~<$!&GA z=<{!W{$F+ctvtF@wo&Z=(O!D`bUE$+(QdUK?*HD$=fVHu!T;kv{6BJXb{9K&bOdy& zU_Gg=`|*It35fVd7}7fok`4#|1r#iV3rk95?ViAY-ElwLLn3c(7eDUoF1734zy4)C zT3I%+;k35-RKjG`Oe7P`+s+>hM#K|;z4`lg=f#JeHwQbrPzkyh_Ud#;bN~0Pc_ZYd zc;~5Xy6BqF_eH1~ikyyYKi?0}D8AnaCZ$=hHbS4znONq38 z;K#$}Ane8w3Z5pQzYq-PCkYJqXhG)>ULeHg>EGbXjL18eM%qIj35Um##NNXn9UO7q zmjDMRgH8u3V$8OFP@84a{?G7##Kc#QpYx(( z&OYxM<(59za~g#6*;vkyZGc!wlC!x*1^`nEafH7IzqDEeD4=5IB%2Zcw%os3Ed8%hmUgGqqbo_AjI z5*_$>&0w)kK~`-xS|hGu4wH`?p5yusw}Hj^Ta#VUYFUR3cGZ}(8ECnFovKUMuiDmC zG5V_@(evlt>~Am(Fi1q{*;K4?rts=2j|15Qyr7TDfDHpRFFKvueETvN28^Hq!Cgj- zy|O%PjV1>$Cva#91@T*t`9b8Jz_5$JjU)hYYafz&(i4YX7`-g;p(PB*3hDz!Fk>cY zk&Zx+f-Z3d#mdL=Z+fI#LY+}0^dH8S@(N&mP+yMlAE-!e^}aM2R1Fmu!WUC3;=7&A z`K7kE3Cn4Sx&&deFH|q@WpEz!F?!Z7iTBnYPUwge!2BNdCxgIiZ?2+ki?UCX4@H2{ z!;XU(lXEn@&H1;?+;!2qsXroH^hwNu{(+H9@#zA{+hDlh8`#VPlJoHWbQtxclgovb z<@wMDl;_Pt$-LAS=X(<6d62F1ZGV11csEbSgT9T$HAQ~Knb}g-nLRa5G&bH*IHm+A z92hiNAVqAgg@$&pruQrH!Fkm2)j)Is3I=px`-)ecaV}B4*z6MZi z#EVvYz6GF0d`ArRQWD+b<;r~PSFfg+k06Vt+Kcn;r^Y*mU7ry>7EL|(%tZ*pHar7) zkIrSs@=_K7?Vt$F7G6#lhUPlCpwUBjj+{%);zjUVE4l$uV#;gHbk9*%bgcj z>Nt#`O#zxFJOo%5CCo6u!hU=ygqG~Ub81;dW8kNcpBtT2H~O;Ga9J{+tVlSzzW}Oc zQ(%2v$WFc{2&+i<)T_xZO9)-`s##oRBU{82@pfL~Cd(W7aYBobXncWy3w1yO6ue+K zdl1MK2Kg4_3cg1%I~nZk?0AazWV#a8zc9|~Nkl}G9|>P|$ZSGm{-xdJmOci_cmVQc z)%$JIKOTcXPU$T&V1D}=IWaZYy(gG81gk4)3(s&7O&DB86V4faE{$!krK(6p z!fs{bIX44+>iWR$)tlPVHJr^kNhY{Y(#XjvC4I9S5*cPz%ODtq50bSsoTc)nmZolNFB%w9^xDGD1C=fC&((}e_vYUC~mhoDAO)a=>uvfURxb06yqbMFHoAH3$G~U1c@a9d;$lFF4&M99Tn|G%; zM^I@oUw_=%eBYtPOy$Ego_RHjoYQL6wVm9|nz^%ku)Vjt`KGhExwrKiTHJZr+1vgN z{@Z+63wsR=I$rnw2m0kFgWBu>wl)8`*zjh(pJ7vphS_+whDGWHqlmktotJx^?Kdsd z2=LtQJWN771p~!l`whT5jV@q8=OZA$OS{pF5On+_*pUt>#wMPhF)X41O7YEu4)v5G zy_-AB88) zH#-LhZ?@~0C$Gy#VJc9)>L<0+J;it|bpM5p<|yZe--iyIFtqV$OzGwL;t@u$@#shh z1Db(~hUY+jzb5;s?1ZAsoY`qJ`4j;fguR$9deP(Z!Ir2usHWh1bsq{30O=woIf>Q? zI4;J^=3;D=hn@Af!`g{iUKJPR6C|@0vxO-Xd%kvr;e~>;`xy znFPD7HAk)G#o}7OyKDVg(pKA9>$s#XtCn*EQojArn-4=?D;&Cu(^J;(F1hd?fGQsB zhw`BJDyXef6fxPbfF+grIn}98Gm`~gnc1uwNWbAG=qxY^Gyq;j zqf$U{MPe3QrL>jxWj)p?&zgI`?kLgAWmXO?sU=C%Wr zrQ~qS4)O3yU5erxwFfEy7NCcZ3Fy%!!l>at4Q~!=@xL9uGBTX>`=fEpXGSbTsq%Ag zzLh!{Va%}tV83Rw5TRDiG$h)0g9{LSf9!tn&H~u~_7gAR3f`ZSAil)a1rw2)hv^=9 zqF~aqe!xJ?zBMgoM1FX&bKqb{`R3I&aGT;vF)mE>)aXc#-SC)U#r#T-m@ZeFJ-uiu z-v~b*G_m5WqAmVvqL%@!i-yi--D;;vaz-x3o5S9FSmyg%X8WF3lf}Nau273fb^2eq z1&qG0nS)zAc#qk6y2;N=zqX#Nw0~b;#p1 ze;~1BW(;LDJ&eY~CXHkV6!1kN)M9GZ2pPn)cT$p3HY62hh|GS3&=jpUQhQQ7ys^U-UZjV8 zlgvJc3HGd`3rc=>5r~}9NGl&iCT^<66Q&U?XaijF@ECxy_p#*yGejV-3Tr|{c9IYk zLc>){t{ZM&EpfCdUAE9NE5EZvSpFirru;#cM^#6e4>j1-*_?i1oDb@U>XEAXr`f#k4!^Mg!Aws#7X9d{iNws4{S^?PATK8 z-ImyTh-`xB?jVo$h9G_LTnAc?CX^i%&2N3=Vmz~xW*MHRO-@Y84JTe8*c}S`N0|T7 zN8^D?IIlV{H$EI=PDn$ELDPFTR8#=eF!?W9$%ZJ~nP@;MjunE$2{EN_;vbXk5XC>} zfjv4BREPtrn71;ToSc&Mk0xWx3rxUhsx=E$rnOtrjGUZ~-yu(a?}7Y;`#`!NsjDC%DhqX8&g%n;p3<&h`D+ke;Ebs`kHo`6Ex zOT>DGiJuWSSXhTZ>GQBBMiN%_7)Eu{rIRcTpVIjX6LZU2!Ic`XuKOL;VrjNv+vlB!aus zA}{jD1Gx3)7}ykAXuwx=x#92Fd-!cNf1oHS-0XqnIJ0)plliJ=TeDb!0pNMuY%f5@ zp7mxI=?&e5VaIsE?PE`b>appJb2$Qb05yvBU*HC%KqHXk6qN~ax1O9VlP+k^FbF+O zBu+l<>vCug;$+uie30^J=1o{5_vw-jMyWyqNon;V5t+MZX%XuOJ|^A1h~nP-(d9h; zos}nxQtg@D2A01BnS_xf0uL1%RF8mqIL=4NkH@he5)GjHC&74@Vq^__ad6@N&F}f+ z?x|$N7txXT{{_RdaF{gYl^qa4u#is1VZV72MJN3LRZz05p$ts$<$N#dHe1cb=BRh9 zl4Db_F5hEqN<=^L&M;^|FW_mFgo80$ATWXKQVpi|$RSYVP$bC}4Jk1mWiqGakn9h|j4n}~ z_ga+29?Fpl&5^~{Bv`cn#dLZ*iclyphm8Fb5EBeYwnEIknIw||S>uUSdZgknGg}i1 z+|KOgi>;UPzgbR;ejLWhSj;F==W%DY3F|if$7K>29n8#*uNGgxbNY{`NfP01K@JWA z5n|)wGy)P*>mjk<(4-Ue0Hq3WBM6~>crr9bh{(#zj0nFbqPbxf^gaP6uq=!cUVONP zKi=($$sxz5>=I_24#ll*Upn{Nsv=_M4;_~-?P9Ti(dkDgC#bOJl$DtgD+J+I`unYH z_N^OJr2Y(n#emyV_pZXFXDjJjSNby6j6M*d4awOqXabu!q(ScuY?krxP@V3fdALG( zHYiIIFS(7YWgG`qoXM+s!>gls3hN*Rq5SXdy?5LD9nc=Oo8F5{p8LVPc8owsBr8=k zQZibQP#r}HJ9l7lm}^50DV|I~0Qf_MCGbJ%P~(=x*%vyZdj2D$`A3hA>S{-*CV^yk zjyY?GTm|kIQs`1*nnDuR8C=FEFq9fa1UJF6HxGEO^VLA%s%9i_GxZ433@*ibcRWVj zE)kM0O(MMRgX(6@0FUwvGcDG#?XE1>>#+QRSi;DOc8*S?VCT(mF!0N3UiO1p7JzM= z4c7A^p{oY@3)#>`7})`AbI^ANm8lEnq4vy-eW*vyA7>(lQ$!A&i(j6#k5`tCo<4(} zwJNh0kg4SbEDkjtbr*i|p$R#}0ygv)T}FKInbgUp6A%B?yC>oU@6gw2%~iiEK3u=5RXFMk-n-GP)Q^DiY<@zY zQ{rBO<8WCdwaQy+H#xl&0uiaxE)^jkd2|A<=sGaIBe+zsW6bsXNSwQ?hdj5W2N8v9 zg_!~!fJd?r2Fw?G)rpQ}r$FFB`&`soqhCK!EBrp} z6fl(dPa>qa99G5#o#4>JokbW`B+-$u?BJ$wB>zF@rRc^G;x_yhCN=JSWdW%JYY{54P*jVu@kK;?=^zeK$EU3rO}{ue4?!U| zfdHGTJ+i#vMS`D9xLAvDqDQKp<`K|CwX+j;-_>c4%HfLs=^wa8eE!t>Y`93JyJi*# zVv!&;%bVzL_Rf9jx=5Q6)`^jvHMw@;!#`M09pfDuwLvohjZb5;vSMw#r+{=ErKB3J zwG^)0>MLzhg`j-^A4<=JANt}bwC(!N?OhNus~K-3Tb z@e~S^rhq79z3|F{N`V5}Zg|Vg;?IQn1E3(>L#TL&(m-8&u}}a}lbeRbN~d5g&T{}1 z*8=#5)?j@dR*80V1ts?=C@m5^!Z^wwLe`33NU@Z5>JNU`@~O^(e$Q z{0-T`MFBJ;b*o`IM|K*D0N1MHJ|pHMN(K(_#N;td=Lrl2WzQuy*@QVylLbGps#)tj z@yWS#pP~KQ-sZ>7*6Z!9zrp&kPBWt6&CZ(6mH&{s){fk~oeSf#*lN#``ihQ4Q9Rq6 z5iI>k^Y(6VA?s@AzE>a#iF$P8s;(dXW(=kJWqDdcr!h&=RicAp8!&cv0S*D>?O*F`)*^4-PGJKiP z%7+_tRuQPb*owU7pcG^8xk-8?ST+VdszquvviWNmdqd(1xHbCA7ZLwAHA?h~Zy|h^ z;-r8(ScPA<*g{6@W<-uW-1Gq!N9rP>V`U)LF)+25r}OFPvt*wm$v#F*f4M}YS6T~G zM$jc0Q>l_SYE%eMg8sh0^WWPw#)Mg_gVB726m|9EAC3tiYPu&t4}{Vfqo9waM0-IY zuqGo@P3pvC5I|Q?;>~Dec+xO?k%d$~hDk7FXlhMHgC$2D7YAzk?FY9tP2P|cDzr~IKfeUU*l%q!ziq8}yVp-R+5EYpl&b1ek zy4bZWc@6tQJxx=yMm|yXz>ua~2}sKvk9RRJk_rUZzm%A7T@Ul=FsYd{oE3PGXOih= z#Pv3@-HeVf=a(Fn213P~`(qr=XcBwf)1Z5nOa^3ZJ@;e2{&pDS@Qb_PbnF3gP;7}$ z12%-|5#&=<`eh9CQP7PBfg048Ia4Nf&6&8`q=^MZOuJzYaV*+|i8w>SbOX3S6WKy( zVoRSqIx-T6nGK#M;#{*A9#hl+!TZMM7AMchAERoRohc|yD9|4Y9}sj%ej)4-uvi+g zj^8Kca%|f9l))Rl1uoT6t#GFkJYTHU;dovS50#RmjAdYe$fPbu429mjHVLV0F&WdX zOiaQiT(Mr6q&HU-S$QLGK)nAuLl)i^0+bE1PCv4pewS+E}35L9)!z};+_Oha>p z8Jrcdy-kgmH?xL~R-~ao`eV6Ap2)YM6aAfxPwS$@S8J@EVf|4$$EEdp!$|p&s)%aU z$a^eWu&lmh3Z_g(Gs5VLcAX9^kR7tHJ@-B#6@aKC_^3X?(G=iB1kM?h74yMc!61`Grev z)bL1sRL2-Sx{^V0909iQ;Y)Qi55$Sg^&V4wQG%4T=>VQCsx%b+a6ATemydu~R}nUB zHb=-T{k2TJR#`n@;^p*JWvJJ#Q16+e-cp5nEtz<0gt0(0#YD0h(%?kWTCri}+u@{q z&Jqo0*QD<-?e!C(c)}V%JR{*KM+V^aL)fh!vWj&P^v?}T6kDxm(IF6I)@02~0>YJO ztP=zKeG%AAwBPfDdI`NX`Cm_e9(ghMKWqCQAB#&NMv*wRbQ;IzA&zkzmP1=C|G%~< zwRT8LpFeSXa`RSLy8Zc6O%&JhXv!+JtV%L&Oj)f(g&5t4mwPwO5PK7LZK35^oMEHd z#3ple4M7tR5t(!|EZbUP3BgV&?onZX6&RK|Er&fh-}Jy?B9X<0H&Sv#%q+VEth45H z^5i_SOSQSwGqcoErqmLbYUvzxG+9^-S)`G|QabmTZdQUI@{mDUHbUAV0m*_sv#XGs zN|1SH?}cN?YfzZ}84WdYIa?W8cj2o0Hv_mgo%<0U7YBn?{dTq%FrM zvrjmXCqc&8X;FTohgT*Qrj_tH5aj@&#oQO?Man%(b%}O#uuX+O((R)umG0p$bm~dk zE`j1*Jnu^A+=cw;Byd)bo7KCrJPpe$ku@Hm+Jvvy?8-O=QWFIEJvAGUxl^nU5G^iW zPLoiWbcLTI8cP#>yr?!9g54GQynmp(1pr|{p1-Xi5|9WXLX&_Nl|&l#0hK@4Q;i8o zLPCglQXFX5@&&khaG{BMf!i%EAp4hNgm0dq)vmi4< z;`u>(<6!L)ik%9)%r;N#U1&r;wV$kfo)!RZR*mZ1PujE-K9&!MV{;)G`jvE7NO?1n z(E(5P379Nhlg2KxUd^+af{KzfISK+ijKI8QJ#{{Nfn}pJv^A#uv5l>~m_&joo*&1) zI-*5AsTbJ}&OLV12}mN4?e&9C{2i zWLdPXxQ__+zD*RJ%lf9Vzr`r*o_V;fc8!&Ug|Q#x(C0A{z+w~RC3)uJB@QHfDFdcp zn0^ZSeA9BcP?lzS>Vj4i%Hd#n2)0G^MY*OmO#nM%a(_UJOT^<2KsbeiVZ0_^Xgy?- z={XJ)5Z9V+UC+;L>6s#5fZpFwIjSB$IlxGIvM6k}@1QZmQ;FEro za>>hf!B zre*VyObA=n<&+&zKhPv7Y9K|PeQ}4yCQFJAd(jw|2@rY10JQE?zb`HfsI%Ttf0B5u zrl&|I@5UIkV_3FNyn}Yl88c!J&Ugu{6Ehyb>Pu~J0cYf67EiLf^nMSmZUzHeY&}fa zUPpFTss{TiNrX31UhWqCSprFyLI~!yuJzVW&fXorp}{hcSZcdiGbyG1w3N^?luGoj zNtJp7J37tU2zbnA2xE**O(HaJ(Hmq^3B^oD24WUai~{u&`G@WfhWm1Bcm=$7M^N!Qjn`o(~+Z#V)}nFCBo$DQ#tkq6jFsD%8$R^%|FFO9I$%XDK0Xm^bs|-y~az5#)JFc>j@Y^;ZQVtR-EUhu<`UpkY zB!XCkbl28?>-T!dpyJ$@uZ&O7^#!I9pNNsSQNu!!TSs6f0(63AV38P28NC7u&-SBP zoD#E-;0qJ>wJQh>!k8d#G=PRT?v1aXDjf@T9!|lDzBlJ#JjPp%ta3?jyB)w7b-!8Z z2qSJ9lfjZN^lvs`d8zaxG5jDc36$$jDBFe4ow=rCsJ9de_G)`>DL zsj&zt<=cRaunIHUX$%(m#5|Rjme>p-u4M->NU=#iQ5>$JAJRT}9Q(sWdn78(k_Y2l zk$pX7=qT)xK9JFJjJ(8BB0HK05dQGeqmUnR2!c3{;&~mgi(~n!yB1I}hsU^@0c3?uw|kBLq_%!5#%M;JrKr(h#?m5^~yBaWI4vC(1HhhNDp1rYJlKU7eTCow%5_``4{&aN}VT5P`%7Q_@I6z{r?F;`o>*oeobw|Ai{N{rG< zcrz*Iui8QCC~dxo#=^vW`(gjU+kJO{1f~6LbScA}uqSgfwat{sA+oUSA}a)xRDz{2 zcc9P9y;NJf6#H3keAh^kRo%p3x0DzFA%d_P2NE8W2ENVJfk2GV8o!$p(jkhU=M=lT zr_g4se0}R($;0QqK2z-fVU}a~3qKxor1w!L2?xDWyFl^&zukJWlG*<+KV5nHu>Ze@ z&%^%zVgG;M`+pE5e}Ev_+BZm!)=rqKenF7tG(*2Z6msB@<*M zsb_#Cuxa;{yhO>%fi41=n@k!1v?+r9pz9|&EQp(X#)Vh0*Qq0uP&gh5TGkbG^I1_8 zUW$GHG7$ECPz^2AJLEDQ#ksB=UkG#njR< z{}awkgN^L(Z+pwlc3rmge(TNK4{!eK<$qb_oAMGW9oF-;3t1KE6MPBr(h}_uXqM@? zOsJUgt!PSDCG#COQ?Z>?7$-Zc3be7@X=ffYmLheRWHJB|QclU{=|%z9zTW(Oo0t~) zG?U-u?fzEh_w7Au?v-$Sr%5t3s=HJo}271N!~UGX;kNp*~7Iwo%Tu($0bC7cZ9&5%CcV<6L&fcU6sqaz+$(bM*&55CeO!XbzT+{2PR1lH_-0m1*(K%qS0 zRCS3w!4zdg+)eXvH#iaTKn(X!i~!oy0kU|hnmn_dH5>9$ig#W&qiKo4trbV<)=FOS zrM9CuhkI}pUs-k(r!($z5rmwB(8=JT*gw%%@>y+q|4M*VDvp?RaTf#BoS|`011UDK z`1_HUkk5o{qqK=0Mz%vf84BI%D7TppIqmGzy~%6$g-jgO2mz`w_#Un~)II_cE$KL5 zeHFVd6t_a?#;=IZia7kM|1T1}|BC-*cI5rrN&j_d^u+5+iz)qzD>Q|6?rJT)i7sxp zshFE`bT-}eV(U&inQ1xO>DFR}mg5Lr#ZUnJ0ot`?t<9n5A5lCF+#x9GFDn7w9QMiq z?+0T=mq0iak*!$pJ*Z_Tp$q_l~ z&%5$MF=OOx6TeWC0w@UN;uZzruiv7gpxG=4_M&Ff^M+c*qRkl#8i)lqq|IK>1J&dV z(6c*0XKZ==+v}yEWjR=-v@KUb422~e;< zp-Kh7MT>V1U}Udyz(vcv3E1tWYBYz#$IV&om8|kQV;O=%rLB{M@U})vvzG@ayNqW6 zO>!VrTB`vZ!lC0~0f$QPLhi(?d{xd2R3Fx>U=#wmxe2I%X)C|9S~)bVupU=#WO1>e zk>ZuNdK*O@DPCi%6DzMDC5x@iF<+wCfSWVKC9A9r5u{u>#43wlni7~0kqGgnmWpA( z`8pTtjdXAWei4hQ>0Fyqh~+Jd8D!#qsJjWU%93#0&gahr>y1ln@}EnNXMob!IK^(Qr(b1hl6|7e4jwSsnBE95OTRB-`C z4}fHx*No8s)U3;uRk)siNLYiX_WUFX21n=yLVkJ}WmazZDL|qK5${o2*0yOEmb(?x zGTn=#5oJwiJ(+JW{wI5@y?gntcC^s?b!p}4v!_e#`YQS0B;)V|fnS`Gw_HreFTRMD zX8}D0Ef@X1bX<8hizZ<=k>~qtRIqx~ytWphjcMr9f<6JAj-L!V9r$}5p)J23bUL+J zL6iSnY_|Svc>mdIwtMiW4S&4<8UD|BHt(*%syF-mVis>9)eDM1i9W`U!;*E=zn*Xs zUjLP7OGkKsa}4sT8}{f5o`)_)(({ZGF3>qr6pf7QnCL)BTa@44?_r(YfQ}bFUP4l$}V}g5< zXOcJ0L1p|Cf7^wUXJYI@Kj=+He|Cmg26c6=gkU+T<8bYt>*Y8G?HX5I3 zg?T!C+1-`Q97xo3QUiP)MOyQ1FT=ODnmoPKkFLmB;ahwC=+9LCU)Q_>R&xKVz4RoT z|MThMga6lke5&|={pjvr58hwjm-kos1u#*j#DB|?HcpDE+er%lHUbGBW}E_!F8PK8 zMW>cmFvO`9Uwc*;E*4d8NfD$k9kNnpc+|0Ovmttw`xiTztJ@cKtGX_KN_W>{3|~3G z?N&m*SMM-OSxw?wuZz0!Ms?b$s~5oZ>SG}8QIv=@<9L~f6Q$#BmuU@azq}TbLQlOH zZWkTL9g%zUY8M>!t;Owk_nB_}@32ZXr5aGO{x2^+T~4q6?e_B0!}@;@p9lZ%2Myp` zXaGCAZ(v7MNfFRRui@i;y==DCufE)lq9KB&q%Xsn>A$^X;8RMz(M06--sXW8>7WzJ zJAlp@Vh4=bWGSZ|hioHzH&z=)%J1AuCL{F5R3>=Je63+5oWfR_SSc}psfz5-bN6-M zF0}H<8>tnaBDvnNLu=Z^WW>e)11RyFVt4W9gNm!8Qcpk;8EboJCb$#Pchm{mBUWTm zr;N|g%J*m_1IiBP=S8e(j-!5MKyJGsw^jt`+*r#{LO0;eKlj>3JnMG4nPqn~OYO2| zD6F^H%(BtUvTQ~~%N)8}Sy?V?1xnbhJTqE(CR=e1k-_59{a8f2&G0tz-wDn%6j0Ko z6xh0tX}R=$P##A-4BM#5C}P<+qnzhM({QiSJ}ZrM3XWGN1?AN=+uv5yqe@z|7RTRO zcX{~S{4<6A4@)2Bt;Gmr&2D#!HcIsWr_1m?t^Yq=T6xg_@8R=c|9jB>??C%6)TT{A zf(o>u)uS&(d_Apx76ZRqWwkZeIm_OTzUt9!w5H=1BLroCW9 zktOVx`=FQvz3sthdYSB)ObZ%~;gy35ump~oN? zMDb;ZA|Q3*pznVPdK7=3Bdgn$<6zVjfnPenJjdaerU)#JDS2}$a6z=}HR)-s&asOC zVJ_A@3C1jXowY%_eA!G12q zyP3!&4nnFB@+8oIdhX2`πQv6F7>GLc5oi98o}lb<&Vg1sIg3R85-IXd^%pJ~Q) z%2BOA6b$fcPdDsdUgw~)vgoI{U8Jq6nL&3sX)&PUk`XF*v5{Ix0{_ZRAaWzSlkB2j zULWlsnVOjfa8n0Qx}2!Mpa8eANAitr7w@T-_5ngjDfvhH*Mc@0R^@CFAwTEc(A5!0 zW>^?Cc$Olxri3c7Io=(gZkm&!* z&{4D!1&p;pb*om88zXlpbH^~x{m%Jub)&0;hu6&*)b7!#Y58H(7A;!U=7h>JLdpbM zt_BlMSryCaO~L#zS zcJ>c856X{!Q)SJtJmY8(b~jQd!T`&B)PwO0rZpzrz8jgTTJWVKWZC&>IFDQ-({4}% z)6=LgVu;h~81&@PFkYx)H!@86M3J#2Tr*p^j)|R2jzr{VJQVbaa!ta#}QRz@3&*=^f0*3wTL)~jqG+Zv?euxrC?)7vD; zL%R6{O(hrtsw<+WP-}ZkSv7f`uf|dC|%Q)>V#2E7A0e@ zv13&`yG5ONm@Xk=Q}g4%AJkX9w`AwWklBL~Nxb86AmYWKnDE#RE~Yz&Ka3>f@ z2bVi!N2u7q%#+<{((jSO?qtMz2;Wa?pxZ{%}lSH21&}^W7&hnCNXS? zt0e}aAWs`3?6(fcBjBj;-gE(VEF*dYp5gH&KNAUKGelQgxU@}8vctitF?+3SYmQ~d z;1k#h>n+`(y|GrI>$}1aNpu`z5)J=<_Wr%UjVwzH1m|ylib$p_1yBG8fKO2*dnk%h zvP+^=B$b(!Dm4@U0%RnC2xJ7nM`o#hUFEUc?y)_7OxwTxt$XcV+dbpiZQDKT_1f-n z|FQj1s;k`f-+Y8Uk9%+28*w85zNAbyktqp?xcA)Gx#ym9?s;4Y!BL!YZcHgZB_sjJ zq|QzWXVN=&(I^T7{8Qv@j$F^}3tX2P2%&o@zXjrR7~-;u5wUhM)e#=Agw+wp2MmE1 zLIwweW0bt4WbfW4QtI0p@l$UT_2*jy2Ljpons_YVW===UY{`MnW&@=znnm40{)J4< z+>NP{$!6Jdhzr8;W=TL?NzedMO2DTC^8k~=NijePPCKV75+zd#7P-3G+|>x<7<$YZ zDpZaNu7yVSBI-To5uud#E_q+m{Z;0$#)FM?XB8b9<@8nY{dnkVuLdYF7>AV@4h}zJ z&=MFW{z#1s*D8e%aud>h8#TAC)?`!DmKfVFiC(YH4;iHEQoE852iTOKuv$^-d=urZ zp~R;vyN47$&O=9T3B^%&?IbFun^@aBh1dm2pnK? zbWCyvGm8ks;7BWgxz3zY!YDd#4Wj;5U{;5KVHzT!zrbblf+20x(!-=Ew)KiVDNPH2 z#tErv%3?rV!A5v41mk{xIEtjbfILxp-l%hop`S{Pij!}?qv*2UG%v^H8>a)#>;TX> zdk5fX!%mcuhH6I}C#Z2E?dnGu02zHrTR*(Vd^V;I@k1-zzhj@P-T$=E6Le}L;7Rts zOZANZ-y;0EyZ?C)pS$~?yZfK-j{UFOKMG+Yj|b_C9dh+c9!e=;5sA81_m93hpO zr@t?A&-3lf%;C<#p`l8xIFDHg$_Jm4bJTfd+I+GW8;``DFJA6!AGQwnU+t85#3^$t zthC7h4mPy-r49D>?8+izB zVp40GZCt4VWHvJ}eE6<>^NlrajWtt^r7exF(9V*jnWZ`{m#(@s+8KCm5Q}RZp%^oT zW`P(_ww@j2VqsQ#Pwa|xRGNf+MVOw9K*`qeF)7+9u_7?{M;>2AiqxJY4l^&WwN{&e z>(bIGDPvikniPHOxjO+5#_#tgn5OGO86`$=IWocxnR88o)D(5>bN))mV+UTp_us_) zv#MqiNL1kVl2s5}jMaZvT@?ESKZiZ=y`R*HUFZ9x4I#$D51zIZs&ba&8^P7T64RQC zrO7lyf%45FENk?x$bNC#iBeGYYj5XTOp@r7ijDkzUG)DZxui?-G1FoPvlUsx>K%fmVkz3oJ?ogbTgWWH8oH=LlA>YBuW_jbe5oclxBfMQ3%9n_g zwEtAxDZCvVW4g;p9eD0_eGu#Oy3u$zBOH~)rBr4Bn;XvZV#S$-)la{o9Z6S!lmY+* z_*s#q>~l}~nDRE+AN`s6RRDud6rhb$kne{Xb6SHB!FbwzfXjDD%(loatSkWocze2eczK*laAc>njshMcY6*(-fPnVFrv zk2dOLs~m_1_prZxH#%YptfmF?RM*Tlg%&5I>>M1xNT#U9EE<#yQJYSGbU`zE7CLwZ zye3KZR#&8PCL1)lNotCsJJ=*?lH4f55Un}DAEGfQo-{H&Bw&vpu|2%o*TFeXX?X0H zDOCl!sre)Ah8!&v&dd?WmQ|njL*n%Dq);8!>^dm!gxUYkxobT@=cv^6@HClkmhU&D zk*PA^?)s-_>P~h{RIDNiaq@|Q$O}ts8mmAo#2j2|hKM7JacH!c)aX1D)Un$?rC_%G zKCZGtG@u4y;Hl?m$ib;2RTA=$6OB_KIWq46@)fDXAIC0PO2cGi5#SiHse^Wk2n!Pp z4)K;BEhLBwz$}J5nX#NrC-z1anJ99^ox+Wwu=0_IwG#6`UJ|*OZWj#{4&{8gf_U`& z2xve%=c3d1G!t2n zjL<5fi@k#BOlL~KFm`gEe(D2xHIjuTNv`VWi@ip>-RX8-m7Vo<2Qy|TF~xE}dBEB| zcWJ?^yRU%G7Io=aSk$H7gO0acU#Q~HVFDe0^U{{SMe-_m)vn~JE& zOrndfF|e49s;|2iFm-)Jwm^?AnoG+f-8EVUy@sD}NXQh8rVZqOmOMxPDZ*{56-YGT ziXS)?EHnDC>~F8F?RjUc;uZ!T0^pnjFJ!Rh#D)x$Z8*dQvk51~ju>`bwo#**0D?rj z7VT!Ck$Y!!`v$mpkAqe-px0x?_F*oj9b8b%WVe8q`xptW* zOoTWW=)U2)sGo%+#ejQaucWjF9gR5PXxR!^Dp$xSA_ zWBAu6ycN+L>0wgF;!I;H{*L)bJr29f5NuEoI52k6e8xxhW(GYr?LqTYUgn(cTy^00qc)8L6*F^~l`Jo9;#cof5oeqX#yN%kp z#Wluz+6vxvdMUvexTU|=5RB9!g8>>!nkUH77_%q?K`a3mU4ZY@SR^&#-+Yh}`Z3j|cS3;2BOg!Ww0-@ z0m4)#{m|!=;YeOI_K3}5!Om-m$rgsT{EV8cw`ld`QdNY<)%?5+w4v7&kMxSX?CImp zLjMSR`B zjZZYfgNW-is!E347f!-X-C3u1>l=jPVXt&p)-sTdE`YN@(eZF|=FoW#KwtEpu?r}& z2~bl7x1;rUaOLrFwc)@Bj+M=~cnn*;07(j#wfI78S&{!t)2{sU)^_ArU-2*pJg z+XOR+W!>YGZWx|1W8JK!($f({JYF|v5_+|YWK;C4lzKeWBWFr2Vo8C4QENYVozdy1 z;>;$Gh4QWWJETBN2aO+&qL$bI8;$`>mDS3*aZCIlYmHR?M^#S74$n(XX^wIeMwGz4 zPo2R9{TY2xYbQ5s;GOj^gkOU=wYEAP*y)%}xBJEF^49+IZF#VR1c(03uzt9YP@?SL zBQJe8-Jsk(Vq6_p*2lA(U7C-4R6=Tpu_JpRoC~9_JJk}R+XYc9m-j372WG$CS0aVl=7Mk1| zXZ*cx5HA&t$XG=~lPA@eKTDM|m3vyj#7mwNIF(py*J?!=Y{>77oGxm^b&a0(E}jri zl~^8A>5#OjC1jLpGNoe;M|2NO%E_XUynC3L7IQ*`ek2)Y)Y%HUc-Y+RNUdWnu3(!8 zJ(Owv-2?y>g&+un778l%f`CAf7&3L?~9?M5EGC9ZJrlpJpZHZe~08>o-_jfV3KKo*d1%*=AUQ-2Qnq^H2=dXe)GsWU2 z14!0a%=2X%_ztfzN|A9mjyRM{m(Dp>f9XjzGZBy|t`x^L#miwdFhg*&6(^nZ8y zzuSxdf$F++q>lHXu2VM^nUcaXM*Q14^}VwjiSnLuIn0q=;8ZH&c`hy6Ui}EqelCBg zTl!PLaD8jsvxb|K#)ZFSh$2g3)#r7hW8(6L2W+@gL z4Xy`sUQmx~Kp8W9_kEHE$N{D5MB~6&J(1B2$H54QCR&zbIP)=Ci1)@S+F{KRVWOFx z3z%@7xoA%|4rB!2xR0c`f8h);v~Cj5A7~6Pr=&@7po5-JrzDFO_IhXpMT$I;eCVNk zcwe9Cb+Nw5+YRlt)L?bAFw%O;cghG+hV0;h3<<+D|(Yc*TuWGlq^e9cme=j zOLc%j1j&c$ER0T2B`>V(f!+!J;J-7vT}qQH!FQ}B_Y zxxf4kK-u}^6Xz#1s3K4kb^B#XnJ0ODn@UZ4ou^%+MV|mhs8VqX(^^##!8ccRrq@YH zE)(k+x?0ZMI8kS6jyR=0ou6X`>fHR*Rj8~)ou3nG)VX;>_Tm^2?upmpPOj$+a8qPm z)5N2Xu6m#J$tP+sIbbGY(qHjBVpov=E*1L`KNJ1`>&=Y(*I2yE|MfmTckY`vT; z;exp81>*to3(56^qaBhcLm-#1_X3X6=PzIEZ#{!Y4Se)u>)EqMTiZW`-_1&*I;ZgL z0lDYnO)q(ISDhU|A*oZJ*A?ny9-mm&)~k&ra&gDf$ZFTCOO1wbP9#WM!id^OPkCX3 z%y290mQM9F(_+EH58QKNfj85p3dkKL*D>N!du@##f176pfp1lA2yVWmf?sKj4~mYj z-)xo=*~HQB6Q->5ZpJhtFy!VfHF>Zw%MXi+K6lTN!V4i=&PZVuQC4f^z5(Z<6g@R| zR184QOHmPhF0_D6kNnY7kcyAIprvkQ4lwux3%%%ADrI9@^T=7OKUhw@5-G(Tj0W(? zJyQ9^W~uBf`CQ{cAp=4P*YANJ_ydeXNxs?WZsA28ymz521(=y`=wi+q@^f`Zsyf0u zqtKP;2p^FEkFLTvnO+C>H~PHeUT{iB!asl!Tp2dQ>D6bSfEnS4Rj)QV+6MO&bqujc z0*@oX%*IX|W!^I7K#`^xxyQC(cB*QsNia0O%fBQ%!=+QSKmO!$oGW&x+k`8EH zjxc~O^)v|72aaX_LYwadL5~mR7H5)153vJ>vVwm1szx(e77~@#))bBS9QsD!$r&4C z7OcxIWJpI&XN&|hAgfUUPAT7Fk*^hdeUjJEc|j80B1#3^yc|Ac7UJF1pSf zU{?}*ES?{!bkuCD^cT=9yWyp_1H8@IAnQs0HXo{UK<6`%dG=!EjiktSipZjp4}%CR z!pBCkOi$T}qeF=~Q6gbRO4{2Z`K?jx$JWbIs-KlihbU0s0iAv7)GX&Hy%7Q)qw(uE zFa;Dd0OJ`pmw*deYBcd@bFl&>9iQswF58ijYFEG#r>(281NDd5r|a5TF4IG0O5MMo z$z0FJ;+odwWXrP-9dB(~WCLNQpqC1FZleZgV5wXNHX_}q?2SGspGVdePlksDQ`5U)d6o<|b<<)P zXK1aZ0&S*dQ|3(KiF}s>8#aI!`Ph60ydXE4MXJUhGUlj3@J|aK6&pk2^kvLi@q?5c zcdjG|m_{`6jznT5iUSp6a$3%BBm*Id%1G{@4!Q&kK{kmo{F>Gcq%VWv)kfpQiRe&> zj5|>jQcN;I&CvTFs;)WHV-0g#!t_aXVaSe9PI3K5M^TqIG(x{1#r`%nNn-= zm5F0m=wwh)zeY)o?2Gf&OlBHXM_EU z%5*U$w*}qg@E9?qG6xuNRRkkUpe}oLXc_u3B~x4ASZkTT#W+6<#F!vbO z)WxXZJS4evp#aMVhdZz4-F&OgOl zTU_OP)v^NEDLaot5lB1P%5txma4Q_$xbL~Ah+4>*N1VM~9~GNM(*eTXYq-gnrS;&c z0LF3XDWMmoiwA(PFB*LBtAm5e7+icvaWk-HIhl=a*%1MqI@}z8I35)$e+M2t7h45jM8%jm|t6-Om~))WXkJ zPZXV_V9?wzasZ^r?SMFdA4sY(l6itYc#8{!V+)$Z{0mhC-^DX43SCMvA#bX?m?0j( z@rBHS2pNhu#XbMr>rzF&WR68FVH_4lBCKk$8r8uFqnVMhGgWuxRW2MsVkdMtC=6a3 zw^~RITg_HWGsf`;1CCr$JKj`5J7k6D2ivXBcJ}q+ma-~^Y!tZ{X(OU5*%cK!s<pB1#=2dBTTuQLAjk(N*7bWF;B3*Em6HDb9kxaTv2=!e<^{2APX4yBe-C`1aIhP zv?!-IJ^Ul3^-Yw6QnkXWUTxr-zE?V`Xc}J;BGC~V<++KG6l0~rF*-#gt2JINB~L2^ zR20qvPC%kl5IVI(X)b*KevCd9{Iwg8r2SUnaKVbwq^);k1E1CT?*^l1q1%mLdeLVd z<*nnWs-HEQt7T_i{*)OJ%F+UlVpU7yB%u}}Hdh@>#JVW6AGVqk=QW*JkNuc<(Q!L= z8A96&kQo^V(&P?Z)#JEEVnlnsxwP1*uP!aD*0P3or(UO}m;t%2!AL&a3Z$sH5fu}Vfk03Q{LJMn1fL$7#0b~ghF+xQ0bJg zM1VDbY}=(md8Y-K_L@iVMvq`%r*Rtb7W8I$F_R`mkwXPI=k~&$5`_k}b503OmKWFS zK%T^?;G-^IzVrQV*!ul$rf3&vn`*)?(Dn;n5vKOUI8NO^6`U#9_e<@Nan26WflaeZ z^f~y7=in<8XH8NA56#O_dH)Mj3;asgJ4c!T;L{}PzVnr8%25>Rby5$pX09~maet)- znU7gFfH?M#t#jpfTJNEoJfmNg$#Xbc+`QfuScaONpd&&n3NbroUVuhzp2dPopoVO3 zs#T4oKa`h8Y32VFPR@zJC8vurln)>sVyK{`h;Nr$AQfDwpwsEdQN=LjsqmeTD)b#> zs$~CX@~3#+Xi0A(iC{p}b?HgYm2fT*IzWSPvM-2whQw<}!%R9_ysEWHap9k%h{PK3 z3lxz09wxU!GjxVfvjvGKDF-!xm;?L^GLn^#zpbD5#OK|^{I2Vv57Oi#rwX#Z6c%4P zXvl%gY2akEg1sd3AggmwGe+vRJ_Rf*?iij6+gSJ+2cER0^PEq&nhmR9xs&IJ3i%Nn zj4IjS4LrE#$`XTg$GBK3d+Cs}FdXr)DdSZTj*pI6_k1cYE6$F?zDOB?=K}f73%xkI zyen{{Fa)uwb6m^dk!?W~os%P2}8e^q`R4Qqh1QrhQ{1O?^IFTZ0**QrXY~-OI zRL4Uq-yyZ17pNqAq*Y{%rJQ`|1+A4(Dgd7O{XUz}jE*BL17yWHq7-NVLFy-UP4yY3 z!eYa!IEBA*gJ>FgbWvMco;(wothY4>(90J|W`$CkE-^Uy5*0sY{X4cIH&9(Sqj%Ha@qeQt3DXGd`5Aial>tVFLm#;EWXb3r4xN0rRBPr`jbSuh`LTa^7 zoRUUCF@eiNf!ukZKiWw2C6=y)kzx310M7yWPzeO$$}2_%uDDduufN#j$ZjQRD1FtL zs6}k4*m`I)OVnb#Y}o1u57Q(%OhG9b!zQb<3lp2?RKqM6lA_=u& zCYca?u@ho z1_J6-ry?G!8#rea(UxTA8P(`2wyU-UF11661ARO`DhLo`KS@6!VnFadlfh}1n#px! zqI<7UFegegMaCn@OsHcBoiS&GFiOn{`p*}m>FKV`m}EVEElZG$OHb-=(($vh8kGiX zRAgmCokBo-L$)`Gp%x+B7x$w{DpjG=lo$W5C?MtpyMXtW{W#RkF~q9i#VehEc;i5n zCZnrO!ZOXL_~VD^J`p5L?wVXKtM15m$sMj_P<4u;YiKr%UYHEHtu8{%1d=Lg9J~fx z@o%4oeey?3@DdkJT<7ZpQDit*VU0fumDZZbl+_QVl-9(73l^!Cr^L1h5)!4*DOj>y zDYl477_m}nvE)Hmqzts8t~3*tO&o^LLf{{$KSltqR43BPI3HF-Tt{E=rZUkltArmb z_0{I$(qefH=JpiN^dlsU-6$Lm$?i%{5TNP#>T+%Jfb{ra(+r63&P@#%Y2tBL@L`WD zE)AuWd6Y=`>|PWvNOt*CYa>JI$>T(ssz|dme5et+bYq$t)VL5ysX(zA%C^qdN)pF0 zcL56%#1qZ)fUz&a{7idXVIEDvgZ+y}a&n0%L1K91cVr}h3|tmqVie;1I39aCu(%(N zVl**Ka#hM6sC}Q@l!j+n(-ZW9M_ z{ShIO(Mu}!`YX#_5KY8n#q`80j~lu4nEtv(8kykDWB9h{Ml$}nBwKt4k z@^5EKYzOm+rfv8nQ8!#-eRU%l!!ky3|74Dff|GC?he25MQn3`E6Y*WZo=L5Uxpxz} zNGgDgwJ0uJFt<|G%<4tmksz(dB5_SzoNQ>q+k8sUGgk&(v^Pti7=k$V>P_yV*e(e8 zqxGPy$+B?X(MUL$6;L#Gzz_z}QX!CPUJ=wOlv2r9tHvzoBCfU1*=D)lsJlxp>Na4F z5-D((a3UgS7>YWaT)T-l#@G=p0Sji=R*JW@d0hdOtG~%AaSgo%w?uJ}{fJYh$7`g5 zmgg#&dJ?bEzEJvUN)ru8E|t~{58qHAtG3r8F^aTkd?D3QQN(GntkTncr*R2wOu?}I z!eKue`+al(&dbIQD)@Qpf z_LY^uKF{f^NALh})?>egVIMvA{Ei3PlYAb`%Y@h|F@JpK@kIwbMSm*-1>K>QAR^T# zU9Fxh5KCvd}hjO^9lcH@rQ_4@9K_k|bQ+o6I7 zCl^x}$}jLJf`vKr`u+SOpSp2zf!))KcI0=DL^BGfb;fvpPDMlCn42$*YF;s`=>gG2 z)$QWEXA*#rkMZ!>JKTAO$ou%mkM?&TKixrXJBFYj#~QpABXmW@K3S^+uv-3{0s;9B z3^-@B!W=8zvnzHdze~B*#kujZF!aCmtql#l2%Im0Xg4d)%bhO{_kV=cC3c$5!0$w1 zH5?N2Dmp*?Qk^e zdx6(E;eoSV1`f0)p?%J`Z7x~P)9a*?U15L;r`2uw%U9&sC4iA*r{)0({~k*}L4Cdf z0$)|1c-|0>0c}Ppe2Ro8bRd+XL$sLHhlm(`e3N$UL*sy37h(xx&l{+9fC)dsXse<* z<7S<#x{zazJa>fa%~y@FW-Y|40}v%VG<)tZ-s=vBz4`79{-5L`-W$x5f)iJk=c(hBO)CbJ{gfc7n&GJP;U3s4MrmJ zFI_4>k+u&fL3n0nDXxeHA|Kdy-VM}~IRAk7D|3VwAOePixgA9KPMqbpHS+KLp{_Eq z6bc8NGDyn;UJ)_3i4BO^oIx7WGNl$dz@Y$Ux&r!p%``UG%>r)b0Vi}o^~9-)ZoGgA zisYfVp;;E?Wx1JzGa`(!7GgPRtdVN0d5y-1Mqj3}>x`_Sk1P>)1CVfGO>Z%W>J@SX z{q&~_TkKFKrwIDcL3(cSbD8*0I%$#a-qYj(nvnl>*%JS0ae4VJ{?q&T+{J&oi~n@H z`CmEs#s|svYLv85ulJWAHt|o(;lGJ=u&Eoz z?|=SQV~3HJt97}|r4tbAyOi*C>M6Z);@9^wrPHR0EhJw`u)oW1eMib}jg)0}+?D85 z@vdsQr{_1cv+#3Aux@Q?rzKo}rIY(k@wtouia>S0{D0}d&*D=o|F1Nc7qj_)R~DD< zq1^`uCoLcrz+sI542!~6Hk52@Ze>E~R}BTCroWdVCwC43Ds^5>Bj+dFa8@rdlb4vU zM?WUQQz!3&M#UMzw_&4vwW;DB=d20>u9vf;D6G_=-q=*D~*n%dEQ$ zkp+`VhTmvriV`jA0MPE(3y3RoD4T=Z=Zrt7v_Ks>={A7%8VO$*sf0KRyX~+)A`Qeh z^HH?Wdmi)_9+2)*O%L=4C`g13d67s!uk5sJv`Tl%UudFJK2|F`zmrg{2m1X z{IMG!&$GNVPwHv0{Ez8Ttuq{ItfUrtlY}qs7w5;Nk=D;wo4w_Q_R4AnzAt-jv%9p^ z!S9XL_NwPL==oBk?sk?QxcI%j+H89dFsCkl?{(V^Z>1t(t$It#y_F`uTUqQZEZ5yd z{O&C_R+{a`GJdajmzP$Sn*?iNsk^e^E>rpD>f&-^X?an?YWEhGmYT~CsD9IP7n)t_ zSI=8nS*&{mtM_1WdAU(<6RZv}$i3Ab^><-)X?59Kkg%2>tN^42^?7AsvAeWTC%ElS z!|kjrFVORDeWls#P#fLm>VuBk_NeU#iyiktyCY%Mm)a|fy#;E=U21rZ-XisXQD`!0 zEZX<_s`g#{P_XL!q;j2gkn<(i;yUXfV5zmZ&N|4smuqpIbr7)BT3lxx)ZDLX>mt^H zgu+bFX)VgV>kM4o3Q?1Sni+3_Kq3^*h(sCEfL22(aRK!WZ~sIVFO*`{ zwXq?q^L3X^+!tw1fKFkS+NRSc|C$K1g9Y6_1}gMGkcD1{F#o6o?i+(Qf1#dbS7iPEQzBlbZ>Q1*xnI zHZ4+4;R!Z37sz?VN>laMksVdXKK`y)`&~8y1g5%fnE4_MIv7Y_GihxL^*NWmf-gi0 zwLHKFU<{282fL#t4oNjmw+doL{En+Krf^7121{4k!Z%G$iL+oho+|g6cI3Gy z50e)S`GUKl)C{M1SSCr4)76^RY9KC8sJAd(bJIe7H)F(--AqQ!5ELpA0Nc*hBf}!J zIpzH@-PKjM-CaygkOb0s&{+j$tSROMSg7SDj{wl3*IDW^ zczx;`%d5b`^xR~Lq4V9vm1V-B#)Edl?X^4EiET6&R#%}h?n%9|ywY80sGc+y7NBr_ zF*WVXw6r_DrQR}w?=CF5y#?-x+j~&2cbbZqHWsA5++BE3?|R($a;NRCx*e|9Yb?79 zi_B{#OC@`P6XdS8nPX};R#ul9vb}n5rLiK$rWTQyDK8ig9C3d_n(TuS9(zX@k}Y|K zB$)8(M<4Ln(%z|RFClD=XZkV@Uk+WY0jB&rLSTVBL)7E;&$2y}GNQ#UgdrETpR*a(~(^9z65fjYm?vql@ zW7laR%xk9n>nOZ`ibA{^1+GF&-LQ)t5pm#DPEI^-fQJ&3$6;4$&NdwGI93@k2)oQg#&?JsH4GLXUaEMf%Lh!+vyCcyQGr4s8zSg>5L*VpJ0+sASD440r@> zMs9S$;F9Ca70FNyXWXtAcOt*-A==sxX{D?&PU@$q6M@xC&gxhk)(Lpyv^I1j*FUdO z5rOA(RWmZE9&x9%BRsASY0|##eyyF|dgN;~_aNcNCxw#m^G_h)o=hcN*?RW*){hTb zyL%YRpKmi?Mj^V9FE2jAeas7G-tft^g3hqQ@i#Sm)|p$OLPK8Rx#C?p0J)aw{)PuDqCAd2vEzB)JX82y0rroLyb_#72F}8j z;50LE7OwK7n~iS;@43-H4-{x8C)guA4ozsw)5 zDBjeIH}gj)iZAHJ7xD)qiZANL7mNFDtQ(nF39-z(S_Lf>~fuHyqz5jzH&k1hYaKBHK~JJg3Py2)>h8jmSeQK|Dnb zHiz`A#5*<1^MQkvq7`!1eJ+P&1GOhSayq8G9{t8GCx;6K|I$l8Wmo6yGKK}hNZsl38dlGA#izJEA11Ce5A zpuJK?V!qP-5r0%ODJM?hut;};Nj8(!RPK^aDi;29wq!-tVnZqG2#dQ_{`F2@pN^S8 z@2RjqA@)zWm7+%ghG)VA#Qa2BskG!BZ@e*z#v+QNOGyV(CK{?B>VEouFg|xqyeRPc zG&Khc59({C+U5w>d)y|S4X`{wn7i>j)thhk!}k1uj6>$pvtvGn+Vh?0VmJ!fhoSFP zPtR)y0Fa`}x^bzoTo#z<*senwCrxIfzpbCw@yg!o)y-QDifc6`G&n#Nw8p~fqU$cR z5?I})Tm~8(BT3(S&3dQa?XjADvD2;B+uh~MKm)3qKPqbM8?>HW!5`bx&+GHWe7MuP)}$LYd$@S>b*p`sFY9xEyF&cEOH`W)+dQUW>F z3ePy%Axd*~y)zrmg1AY>n|jWVN~01%kD)6t5}1>7sa+S{7fH>!OcIsWRMYfxNXaPy zC>?5r1FX#`n>00E5jhjaTR1wcB^n&AnKi}L-pjvBw|Y7I@zDw+5c6z^#F2vT$qQ1)V5@j}+j_@CD(> zdWc*ZqP9~lekWJ!qud=2^JCBz?~H8z_Fz1~C=V@hFQ}ZE@HyW`s8>2?Vcs&v;>+e$ zF5ND3;bxf_;(k)R+ovxMXAIA+w8xen#6xDAD01Rbfe!Rk+o`E@Hbp$c^z-!%owC{3 z!`a;c_!H=DlA;oMIRRi+rd-XmZY~gZpe{R*dUd5fFpP9J()_MtOOGyJZ*qoQdsU1M zfogRTZ(~Msz;u@D#!?z%++SWy1o6*3_DJl)k=`MmQ#-?mFKkqrl|?$tRufgBVN3Lh zvzl=^yZIsa{9 z)YPG1;XT2Q;Pt5lECI@Gf&ri5d_kvkHy9Pfr| z!%HF`%Vv(RiRd_Wp(Mp}V>x;LPJK%+j=4P9gjTo$17@Vf5(qQAdK&cRw0E2txJ34f+n8f%it=>Z(XdodH41VHwd04*{rmnz+(&1t zJ{rv9RMOvgbEsUcCTxoDNo{Ku-PCzq9CmA{r`r8AjQnrHfN{Hg(=9dLUsKJgno1~| zGO$LfMAlaU&;tNyFap;mrRYwi!%ljLa_{;(~D1po$U?)H>@cdbrZHx_*_>(W4Fk$O`m6`{sk&%c1$}r zz1rwgs8`LlF-cjAxKO6W)yItULtA52ozzL3^`dji%C#t#L>?W$lPoWqbeVgbRf7*@ z-;$!FGG1QH?oPo?a8D(0G{Ki?_b6YN)X`Uvw?O+t;LO5At3+%avlzI=;b=<$VTdFz zMu9+bA{lAzzC}z@xeEXUC*V*qayaS9P41{V!l98$y+ z45k7FW3=DHu=beb1tT6|LKmv*kw1t~3J&PdR845mxVtqy2QenM1cY`+B3<5Ul?+W~ zRy6wI2M)*3lf*A|jN^XT$E2FChIp@+u#ngQuei{ca_~jcb(#%T5c9~4!zW&Ch$L6j z{b@)xL~iTrshbi{8|&K-{cfGAzN!C=AB1lHv)1i z;&+i~>!L~m=P(q`#|%j=pw=5U1d>p#c@Njq%8Aqsk_k{|bW9#_Rzkt$B~v8#b!xEn zbp7^Kx-LGjw5uTrHOMY$K5 z()A=eF|~`gS+slokqEAo$T@T;mp+YvecA zyoKhP`OPidLURj7bJao`4HVCye*SeRBZc7E3Ufy~85 zFH6wcSQ9W&>vX`ip=uNl#`x=K(53SG+oD?PSwbpa|#xA0%6t| zZK82jQ-3=_)(0g`>QPy)E{4d)mu=`dEv_yRa1<+{TC+tT5W+@siN==-itb!fXk&0H z2tuv`shrh=Vb$N+(1?9nrn}a1+(56?g4&i!I@`*{n2sb5vtps863U4wrJ4z1l4P5{ zJEMVFw28??2w^a*gwrnuC*Jo>D4_0IrA7y}Go%^sd1tKN(R)E!8gIJWVOW}vG4giW zTubV<3*R;i-sZnr%zsq?u)!0p-+I2w4ND|0CwaEe!$xL(U92^Qk|xL)9-z90NKI$l zcOwL|&?NtA@{m#vyK6G_$_zZmc+GRpVRW(QofX@`lz2U4F7pX_%=H}Rm(AIGQ~9Ek ze4Ln%_A*93>)JuJP;nX+`<<)E{F%+*jLz2;hwT7_Ib!mj^UL@~pzQaRZh4Aq%0@=! z8=J!BWv4JEpBaw1fD`GD^5-a(-+8K3$hJbCd+})CMK?Y6`lPX^u{av+d1wX}dwUH# zo@*tVlS+KnxXJM}tlL4m+Q}W&0Hi1Hz>h9&dV5a9t%A8}-tgR5`jVa-J*s}I<)SwL z@Eol&0ZQe@pCTnV_g*TV~~QA9Bv zfWySi1&4{Aox(<&n9(`lR%4h#nx&VpVV{-CI;V3J6L}dlvv5l3G|Zyd%*R+RXPPnT zz=#6GV9 zc&cyp`{H1Cp}Sx2>&$ltXYA+EhwIE#I5VRp zy$G`kqwbkRPZS_Onw*#K=7lyDuVPApjl)g{p~|0UX4P{~UB8c6Jua^rP7B?nm=}2n zzX!>Or_KLsoOH5WbT!b zEi|>WmLM3(S>T01?Rax$1~2fiC|MMrqp?A&HE1+f{fEx{oQmAcXO1318!6=x=17{G zSHn2fO#8lOD6M#*SvoJLUd7NOevwlb3s8Nmi^Xsmo=OvT5jUDM4M2sCM>$#IQOGVH zNByvk#$C>-ANz>GLK*G`7YHXF!*+*bGZ=A|nw~*n5O;&x!0$vMVm5{N@q+3Y5JOZb})`&KKy2s-rFaTEsrH(qk2qiL*M6$%z3)2B$P; z1Cwq%5_XH~B%=`MKv{&f8)i%$5pKi2#E$i$t#K>%(Wd$gW6U7dQ#&|2F^0BrIz$k0 zNC>Ts4jwQ`HARh}+1GH!uGQZ-Ya7nSiT-&IHQ)3M+6=06^J=c5hkdAIwu=($3$)bsQR)$GOz(o?`aXKey{d~;mw z1PVQRizkhy>#ddqa+I%t8e#{gyU6CgY%ME`%nc0&F>eQ+_PdR*>6?ftCM}ER%EKh< z*#Yi`I9X;oZbl(Jz*RyDJ5>4JhQKs)#C3d6h!EEtXSXNA>nFIO6OIHBI%D;LTkl@T zAU;&1l6-}>&=H@YjmaLTd%4ZpcI&Gb^_7d8+pHvBi1kPo;W~lY)JKAIaY^y^kd6h) z4*uxX?z6+)J!r8#_Ce4IS^>t27yKzvu`*GP+}9C@ZNl%ceg-=Y#%DPt}XNBwB%KbrcFh4lVVZx;1pOZtyx{l`i!fK|QN z1EV|8x#UM97XmD*_G3Z+v8ex8diO9Pv~us41!Z03?6*iswfIRo|CNcWbQyl{LyJxS z&3vvT{{xrO8D313`{k!t{%u2Nd>M>|h<_h#%Ga?D#!fhs6MSx}WzO`&J7U3czhsJvP>8Q2anu+$ADj$*KR8n&KdjLV=vZQaH8Br3u}u5V|uY5eaqDfYwt35w*pl z0{M$8T5rVLF1kP_Pes>l4{-$5^kZ^T6X6BXfh*Mmu_&5mSv0G(Re-y#1TicKt4iXG zKeTBb0fUP{q{;)%>wt)Uqo4W7i(&lIi_{35^l%&wf*$siz-_EF2IIs%hf^`1s%m<;M`&z1L0yagBhEZc-iW*I$#^Mw;7F3Ol zHq%6l`)JTYW1YT+oVe+0$T^vMbZ>4Sv`z0QSxFmRkzwo6E_x+|zUErNYuj;^Q*ILC)yT zPlRiWy*?cF=(pig6h>s4_{^uuabn>@a^N<~c_?vy?g!oQET#yqN5Ob)O>hv%G7x`_ zTm>2(5gfc5jY0Z5L6!5MxwPyPuO>l@OEKkP!$VZEWp5ma)W+Jl1eZrLm9F65e)%#9 zGG5ZUMl91uRz@n#WKk{@#eyY|{RMcAe3l`08Wv1XUhIQ(f*ouq`RjYeFIsAufI>nqK>```EQxx4?pyZ^m~``;-qJEbAX?Bv_c>{X^8^6{!a zW4mnQcJm0y)I9y2x{~}B9g|S0;vB-umu}<^=x7pr4B}NQ76+XQJ%@*M*z3jU2cI%C4nOsEV+ALdg^iOrE)D9Y{k(YCxa~) zM5EOzsHrR{-&nGTk*9YQnOS60a$7aPZL|WH{TCcmJMTqKTs>JT6;01=aY(~-?6_5w zc6{dt4lr|yXKRbXKciX+Yej63?w%$g0Qd^jVk|k_IXG;+ELqW{g5vwm*JF@yMi<<> zM5LuyYA_La1zp07A=X8EsMmo-gF0<{9UXmTIt`tzSzF7$b4{2j>xv`5oCUCzHx^^( zi#TB@ST(CWNOh^60nuoPfhJFIY}(HS^XFm~#F7DGMf6MjTrel5 zK|gf}4>B|HKy>Td)y9LSHnse7Nt???y}7uuyh@F7m4>mr;%7tqsds>XHr^rq-rYMm zM4oKxaHmD2=it>Ye0^CWO!8o-!#?WTsZsvE&Y@n4TlkFp2zG-KV=6glr-Nxu%l{Y1 ze_gLVK01OH=dUSapggp)vXm$P(RWk+Ypm3p_5W_^n(a>Y`718}O||~$ZS%O+cE9oZ zS81bI{%fu2O`vEi+rAa-(Sr%vZtanUmfyJNtN+2q`w?YkEq8dJ9@-l+Zt4(8Zv zaZOp}4RulCUFr2K>;m{P`v#tNIxXSw$9>0h9C|Sew5fA4ir_#OK!Ev9bx$c)lCshq zrRoR$njduZo>_}WgK3K@^Y01eya6U29*(?VTF6IU0F&97w)ikS^P=I@#UnrNoK9PK z9H^UkuRCp}Ge1~pPFwhVb=g)lDN*Zm60{*Q){SW4^)km2acNUYOK)Q@@q3WDPHaWw zrmBbyGfd&unqmQz*s6Dzw>Vk;uQ6iezm3w{AycM%0a)*MT4c%0R3@)zl_X=Jr%8_5j*r55vXiI9ZQ(MWlMb+4j ztsvFo8`^lzePIAp`c_-N2oIW8r!zkff5atbv^I!OJJn8qb`5Z~DgZs(eYDnXA7PUA z8Z4(o*dj0;JnAn4M;zn>*lcGl2?lE$0&Fg*N~&02ywqNptpO$J`n3Jm#1W2-i8AlX zSEN<&df;M8nMsuFJ3-)3a~5_c65RqisF!7zuXqXyskV-lKpJl+)5ohK_xzVDmqz4t zohi}iw)W@z{2)M`m2o0>71 zh%q-nA*bQ%tV`H){XR;U7|p}&w~j$x#X~AZ!0e?oLZ+DPoRYWCaNBUPXjR_J!F4ru z+dhZZlck{O71;2rQ0z-m>M4pRd~CWx9!a0A4oAlr{%KYbcQ}78hd+fI;dW;kp3n6}%*v98w%yG+Mg!*OtdzY54ew(ta^Z>ezm62`RCzD5Ol zVbr2-4nyep)u>69Bp1@$?5s?pzd1GD11-+Qj}MNy*)zD{WU}(Z6aenA<53FrEDQ$+REP&dfH~W0F^8~D@Lfi3b&3{ z*CO<{i8y`FJuz%6)TAYEY}lc_{cbRISD-}67_3;6dVRAvGIEc&6_BxGHz-gQXI5zX zIY|i-H-SeVJCFPTJ;2Eq6#Ev-kpCFT&pRJd)DDbH;`)6wyYkNcQOyyd)+mmH3s4Zc z$f!V7*wSl=4m}v%4+DRk1rISy1k{fiqOwjWgE0WY+CK(EGZa&6IDgJXJ@YJ1DO?pGQ8%ArxH+F%Se>%aKi-t3!wCryw%)e3=HqN7to@gTK*8 z(aycoYSY~0Vi^`BToMHfFisV{b<$LbU$=lkg?3mLxf-EhEDtEt$fN6-x`hW?w)Cy) zgg&S;?;2)2`V18xtM=j_ieO$sL30@u%njkbjYMc>QEiYBj|XmaG8y}AwQgz7lU`l+ zO7q6p=46a8z3O{ria)fix9u~P{r@)ll|I9xt~NR^w1T&OCd7YVURr6U?f)A~D+_n_ z|L@^*Xa9d^|9^A#|2;qGDh_Jri=FM=y(ce#a6j7L+W#^14O$C&AsjYHU|J@(g)vk3 z5K+V$et!CR|A3yFhR^(H8r%1RlA76jeyJqjd2SJlv3q{uw4Hl?$+U@keo521J-?jY zusy%LY15uxPB&+VQV09n*){9XD>~-s-Cz4Q%g3VQygcQ((E49nfAr$Tv$enWZ5o^2 zZCW2fwZ}Uzxi&jpXDtP^m%O^hgXE;wfn@KUwYN4#7GA%6^$4iTjE3%#o3-FNy~~+A z#j@IFFkzqGWe0EUrQ9(-MF-QhwWC4UVXkFn(iWA*BIXX&%%s!EV!qM_saun$9_fbU z=~vQ*JoDT%A5Xu|T8^hnBu3*`K-X`r4C}izEpGWb!lRZZIs2?RavDykiVSfrtCF5vR83rAvSGsX z$>sbMsa>l}iPi~KPqfWw?qybr?TS^YlB~wTUMo&FBsL6$B?@C1sC)sn!kupzC>pyz z*Ur^g$9yx|skYlR9?zI~yrZ;cOE;02wWs+zo z06Er}g)L>@r)@B=vQu)9JF^Ljk4Vkla0-HQ1 zE{z})=Fox(9FcNrxxRc3B)7E8f^N3Ux%nz zSLcJ_ib;A4&I4)JHG$enJFy!%8S>;%+Z;}HTqr}VDMoPv2Zxx|545f} zigK*4uCd%j3zui`G4X5$1cd(39EVaH;tG01I_(;OKTSL?;zvmZ}ZPG?LfrX1Kc zb=JA;cOkc(gA;hC7zP+3l<{FYLHR1nV$~KHSgm&Bhrapc&s6vSxr(Xj+9j|7V=Ykh8F3%9!Mp@T#X*>R}8Bka{!@U?IBJJnmaBUq0K>v$(Gx(m}E<9r@jU zY^j)}GkpGh>!sfMMLa(MIf6Toj>3W8F)}ld;?vC4K+Bp*-w;|8(QA(|*WHyf(<@d)V|gZ) zg(*Ob6ic}TS@SQpa;uoODzwB&%1T1rR2s|HnH&3N;{%rL=-#Xm>G*vTsmS6Aivs5MV zK%2=Q?R}9yk{nBF8Z2NRWhdHCu6&er4B_RCkTy;sj4?d-SqUWzken=Sdz zjyVE`Oe;9>-p9;PWKm>sqp}ivGsg+ueHDPqgT88 zJC8*}3J9idyF_Ko0oQ0C*Ti`w1(2Mc?7sZ;#oi9WE9{EBCzC2uSAh8xT`BGfA?(DC z^PdF%r$eKIp3zUqdnSry1O^SPl1^M zp>TI^_fTYBah@=ja6qTYr_3X~7&6Dvi;r6&e}72(ci+Q|4$R0<1xIid#NXhf5VU$1VPi(2-H3Vh5@eCN_?l*^Pl;NAA4(IkAPoQMKoLeY7bAcF4t> z@rY6l@!^sNw2|q-Lxo&V4j#8&?(clI3rr1TLuNwO)=~gVWtAt8R;Dzk1|*Q6jO$V^ zYDFxKN(K0EI<%w(O0lz;bwp1e0-z6eo_|04mJ9g90pli6wJk@(=%g_9fk)))zT|?b8DlIA7@V^q{(Ec z0<*I;o^)DIi-nDS(Ipcqk+vO%eN5^$9&Yui;>bHd{`>_cRb|w13{hc_$!YJ#Ukzg9 zd*!(xay$(|j&BXz_youi2(0*%GNhF;MRS5fxpnj;X#9G!1VR%^KO1e0@%;gvxmks zB{RPD`0@VE!9nX_3kU`DbYJ7_vZbHzJb$tO<5b~nF~RpF#dxP|bvm$5I1^Ru;#mj> zA)MNH+$D+KS)+spquZ701D+^{FsU}<=<_zW;Vh|%Rj+6##G@0$(1AAq=BM-tKcVbJ zB0)1h;Z)rGy%xtZ=U>vs!+ezmlX%oF2+2v)KF|}Vt}nW3Vh9Zk2JWyV2v#N4e#LpY z|KhNP)9Cz^zkj~Jd$^N$*O?z|@8$mPXIqCmP~Oyi{50uJ#i?SlCK@nqce6(uRPf2x z?z5f8a^KU4_qRT8J$v!A^knOB3lCrFd70MHm3vb1mAq0&X1wmK$bTmHQF;Q%Y`SEQ zJhyL>v=?@aAzrF$5^+SEQv6TwMK%1<225R1^Lq8NXoyv`qy^geK^G2j`YMw_Tl7!K zE`7P*IsiHTv*%leq?$aYMJ9nk>@do3>4N+lkE&h|CIM*w2=m5~n>;zK;`v0gaNFbX^Kf9>V&lzRM@iksao`YSWtLl#xC73MAHo76J3W#;@M8uujQoKc`5@)H z$@${Aei!@AeM}|`w^VlGjEy(UY(ur(NQYHrMB?zX3D2PAs!kR%IS_%md2}S^>OT`+ zhc(b3sf~xI>ef)0aaRayiTs8^7dou=->2qSB6EkZk}y43wbyr#WKF>+)nd1Wk1=_% zTst_o08<=cEgB2qB-;rk<{`iF+`VXfmczM}%hSo@U2LJP!^8dEN3RZdTCetA9qc@o zVgw(#boSFp59A`32Y8sw^}$vPB@$>LIlaZJx}L~fXNY&9CBUi|fhYJX$(?0HnK??C zm`8(CA0cb$A{L<+YE)aJxe67SD+@t5Epx&@`q>3P^@9t3s#6Ph_k}Ek3rj2jB`W3L zw9w8^H*j)LY}$MBLW;1k^IkmOd9t&Q`%GQszy{}DJ3<_CdQmvwD!YS$*G072Y6F%S z%7;?9W^YuqAql&toTvfE+*0_(s$)rE(}40(?V(^mMU7aKq{Zw%oY5%u_NP1BKP)Bk z1g>dyQ%V&y)1UCOlz36bW2kOf{@DarSvy~7%OehcAaoPBl^Tmw{A@_E$QXYj5M^d8 z2M(Nys2$kZ-{%t$L1t!w37|)e-wdh5?pj^_# zBr$yaj>(K)KUk&=#PmB1P%Hg&p!on-~#jD54?>Z^tB;E zyknq@1oE6L*VZ172g5n1Hx4?iX$H;_>Zb1goDuV(+@dP&kSQVOJRZ??o6Cow<3>ja z2ALFK`e2xT2lE_zZj6USo;#EPFHG6+dd?-20#rJRrfSSZsvf||Pd(&r+TQ5Q^Du0b zhf14^Atry%&?lJ3&m-WafI92DnaFa|b$Ns*xMD8C+-3<&RX5ebliEeD{5JL}pd8I- z+!z2wg_47l{c?LN=sv-Gxd(vTG5nxY?@(MqCLAGxl1yREnGIk9Fq`zO6NfzEPrVUU zC15esjZgd`vx}o}SRI71P)N{HU?HLV(mEYiMLA}SCdQOiYlImw32s{Yak1?)M6x=tMMc`*&7eEp##ZZXg-{gU80s>r^?V# zfpuvjNEnE7%K+}Ty1;J_y>5%j$MQ|r8-m=kAvTn`0-u9Ow9T_ol8Q>cc-Gpiq&qJO zRfB2IV>aECSMA1Pq0tS?4Sd-yY9>qYNw(wVB*T5)_AkUp(MCQ5%%vWMM^Jqml|itx zWPi#P+xXQX2@_ed%yh+$LkcGt5#9yKAAq7+0$rdD!#MWa{R__HZmEf_0)rfZC>x&oU1%lQ zhMDaqhOi60(;2DsuA7drnu4uLoil2Z`55|E{wB`K!t06d5lf|-Ny;V&m2_Q~8|-VI zqS>}Vev;~_LI}p#gTChtpMheWG=Lukj)-= zm@Fmc1?TUY;H_?+sJNj|e*F21{l}XnQOB8c(7>RqU7HAQ0vQ^#d~;$1(ZZi3cB)^s z(P;~yP+}Q^m3G_U9S&ZrI4HX zqKwF!H*#1wG0twUsDscA5PR|b9U#*Octgm++B<3-fP`b%7KIWy z5SD%)a2qv&sC^@)8FkM@tRf)D&pO}c++Ya}LHVJkOI5oGt;tN%f4KV?Iu!{`)zI&@ zMkqfK@1by>EUyrXEN6wLDt|7F8)sN!g{}DAL*VED>AGI0kIY@EutR|NIk(w#8N*h6 z>j~gZA>IO}c1x&D*HvOrYWa&o66tgWP!Xf?treIkCcN<&J8vL_m$fDvt$WML`5h;r3NM#)xfJT$jvkf-U? zu`hQYq^>m0!^}|H?7Q0GTj?;7+t>K+B*B>R2ToC*DlGG?!xpzIxrEf!Qecr6rpopBVyDF}kNSU_=_ z3XZ7V4?8Dh;Xm^G*fk~>vNL(66}v$PbpYb#=h)>-AeW9Z2k0L|!s`mUa-v%d6kG8X z91MUv9qrOdbO}o;RS@w1-H;hG<^w!8!t111a_7L6_%%4KX%-m{#go2J+}uc9Q=u5< zCR35-C;Z?P@7#!a7gFN|5@jF&=80juZDy86Smlfi4n&>pitj)V5m&m7pbMv9CIF$j zfHSxhbg`G##S_R@7_^kS#p}e*W^z1G0X*;c4iA?Dc#GhI1AWtN5tfK~S%oTCF;E38 zhQKF=ub)2S0HMG-(J?f!v*paCF7)$>AH^dn$DtAp<*=HRG<2~^3gJvV62XHPs^Z*# z{U)OZN@zgJr%)p{Tgd72fDeGrr*?PHp1H(|Bp~g5Pbh`d)_RACKm*wK;}ah+h?cU{ z_Bt-w8TlwjIOK!V_fK%=F*}+OE5z0CQHc7n9;@H{m=$C;G*D9LN0~eK%#7tul?|X6 zn(b97vD*^6Kiw-7vs)RnEzz$WleUCb85-kBgzX)&F8WoCm2xv86d2)tB5tx{VUCpy z2DZF1&J}iA(^+WcULAen!`$Z`GRdG)_QgAUk27Xkh{N9z=gaTF=Q{qM$5Xa3A^vl7 zX({9Xxj^M_b>!mnSKj~g&iV7s`STW>KcP_dCOv&(u2Xv7vNIl% zmj<)HqCGjyhoLgdw)dpMHf3*_dn-Ef%Wr3x{l5@m0^l`l*+@2x2H<0;OfRTGVm*7_ z8D?#OX@OmcVHZl}HPJZ|1MmrcaigP7g;`6wRy@UHpY|w;Leh0a7;6drcZBnJgffA1 zJRZ0~RYnWcZ+;kx9H0brpkUzjK700-NXA=s2@#J` ze<{AAJBRrC=+yyyL(F_D95CJrZ7Lfyc@zw6AwnJ_1t)Av_SyQnp0g)tCKG7*#~Lj}>W189pU(y@Dr+mCe$r63Hd47Qwt zt6eT@V=l3TeMUV5*#l_x(GdWvKvch}!u_7;-@Uj15~#S({;P2@qCTzS4*p9!|)Se~Ndt;%=f`10s~E&8~lVY~fHPh3Z6Zd<@j7I~EEk z)Yga^$UXG>;n_oEouHeuBUn5l(pCMAw zmaMQel}8mDxw=P1%mwDd^ZGrZ2kqe1?(rCxS}dYe$noS57hu)GZ8!@VB$wxqQca`w z)jI-~nMiQTbBSTCJ7Epi$wDEYK6Br5m&bOyCB2P2#_HH`-;z->h8 z;TS#Q(4tOK5{)+z0mKlm1?fX~1e^r5SubSF1~Es9Mp(H5*aw6W+Fn4O1+|AdnQ#+J zLu?m8waI-#8b;B`h?!HFDFqoE>ZhGdC&?DJz$BBK8lJ)^TjMi1GpMCY*%~HPS|UHm zEyrPak{A~0^~L!>L=9)HFYXH}M2i?4f#`=vBypvU8~LukAM5!xX$Uw!!f28Ez!4pp zO85HX_?XoA?QyS1q=S0X_IhDtV4oa}LQObKwnI8c#QrB(e2}EUp)Nu&&oOUZ!>lmb zcL&1PM;{r|6&ea@G}7`L<_$d-JgA(ev~7*wQ#U#_d6D9g=3{Ms9^|GKq4EgE=lHWq zuAuZ{UIR0_sIAnFM}z((t6KeTTG-bXvUY+o+?8f2HggoFKH*@Hpr|NyT}kI@TGDY! z8l&fl3m)P(13Oc6m`^28u#eNyIpKsR?)T_&DiM$HWVE5$pmJJ|VJT4<32$z=$nKL4xP$ zZ!?x3!a?;olap+$nY6w==@9 zbi^uZjIV?O54vx#t&a1QA~t`zbpWT_*5RiVz?oHnGIoxOz6vlaq#OgGA9t;X8H3UI z=OwxEL;9tMnN`emtbCM>29npaQ~CX7w5#O#yZ zI+`;IX%9u=7BGq4xiazumTB8nzB;o%`N7N_)N8taBp87f6SY+WF$; z&h}wz=ZoFLQqEEczzMeg&__Y=(Zzul1gV@h@=Qjn`2ZkgW!q|HXGn_PJkX>*5nbes zu=}KS@aiS%QFb0r>Ts$H(uO!~nEhn;+0L9p;UHUdE^3n2OyUl67?On*-iaDETZ345 zh@pWI{IFO#rQDu-B;jFMWvPWgD(Hcgbb}138&=!dSplJ(3O$l-iNxnp3TV9o5co~X zty)J{v@#wHANy=_&X$?DRSuuOe7sBU{pf=Lhx8-&8?O)I6RM}AHEAsM$0MbS<}-^6 z&q(J+i%atfw7L_Ve&$9o2X&j(nuUEat9{#f{xa=nJK;lh5l)+TCC#P=Ytm*xc z>!}wV4Ti0*PtNZ+c}GB#gVPdJ)vbO-nJi``Aw9TA)?yW>HSzXg2Ub_;9Atc~d8j=r z-HvXQ9wWgQ*pG;>wwOKxh*uRSMX-(S)C-4z<6Lg`jIosvw6(XRA*U7?XMNq7eZtXh z&|r7uX#i&vhr+3DlN~2xh`5p2(hsLPWD+^~ngN$ub7b1M&JNx#`auLrV`w;oy(j=1-7sEICJV^G$Ek30He=t)D8 zzQ;x-eyk`0YO#pr#Y-kqN_)X5u1S0lT)o(ete&DCaBPo*gPnb#)BCUFp5_uYKW@?f zFVnW}iOptU7!^m07WD?`DE>AeRkVWCq?p9RPqz-`v?V3v+9tep$%edybQsp*+NhgF z-`R3m*<8O!w43shkF|PIi7d@-NGCgvBD@#ae)+1R#khL;O5RnHGe{hw;{J$~=Co?; z3(8PI5=98G#9|pzQ4K{@sd8!>wfRdB_)|AN7`GA0RBV#jvVmH7%H_{q;(Yr#96~Y3 zFh~na%B5%e70>Uiw#>6Hx7WCX!b&;iyKgLJtVNDhfn#M*SVx9@RqY6tnm#4FF7ei?69qw)&?r<`qgIBxo^<@cY#UTf}M+dzfyNytqs(NudFQP=>Pe9O8;M9UReC^mTq>a z_Rn8&{r~0G-=4F3QX9qhKlNo;`ON)Kqj7it^FBW5%b%6I%b&Z;pKD+KU=h41SzFs; zim@B-3wlv1qj=Z$ILZjWC94PMm`tm~B7>wb6&XGVcyNbIzR1gaiiAxza+S@;q(l!h zqWad}&3$Vh+*|zXk&#-;yK__q5!8fhD9UidYo9Z zJ$C3w!teK`p{USXc!K&+I(m7w1Q?P9L05!zr-+FF{lPP$=4@ee!ah$>Hdyl2D)!82 zW57d~&Gxw&4(q6?R}gkhXKXHDho_)JQ zw+VT5^|je7aT`iKWL+OZH9*;p#|CR6GDJY?9HDff#0y(_n!Tqvm!)PI&@VcP)eP1g47LYc zjPJ!VzAJ}{$9gfW*QmU)vC6<0%axtA#4|EL)&kUvL5eZpCQn9Sjd_nY?16_1AQrfy z#iW0G9G<;R?)W9*qaD38ipB`ZkDk523=H`7)t>g_VCV4p*1-?WcJaav2^kg-HmM4Q=BIE-nsMO+wV zfs5D!tQQb(v;Z9<0il5M$Qs6La)}3MWD5+7RHH{8**j9QioF+mI|8#}Szg|PLa%@w zIh|*#WL23q0wb5D22d@3=t*K5^F5PD%}DN}k+8_d0aHEIF6`t0I#!a1g=rmGjjm8r zWF$fQ?XhB=JXtV4E#d`3a+nndde({j;Yhe}XbYA>5~l=54gwIKpvr=ra)c?Irz?hZ zcyivnrGp5N4|zxB^|-{9MkKnVWZ3>3+FtyS1Jj2Yei&BMA;Bj%RH# z!IR*8Ocj7f)Z_JiMrkoLSoCsM*MxELk0gX?a|d0;4mF=G%ai}EFaJ-D0x?1UZ`M~9 zGWow(7MJhj|M&2@lmGAJ|67p%bG(^%_YQaV(Ij3b<=Q=<3{YE-p6wL)G*7B_GoH;; z$bOuFM(HVV%*0{3BNlHAwS`4zfeXO?=;)q7(e7hDAEuD>g#`8R)=rO0&iaQYU3Z@w z_+0M%CmGi3w#K90YOC)BN2B9b3?veB!R9jp6Z}6G>PyS%^M84Hp>cQqzlTri{BJH= z&j0WG@qc&vf5%S$M=xIOJ>GfTdUg0@we@Ug@9E*Et%IE(z1rE^o{9~aR6p%85{z;* z%L$K=dK-Wg8~L62wm*t*mW9}IB*7$w)DZD!;GVZU)_0I5$2&rcWtqUGLF~dJyMM+M zFXHStjAe8lFJi||SSMFxfEf(O((gYW4@e~{0x76gG~Z_hgJP#s(99$?p^6ECfyP5p zZoeD{7Z|CtBFx563&hF<7|Kb2dO|iQBY>_0t5jWOK1mqtkutRkdz%7&Qj^djm@Or0 zJmQ1q6`V8A=$JW>lSV;o)4tC*LGjohv92AEn&O9YvH@YuLIE9;fKkE-IqhhzoPy0I zA$1qc_dt{gM*R!eEzyw&lZ8$&q)R0AGoOpGP((8Iz!C4`{P)B0 zuup+Ax=3!4X^AUncnQmc7M8?(9*hSsdM}}rhbjx8&cZW%hJ#ZG+iLI3>4x6`@^mov zhSRy|^f8eL1`%_kgs!q~(*@dfJn&FWBq<(3!+DfztyaG_gUL4gXaP;i=Y?i#WK7oP zOsDSx<;h>cZ)cq0xDCWq=-JT0o?`ou&X#Pv)E+^-Q7)uXnd09Qd#&On&}_xdTVPQH zhw>KLbB?tFcm>+7*W$+M;BH>+x=sV6e3Evesp>?J66ZN>ss`D+izdZ+z$!^yS*d5e6x-R@%G&5+r%q9&sHd2a`E5cqYAT?F z90)XcM8@pm64H!4lfYL|zHw^3u4Vy>r*<4`&5N*b5xRo2Z#t5%q3?A(V@N=(cR{9D zbGWDL=6=KN+;G-69F5P!pNj}XVcn#SAuVcE1!}93{MMjLlR`}+j!I72S*W}nB1(fS zR}FhrVuHox0cUa$>SomR0x1~|y`UnY!Dbi?X--bb4v>@Mh+81MFK9g+S@*i(N6!Fs2P_Ub`W#Ek$Pn*gF{I3Q9;g1GkU&&j6n(vriE> zV9tSi_537>IsDJ^Qxt4sF5}DA6Y(Qgo>5 zn{cS%T1}R7U?O&a#pLDY6>Q*|EV6Du*g*@PlH=g}USEVUNh&4q9NyCl6;5;J$?Hby z23^15Fo&?oQxrl6p&Axko7)+297obYbdB!gY3AV&ROcwVgg0{V4zQiXB0>CR?v;lq zny2U!dgEOA7zkcY?WWPb%rkK2a`ZNrkI$HMJJXGbjM#;}B(E=jq``}&o0@DNwwx-e zx}le6Qxutsy4yCvK>;r-69;D3Pe0+{+@bA53#l)xv7)?I=)zHwU*SM$mYtu<2egjP=BBgU zG-ffgCz3fUO}$^BourmJ)%24VS~t%)ql&Gi9NJLkfr&+tiIuWzFB2XNBmWe5%{9e_ zB2_Id;8E?vN`F;Gfl%_og2&a*OT|+ki$o}VSe`JvQXLt@uYi+WXjYhcJRz2`EE1a$ zA;!kOqVs^i-G`FU6b;&cBTRre_L<=0<(Qq)2~M3EKaZp-z~V6og3OP7<3(Xrg$WfQ zm$(5yCQRU(@XDwJ6Twl1%}|gq*=i?SAWGoB$6nUflQ)+k895iv)J z3hoJy`Xe8uduV>4$(8|%;uGejs0{gkz2m5A@A;-@l49*cYpd@*H~qP}`=9)9U=!|t zn)QXW|HlG6Ub?&gc@Lkv`=7h}pIf;9ndF&Ke33jm=>}(t5M4KI{$Yg6LZ{YJu3nm5 zhxg$?M_p>XMIOK}dM^TRJB%W)GwNTkz>o`JeWAID%##+!VCP3AcuY*Bs^I z6-If08aubYh3a}J&u;qfX|wgmp+_^c)QsZcftp#3uIJ!F&+V%yN^uo zPSAZ%=ai{l^y$tE{#kbx;NScAeHESWiin_86Bw+Fvq}%bQ>lt+vWt+qxSqvg{==)Z zxFFA#rr9Q^(3q;tch^ApnM;gvp)q@fQ$-E1p*J>hc+}XGxG8XQ7XW-7M%~6U&ppLx zMBVx;cr*qXWg=QGFDkUmqE=m?R`WWj>;x;|Cq?es%K@XM}uX6SqwXZhq zb&V#drMSerUzYqm5EJ^~N`zM&H49hb0~Q1mv9PFoJYR}b7NfI}w79~Vt`~(EH3$Si zRs=67`!jLJOIN6PM^Jme$JTY~E-cC|?c4{1z7M0i?<`&kQd5UCJ?b%*ZABj8oYz&H z^%iQgNu)sZo5hyv}uPzal^QS-xl%S&HWH) zv%Dne#KLu!eR)xbawWuBkjLhgAvD#&Yx5$!$=iYtt(Uy}yr0kI^#5c9>b0VAJZcSv zY3SqtP{sQH=3;#*LZkwlk>gl+^)wY%Y<>XLbs z#>lCRhUBpk_7L8w8~L~cs=}6t?S~O?m7O?XBB((OY4SOHh43EdT&bh5??nKBvYGYJ zbh#9S&ff1dowy&KVa8T=-oSiiqcNq1WGm}3XEZxQ%WO2qmI+tMWJV@hW78AL&MqXG zW6vErrHs4C=%OtBOm;<}4EKn`WZ-5VU~DBA`T)j-@k!9pBRpfImypQ=1QWMK!ren| zjkXJPGh~x+=q|;|IL3Hp>{R0g1&$G354NCBt|df0JWfNHBw-Du(VL1!l-SYm3=O;i za^N~BwmTyCkT4w31p6um6dAjtGf^PMN56X@sZYlb%|zH8_s21(kQS~{!fZI>)S|XUO$*Je)F~&=-Sche3FfG6 zE-iDG88UTp(d36ry!W4MgJk`niODT#`z+Z(Jp#Iescx4m&dK3(AFVqZ^wlM^b$onq z;+S!&ZV#nsgC=K<_G?upKbJ<;ES~Z*^$hh2BH?#>}WVOw?dk=35kg zIuW^al(yvPByz`?irKWXLr6gw2&boUTQ`{7I@sRbHTD3bc?T5-@h}Vsb%%Y|r$}!# zm11+^8jzz3ZYOE$NVzEG^zbB5&$9D?27}hoA|;XJUj$*3J=5biBEilKEa{IMVR{h? ziYI1I4NJN~Q6w?yf-qi8_fkt9S`zHg5T1*a9hjJ!CVeDH5ucc1ayibs$n07cQ5kTv zj|U!S@^JfG*w{53Y{-sZK}59zW*dW->k1nF9K?y zg@#C8>m?3L`c~{AN&o_FVWdHp352hQh$bIn(5WQPG)3S_u!y%I5do3L6fM_PhSlVV zs)+Qd2y*Y$GZ9M61xn;$PT`o+ENd`jj6dP6LK!qD&wSVGkK8JuI-PZt*;?i{$KkcK z;bHJ8rJ%4jg0>$5do&C+A7w@F)Ubw!Mx^Ub!RO@13z0 z+)eKOA)KT>72!yOK;qrRbtdce%c4hbJfd{Fz^3%WA%aaD*zURa&Mq0!7R1y%EO|i$umwP0v@&N}27hH>pk~S(|`*cZL_Gi4ivich(}k?HMyc33m;@!gEh4C%uAuPnES&D81~~J#C`!)On`_mGMAa<&n%t2UxWsv0oyD^sJt+|-S%&W+`9ohH z*kIm}f=1BGZs^GQufYO!XR(MxSB55WcDdF>*KYJ`MXAj}(#OXs@=GxVDPY_eno(Ny zTEE@iyGhH_4m{_5OV=4WV9X-AZ~>uGe(a z2#ZifS5^&gI3O(Yi5yrNhp5(t%r?&4sB87K4ZO1!@?^fnB@qj3>b)#GbIw`PvCk;* zDNQVpoJfRtW_5AtW2Rp+c!Gyc_-NBHXA12UKR^PMu~bRvg`Qtz$OQ_8i>UgVdtA~8%Ju*OiN1ve6GM?Fm}L&HqeLQcP9=`>C732Sg33_E z)f9eI4wwsaTNUS?;KXFqo_=_Q0e^*BO2RWvJfI%fx_3@2B(q2I-9l}F5k}F7QL=92 zQ;7rMQ1SkrF#2QU@|MNRcovAFv z&IbB~_@-FkGerer15bG|%%dfh*i7sji$%Z;3v7FI)6w_V>4e<0=m1OEN2$c6dNNQx zXj2EqhRSQ25@ly5X*z6G@yMCUQE_PH)iYaR6SR0DxoApX3C!Kzt7i`HPj>`Fg5p@i zB0i(IIL!NstO&GrC!PmuHXaN)G`CPAkjg;_Czwrv?^Bg;Id=);RJXWi_%%gZ`0ZxN zCI(0@FsZ7GDk?j)?RImu!b*<{lYk9prO6UQMp2|BWLJc&Pm41ZDb8ZKfix}hBMj-~ z_mv;DO&pb?*GC1qyfjmJIc1zC@>CLivKpwCwJ^PC@AOF=@r(p9P(|*A>v65dVUN92rq6j{3lf8N~L1vP>zj`cD1xRQ;|j16gNhL zha;1@G4YyK%oGC(7fJB)emSQ(yjemq#$#Nh6cDzp(Ljy%=N@Yj{Gd-~q}z3esAV_K zMi!=!f2?xv`JCd%^Bb^bc}N%p>9@p%&YB}5KX9@88~kNno4fnM+ryE&rp~{_a&W~> zr&N+>f;f%m#0fj!Ob%Jq8KbP!0`kEur2y@el`m3lP}iUxf?A#zUAfN}R~kd~2xIMO zd<77kii}Mt4%0I|03hyW{rb7wti?OftIu3SeX?JfJ2lfv@&tBL4X1o^i1KnPWva@ zlp5!nUnv-~m|m$9#Ov3jcEWeuS6wQaz>2L#vQI6G(EtJ@%B6Z@XeTvj*5>(gCv%!l z9Co%x8wHiP&i(u5(M>q;#HV~ynBe4;tlZ@7GRhW6>pU5pRop9x+%*W!R~HHb&-7uZ zdwA1{Mn1Hu;@#&KJ~v?hJ23&wg#0gy^?D;?|J$tJ<$rk}pF8{CJNw`F9{>IE&i0GP zJFWd!2Zybful9aSzov-$o>%Ysw!b%IfXgPR7WJCcr4_5t(wZ{6GR&g#QmUgNY;rF-Jq$8 zew;SOLqor0HfC3Gd5#|HQW zAI?-*U!=q1X)Z16@&4otXE%vGwm%&L@@6d>2WW@PG9^p!Z2IlewO=?IMs%q* za8E?)L`zx#8H688&>rC&0nG2x?KH*RP6gbq-J~x4{fG9;qn#g`0lE8p(9iYx|NOXr z@>9(JFD=xUo0%z#S? zLl)RdJ-lP5eUHqbuz0#)-#Kv?0x!NAC-)Ut37zgZe>-qN7RD0rT$p+YgIVPnM50Oh zDy3$qmt${KV*A~exRhvBFe5{|B9pbJ-j>TsO`FdN;v8*Zyy^o)4>dzYlPGk^6S+%P zKHH5kboYT8dQO(gImOv{B3&4BTc}4k{B(WY03kIm*@E0gsu)`0+2_?Tu-67V#Z><` zJl`RIpG(iTVZ1>@YlXcY<`UV+>nOT&NV!N(Q<8h*d%J*8S0Dd}T+bJQhpTiLhEKe+ z53rhdD>?m20%?7YY7q3yWSvrHB+DwxeGAn-L#L3pM`6F~1#gA5W+cT)1eq2hHz}avAKmdz`}x@$U3tPpEwNMv}YE$!LOvH7XLD)S&V=V@#G>@oW`Y{ zuS;luRo09T40&{X*ftR63?{<8=dshc~Q&#Bf-xCl)mbN5XpU4&xp4cs&g1AD({I zHq7=cMeR!(6^~|A#H7Pdw+=1vOX*X!oSq09UL@_5^{7lmZDfvWnn-W4^JqI2bn z!+c<=oJ1bWpX!-p?fqd4T{#qna*w55+>NhnRX1*W{TSk6tOg?iM~$%agMVZ8yqU3Ve0999LM5Ey~s!Z$0x|B+SWz z?DqD;(S$W=a=Mq&T9ERc9G1RiJ+7F?%}Z;>?)V|0z&_jdVQreJLOvE_tOHodOKhr-VWHGG*)h6 z9;RNeefJEcmSoi|tMild)%wkk6`|h36#nGA*Sj64?`c&!;ZXoAb^NMcU#;_Mph>H6 z%Zt&iL8N6BcB{gvi;aupkrq}WxdX-f%0SEe)<<`I$0=dPv(>uua_h0Q%{M|===bM% zE1c~$!%M=ckQ0;iIn#QQIMjE9x4m>=F&ZRecVp&V%OUrZ^G;JB<=sJdSqu}^$+tl| za>UP}*duRCq1z+jBBmT@l;WQ42NKMxa6~k6CPWl*=eHP@0*-?u+)T+mSX`Mf2#f*E zcC8e<$21zKrO}{$^LzT6n+JIdWb(oLpgMvTHE`n5mgOjD7i`DI-FCdX6hO?9xhE0$ z0n`e*2;a6Eor2Y9PK!4;F;SVVmEW-kQzP_kbgW*`G514utWnUhscGMBbnJnxWBS!ZJau{ zaqPVJb0iaB=a&?V66gd;d!B-qHu8&-U*9A6oYwZGS*2 zZSUTH(YyEf1JY`H_x?=p-p&W4*w*g-`QOyKx4ryc$ut^akgY`9y9fgjpqb@T6f!j7 z&=oe^z7gw}Bwn=S>bPWjJmfTOPHTVfbi2_RuXnwU58|(IVcc9d!#$!cbnA^U5RW%W z=p^Hf84^u~V|E3O#sQk|j*cS=(&+|l08RF~!hV+x#!tP-?_G!x1U9>MzVg!Kb8!V( zo0cFRp3xmLDrB}$RJRbox|R9+^M8KFgkPNr*QWguIYbuTPPO`O3nO;7E-vg#Aq(6s z$&D<@*1+!;E(q+)$ZNGu{h&2iv@Ho2fQ5k~cZ+f}i-J8VT$MI3cddoMwjTKEj$&PB zC1k=$ZAI*71$?YDivPP?f~zmVp65pG3vB`7-QY#kwcZylblgEa{>HWv|KiX8^`HOS zKmYfC{-5sF;wIPP#d!3hSFjxYQG9M&j{gM9@$X?#{_WjzT;rU;6oZo(*`EKkWdZ); zKmPIE%-_Jdps#>^@^g*`SOES1yT!PnZBTGJz+yC;s~!7d{Q4jN-rX8p`(!XyqVQ~h z#c0?U16Ja0LtJYyo`mCQ(y=hUSUI*#{{Q*Ue(|SwQ-3p4KZTCtE4OpfYK@PV7rK_k zptpA`a)X;;l8S@ZBkZ+~fu4=x)``Ec5)`dWQuc0*ZfK1rYCQDy`DSs+&mm)XOLLQ) zuD(P$$4L&Si))eobGIVbWwrG6DByWl&sUB+Uk!Tpb@?Os^S{8K{|)~9G5q;Ack6Pa z>r%)8)6)2T+rf`ZA(rQl#q#_wcS~~(ACTw%Ip!35(L-PyWZQPK2!&O%zVg67?X9{# zkhRWN?t;7Qo)l`aSb)4+wi{YDVOaD+1|Vhw7R!P)nhT3d%PXs7MKxX53hin1Xs%}- zU1C!h52xpyVSogYr*as2BTQ=<_`@MaA)o|RU9ZPcKrkHDaCBS~sXH}o6mE2Htb-#O`1$P&7ncSjhD0v=xseLz>V?u|SQ zYBe6XTGWz(d(rkRZ?xPNGn94C)l&z@p3yUx((;bTdZ5cev=9$s42-Vw{!$`n%vVN1 z#zf>92^%L3Q_4}Y0dGWMT__(%Y{n$xoSl?4vQN#T`MS(OxX@%902Ogen&@97b4Kyu zFxjZcYZ!Y2Kk(a_-hexf2GTN+_zXvxP(gZ+q01OIJfPLfjmKY`kr|eSi8ZP_oId4& z5w_PaU}APK5?Orgc(6cD>ya0pjr+Y8EJ+w+_GY%&=XALgn+#CPjXK9JW~)96s}wb^ z?~O!uK>TM2e=y+7gl!|5vh0)Nvr+5JYaO|876oq04_ZfXT6Nu{@t`%EA_22r*zH_k zq!_mqT@0XPFB%77kS%yTZn-TFy-(d3{_T4~s~33#uM35b&yOB-R_fjGf!lY-7UFq) z_UC^zeW!rf{+ZUVKmW7Bo>ABS{NF*jKZ0u34&Kpa8(kLYeRdr7$(`UgKmU8b{)4~q z7ytP`|K;ENeTW}}~um3;)`oI1U{{g|2p2OC0 zK6OLb?a++aryMXIb`4>9H3^jtWCBA%Qe^B&&gKAEz|A81(ctUFIIeekr*7ErnrBC= zgU;D%yMA`kf8ef+Mi1)lYUGbk+b1id)syz=19y2jJPLcK-}HOS83bSG)*Bb?pfPT) zb}zp6m%eUx&Mz*`gOjCh^XR;B5Q)im;dd*ehum0A*`_1qD-QWCQ z{>!ib$-knG{SSZfXMgio|L#xz@_+jMzx@3_x!W!|+hq%Je;~=fzBhi`9lF})_>({R zi~sohzy6#5;V=L8zjaDKcHu}4$CMKF#mP8w%fv0HDg*xfL)`Q6pt z(Q>EWas3CY&E|OYwHJ*~7QzAGey@4f9@ewx%AmQ>4eQ~sxzOn}d%czVpuIeDy;b+? zm8AzqU)grdfBi@Q^f&+FpZ)R|KmX;=|D6SG|M>6!^5_5hm%sSMuYdOsfBEx2{pBzI zX12_)|M@>Dfbh$o|Jg5p{!f1S^FR94&;R#d{`}usA^gRE`Ga5m-XHz)7k}%QzxaI% z{6G9x@En2s;upXC`M>$)&;QV}iT~;U@fZL3U;gsv|4&N?u-5aBy<7Kib{_<~3=8w(P)_ zS%wjk zJ%LYIkcn}eaK$|kKCW@pCL=#cX2n7%&c1qpCQxnoAO3{L9k+9Sdfe@-w2#i)old*k z`O0%U-EPP0cDns;w+;WnH+X&$^g5oGAr*el>#ugbe$!p?gRdX-jyuD1|6~xaxQp%s zxAVXqL38yZo9g86|I44lpT7-%{t^87J@Na06#xFu@aONspFe;<{}cTAdsr^JQ;}K=dkm~_30)ITHcFxbMZriUNLEp#injg-KC-eC9cr@sL zEHgGt7hPJAsc9lgccEJ5QJ8+x_uCU9QPY&f6Jk?Ok)EbtJQOcm3`%6zQTZJ{-8yJ( zf3ekiyz_i(@9DE0y|d@%G>w}gPsB}SyBS>!Jxuc>vfdz{pG2s1=7778ywiuNr+CNE zLdf_6QzDKBZB(ZBK*Bj14=7;^?51^rzkp$zoXO=JBn&{QI{Fa8t`WY8l-Cz?n85D4 z0M-Xc7qPhw)Wsgp&gq4Ks7UG|OLaml^|Mqj`?8l!HR6FUyQMwr%O;X%-BWxvZ#;_z`0NM9 zGdGZ9NS=ieKKrTh%%cwej#>8rpKTb=hR>+a=EK1*bvpHsO3s-NyPr|F&4bLpO z-J_1155s-xx%tq0L0vZ=_6Y;l*Ug6L;pV1U@_Vm+g7h%eqkw9EWb7K3cFiZLMW+S+sk!RIA+6?pqxyi*s9H51 zcIaWntjz^CP0SpQ_$dU~L z-yfm249==N($5^InIEmdFn#PcY61BFSgiW@}`;Xyc1^81{{)9ire++IZ^nR32gG^32O)d^ryCUeo?0 z%LC)_$f%WlPej)b%!gkYmC|nsd-3w#cselZWL}@kO4(NznVQ)$M9W*q$uyd)#+%Tn zZ7qU$KHKYut~m}m7$)H9f<7 zpw-JztOFtf#>ftMHTiBLG%3jelPt8)Zm~F|y{5!{u-N)*%Bol4=S%@3;7enAyjh{g zswIBtY|6HnY!$bH;n}ab^al%w*~s<*bAtw5toblK zmMwnO>$@}s%&vKBgaC0kAS1vS=+5(l&$cnb&pj9sCf6jsLjyd^`Cs`CbbxoGBL=5* zc5XX7_2^=?=X?Dwo8g^#r1!%xvzW>W=E8HkXvjC96ji`?`6FzW8fAcziy_7bjVERH z59TK$ug_L|frtSVlD@zXIH44o6ZSzS?K3oD;9}1k#E#$ZSKaQZj|^!E;QFI`^biXZ zrjMYai<%2mij`|K@0^!z6nnIB9?l2~+Hzw|j9L2DQ{ViemlrWdn3%C%20rV~dtOQFojLWEuAq}UjFY>2@5opgnjq*9!6S;XUouYoWf<&aegQQ=xZYb?YhUDryH zMEac!Jz_+FjR9Tj<6km7mw;lVFGE178Gfh%LJGo3bG`FpcN~*R15z$te+hw>Iz0}g zsqWA@4$qvy7?uK!iC|yfg9Yh^6=)SrG)a37BNVpHj)v7R0{Ge@WES%&@q?7>jOF6M z!3C%Dh7K5@bi9kVF}9b&RJ<|p@obQaGOFc9C%iwqzzNFGWRhV(dU1!6#3~!$Eie2*LtT_G9|FO_AZ*9(sgGKE z-owx)a&HWdVZhE5dH6{C+C$T4)Bvj#>spduR{pm3ceY>bKR#%Ey8HCg*5_OBy7hc( z|A%5((SW&i2D2QsaF%!xb_tKwOtJD2X8RXs=nXhH9hrq-$R_8)LXm< zqSS?Gw}&{a^Fzs@JBmoo6haO52G2=A+*2RfJQXF601CpvnVb*-$$dha>dQRpMnls3 z;MgD0%^R(+Ke}LmbO+*;@HXt&Cn_y$?Qw=2njz{FpB1#lLP7F4?Kw^u5`om-tguRE zq;fzqcB1D)_sAQej{w3b*Je^lyofkUMl4Cn0T1NT8|0nLFAy(`diR}WXVVdD;&i(sh z64Pvm`IcD>fz&@sH-t&2Z19^#~bKK4*=!s%v7p{%ZF$ALeh?82k-(V7rmT3@>Em+(P- zHjz|*(mBQd@u9#rsft0hI33a_`*IkMv3t*`vl}?nhho&9d-w2uke!&ImqQ;A!zDh@ zA0^|gs&Nv_hDS7=OU&J&VJU+PJY;TM5Z(b6VU9-PuR#ptpfDGIFx7===>Pr z4LLG`;W+BBPyj=Zk42Uf21rfPQ71gc@LZwasMk>97_oRPV^R%H>5^0ty&IsC1JOC$4x`}D za<(VNgG&evt{CXVQlPM#VOb4dkOLi{2?JZHEstZm&i~m0T1$b19RlulE;=ALh*blw zH+Fk`|LtC|6o^v`qGgv|?-&-FpXhUJ-%dgRfj-Ku)Nt0UJS!cssUtf} zhTz<`?p4JIh~uOsh#i(sbp~nXRT+96zQ$|7_>jwfD9;owC=!P98+`CiV=Vw9;5cJi zj0wK|Q-F$eOegm(O7WStFC{Z2T9|um*d>^(GH(68-|hgXf@VOzR8^pm;9{cGu2j+h zY3-1}?jNCf1FpSNQVTZcU=%$Apt^Jp?eKvkia?_<@;VLzSWuu9B`o56#AmjCHbwFv zf-3U-5%WM#*h65Sp2Rd`hyUFZferin<2x5jFN<~6E z9-zSus;&8`1C*7ct>L_gK@tbI3r9R{2j+q1cr{vGPqMEjU!>KlMN(trrMzUiCX8HlTE*ZN_ z(HBzdSo8^ETYO@}px4DS_{K^tko|DGr)ake)IuvhD;T<-kK8XD-7UV#3QxRXmRy}i zsq#_@RdbwOQr&{2LYtJB&@>3jcZYB&ltML?le4zZ#!DF%%)8{qj$ z3reKr5)zNp8rU>nxj*5UWVa0s*0y{M%60o(N?2+sl`$pIHecH1LXW-{TECKxRJb%vjf+aGj_6zdX5yJKx|p5aca!-*?hI;4F`YFZO-sd53{BCXrTY6WpDpop|St?3-m|7;>_;ZxPmpe;S(Se!B8=0K-)Zz`fDhN@^1IVS~hZya>!G8w*;**C79x|6^=JL$}V zxv2#q>YEt-LKG>{uX&oJaXdGVHv@WKoT=Mg*BjfsuiSQ|9SAj4nxol#0+7n;isqr& zv%q^1Jr5(Vq>2jD25i4#Xw8xv=cI&KKsoI~_mTVlrl;SWhB-M691}y-Bwnq5=3d02 z6^*D3FcVwb6N%h}i=-n@6Ks~KFZoGQ{0aF6+Lno>`6`*N8mN9Uc&CKAbGiu2$ZZ0# z@9o?xmrZ2((u=}Nu1WE<=cvhq5glvCNF+@(2eZh-(lHj1hbN->sTcKNk}A5vq9g2+ zJhIo)bTRiEWOCw})eBP>+XdVRdtId%KeO_Nmnn8A@S3GK4`h-~o~O||r$xf?$NA`zANFw=;4$JvB~ z+$Du>$61H(-`pc&Zr0xF50BlXcCsx?HUMaaA>V9iZ@#=&&YZ)$F(1M?J*#WgAKa72 zj9pKTyFH=0ojzTajeDpmcSO8Q{^@Z%A0)~M4JhB!?QLhVwp2SO+S*4>12bE)({%}- zVPH_2;QmE*5Oy&aXIBi%We@Ltfjw0;yHs0uaWyvY*Vc(q*t}o9&({L>u@lAYCiZ$jx?A^X zvc$>Z60u4QhY@-J;(vr!KPsB0xoA&BQ`^|m0X0;3F;slVAomghr|r{CG|Pe&!C(oCE_iUm z*3z_KC+Je*>-@v8a~v7uX9C^cbn1yFX7b@-BlAXmXdV}1YLXB9d*h9jYoXmn2LGco zIFVwIJ9N~%S{FxAxgh36P6m|@{uanReT*oT~(E&Y?rVB{Q<;!XrGQ(Ur; z5uMV7h#|WiFc^W162?l{Jwkz49DM8d*hB|sNP>vb@Iot~PP_H>b#r?Q`F5Q)ib5sH zt*+}ES@2v^M03!4wycX;bjA!kijBbb8yIIn^if<3Jq@Z;PpD4aLdvGNSS#+$!)X9%mY>P(rtT`USrSO5PrkW2 z#Q18Z-Wl78Zo@@X1m#;8a8L{3A0snQ_k{b5;^xstt7{%?+U9!9z%1GUV8E17@N@Uv z`F5dMU0!@wZTlnB4+vUm)*U*PVr3gkCNW}%oj~ znpA~Gt8L|2K_xdKjO-V?peU6bHYTlvdV6np4|B0t)|ICcn-ZOm!!Ic2k^MN`TW(J6K&|=7d0a z(d>iEB~RALn?fUGx)hpx5v=(hz21Yj7IOm2APu92dXBFATHSi)0VT-k7Ewy{!e)m| z!13{vT}{g8^!c$*J_;2M8YBZ;W%daW|u@&E2gt}GfC3s#&N2XkE z-sKoY(hX(8iishO{*P7M#c}a<6 z(m7hISw_*cYzViS1*!F_tD?88rQivpGrY3I$RLQJr0EJdlaBIVlqxXGb?I{+aQ0w( zm@T^#bV6j!CKj9u+N&V$!1Pbobl&l6DJmv$a`Ru0-99ntQ-M7or;4eHK0`(2CCa}F za2IqjNYZqZK?0WT;*>?N7J36(>OH||DwfLD;d)>1b|;ofwrSy(wA7S=1?{YhGe;o} zZ56kX3nsm<1cCE5c|06LYpVI(cKiJoy&kamlb7PNDGN?pZmaDdx<~QkKEl8s+vd+! z_^}KdG^yZJQ@Q=wkHpT2CiipaoIS)(+{ZaR*-C>nNU6cv}?Vv^Jjwr5{Bo z^6#h!gj4L{sf(hA2#{Hz{*yO4f_)kJ1K_=^BfMKZU^RUacJLcVv6lN)Z(1kojWCDYHCS@HY#+qj1=y=p)?vyNGA~%Tpt{#Xa6_pLM zLi(({bsp_K5o!O>-F8SB)({E@N@re{Bj!{o4-CdVdAj!sojbjN?~PF*p+U4X$ko@G zrQReJ==w;|kE(hap>N5cO>orphaUi7)K{WiD8t$JLd;&PWt|K;Or*z+CN(+FV)eNxkc zfe2T`>e-?2XLUs~EyMPSt)k*_2Zd(xVU@2*Aww0=Ivq9D3^W6?M5r?(Ty5!1m3^lu zVj5Y1vTh?zh0_tuVyox~JdQk8aUO=kI7mhKFdFo=-Y8TMF2OiWXk|;ILd`lUs3ZT# zCpS#0FSOrePmFWVp2c2PypjQ?yv`UeMEVzu!k>In5fjO3DW7gb#(@}4Z``jr7@A($ zdnq}qOoj#Mvg{6c4+u|S(gX{afzRa@l!oBRTbcGqMomFHP?4s@AhDNd=^!pEx}hFk z3;WNh(&Qee9Y2O?5c`J>=jhT6#w8-$V3ji!T@Rop9puWQ7MpVMT5;k7PVmIYOOXqN zZb@#-Bu+YvT-kaf6kpOOvaY0Nsy&cwam|x3M2rhC+EWauTk895ADE-j#XVlUVKqte zL5`pI7Z>Vv&W)vFbR{O{rCu14lkYlztJP|oOaO(AN+hhp{i6U@zAGW@%h=v)Ob{$| z$#K@Nktbl2NcOtWW>itU+;rB~Hk{U%&blYiYx5G?fEzZG7QeI3OX3KcZGAb5>XFob zkWI1bBN+${4c0(x#InN!UT*{OuF9uXlz=u>R*dBH`t6V2I_tt|KdyF&PoN0Rn{QIZ zxgCu9CfcyQ7ZLHRvH;=Ci^H8Y=MhD>$Jh_Bw6L;tJOuNtPs6VteEoEFAv&K{>2kyC zf!+z^qORhDQRu>96n4krAZmwbGNCRKopl->P__~7O&L5P6ua3U$vDy-FF7?~PQ!pB z&pB-%2;(6|sn!DI=|LAb!bbRgR2+|N5ZYdc7ED72;i!uwSX{jhhn`C*f;q>W zF|uxW7I5@XifD&{O>8qzVNh&EHt<|L5|IdS$WIxP@2ygRy%o_Qh9R)dZMyR80)ll$ zvQvO;aFo!21T7(eI1PcWOf>s;+L*k+x<%R9HBdIT!dVrwETsaaDsmM;!cib8vmCbcK&O5!q=lcWl04`FcV~*ZE+orl|nE z8w=HDRdJJI=G1RE#^U^HR-k15C|+f##H~~81O*dKtZ3+`KTV4^`SUH8i7gr;V1$q0 zaQjAZiQ1-AG$TSo1!lD5{3LN-`SfH5@Z4F~z>2s;jr|)S;H2}uAS5B*L7S10I1Mlm`8u*Qvw~&9tn__f3qY*) znJ!3*<9mKC5g#|^<_U?k+m5VOX9B|5?z+%H2L>UHa|BZcY!$^=A>I>_NHX0*p6O8< z1B&iU=behIrv=3Xe4utBvXMZ7Q%kWd#?^(`1;DH*Z=Ku$DngQ4F0q8_Mj}H240Jje z*$P{9NO>15w?!M$cPf+Vz_ci-ny_+<2P5VdZI{6mVQ)5#eV6QMAp+){6~MMsxe+ho z72c;Pkz^3yU}UkdtK|rj{fR8Aj+I}~c{s7Mzyc8zLsx0_a#ZlTK`(2hGfs3b_Gc5+ z)ek=E*&a}v?a!*J4?u0;NiuwR1W%-z#fH?51)rUrY{^Tsme%9sG;2~xXfu1V78(BB z+#b60MzA`C?cFQ0`K@WOq)3$50w$p{?sMcu$SG@}QBu~pc}=&LHdGRw#bIhj66qb9 z>-2Vmdz3>P<0(tF-hSugg8kRdFa{jVA*n~C=912r0f$)clGf;6zfVfZpzDAjV(0|X zIFPm`#-fww{2*a#NFC$GN*$xLkaQHt9}~_5Dx1+*=5v{u8hBq|DIn8~SY8>-Qs(u? z4$6XL^O5bBIkJ*`Uv{QC_@?Olv^_P;ozfj*)f1P9LY~Rc0h?LD4buQ>?AVQ4N#IG% z&`p@GBEnmYpArM5q-FisG;Z8djJvuXR?n4L%CsyV_e!gXR$_fr9v-nW_4ABE)H@??Fe-NQfupwTz|CHr#lv5G$?d*|8Tmt_~%IIGkJom4;-^ z;c$=QnmL!28|$1|w=tPonSxW``MrcDr)^6F%}$g8X?)YYmvSr(bqsS zjhtrdveN~!fyt^ECyv#V)#7n#F~qd6A4D5u1~(;Dxoy8Xa!H`FQWUO+m$udJo;`;8TmOM;xW+dk=o3Lrg64V$4f>mvTS zOZRTQ$oDw+Za$RMS{1{gMYqfxDeuu8Rb3=L#5l@M+au3$uJ}Zx4Ss@Dgl{x^D!Gl` z5Jq$5dmX9E7rJ|(GikNHQs%P*@qBafWBLX~kwR7*iw_!&h5Eum(_+O}Xv}t7(w*6 zGk?4MFOM^|*VIFE>r9j~p4`iowi)joUEWTQH@(V5Xms__T19e2+L-)_pIM@pyrF`R zQqz{%epaKs8{KvZ|Chfkj}qjV7Ip3R^RHp}WI~_1V92atkwc>RB2C>*lA&4S zih?|3)7wncy;)_Kz(@ES?4tVE&O*Q@=iZN{~tWsHyX{w#pRVt8gPFn z6+h23mOo2sbCfxz#aK!*xDm9lFqnuIuSS3gr63Gsy7aQ#v2UDK4wol5>wbuaJ{mx3 zC;OP&=>ulEgLcgl2_0mwfx0Oly+q|!Fh&h$eT10OK z7{oPE>+($ELgSL&1Rn@_QP&3jxfeT)YTM-;*j?}33D^}J^=VzSb^4aFs|M&W-*`wq z)}^4@#B_UjwR7f!VE0bk`$<&p%Y+^rMUg?Vnw)Yp-lGfqdm|W0^JRZ6p0+<4(Sckr6guA^|UJ^W?;@Hwh6U}_)|H3-G)M1O~!^z2Vld9Ai)T& zvc6F1FsD|JM=U&s5iT!cLJ*!JGa_(7AXFJ+X>O=VDGG@AGUqhvfO0yQEF0W}njHUg zYP}*mMhkla4D%suH{=k|rR{h?`Lp6A93cfm!yWhPQO$9l!d%4+YZi00MrbfLD@?^W z11zj_HSAR*GOp%)W}K%<%{5^er`ep*%-^WCxYmLyOdCYw91NKpqm~Ag>_}V8*Lj%;S{dsB zwgwbGPVDtr6@)|sWyu@DZ;gODQ${T%?@SnAm6JTmg(3$8$=6VtXtZwj&w;BJ!Xk!| zi|{Uycu4Qul~hY+*3Hn8Tu0CwrXN#p^U3@9BW*+DN%ax#&m{IC{JSSP&=n${$_My+ zh#*@!f_(W`1VMDgSH`+bBnTA#T3W#pa3*>rhw_y@zHi~q;iKFnVma{=q@t@J+&Xaz z#i1s|@KV5RoN37t)uJp^nL6`O7|^JAEcuLX8qGxP;h8H$@K4{QA^HSoe2>o7^JuOr zs0RD$ZR>Np|}X$soM;=0~Z z*Y$FgSB*{ZT|n_>A$B8EL7ohqW3O|<+~{oQbXKf{us^z~i!K11do3jA+PE0XwNfh# z^pKXlr?f89j|y5pd+dLHwIL%`=Q3~;^%RFF2-+}r3T;u}pFER4nf=MElQC<}y`j1C z5b}17ISi{9c&h27Wx!i{BlgcNcKrpBDTQ?$nM%YNj1#kZmw9K7x!m?fDx5zgyv;4$|&E{yZLj>M}Og*xdF#o0|_#W2AEV>q{#&- z4`e!(Wd@a_WC$M*J?2oD;o52g>vQ_j^^xsT>=iO#CvvYn^W)J&XIR~IsjRkJE|qgc z0Wi`z6(@8`>Lkg&CT(18>tc2MDsLX&iGPcBlhi3m-2pG^+z@j&@TZ73 ziNnVwLTV}Ux$_%b0 zUiW&i&qlFudyYKH-7JR4F3&DnFG6Ge3tMKRDIyVGn!{)~V#BGJj?lx;#1Wd~;&pg9;r;G}_XiW+ ze=c1{;RwgN9OQ@Gu?bhK)4?Tc0g#JPai=1org)eJ$wGS|0pu$-KeL&;XU`i_=m=EySHC6L9Od zi{Im-C>&B@Whlx{tAdiuu{-2gH*VCY5J(`|{8k>YEj@}!PKS=KxS)rpQ&g03VAh=H zz`BSVU34KqS7YAz4#rlfkfTWw&WRkmm5&P0n9d1BLc)-2$nET?_*Mi8b}aHNho4G@ zv+H5>Bn@E9!LLMU9*(Mn8??n6wC52g3y`0v&`=hOqk$WrMD9gx;LW%D;n94v-fUFs z&1z$@iZem6H>ucAeRdnBVuA#lK9w3NTR5!3R5h1t!G*ZHA1++vl@;pel3x?vl& zbt0Hm^wRB-Vl26=e5oQjNFFUCy?tid>Sk+F4n%XJLaDR5Vdyr9^ zS@_{gYn>*{Zbyq}q{Wv_Ycq4-TO%ReQfHrjrgiovG;)_%unALhQxlLmIVZ2+wl*nN zO|-=#OX;a(#XJkD1WJx^S}vkaG%mZMwbXSs*^}SCl`UrHswc2}$Zufw2ToTObTJ&I z8KK2wQc|FxHqai7Bhm?vFj7r-^7h#;rld*O2ITDE7zO4qO*ucx+k4k=wP4jk;$-Z7 z-SRO_g?87k>kL!H$EdA}I~Yr4qZpTyQE1KJjl2ow21ZmE0Ls2LTlsP2Zh)G?8JV4v zSr8HQ{a`&^6PZDzkL=0YvRmrw6}I*9X=Yo0=%eazE7@xtw^k-!v1rfv9V3v9%%&I@ zJ(P5M6I!XRL2z@{IZu|Govf)Zo+qmw-;iUF!eQLLQ}x6m3-cxVx?U!$h|YldV*Mvx4^J_6Eoochsd zjCrjmjqZI6?$Q{3ZSJxF%8fdHr6VBVf^0XOpE}!3{A&UK+HGJc$=Ius6Ai~*q32Bk zk$z?M3!_*Bb*S|ifj_32ADa&R@tQL`4#@CLD04A7K^V<zx;8IAJ$Q)QyutG z1l8axDoNV&D{i;3(q39!=qxNRF0{LgOG_)g=7aX?!h=S~UGaK#{MK8d8lB<13@rTd zv&QP;O73vB7jYzumr42Yq0!QcciRbtQU$X-MWeZ}IIA73*>r*`pQ)C>UC(JH4ET%E zsaj6ttmU1mQJkr_uq`83)l84D{AAger9nqy5eF_ztlHEGgZ_rrfPVtpb~Fva(oq8giI|0$M05?BFY^x z&w--o5%96*~8DfJSS96QGTTUt2QNp;{ptLVWXr-Z(qm~`RAD{5^ zstU_A+GIRSqBOZsE_-1+n1F?&TH?MKwEd$onqtyjCmIG} zMsG6t(SrAn{DDY|-cgfUL85_S;xTE4ObS4jK*kvK!L`0zbVF~v8$CZg-4S}-jZI8* z!OtZ|M9&@c4RH8xSyFtkq%wK@!A6BL!1CXlHkgs~{8T_w9~(%T68vjzZBCiBY-+uK zbV2Ai9>~lp=33EGRz#AeXy8RMxkBu8S$)+ttgx+tTy@rq5L~1k*vRPRHSIH(DNlJj z$EBy%;UD+|zwbuN-XYpWR-F8t1#UT5T3(#IPbKo~q4uq<{+}++LU! zO}ABkhaS7#Wzg9iu(^hI6TvhS{T*1z31QEM_Up3iE7SD+kb*YLP-2$s7pZ7*HVH{p zPm(KI>)J9ZrXb`-Ql00J`m+uNIt4O(7O24bGL(gCXzGyqMUmArYHVu=*eN1zUgerD zotbQUW~OHAy58jpStV?Y1hEcju46I=pX#^Zd5X7b6ty?H4~oWUWs5E~PMa9>-iJ7$ zzb7fmqGeya{@k*e6tg>Q+=50;+h2TvS~pIQ6=Bd6{DO_+5duUdIJy_>ZnYvv5xPc1 z!1~abAB0e|{(!G7H%xJMv2X{G&%OVdDiByA0NDN9&b789HxfUT~&+^k+)J@VLzvWOz?*ul1Z9R zm+ha!p0n3zEI)9xs%(V~V&uqjP~@hU|9~2vOW_*VxDskjWUU^}YBEbv!B_bn>Z;+{ z@{OD31X>`lY9nJVXGX&lp_s_@%+B22fC*YLT}*Xwk|oC#`;mJWCYN5fEEMy%2^>q( zY<@^SGoF zE>#tZ(aAap>ky`8CuR5b@bzp_mY4b`v0$@tx77If^1_p)x!dD+re=61?auL40-4){ zmYXzZL;gzme(`VLIHk=*yi|eX?uaT5-Lf6i$sdG}{ zwQsL~In*F!I)eBsaq+dei{F4`d;Z3G;=KOx8*AEhOXkuYA!(;x2z#8LIxj5YT=i?O z4=>ZEsk6C_G@Vk4h+9zrxV@C_D=#I{jj6z_4gC0Cx*v~VIV~5CH`a~pP4NDU=_X_6 zT9aYb;niJ*+z%FNEmAl`Rk>rBY+ z;ohX*dY)%X+A@^r;Dofrhp`s@guPCjJqnp8Y_{oFLH)5-e;nZQPpIH&6|l3iJXSdn zVLAXIg613D4C6UYQVxlAr{*^KVK`)KyuKF_y4_i5ug zItuI=^+e3Gq4YzqHXS4Nk)k5`wVyfb6kNO7fMU~@o2tnS8km-Vw}}7~;tjNlV|%FU zFJZn~R=$PRDnoAr;-J;NFbh4Rhd=iyC}!4EMPQ(@2zgqC#W z^Kmjxa;H>X*1(*A)DZ?G&*t3zr2Lw4Aq5#PuA&YFLf2yjHOfnHx?>$%Chmy_YG?2Lwe&RkvGCRtvd~&u>UsY4Z+~_X)q9-==^S1>eo<=AFEkhH%gfD` z2jw+qSLzF#P;g(YW;mz2-?xXOw`2qL`bVg){d(*JONJo}&{_%EXxp`1CY|JWfSs94 z3omAGfV;JWKCuh!w}00+xog2~`LNiVGonOYAr0y6T!BpJwBhHI!R>2KSTWJHak~ZH zua=L+?=^SBzCRXJ{Lc4*F;x_WzD1&TO)JkdVQL?v?7Xw@9M0WtDs1un0#fMgIYnlTjaFC*4#+xr@-{`JipRrROhS?A_a zPnEQ7SgxBF1W0(R45R8W@&|5okz4AwQ*CL?%Ev0Xhh!_P5WYwmOBAB?cLJk}G55C_ zbMp=xE9&0PF~gTW5gUuPIe{+OdITfo4czudXPy@bk7#rxLibv9FK0Jf2BW)~E5BPP zur`x;UOOp_p~Zcsf~32Kc_ip(?+Z?FYJU`z(-EkV3_o`Zo?cUgcMnoWO z-K;Ae*-( zc7cHrCZR)_$eyDD4p4pW=9zope1$qh%;_8AyszYxF1udFIyYA>M@6GkX{n5VnSbJ)`LXahHVND<9IssMOFh2|nWwq|I!%jX+vU;`lV?77w4<3Db>{Ms|6_;|W%qVp=EQ zY2JL#h{X42lEAb>jJ6_knZThLrVhS|hvIa|l)FyX8i*pD10p+T-o1!)$^!K>9ZtG3 zUF)wc&A-t(>}R;qZAR;tP+=AF@>*LcB5p%ZKEsY|1>M8Q^)Y$cPR6w@$4RD8pv!f* zLS!MPgm9lX&k!-5IWX8&_eQv5I>&-b47;#VgbNrZLxSCcL8%#KMB9x*KoJCr2j$0{n91qkMS~Vkqd*}yCV?eV{ME~Hi-+K0HPb<_L2dug)Ea%PCatfhPXFqY|z5|eq< z1#n(dj$nm^Q)VZ`lm|W~COiUS3S1OL`aA}qrj0t)upN65^h`usLZ{g3Ss3-Zj(6^2 z%W=Z^VE{6buNO#i3E^O4`0ClS&z>jm%Bc85i+Ku}7-H0DU|qH`;Ne5n($;`wn%`%F6F$vS&;fN9qzVDXoH7Jwt+V z$!itW$=jKsE8%_l(N~Y+#hj{v|5*(|dnG-#!C+oDe zGf4BwnxF?ao&D%If=BWoLU=x2&|q4$4xR#AfioTgi|e@qjKkX*i@XOx5^RPJ3A#YB zowaz_QMko0I7MYqH=PG}`lPiBt3{`UiQFHG$G*11_|#Hpnl9W_G}&C-CJ$?`PeD)_ zpIaa@3A4^OS6#}IevXr`jS!7FV(%2k>;;fIkX4}*oI_srTIOJ_yc2dzZ z^DXcvR9v5I>)(5pl)7>+riL+1hlYoojo!BeZjc_3w{5C5^`2r4#S>#qjhrbo4^F*Y zn|K2Cguz|PS=<)-Jx8+5vt^%@MeJH(btetIaetbzKeLTJe>@XeiJ@(4ey8VBr#3ku z$6#w{aedpET3*i+q{92E2YKf|>6Ltp%IJX@Xd0?y!4^U}ch>!&>zx~!J1z?(Wqh?h z307A9MP)RV{&#~kOwbPb8p~M_63IToTjhqk=a+~b^Pao*#U)ZSz3;B;n>Yhi3#6Rd zvW+TcJ4z{v3pX-VYfh>*1&oDD!I%tiIBc0U;4Hs?-+Krz%;z8wc=zvHVGIUY7}YAk z7!0y7s#PnDPTweM)8bLFp{Z}us?3o&0mW5Nk-KVEAaQ6IK*-)DY-@(GopW9f-{f`a z)C!G0AF~HgDS43%*k!_KS;myWsP_HX67vf|jQXk@SqeOt(|5mrnbM?w4bDWXm7bm0#5OjNO9{|pz)5{dfQ?DhHYXod*s@V$OWu;q zrER`1>-PqpH}tS+i!%nsv=eR6=J!$sX!^xm^U)4DM&7 zy!oRdb(y^kksWazBM?VYGy&fs3-qlDqsoeC07LS|CyZz%}h5>-8(+Zjbl#Tq`SCLEvVl(x%eIA zmUW3Ba`e(JeDm-3{c&c(#|V9&F&O34w;i|7t4jWa0K>o*4;nDAhsMO%2k=CFL9U*c z@OW$wxWfzfiizz}Q4YfLxmZ|L3EBKDJuFFMC7#9W_kA*m{nZxg(WPMlvh`T z&t+~xw42+J?XGuOP0NYR%olx_GjDfJjW%v>ZEn7pPfmJlYT5`RaFUFD%A~f3qqEdC z@9x)x$QAZZn(w)`FE2YBy393uL5*EA1sn_A93;fu2tD_9`OBrJq}riiC6kJW z2UxMec;1Q)tOu5DL;`vfBR+W5)gP2?NBoY0BFJwrFh9{Fc2bzG4En}jsA>5Nbtr!s ze!rTj9w{sdJP7)89hdrZ2=D>$MLmk(T6C}=`(8AuKo7*_I*&f7H3C`wS|CEzb-uJ6 zKM|-a=7ROdw{uXeX+|SB^jOW*W8pxslR7W*!xWMmg+FeOL3(31_z>>nygHimv0)9V zii>UIlvn##7|jf~2s`~LcW7aUu5AwjEvfOUn&B#X$Z!BK25rMlHz;w-y2>hFlumDx zy8LYv1SXYCC{~KCu0*&lb);s{EB<^E|K`%|Mhf(T3Sk99Q2sEzG?v;6GgQme3|7x@ zoIR|6Ojnb&L25>5edGXd>a35KN%FAuQ!GGr0 z`wN{VC%B3L&`nQs!LWrh%$t#2 z1*J23OXvL18-wsx0i?i@Z!lg^4j>faBY0CSyfTzDPh}HQNdr|(@0{s+H}^U=^wZa| zIe~W%up9Rs9qXu85ID}qzCk7Cop8=7+`(Lzvm|#g*v(&`qq*yIwygDe$UAq!3c1Y{ z?2P#gKD>S?1|RwoiV8HxU&N^-%hC~d!}}}SdwiLQYBstI4WO&}u=`o{-IPU5SeHo4 zU~s;Cx(Wt?etDRqb_k8XjA>Y%V{)HQXoGMbp-saQdYO!{uw_K=;LR&pe;^B22B$}( zUILC*r|UVathlXlXL5tqI64J$YN;ARaIOV5p3Naabag_;X56WmAV(YBKg1^KgVDJ7tCdAd$gE*&BbEwDLs9to%)kz@E_O%eZ^Pi zDJV)79xW$Yd`441mjA+i41pV4a~IJ6SEiZ%EP~?iw2ds_sPWKv`lm+dIpqQusM_-P zqg(e|&g9$5cUiaRu(OwwQm>}eOY>YqWrQJogJN3;BgQ8((%s=G!1jKZ%EZcO!T@92 zwJ<_#gZ+px5Ki)LrIOmNeXXmjYR2`Y)4wEFjzC5!2Dff#-SC-z@Z?F0Qpcm~2HOWT zuOHoL!%EaII>-Ce$-X>&ev9Y7os~8xOflv}nMi?Gp$uYCv97G_5!o$+hhV-{WAx++NHsvpw0ET0X2Yn|hrsUY;=%4lHSN`&nV?T>)OVJTN%Lx` zrw+&VHto(;7;_aHXhFi1Ob@rJHMwv`GjAqx8LAwZ*qiqKH6@f4SP8V`hkAlgxpgt^ z80H7Y(h{-6*pWOZmYGyMo%RADSJBHpQu9^n+ax}W#Dn=Vjejji%9@AqhGfy&z^N!H?7W<*dV)mO7?#AXa`@{jGLO#sTpXh z+{^l?f?sWK-&8BDYV;W$Q=SBxCPuiSS|kIH7Rq>iZ~(h5N}@9G?4Tx)G{k#E=rQOk zWdFef3bQfl%SlzsGtM2|!Sjnacf_&1di3immvFZ@WAio+28h9IFh{>~nm}(dar6SN zs|oHRJP3gZhL$s~0pZ3IPR~6)0Eo2pQ>UGU4%MB7V6EAH_Q_hGF)133+B;+09RWt47_B|?$9_j@CGdZ) zH30b@$p*8Qi;`F*ZzAp$YAn2eiz8a_4@8EZ9b?F>75M$d*q)?wU^GN$vd_h@LeI7m zUA#i|1!W4w69KqBg_03Q=&%il2Lk_-R3W8vN-uw{Xi}{*Pl3dJoFXONjUG{nWP{41 za?lzZkOCqjIX$E2P3!@Dacw^yj|m;t1$2YC-Zg$>;U$2(1#`G%>+DDGXtQ4S;T;E6h(K`{BIo1hhxGzQE87Br1v}AjAY> z2J9C@u%YM!v$;?xlVm3{;KDmOK^>V$2gpA{&udiG4mp!)_`8^eU+}{B%@4-zE>b%N1k~PC>bc3!N+JKeu&iUR;(Zf~HDBsu1G{604 zMy;{G|C*RrdQB+#GwC5J@aZOu#)&$g-*sAV$4$Tc=EdBz_n$?%-xn;hmXkxDBt)OP zU`i&Izqo!;H)oJ0E|DPT{qYCm{TWk7UDbyTIhS<0^|=-tpMLvKa+?-iBvSUQ2&d|d zw^_-C?v|TvV=GO|nhoSj%jI*Q$^s?g*^XoJY?4j$!+c!{kCibob&23yqXr zC^4};dCTNva8IB&P4v2rF3U2fYY=guUyYrLJkF|yUT9~hf~OZcR?C$1s8#?u9t1ZG zJ58sgFYYh6cMk*Tp)!?z2g-Qz0cAazD?my_EV0LeN21a;c!uj0*FtY((@9TZDd^sl zvKGK@m`$;VM14C#wD7fOeRmAQG@Te$qt|t=CB2twCtt89WC^sz@K**)1tvS24zAP4{PhwVol;>C{k5l8FOM+3YtSUzqds_uy8 zt%h7K1SI7UdsbsddSBK_3soJW=FfpWv}R)r4HYl7{RnlfEvkEx@WEPAA}4sJPMOq7tMlz-HH0f*eYE&Qu4v8F7WWt7LN zdGdsh--DOpB@$ps(p=0n zz7YV@{gG@X%nca*;-c7Mc-O9~!zgVLy|87ivd!4PjX9jeQnuAJ3k80xE7`to$OAt%GS1M$s~7nbu?JP23m45!g!baRxgM@otAOa^u_$jO ztl`8lqR9Ca3yBp#&^btrKZ?44xLj_TMMliXi6u)m_#R|EY2)H_1k!~--xon6S53K` zgQ%zb)Z72cNWN8yAuNA}B_y>D#xtN9^TM~U9ClQpYd%x^?jA-A4^|sxkPsDjb>TwL zrY=t{$2ZodEK#D(q%s8vKI#;Ajum8sKKWclGe~Obn+~sIug;Cr|w`O=kFdg5< z?CQ3|YAI!Ls`tlSBMrr|6~1yypIv@P-c&ejKv47T3teR3N(Oh)Rf!6ay;tdSg;Y74 zpd(OP+vrWHf{pHl@Q{L(+DU1*2i<2cm)28+wl3<>s~crx$kgyyV;7>^hPI!&fsEET zz%PaTn>ljXL?q~SO|%?=6JNRn7+pEQ)6#e zyUCh>Jmw<2n^C6}dGUf=0+JND7Bp4}ibL^Ez|e=|VNKeMYvNDnwnnk@W{AI=_$vd5 z3oJg4G=_Mj%7-m}c=k9UJj-FvWqTsZ(&v1`@JKxdwkwGJ8mDDKeT)1!Ov~;u=A#U{Q3w3%k-Akg|oeF zn*AHgl#ioTP#&`Cmq!cGV$92OYC>e3)uw zT?FHm|M;7JU~tvA^h5^IgiMaF2t&$DM+^e_A* z|9$%GdFww~ThC$eXB*Eqp2G8uji=8y{-gO&lh%J`sDgkYea{PvzMJTrL@|&9RlZ>5eG>r;{ zJBe2))It}x-i#daQA0p3NaR`NjBSxi0PptXr{-9g5>7=yiC)Mj=@-$5cOiWE>3Sw? z4B|tBGyzJLAzdx5udiWiBgm9%dCVUN>qp&#&T+3(2e3u6x9%7N=7kRk$M~SLSf4J} zW9u5FPHP0Lg!C2|Z{Ry2M|*k0@Y?c8ivYKA;IbF9Forb=B+Om^03*R%W3}Bgy1i9n zzuoKh$aU;p_xy*Gx97&Y_Ssqc_`KWc87F7P!O8Jq_q=;@41c{c+Q+{bKX#7~Yf@eo z{w4?}`FNpli!R`{9RmTcU8H%C>8mjt^~@UC#t1DAC>I%1+n+ch#~OOxqu0GNaYAt; zOwFsYf(HaV6^F!OXaDW%*WKgS(QzS<3G)YYPP(-HCQgOl8d%#EYc*qTg_qO(dX>rAeOaF|d}xN6r9ZX#W#qeY`{kXj}nzmWO}qzV_0MA5AXDVVte znBi=k?YlVjy(?#62b_tB<`+8b06cc!+CAt~C}hTQO_a#qyfRoWxOMxSe`;(5*3dR8 z4()1y6IFVBLt=1zTSb#6rH*h#Vgimvys%XOM65fJMuZ~17-8tO53Cy1U>M)3m=Z-C zh_c*HGMr3TiU3Z=8omG^47|fGB<&-hHB_9*royy|4zkE!A}mV#x!Movn{?a)&77U| zf{)IWf)Xe2@CT6lV29O6WlCU#=s5|GZV@K{E>7OQ!RdwukhOydMYTEYJFXFqcUO#` zpw*G^)uNybOxpp=t$wG_5k0+z!lPsiaVJn*X!2QACx5?>bccK#!=7k`p?~HsE2K1{ zz(ncn`IjMtUxSi=!ry8i8Twx=u~LhA{O7NNzoH)=%lx%9yi)S>U&gRfjsF#W<`jGe zvr=E;#dGt*^2IyPQ{VDm@Jj2o>vXOh`F3Yd`<9Zu4tLPIDc1jS>$o-S$ghsKw}%lV z_?P-_^A!NHZ~2`o_#1xT-iAML0R1odwLfY7+%s22KXS$Y0iWxC{aiDCuEqv9Xmzd( z)#WRmt^QXu)n1T~K)PQL$(qcjcknV%a#Lfk znjrESCdCTTH384R2|6u^fLgU56qyQNRS`K97Y`%$@Un4P)%o5wD*PuTx?Ni?#fdGBT?R(aFk9VyFYYhtz-$YHjW7Lce#^QAR&&-{>Q}F@0S~+@c!3oKHX@g z?th!lpKpD=|9ys^#Qkq$E93t6?|%LJdi(qAx4+nxY%U|gds=j{>jNK#E8$+^5lT++ zM~VC24uKWyrN*Z#p%n^D2RK~urLheBa6U8i=5*%X;$KU=Zbt9>7R4x%Tn5$KO4EX?&8cj^HBWXSA}Ct^Uwky+z3&qg6ZE>Q}v0dpy0g(ybH_ z+@OcT^Q>!{%)qdt5jpJuC!N;MkDs_MjtM*O1JuOiFbc!@4i`0*fo@W zM>Es=bV$&pM`*5;#_6hA6W+=qYL$*OQsxcFk6kJOXE6TNU+0eN zvg7ruCKtIA&qeR`V21zPu8_vVh%QS4PS_dK*##WZqAJR%kEuy*(jlpMRLYa$p!Q5g zq+l+1eR?kQTDYT;&l#Mj!XxmkhCEdF*)}d_n99X?ugrkx`YZCrpgPGWlyL9>>%2JS zg$Jz2o!KZ?;AisIhr z++7OQ2}cikk0ebOX;6uN`Ep3ax*~GWARuswB>xYTN40!9lwYe4!X0WR-LOl&J%*M4)lkGDg*riHUBV{G3#!CIbn)EzMyyZ-0q_2(IL02OW z)8SycBR+UVe7}m(_z26&(RCN7*+8v6LpL;51uwM*1C+q+U{&f?)CeYhY|73!MRO9N ziiJd~WSMVCECC4X7xtLLln7wbF403y3Lv`*IC&J^$KueD%W4uX!M|v|C8ttdsllbf z2=>a@^QN%ExGJK5=vZU~2as2B8mqbU^P~B(HjQybV6q#DVRYcqCNdELibXSwR+7DO zG6c#jjlN!9WKLp@$r)^)gSThB4$}bn@M6efAo5Y8l}2<$2bd#?(spMP!DHHtGl3pS z8IlGSiwk{ktOyS&98U<9A01tvC~l0fVh>i)Sz;)Md%V9^CG31!ZqBzZ~J3g(t;QZ5Y!e5PX#-E zhknLz!-Y{r924@-C<%(pC&8RsFQ5$U7L&@T-ACLnlII&q3u0o)E0WDI-BgYLp^gR~ zi0l8OxsgTtU|>(fOB03uk3HNHJ@Q71`*O*a>uc%V!Z|Pmg?KJ+1K5RtX(nRK-MhA~ z`bh4;_eoHmJi+)NhCdpbHa$-+1`qa521tZrjK5J(A#-@i34&QLWlJ30U3GBijN-wz zjXyt$=bv!-VX-UC>Pl=S1YIlf12`fbg`95&H<&LE2VPF3J#vQRqb}OTc<2V=2$R`r z_~fRD0hczWU1xqX8wuBDyx3y$IqA0~5JPD~O$nFgWc-r9-ih6Y;UrD1KYCahPo6jw zD66?sl0I3it~fQt<{#jW3NMX`7mz@~dGI1sle8du$tG6m_$Y6DDblFdlW=~}9UKKe zko%YgXcB4bd-@ym3>Y27Pu4lk<$H!4m&3x)0?H87$ISlUiz@P}#I*=U`(E`INA-5( z!N##W9V@I*j0{|b`H!=7%udvXcyJsvJoq^4jXjx$7^pF@ZfhKU>h*;d4&fIGr{cW< z*LfW3p+=S*z@QMJhW2?53*o*$c6IC=_;EjJ=`_oFgj3u8Sc&_^;?I*O0c;|-Z;Qoy zDXuCM`s}fli0n~xVo-)UnXj!Jh+F`mCzgtRc4I(((tejzc5Z#ND=Ap{#@K)xBmefF z>Nk+_)iqLgj7|2Rc7L6@(QQb208{h{9CSK;5;4~I45Gj~D&LL2fH*HHab_J)UHF^q zgYiGK)B7*IKl$U5vARy(|HTcAsKouaP?t z|A9!Kg;I`DIZ$B=oLR7{8b(M@@!o{2lofHHdJ)pg%au4y>3a@BOuH zG=Sq{&98(7dhG-`F2H%rBLzCbuoNF;q8Xaf)K}WcsV@qe%<(%q7F9QaN+`p3U(_WE zMH%I|CUpR9uy|M7+kf`QUNH0RZ=0V`84C}BOJ}lu6{6lSdie7;j)i}t4wv+`jRaz) zEigwM=Up}nE{`S9Qq0L;hq?PmVZ7@qtf>C08QYu}A0t1DM$J6WPrYdbdNI@y{Y1|+ z>4TGccTDTZ{Z7 zoK45_kF47eh^z9`$tQN9#C5Cqe)W!wAb|5& zKHcQ)L*~(C_dre%MFflYq9BH=m`Z@PVXn{>1i}%9i#wp1%<7|32ybtkd)H_){nM=Sw)Fer9bGII zv~jea4CT!1|7D>pkUIduY@w0!<0}vaf=e1If0z%&qm;&KFOAh@A*+X+CPSWika?Wr zJou)MJk3NHl0sCZTFjmBqq6*7X308ohIZ&o>|(CZfF(f6oX0QkhrS*j#M43$ z*O;di16h8slj6bVjguM`Ol-F*5vRA0d<#t{hlAMZz0iOeuV1EkbLiE}(UnBg=( zr{-%$2adU-YmuV-oC{GUjjFihftIS!^Tu!@z%e5n5c<+q$Wajp(@Z~s&pS0)q#@p$ zv@KFl5lJ*!+(A5Sf;wTLA5KfGxsrv>P9ZT=@4`yr5VskJtQ$omu|2k>WnCq`Wd2sw zQ9zHXCF}(996?*{E0itHal8(XlDhSkm~?H~v&Ou?wlrBg6tmX%W@yH%+|-QQYI0#D z9Cx__>)7Z~{iyq*V;R^0YNe^xj6bTv1KPJ0DFhFNfb&bo{}Sf^iY^@P2%QNK8Zs(y z*pNg^4Nb_^8sE*)T;SqfN!S~dCmZe`;eI~^N<#Y@pqT4&ae=kDsIuKx0FDu?3PE*jnMIo;VXRd)A zQUyJkX6{lr%6Q31vLPECOD=}9pil9g$TVjhF_uFxh{U4xD$*GWTl+V8G*M>9%`O7_ zUo)6(F4gJh=phII3uI-s#wP)KEo@lgZ%b;Np^ZaY2$mE~tGLPZGl+Yd)p6MYL>#O%f!D8gwhb~DJsH^-` z2od@zvO09pXE!1aA#~&%-Td_(i6t!)?h|s0B*F^r#43^3+sE0g=*K)(gf9;`u^kWl zHohq3lqH{*M(ziKJWpj@Hl~fsCG_IH_;&Wny{G;=p#lNoJ)~#kFNj(6SY|gWhsFCv zYoqNM)%zNiaF<`}4bL^_FD#V+41av9O7XeUkpep*Ke!s_6hKBex=b3DkpnuoVWiJ0 z=>P@0hO>d45XCmLZyff8)ucfuwvl*~P?%-s$Rzzb%*fC-OMEU;*J912r57+rg(GcQ z!;{^%5rx1Id@5@wxVqjEr#~Pci<$B$L|0EEur0q&S!n^fF`3^*0(bQ4p{xLGr@x3H zW?%=7FYBhMM2WFa@CRpyS;n@v$sAxj;W%Yjn~%1?y^Rrg$!9%V)VLJgXopg6r@%sD z$|ifvlSRg-;SRM|>{&}8Xv3k?M=cs&d9cDF%-9FPJ)~p^v2~lG2aTqH^KFi%C2uYZ zBmtF)L8}bIR67j`P*)`izeEZg6gsqc zFtGeIey_{n$3%|>%JH)5XUIh+C(Skt~ea@;noBdvFkP`b=xp>dnmlR4MwQUFQ5 zn+wyY92Oj5Pn0hjlu=^L;k3vgNzokfUMmQ^ejT|cP~uuPe~x`aeH6$TNy#K3XfR_V zahcew>=ntM%9`$Ao=aE(nJB>Vr3j6$V}cTJBHcYHgMM|=Ew+!yg*v=-X`NE%J?oDt z%x(I(;Qp~wXrU~YQWS|2g-&xR^zITx0U{ETLK_!--^o&5ev187bn<_iOPj1KtM6%g z>-xY7Ei{SDwTEzH^7%)p^`m`@Mfju|McP2v-~TtMU;a(1Eh2i6uacZDp~0fhvQ${= z+l(dCNW;AU)wG8OVPf})E_o|cx6rt!riLsf@K79=iebjYG_ZYyYd%*P9#X(KB35iJ z6@3uzjpTy~7eBGw_=zUPD)je@SBb&&JbeypF9P+Q$SNY5U9j>@&6BWKBge`b2E=mO zp2z<)`_sDU4?aCc-VpCl&My!-x#4p(`ed4^_+ZspOXih6plsr@?u{(-B55fQIdx?% zWDL#Z;@e5UFm50o=|mu6g-nF7c7z@3es5gbH+6CdUNg*s z)oYI{kUG_53cc;=FL2rj0R{HFe)CfSu|k6ZT&v>D{ztn&84R>|GdV7bx+>%ViO76ueoX4AEmSkF;9|W(dYqmecGHf$)*6@ z`)T_$Y9RkGsloWm5KbOHCJgf$d`Zzm6E}~t#mzfdI7{1-e~imKaGa$qc5Ly}r!NE} zoccbx-`MqM8+BQNXTS8$Kq-aDYG3q6);AHaOZ7ldQ&aC>+E}|3X*@m_$s4g-FUQ3U zMEEDlEqQ8`^C$>agktFf)9wm@7{vu%PMBga;gc{mG;b#83~K&(fnvEi4^Iw=ko4ID!;QQwPlE5q$UCpCDj zfSSLvD4t9?)CEx`7_|gZ?6yTp5FICIn@uQbWbAhcTh9);2oEc$Ba@~@oy5J1{$?~w z-(2`->1dAKZvLkEX+A&);@4%(Q*R?~Rq5EPONRp`wM+(-#|mR9=~$lmVjENXRW{FI zZ@?O^;1(|OYIJ}TQG`;!(T`KkiOOt((+%cEUel4Bj;S`bjTtn5VTJ;e8Ig9Z+02Y@ z6R(OLZ!5)maCk9o<&i&z{*@)Flna~qTk|#( zPc*+R*(TFnL4TRH-s^8urtMhMOf#hTBGYmcgZz~%{!C~;6CLEfkSed__nHDIdd0U$ zeZaUlmFOh%W$KiWifbTx3I!wYzg(9niC}|sQRl0xU&F%=9z1+ZbAIA$G z7JtSPKcvf85jG2ZN_RGLROOrt;>_=RT&>kI#@yS`^FqG)du}X^#)?b_(f_EnG;dva z{KmR*Ch#B`_l<>fu@)Rj>tr}GP^@bRx|E^z#;&pP^jU2s+1>HZOz!GEJ?hzLNS2*X<*TXuJm(g%r)n(R(aD0U}Q zMU7>lIN2R1v=zdex}eegk<1tnm7N@Ghq2aZivHHXh6EN);ns#o){)S97TW|W&yP&D zz=;7O*KMgTWC=Xd7g8QIap7RipUTpvG9bO5dV%@jrAk_Kz*4-B$mfi#2H^{PUiVL) zXajVI`4e#hElZVpT$5Le01bBQ{9=QUNd%PRVeGJKamtN)?DDHc%Gfus4D|=}&K|eT_%0C0g>wL{m@V;65C2$?P4N z&49auV=)#GYg8~l7}uh8UCPXUWmoYWTm61jd#T>2{70I;@s0$lXp?(eB7r6%fk7&Z zM*(Zp8pp7eLkWU> zLecG(EfbiVf(R?3grvms-FM%?rUSuHB;X>iD7Hf|%}Bo$RUCzr*(-s~qS_ zj_kNykO(UV@|EQ~=-b0W3bAU2_Wh=@MjO@}#?e#7G);eg5*vtjw6MdN)YL>LksD+N zvNiTsg?-uLMj}H|91u!G6o0f%MZcBaLBLh7XN(3gX*vU)Jy3N7Ts+_`@$UbDy}uOd z1Z^7=n-oj-Bx`C_eUocql&bET+^0cnV-pxsBED`#=q{m?s5U@szX|S#*9vyyQpv(e zFj1+tXsctA$7nYqjROERO%wrAi%|Okv2*5JvOahM8y+Sp@dsgJ&C}#(M1QOs$>l zC*Ch`L*skEma(09@kH*zoI@+3XNgUDEu*T)CY~=y&R-5Smn2A?l*>|OY$?hSWx{N- zYcMM@{)%TCs7m{LM4xSG5SMt58^%Qe_+~_iktuW$I#k0&E?kL$1~yhi3aHMzgoS&a zj%R_vg)`M;#lYs8s;Ec9Zmx`hc*AEE3DJn00b5>i#x+(z$h@y8O$4Dgg*6>m zu~-lEOpU|D!W1V$#m>djz!nvXDG>d{u}^wtx+BLNVmYt`bFp&z=?fc!Ign!$MkP>M zex(>E3u1n=BG097vnZr1ENEJ|?Sf11+SPLIliGs@(|d~Qv5Az1Gfs`jiYDHFm(C;! zOay`68AvKzq>NQM)Ea@5t{dJ=bC8NrSgd%lUh7m6D^Yo5THw%fnZiD9-rx;^$?WS` z86avTI@ZI|3)@;KcC?zQ4ssi`vBBmut%3S2wb@`>t|gy7iBB_TEt%^-K_5g&ttx(! z8l>zQ;_A6s;wOfzY(y96cw%e)Flj4CAf*^Jqa-dOU877+sq{-xBH3ed;1Wj(>r*3; zMAB8v?M70mC8@T?Q3MEEA~l9eaL%4U-b`eUMq8#j(E4~iaHVu*gV4_QC{}A*VU&5K z#37{lg%StM!b7|uIx2G_fYS+}=EN7JE?rqtN?c$o&eWvS${f$vjLFp!H^59vi_=zu z@Mv9J^zXC#HfiQ#Jqjte6gj@baEv5Lh>Wk~66au6@IYFpk9X8G_H^=eMIQ9zWem4l zAlw{QRfeFgjZdr0N8ua;c1=owKx7)0z>AnH71$8lM4`}aNAUv`0aoAy9?y4NquEI{ ztZjudqL@7SRM{X_8H6J3HGqpdWI}R;hcT0?UgUhL&nFQn6BO@-S~eMLTclv}uw`c7 zCo;4e=J%`?(iB<*t`n&8ICu^bgPloT0d1I+T$90iF*oXLVzPEMYriotLKan@W_G5< zy_r(~p)Pv?R*WFB7wM#M5KEjwtPTp)*!tX}WA2bD1EC}Gsd&j=Oo13hC6W|>He?^> z1=<^7dXJK3iM$4wOFaEKoInZ#$)>2Llf&TeS?{@5sWDVvu+lg^yNYNV6FK>7ttfkz zLj^*MI>Ri5WweG#(Hu1p?4N}5K$b+i^#Y5+4#eiC+gKuHSadbW+85u%4~Z!0X~xI8 zNTaf!YBG!F6)3q>k!Roqu#Ar{6Fv5Fd&F5S(4EXbn$;Vt?*5dCndOtLDVH4YlSTv4 zj@^U%w)FR{tmdTL%2;8N8-PLDz)L5s|FLF6DUg)R^83_zc9yP%4|x2}!1=dbE75{~={;Upkyt5Ak>ZgJs? zhuL3^=FRgV8CuzmTjRf4Z%XRAbVirP1>Iz0Q53)s`^F>a>_xMh;mef0>Yw76imX{V zbn+>0g>CW$NNr##dalyxzTnPHkoUKF?$GMHMWnUNAwFdf5%5en

LBWDn?^#6KEL_CF%&pRHi!?auMZ)D60Tfx}Vtm5xf&Rj*0 zZbC>QtkulALRWM=#!Ljd(ja?rgzb{_m9Yhmk5XC(OA)uoJdnHDejS8&tY#uz(*pzv zos1lGO(Eyn*#6P4Hkuk1I6&X>g{e`lvT}DPC#($3YP>U=Z;2g{3?7aoa4|WMwqIwd z?jwE0YmNJ89s*jHVG)ID66i7HW+-yA+T<8@BBZ48tX;5*RNgUMN8O<%Ddxu|v&5pX z?z4eUbClOsT#HV>rOj$lRz+Xr_Fz{HVrhbFUeW<{&37^8w$lD9YkV;sgpO}V!MZ?n z$>>~dz6Cn>1&AUFdx*$F;Rp!hsF*O0<`M>8I{caQyUVt_lBAJnHJ3OjoSzQ0%-L~r zvG{o+ZRdK90o9-Mo|}WkbY!_^9vA*#--rN|^bw+CA-x_kPlj1=iFF?^BvP35H60xL zXeN9Gq&pG6WlaHhhKk}Et3el`npgs35^Lc?rcGA?q?a~IyB=mCB5EoM&?Nif+C=hR zo9FJ~O~oF!Ft-DuY@jLn(077XD~J+EB$242iA^)T}&0NvS!ck4hYb{0f-4j*QY4hR2gVsKq&vNX>@N zg`0VNJO!laE|8^Y=r}GW;dqpdChCY0b{B}O(<@J6!PLlqnJ8-DVK6ow!!@mDBpN9_ zU%vI&<)Hr&JwatTJ>>v09K!NoZ9|cm8J287N0~$M@aS6)qLK2(H_uS^89FzS1z2>U zB!7|6LA^1(p^2(v70DI(>5y)$ZfsyVH|Tk79X*8bk2F5uWucb@k3~8j0TB8>{1v6} z7EkwfbHIwO2w8Vrt%oPO#zti9?@^UO#N>DoBW+B};E`=Llw~g+nTB6&Vnjf;tpt7I zJ<)aMzDe$o1ieIMoFX51mLjh&Z88Leq7<*{SLj{hH4)kE#GV!2b~sXYDt#H!U({sC)+~-xR^XB#HNdktI?8(Lo1NPfakG zT}0)2F{NKd#)c4!WJ%LfaOwGBe61=KOZuF%NHEYm zb&y36WwWP?%G3}=A+wTK#w-c2lk!+G(Fl^g3|ovZFlDad@5%vG+k%=4kWd;3@kmvgQnue51p;N;A!laC?fbIuFEXk4 z41^?kZE^A)RH4}7`+`q}XONTrNW)+kmsl$cuN`|9XI7Gk;j*GE!zQhd$`YOz-o%B6 zgTCduywSzNno>~8s%nofg)vcrdqS(TE#g@))c`3A)VRX8J{nkLA&Tk`*CJm76(Awz zJheDqA>U%iF&$6&D-f9}+oSSNVK9YtR6(der*5@(7}55L?>2JNuB?!Jd?+Xnaor;n zcf|B#ktt#oYS9>x^IG1I@I^;>0=fdCNGJAgG#m+!enky{U6XwOBx>0ZwdY|Xsd)e` zUd%=#Trc!U^IdDaLX7{o{if49Z69>Z&hcTYm30w}SN`Mc&)@L_xVN2gy+57SH<}wy zo2`xKjpjP8$hun0b-9@9k~f+@&`jg96J{)M09zniU%XaCXKdJcm>+jze5 z6rOKvKHGx#4?1)4GsC*TFeLhf7JWDGeR6XDCO@S3nBMx%=rS~b0=7t8XcJW!?O6yC zZ?FQFC;0Bj>4Q{nvzIO3lG?C;;UDp)X8dH6=w)m)nnndbSQW2UfnPuux895rl*w{Q z6s$bNgBnYJPwAROLZCxoI?8$}dTC%Ezlc7(3ldK7<~6;Q$`SFQVTA%{{J9LnX|TP% zetmu2un6LY=a1IM{B5v))II1N_d0ceTC{rWj#=nr6*2{YDMv0i6Rs(5#>f}dr0{ab z0jFq?ABNZHxXT`FLe$WaCSj!HyU_=j+{HCk+dZS(TQ&CEy>73DoxJOw|8Vm5+<4bM zJ8K`GcRM}f*3cTbMtuUAI<_!r~H?(reWmt0!RzTt>$jL|@J;z^5la#8k5 zf}m0fh;$lJ?!*x)P3U$z#jx2RAb}6hOEN-$1Z1%cn3`8(W#wCEh>qA&=-+?)`gQmC zwb?yB@0=aCqkDjPhH9c8%$0B1ZM%E}7{cw3XK(}E=?CEen(t}PR*8S1Drp@K&Y?4E zT&}LH#19-e0TV~leg_6!DLTxc%?jCsnG4daNidRPit(E`JAaEA8f*H!kfbJ=Dv!y; zjtf@o_yTnG8=Sh-lQhBCVhWKO8l0(O!OWG;zO+6{$OOWaeV`0$-&lCTs?oKJ(r@QV z9JKeaFF7L+VOGtvpsDHx^uP9UH`}-{kAa4WFCfd~RszQAlCMvS4Oq^cNx{Pw6Jwrar?FvVeT>-OuExPM#^tReU1&nTS( zhY$iJ2Tz_5+5jtckv~J2CA#Fu8O$7VBO|zYjhsJ7`9dFuJ{7wpX2e5bZXmeZqL8_RQvi<_U9h*p9weUu+i_&9iv$Od)jJlZ6)Qur_Igh zU**5g@bgvv`zrrEfczH|#O7ZlS2G2==n>}t{N$Kslc`;fr$F$EYG-1AkL6@#2PQ`jeCi_ zG}*+<<`LF?AxY;0uVoTi(Y)F)Ew%3h@PLQFLUXUoX@WhU*}-fao(vC_HZ)tbk(o~P znf}RYxL1xy2&|(Ft9-GV))VGAfCIB}aFQ*g0A(DLQ(94mHOd*H$&F}s;;dk-ebi^b zqgFJ?Fr2SuJpO;|=}6PTt;K5kj|Y}(`L_p3!?;UM+3e(|g~?RjE19jE`+u(u zgIexnZ=~}^yJ#62dnEd7eu$HhwB3qp!|E%t`Lm9El`T{}N)}Atq=8EIx6kV&sqo@f z5aG6gB}PPE6SlKenlaE2vr&@VC&nt)zmgD%?nQgFa8*R8&atP`FL7kRHXkCefD>(@ zr`CYekAI?_dTs}y@C+!pFZ4NaNuc!Hl&57nrom?!+x6o(+mQL)w>(qIA(L z7f3X@!k2{Ft*nbIYUoMf6_08@&1GQRp$b7)^@0)g3Q;$2Adi(r&yvtp#A;2o zkABi%Ru>&6h3AJFD7hfT;}8zj7@sQQ*H1E7pjlmjzxm`TrDqpp+gwE@7N{B43Wt)o zeP$Bm+v3|G|B#|fQ&3e4_Kx|g-975bNmm8<+QuohTUu}(xhIVY$QGutyah<${nVLq zK^S{#)DMgn`f4fBR$Pzy6uHIZ%0oB@Nb%Qy@&s-@B&sD!k_x7d7bR!~=Y=!8jd9S@tt8Dhm80VEpliCg`S@RJbB;(j%8e?TWVyj7NLJH;j4)uie8`jy4o^NkQFGvDQ zcP18^`wW`jS%0*DHSf@O_O#B`P6$qh3(Qe$0Dvk7?&yQ#`CnWel=-IBEccZ{!GfRX zEkW-0-!0rgu1J}NL8*_JAQt%4%qIqsdYn>@+reF^yYbC`eY-G)7j^ib^E%9)$y?V! zF(?Xfoim%~aJ4u4*0lA!bNjnB{2jQI_51(t|N97xVKrMpy((I4Z>L)n&QlH*n6uV* zT3c*s{vKZ3ZMd$}zH{lQ$O-pmG515l+3X?`kkh?E%d zfN~bLHu_@+_77XT7KNe^MeMnqJg)BwZ(!aN;?{ET7Bue*$i|WY`R?8rSr$sHdqc7; zocwWLNH(7@36l1`A$hSRNPfL9B+oXN1WD`Od*|8Kl0X?fyEn}?o28lHNt9-=EA!9a z8<`uMTTh=ozwb1@FPOtySKc7Ux9Gb)5R)o90fH+NdW4p`qQ4FTn8{sdu&wvB!0DI| zT(Dt27<^j==IyA+pF9@|&*rqoQyMF+t>&i)1DrQW48DKUdyG5pUs1Jd0V zBA!C2h}=KA-gQRNr4sP}Jcr)5CbzJ#{;la+Zn3B?y$-N}SHptJ% zzoh2_vQO(aXql}W*dopHbNKU@?OPCgXa+amZhq2esc1hW3PhFJ2fx7m<~a{-eK)x^ zIoKh3c!7RjRCc^Ij9}dnEy&qR#J^dAA)3%rYO@E+kq_>^6*zsYk3^_0yoLQ@0Z6TW zi=cq$z>BpWC&pf6%9F&%i?nqUpc%jDAcw@7C%ODB! zv+`}jB*+W2oyFT$s^yzr#hW%7jq+`864PB|7v3hOyGYwV;%&c4ww$M${N-cRLB6zr z?o7x-=kU*7VuQSg9rB_4Tzc4g&`MCwd-S15^^zm2O(rvvD9-F5R#Pkm^;rVyM+@!i zvrM2LA<*SuezQ2l|4c#*vo;oj`k&cQV?X5~m(>N&tm{*ce3?qXewu)NO=K=u1p3oV z=tWP9V}23vPm?i zZV(;me&&L^F%R5H7Q6OE#F=V>}OH3J0i+r{U!Id@KO-lS><$_sa& z8vZkE{jt~#YsPSU`;U_IJo4NTY(AWA(7w39%mkPidj6EXGC;-gP&43IUj!L2%;HO3 zX3T6{Xcb=1Ju(FsqXB?XK{NW*YJbbjx>O}0jRn+1cdXds5|^wP)O^LoNAo~uOiqv& z0=&`v2ZoI};bak4~eB_59L)cj@H<90`^CW(kw{zNw#p z1<=3}2A3!9E01bw?(1oTiePBY2V%cf;+u^U-)xrnW~;#VuhDOC=pB3E8RZ$V4`*nn z>v2*A<;T3Q5(x;$9gbrga!|xIE|E%lQ?0R&q;2$X`|$jlvJ_w{SyfIWo=#GDQqn^o z9bY*Jfj_#Y#70)Y(<^sIPAQ7{X_S^t&9G^9*!=Z z-?N^5ZCP*cbVezUIV5ZGTjB6PLWDBwsmk?H)P9;#tvk z7aL=YgHS3h9tZgIUiLIg0YXyWqA=j4H33F+YrPLND0?gljJ&SL;lbPbogv{X;DYNi zIm?D5IzS)Y3n+00Es7qH*q@ugr8dkIWRW;t!$)@qjjs@k!PONojXRSBSO|(BY(m_f z!FuDl-o*2#ATe~{4i?_(hI0XJ;e|)SI-Pb}qd1Ue%`ky~jEZ4{5Awll`@VIHEa06J zUNS@Iu!B54EWU}g$G^9RW?H}f(rDhah9&jWF#rxY|73Xxx;#28AcM01toR&!FV=N$ zAsBhd6r^)tVzm6eVVmK_KlL5V$@<1|XMr7b-NfJ&Yd@JflvtFr(V@6I@Hm7q2xr3~XT!HMGLec@ zu1>x%&+~AzCsNOvNpVM88+ko#rARv`!#P~+?@{#7+zt7 z;>qy*+FOh#BRENJ4Dj5K3rnDSHeApKcYtb=fh9Um?~kg}vDLRPG1SN}brAfRaS+_| z6zIB`%+U?IzAM%3!5ppkV)I#GGJzSJ&X$>{zW*DibL_d8VYX+F zhjV2CZFSJ1zR-e5llvV(zMQ!q=gTUuIx*i6K@>AZZK`j!5pA|Jjejbrl!W~!Kx7>y=4MM8U4zU+K*3NFEon)h4=L& zuy>@kw=O2hn}fBt8L-T#VIBjidpt@Lb-3WE3;t~{mnbJyi%kX+pRwLt@C9Fne?plYP zqY}5*!L4hQyg-t&BR;d-vBkgwgh6XI2Lv1*!2n5cRt$y&0A&j}eA+?a^~u+x^yw&p zo3?JoaR8axB|JMf#x7Fxo(|Yb66&43#o>m-DGv8M*ZnN8YQ`=6GRuK4HPdP9c9OXq zcc04Xcowv0p;t%{nE;XB#%2%>o&nW=wEeA~?GENZXFTC#SlnWJ8=EW+FQQ(8TqaR0+H%>UYY_VoF)Rx1Dh^XJdL=70SRKZ*RW ztrr>jUmO4K31GiwfcOFtZ#?$MigpEO_6RFF$Az0Hhs?PRM4=pSDVi~y zOy9Sf%@4A`QYbz#cF;cuM>Wp(Rz!JIEPUxz&dG)(3tz(%sxDu7N{>Z8yjYeoxW4?l z3Ey>{j&p9pg#ZSv$&7^Xd$p=trF!RQoqty7lU3||uTsqt+0wHjy(nX3*%N$pokNgr zU9@G>wr$(if77;&o3_5RZQHnM+qP}nwklt|h>EC2b7R1`Ht?JLyxZI@Qt-F$;e-&tQKhhSmcYuV3?S4LGD;TI6ge#WLP|f=tegYy59#}dp z37=S2^8KEYjcrPei9zUtkzu#u2kl%loR}7H_A$OzdAJ-iVD09WB;1d9 zU7e{?grsIN-@HAwwU19BKvzZt6IX#;VP4dFGxJ*X4=F>Ki|Vj3Taxt~Q4^$0B#NNt z*%H=eIA{G@t6KY>pBbIOKHsQ^F=AqTJPOgDqW!Daf7xgA#~2hObh^d65Zp!|;Jq8w zi{=HZ^dG)K|1QFptzNR8d-cW}N$nl~`Bp+>v6{gF z`bXoExy^>MWSktW^z3mX6q)-M&+bk>rFSZy_?8v|Hfii^`5}LT8w~5PG4L>{CHy~j zY6Gj?w|2npHU(j!r-H&gwwh^0#I7G{Kz!f+-Ak^imi51N+N zB#z=F4X9;=V$Q~S2(4i3f-H8H4}Peef*&8qgD?Q>McupG80#p6AkXx0 zYWr1g^>}Hcpe^P{a$e#=R9%w(J^`Bv${xo5k$fy7@vXohd^HnnM&KD~h&EjYYF%iq zJ&|MNH0s`rmK%i>iCZH}As>0JeT_w(F5q)UBXY+NG}C(TTb)Y3LeJ-zPNHQ+vRK+rO>VrB0Av}O;i2E!4}W~WzNujdED%T`OO=5* z^S`}DE#a=c?R^Q<_QjKenQKF?tPK2;hhU}6x{-e`#WssxDnHy={mb}rg4oqq&JLGy zBYv{4J9j&>sfwdQ)CcSJOzJxmC9Awh6(T2V4vaDi)+ZAM8felSfUPsTKxVx>({#1HswuhId46<~v1s!LPdyxLhph4ZWFpY-InKJ4DO7p= zAdR@oJZq;Nf4`AuU7W1sxJ9Slei%{b7NC@l$C2DnV18wxQ3+nCO&!N>F>$rIs_Ll4 z|1lFM4yb!AA?Ct20KHa6_K9>slq*@f_`dvk*kp@O#Agpr1>QMt!eC9BBBjnEka4|y z#2+7+eHLdW%i^V}N{Zjpp~^3iuA~z9{0@9Qz0y0XVy-};p3B7EwSX`$msm=UFT)_J za0(h(mBmOFgQg99G(h|7Q%6vuWP9P1xAl84JU^H@J@LwzzaMnE4_t#iDeZ#Y!wt)J z)x17QHxumcIF+wM^d5X@$Zf7#T7C|xRmyjo1?c;&oyUcg@9wD%>eE=5Vqn5Sf3j6w z=)+!Xm57!4XnJ0!Pz$M{hp9yQQ+)}afI20Fe%xcyukIznb{OPD79KVR&bSxmd_jqc z$!)xVlNMbN?R9rn)4=y;|G~@w3MlgNFGSgp^IEKP=L9R`NGj_&%GJt;8C2uHi|$hA zq)81&(RSqDJdvV9l8Y6=o+u#vzS%8>RK!LrPARK6E-wyRhJz2L|Cr(Zt|}IUKe-Jq zaZ&^eM8~!3rJ(P5Y@f6Srq3!WD&))zNP=~VE$B`842u}R(nq&uFd#LtvUOI+3Nu(d zu?{r_@0iZq7nv1R3LmpFq_Y>r#w4>9+sp@=#D&_`d$DO3Bx>!cl}8CEIpAS*bM~Da zw8<$FxASbsa&uT6ul(ttpT{3|+J$Ej&8k(LNUgI5iX?JAf%)5958)JG@OTXUE=&z2 zFXINp$^^cGk2VfALJU>5*9xfEbikqwmU|AnxuVJ0vftGRU0b`Rmg+p=qFSL{Zf60Jv3EC)$i0xi{)dXqKk=^?m{Fp~;3$ z@W0sZykSa2u*4(AQmrnRcYeyRD9t2#1EAxb%`4_oV&Iv3Q`Z5LnEDVbte>2-be!Pn zPpb#!IJ*`n-JBg*8~&VgaAm;=alylHtvVfMvw}@UowPZ$foDF@KLTCE5iRj;P55K{ ze{s51ee6Cib?;7*$CA^#5Idyhp;J4-y=`VqO#Y_Uehwws*ZJWcdb(Uy=TAKSE2 zPBw_oc1NL#!y)AHF%EetZ@SAYR@8Z#gm}Re;jJMV>Mzx1E9rUagaH4_;RDnlcog zsXCTPgm-zTp53rIsL}`tLH2u7oBl^T1wg;yy0z#=JHlq}+WLKD0dt@t(?{!5ccRTh z;g}XIpXTvglFm|w4+ie4(=KOtYQalDx(`L$S8?!!Nho8UFtK+~$dyOK++XAP=c;p~ z1NI5un|>P$ocGNT0O1jBeqy6MF<961MJ`OAjf1lToHq`%uGY2C_7@2>TN-@mbTt32 z{koX%Wt;1P20=AZb?+?NlDmUdrvMjIGmbnirx-YE5s)X-Fu^vy-36-ME?nJeZ!*+< z@PDrlRl~AP6vD!|&ia|}+l>w~nrb+5yV`SZM2ZW3bLKNRoJ8DlD;Tasz3>H$l6qKN zRMO@P`_~$^%{D7}?#NJ}QpJcZTeIn0zD$vvaB;hP-@6WIkVM)siQ6ixijIOdXg4K= zQ|dYD35ar0wl8a_% zx<$q;l@7bq+?8M{ew#PlLCkKi2)@2yK-qxMQj+JI(*OD!4?S$N4g2pI0mG=yuqP7< zhMB$5!+nml)w4yLsDFC(j4#d_JcXcFgb`o4H;Mi`Jn6y)ZUW*{oreCX8bkUbn~|}fa+S5!W*@#?n@7h}n5J zfnNIs5k%BBomA}wb;f*uRoGplC29y>{6kx;ycVQZiCPWAe&DxTI0S?U?M-Ria-ov65h0n2=hmcfN^u@!XtIrS-<43Xt2R2UKNZ4tIrOJvKJXw}tlL zxnznpmxkE~!!nXD`OhJ}aIf2li)k$K=~gWZ+|PwO6)Vs)d+Ph{PO(!s7S}>6^D?LZ zq;M491zhWw`p1i*fo-J4=~5*K;buJhhK&uu6G;wa=9L5E!at%j{7TQ7L)7tAbfd@h z$kio(f)p(9#2Z9wuYmjNwz@g}9%?mFfEwEHkS^=I|913xITLl$!VUr^fJr)=M+U&) zg!l*1xEnJQR>16^n&;d^Eo|(ahFAnK{#Z6=9DDms!JhxtLE;}E$2*qDGCpVy6Q|>~ zLahR-Ffc)k<vv%S^_Z!#+u)7HcmfXDP23UE43`6wSB27%T<%*TJ z)>kW3VE@hIxW;N_S4H0w*E$ty$Gp8WFQk;; z)q=_b3wDPq^`|9n8F4C~84@TzYrrM#gDg7clmQl1`ipJBA8eatP{vo@joBdZs{HAw z_hrJz+>A4|Q$ctSIwCoiz5&_pZ{BrENxlBkF!ipn2@%Ud(RF3BqH%VR#QGT z7~8gFJw%`a+{yO`*|FnMrh~@{(pP3=@6`Y)=yy?8y25tyyu)0G_BuhtQoulSoh7Xh zUp&fmbds?nyq&}KUAJ_hkKY|oBMli*eGI2&1i}eBy=z)Wy}4-z!x`+fN;q#eGcN1j z*}*7+%Bo{RFvD=o7QGl2ybpYh<{G>T=(inbr?xYEJ%Cw0p%X0je*KJDM8~ze4%%+- z>sQVQ=Ky4FZ1B#|o9zZj67=Ikh{$qwUL;)g`aWZ5v^XtX5^&F!Dz6J9w|VWTpX3x& zGeKo}ItQJ*&>T-83Fy=EmnomfvFFt8 z0QOHa>FgAV`+o+htKroN!dgm20xEbn1>Pf>P<~1XZ)BRm2U3rim+3FZ`gGIC5xXhA zsRj24RL zvD*1_-#qNpOPfhr%jSh_Ueu0uognn|+;cu{fWTIzp9(4W?-=rVby9q6OVn&SSOz=e z4v4c;m6buIfUxe1*zNv(ewB_R|_QK`*9tn%^W6&Qb!RU9C!G>3RUOl!i$hNob{no(Nu3U5iAF#-vp3BKoJyi0{ExY z?zro~9dVMy6|s7jZq2`KXD8jHmYxpX&)p{jX97=~z-5;74q&3cq!k|B?jOVPe! z!~U*rzUFB+6(>nC8%lJpXmm=J2bP|SgC#}OmK#R%d?rk#1foxQ2!UUPT}1s&M|2)3 zVoYC;;df=0oXtlzkn5Db$?)v3Z)N;%kdA{FSdD2;)Q|}9i0ne`k8_y}#521wHsArF z+v!IfINJ;{Zy%$r+_|yY8|40N4uQWl|2TR;;<(#cJ1~pk{$h|7{uEyau_8?vVxr%v zAiE?7N3`3_^k+g9>i9QhB)X@wsVLIkGZoF_(mz4D;06j2pSpVm0(%k;u1>2%_F7ms z{;N1S*jsAT^qH7aY$WH*R-zvFs&2#f`aZsD0S1%=HxqHRzHl7M9oG(;=Tjt27=}*_ ziCcLx^|GJk`+LT##)}D}_&cbDqt~_SC(@muH!`YLScMllUAN`$)VQQ9!PBp#%SJu> zthlY4v+w>8by3;CGe-dNuXicr)G)in=`-Pg?F7JcJK=ZU_f3}+I$Fn8epi*ggQ0a) zSUwmbhnLnVjPeR_Mhz`j)J{GTKh_dh&wo~M|%0zWMH z1kDSqLg$83*Hzfc&MI(HWCxh-VU?!?f9f%=EQbplcg>(g5gA+-eVNyO@M5(2E64rC zHA)^D*tuAI`RxV{^cJFW0ILAgqwBti^lR}GvI5cW1S1e&JQBQ3>6~_OsBt7;)>;KW zkc{#e|9V_HyG@XS%Q(DE{AThRUI$HZ+7>MVcct}Yn6~;@Ws(%xuM7k)gUc%%SuT6^ z3RU`ghfkK{?s0t8=$G=nXL~97NHn#oJ?#tLrGk%#(SJ#@Ds%;`dgIkoLUE3F7f)Sf z{Dg{{PsAxfo%KHrraB~5#Im%hW1J3JPGM5(V=(Lz~#07_+ zGxF3bp)gB-Sq#bbit7;Me?C=Ye$}J6H+xu4u!`IHyn8;?3ifAU{b4IE$+aOl+!!>2 z4|Uc3@#1_=DssRuo{CJ4$i;>cpxB|CIQdDeSvib{hs<_HmJC_YlG}`km3OU!MIj3z zId6Fp)K@PwkWSOJ%fPbce(sF?ErP?r+9|gfjNbNCKwX(++2~OWi!2a|Rw-WjI2Qh= zCmJpgu&F1a1LB5gArXqP_`sr?xeD;cZTZ4|HE0Nx@|4JkjKJygULx)zp(k#eO0S+J z=qa(9X$^AObuN4HH2CV)#Joy(?_q=BQJZfu&5wZCd33xYRI@FSt~KmBFz zX`$a054&k~h@Qs;wg*%#hT$+M^}8N&$n;JlIrP5PxYb{OLz-{68%?8>A(q-(|Cx^F zo%P=4Sd%jxin7t9tXiH{Ut^rJh4|y+R7Fp9y*YaCeys}rVby``zS(4z5fXZ&LM$?c z_N)94Y+iUk89|gsBo|l`q!cGEy!OlpnTE!gfTt)|3uyJsOjGF@I}ctD@sim>JP;g+ zeJZ7`uI;JCpg9Hn(@27&B}bqGvS49kvCNLwHg^GI=OGH^j7W06+G@VsZ9AE-v}1&|M5GNQbm;vfKBI=f;%}@A%nb5c8yE#z#uT)^f?`Z%H?bO zF;bvJti>9j{tpm3r17lv$^rD;E3H_=XsG``KhU1ux1NVg?vXzB_b^E-S5j*kYZD>Y zFu}I)F^tEo?ovA2yY7hUXSVNbo%Y;~5B~J5qy3fnr7#Zf_j04YfA6jZMv!C3#g?B> zn8Se-BBQr^pQm9FIi3#A&B`rZsPVT!-DW|f|*qof_K0g5PQ*xO$XIBkqUU=>VMtiI` zg#_#)hqd4xlBZMkqW%bHkA zmwiM|W9)TbtV45iP<|R@%44x6e!&45W@H+pxt%`zH$w7L`5lW@ZEu&?#og-s@2&J> z+2P}04d`q+Q-)q2ZRRL7hh5m!a#%iQ@2-5@4#Dzah?^p^ogymNPc%lT zOlJgUP)3YAG9<)Nc~!t$KHgIG*>}1!?!>tt-nrkRmZD@&z0pF&yQzR+A(l37dUv2t zBSvgDfdYdOa9VB|ALm~|zlW+BXf2LYKim;`qy9@5RDzh@=NUR<95dcqM?E_hWfn3H zE12y2c9gP^HrT}PJ{Q88DCQbB)E!655JZFF%Kp#Qen{)#0RFOSXYm!5dI}~1Id2s~U;?u_< z7S>`9L>V1c5kQ@bz<69$xL_#XU7|vJJA!DnFKr+C7*oWFbdd(G?NzQ|b?mLk?9!YV zz2&T!1=b#P0T(Y|I)V=Yc9ykUkl{V4FmrQ`l)Ky-MAUe0iQ%Ee-PTqCm(dA>O4cyJ zg=?G`&zSbB_#R++72z_NxRGs2j@`pLdmzX`oZvg+M;NbeY&$^#*=NDG;4EE z(E1j5JN}o6Wi*fNq`328QG+pHG7OF~2cl%a9hERl))N}qYXfiR<^a~PZ3;}c@He(I zWdcLtH>h`4C2(#dG@NUnzIk`$KN%BY`)l8zZvDs@mHoi_xdB(Dhb&ddgPv`Ku`c>tB1V zJ#X!nRk@hgN+B^RZ(}!D(z7KCyq!Efp;O*Qa83b0J4Nd08dkZ?=T4f{g}~7vhJVH9 z^l5Fqbp|GUIoB}SzVxFq5osy4S);_5t7_KfY+8ptq1rIQ3GCeKghDG~oYakBg~iJV%ZJc7;^f?5fP&tP>1Fa=+VJj zBjPVizNKk7oXw|rI7_gR-_^J->hm*ILr0woMXh%V=;#HW+H52qxC|bVj`p# zxll~4&Cc=McH7nEjTmJWjXBh2+0L~r-dBHDExCah0-%l5@E6wpdz-WKYTJk)dn0tU z9H{tVCfY^T#Y-Z%{8??{TLKQ$uYZqHy3bGZ^e<<|u3EYrM{QSJq z>v$0FM9lkEym&a+P(Fo=4(_#7%XYY?dOGXxbnDBh;+te{qX!_|O!k5;D-czZ8Nru8(O z-_9zL@Hx--{eT4Y5s2C+-6wk~~FB3LUYLi^na7hOJ1=4EY$>9JaC1 zla^bO@9=##sAu(PF0bR{{E^VeW!f52`Np5G{*paml+!5kNc_ONPC6yvE(i8RaIioB zc7L+sO)c+oAf4xWHnZ?fSt9=iGWo$0biqeS>`&CSS_Xt7YlqMVkw@|jj+PKRrMsyOp_K;=$FsA1***Z2m z{sJCzD;RrXu+4}zw({IFl6Oc#$Ht-ZSM2eS(66NGxVD+EuyRBv;ejO_V;tsxOh4G> zzTEsrsH@HSF?B~$47`F~WGE^Md-zJDXj284gHe1FSHoZv-*ao!(7ZG0z5un_Ao^AXIW>%GYDFFnJph{}gk@3V2y_3u z@@gANUwfZLA*c93dZ(jXp8NT|l~ z-@<1=o%?Qf&w$BGrh1Bg`!qo%RUh%74HTgbO_lh*aA;HH%`CB~5s zlt_q=jq9FUL*B_t|Mt~kKQ3me!GV}KPZxYeto1wr7G{fxR-JKMi?E_D>v&8%WS+q| z_PaMh-6MB8tk6=1qR(N)M=)QLAt`Wq>u3CpY^z8O>P(x8rB7CqMHE)IpManvyJ)E6 z!~%%D{xVPn^8wDTlqM#^@$RgHaRw>C^x4j~xkXl){M{@l{U2&t7-cxuLJ>+VJ7_w@ zS9FJiC>1fJqL}}duK&(yH={>TyjIoK6)dg&J4MQitN5cuv|z8kp}v+JmOWxqX=nhU zrB!r160;##6Wg&Eh$cp#Y}z zLfdKSP0roD2;#I4-*xcJ(4#i)`(sC!ENWP1u`E8JiwDLR=t`m7VS-M`d*WeSB0Zio zWA+r24cCo;c2L)uA84#ld0+ z2g3k99iFZ~*yfdWCCyM3lC(Ci$v6Q-hF8etpnx)o6zg>j<_@UhCmza&BY)j#w7L?u z@}bpbLE|mud{D8xP|C9hVB#7(!)rEjMfwo>ERX+C+wk-Jba8!Wl?M3O6@S=0Y<+p2 zI&*(H#Ig|>{y}>4M!oRIX+}hx;pxg*vmyk{bo97RpFTXw+d|s$*vU=%q;ClH1U?W> z^IQp61ty~}_rhKfDUPj=9)e?cs@UDVjjE`)GvgxI{CufBbeIwD6INO1_o+fXAeJ$o zo)f8OMifQ)`Yjk(e>f-hI-?RO)6xlvB*A29;ed%ImT{`)$FWDDi45DelNKGzheYpd z`Ouab_uGNX8jB|V>JF@Nc}Qh)g9b&&BpNZ|IiTZ&c8DUPa5Y!eq54B0k)zcfW68wS zj+s5bAVc*@-DLiGd-ifEVTEv)7jq`;^iQm~VrjRaMWt6rSMHx4x)ghUo)=mERxVd` zEh2z*jt*}O)A%G|5%41KdqYIuS(XM%+}!RaRJ5-rG<3eU%7cgtb(1@8>tMoskn{zw z#d`mZMHX5a);TDISaEC~&c8AaKr7JsEq0i-%7k4P*m$oC`7+Q#I~VhE8Iynxb8t_i z1QI2%)ggsB7gu$l|LONPo(2rJtYS)t5>LmRt0|I9O6~52fzEhGEd^{TRAfe45;2ru zd*lGW)WqxBREiwo2vVfp&_^7Jk6PCOxmyk|s8ed&goEwXe2&u448(W3m<{d(tMJP!+8O>O@c^YnW(j9Yx7_fnA&dIOt@p+4 zW!psE|7>!WkXb+O#zh_?^NEHx&v~M*D=n$+T+e(0EyLh|d(%1dG<^bLl_kX_0{Jfr za)`Nkqnnklg7KB|sMWo`e^)W*hg0{GK$HT)A5gAT#Q%dIYqjeWYig@xjVa>^aM$oQ z%1QB@&|LG|8JV z>s@1{BV^Q$MX6*zC>PyH2r3hs6ZG`f3x81rC0W@fEZ)Jq+$-l`_jY2IOy@!7jIONe zGq!pi9T8E>g-2PZU78PF^a9h;$2-pXO+qa~L zcT9Qi**@&x0ql`{tvW#CkR>uxcmTIJ_=9$&Zshz99oNnnmiJFMS?ISS23rsRZWyL{HFI?riG||H<{ktDJ0M$E$}4Dm}|# z9qq=bi9o?_jQ*{IE(U#&T?OVPMJqO*xU;|YDMpgCX-nr@Hym-pz8KF)BwRIO$9HYV z-d?hs4QYWj>Y`xwg!}|tk6A!(L{~J3x~0l++071X&ZahT`w6otq5);kC-r!f$8I7u$>&7ffc^>A3`=Wg*+K1$VjnCt?@|z1f7Lpzd6u6 z$PdZ;ErUH~e^oOgYTQ4~{{>>-{~sXs@PC0=hyM%20%@~(Uc}VVl#WJ9PtIo;-Ls8b z@ite(b2ZU%iD^QD*z0^CY)4s%?ZOXO83e6P^+Jn0S>s!wNThXq1MkAGzF2mcIeS(N z`*f^a#Uq^kfBhMlOVhV2w1wWEk$1)~ufM7xKUS;}Q!_L$)Fq%8exk#t!7r@*1Q*dwvZ!G z=EDw7!=KmVct?LR96x!9e>psbg*+1Yp6 zIYtPkQYk{Zq0EE2>^C(}qXJ##upEHAjl|}Mi~nOEjP^H!EQJw)<<;^U6=Au3XH^3+ z)KBsBgnu+lZ0=ZB=rHk)K2OITsAEUDqK+>U^?Y|F+2=Iv-eQWf4QnUhjJq~hnpVI? z;AwXT;%B&E+moNc-w6Q2;A-`4O+z#dIra)NM<(g+!Azw z`JLRQavmdY4Gc`zxngkI=>hS|$u1bWEQ2X4PVnz0R>i)BrLlRGy`z#melp(?u7Ivb+CCp2k!I=&}8S*|P}AIk(M(>Fs|Z~PnW1D`oI^Z=ht{kcyNUNeHH zWxUt7kpIY>mwn6%hK^J}I=#VO!de)t**ap)CYw$WM=ggjVUL)bSj>J?>e)BPgVQ{m z`LXXhCP0{+Whq9(>V?3YZv%+Y>#7`CAFgc(5`1 z6XDUAfJ1>4W*kp}A$cV;c#C#Y?K*i}Ul>%1<)F#k{y6_ z9aLBs+sdxy0VgoEL#f%il{UOrKY@V|U#rhk6RyhpLm38dojm(|h#Q~^)o>crxrq>Y zx?^y&8~B=NA=m$sq^4=rylzyH1}&+#W)iVp$up5k!=P;l)>`ll&rhuWv83zul_%Vi zBXS!|FyT78`^aq1f(jUqb|WPq$38KJP~BDI_5jt`T}oog|6JKrs{W162G&FI1j4Dk ztYbnL>|Xdrl9tgbV(05Y{W#bSo$iZ8_cHWqusQ|p4QZ=|7+x%F+Vu{=9z8Q29)Z&X zrj!wa7IEdvgz8~MpQ{iRl9Ab^_79ITA#d_k_Qv0CzjYUlCa02o%*cUd+=+cldu%ypi-q8iQ{xQSV zG(mqykG5k@q!NlN{pk)wp@4^6Mf#n?&^$U!y-LF~Y$r;#`Vp-6La@YI;B&As50LVt z21*0$1M5X^LX97;?hH@R)l#B*whmgvDb2F=PA*GgRMhuXBWr$dS|<gvOe=j46b?N>m{wr$r_ufUy`iKy%j~|>MFL3VzW{S0!ID< z(_K?iKtCd^p_;rWTIE=pXkBWS(JhG) zbd914Y=zo;j%I9k${j$BpX&g>nh=W@%eaxik#{n~D0I_8AAM9p+lnLTTF^9^a<-YQ z=Rg_|8B7b4n9Sw#BiJk6BS_xDPf!^O3H4XY30mZ{5(xW4H>;^}>&qrE_!0) z&5K6^O>4OewjMh;mE8ffA7?&a97Cch@68AI91y48$x46x1K$bb&%Qefc|H=8v&&rP z%ygWuG&yL+?n~cy>jec-1$aA9%el&Mejz#*%%xHVPINe*^#xc_Uh4n5bAfut-9d?zcZohavcDAaWu)%MZs_sElM-7)&$sCU}T~ zZu~q2@{qZWN5tY($8z_sa!PHoxiknAHX{QD1NPL}3RvEua05kGq>KK@UGqKR@aRS-0=#O)&Y7gaKVn0gm}G2ZWnd zm^?%GSbd(fH8ap-sOwE=*rbbBk=k#&bePupdQwYd-p$I09qO0WX{YZ?m;QEE%ZssR zl1Uby(Z00R+VsqfQg)~)oTe_?_~W!%bSZ#3=g7aBjsNH)lon9wi}C>Tt`3O5|03-1 zPQ?2Y7N`lB@FL0SLF>|I$4O2&O$doMYxIz&u-?ty9t{?Ngm^w&^{;RBzl{Lq?B+M0 zG=538E5HYDS+OJgQYXJDQBCb3_1?Qlz)8w`jn)yoQzOCoNje=BU=aa#DA6( zSitUYCt`Mi&hRNyVBBeuIE@NM3g@P>E=#=W&6F`C&fF6Xg1|^H2`2xj61Of1DF@#T zViGqjpfm$pOLey1Wl1`95sHClGWP~+iE?qsSscj;zSeP>z+VJ+Sh~{@z7TU8pz#{& z*o@TtDa0@Eqt72XBy^NfnVMjvd&Cmi4f8fm>tjNj2Kv)pY8@U^VG`NLiD^8OIl3K! z05K0#u$I?{4^gGO_ASBP-Uki%tsrV!nrvFr@! z9Q|pLG^k|}Ew~^mqbqcb&;7pdHMGvZ9mhs4w^8!~7Xjz?IA{aBI4G=)C}y-RXsNo+ zjhl^rYRUToKB(Q?7Pr$jZ&C0?7^3_Ff!`Q@s_P$T0FiQ6yyq| zk2kjVK&eKGV8ek~q}zWo-$$S5TRk=n_>BMlqBM8i=f_Fwgg2`Fo~8n6Lk&H8X*Wz% zdW!x~<#mj`vcncBKQItc!RvGTh) zQGG_aOlaJ$z!o;s<#m^X->96jS7?Bso zwO7W{F=*WN7Wc+<$yAZdcj)S2Psk`N{4=Uxi2*Lqx^co@g-edFx#p6?)sSvSE&%Kc zAqdoEBOaS$O;Jd!f^74Z0NyRI5j`0uLufj;^<^D z8QD*ajfkQ4h->5!IVD`@qHE?4Q!stW@K=BCDW=Z?o=-px&OYPn+djRa zW>;|!M$mcYP~Q8$KXfW^n%Uxx!-YyheC|qy6nzUGy!d`hH2b%My=<48dqy`5m+=R~ zYK(X6n}oIM*ll2);!&H6;;#KeA>agAqAcNEBcPO7_~qQg>15krY3s`uA7pIj{(@SF zz3r#DB(k=TR|Gf8YN_O1#J95EHMm*#z8l4VAn`^SMB4om|h4wm~iMh;fF0O^3o7l}w$9It?2UP{Pn{ z*dAB}6-Ou0sYTMf@m6P7_|YWWy|AUDjWR}DTX%Tbrp_Y>Xeh+ZCN6A2GTygU4faV7 z6#HqPi*J1<2W1>e?762d<*?YLHXhiI%!mI96_YBIK{|n z&I;oLctY8gRH?eqxaB4Y_8(5*kXN4Fq98_*bx_}?ZQ9yL0+HR4OoIwfxy@4V8^c^Q zitQt20b-=5p-&k7sN@uJCM5J?1!vVRx>6w@{{ddrvj4EQ{>^gkoqp~iGm(##RmIHCo)g1h;My?E`S+bd=S8(7S=hEo4Uo zQU14W9S|`X=}YiKM?g`Jn?VFHK!IzJx2$)TrcL`K2pf5qFVD4lW!d@+b$uCWIUDJl zMCbqa{&sc(pfnSFp0{DR!nFbmP&yx)Iq7v@cZ-iec7O=c=3$9clOh#hdthgHSzR6e z#Vp2#+`wh%KyO|xz|h7@h|>GlqeDk-GeJzb{i8}&pH5O>nF_Q-siru$F^rS3^6pmeXhH6wVLjmotq1^U!8c@>G z=}U!EPl#p6ZBj`nJS zs+gI#dqt^|X~JP(50g_%!|#B{HQ3ThR;^@(9%b6-FEZi@_B66+qJ5m$oxf$46?GP* zra}C`xx*bS`V^9KglXF(%)Np%7(Gmr$haa&6<;PFKL;m4LyIRFAY8~}qjCc~m&1`f zfHQa1pG#j+C2U?O1?pn8|_Y=Y9wJGWDSYS92;) zrl*_b_+6{fYyAAaBn%fmga0lGmG2WmHkF6I8IJI^sMu*}-$v7mN5%h;r0T?sQU{2F zTbu)^#I00YaiJHSiS9wIAk#yv*yKpdMKOs&2hN~5$5YQ#^LBCdz^;Y0p{CR5Jm;eK zH3JzjKZd%gA8yOCvCdk5o8ZzvW!&^IuoGGIFQNvc>`boN4uMI1h0wKP0LBx7Z- z6iqx8Z12&4i$&QxllJG3`N~752PyQu3P}zsYExoBFNGoG{Gwt<7R;8xOS-8G^~bPuX~*m%wIQ=HPpM^|NJ@tFs%vh zn?`V=hYqAeHE-3Poo)GNb*2ov7Jlw)B={QnEbPT3p1)-1&$b2VO{YRlcdDuyJ}dxXjcvK$`TT%fzct*WJQu*LKa!o};%k`;*gaUat;Bvxah^(KUz=kF74%rTCU8NBzB!s?-f%kf z7tyGq@oPjtD_|*>$S8E~0YY zw5DT4ZQYk7tVqehRXqXgH7!xZG?te3V&FOcb+16(BMNQ%H zUZt6ghbR1-0A@}Qxd@tvjfB;ywB8 z$08KR2<)llQ%N|9I9y>Eo$@a?gvL|uII3EOTa08xj<`g-nYhME(yIxEgd?CY4R7B* zr7xun&j>O)(_ji!7|tOt5Fkz81B3%Kxd+z5{A;e^Gs)m$f9pso(beLo-@;rmYfHtT zyf4i!>kLkAj782xZEM`=JigD^+WP5W%-N->e6U2nXZFZ}E0TYRml(RWo#Pee2e`ph zvMxJ#wP9@MUVHE#8ZoOq+R!qF(h@pn_e=R#b@K)tws8@I_NusHiTiy`T}5~Ui=}TE zSF=8I7pVy_!?gyMgTZ5(_ZJ?egd+~L#6yp|Pz~^uLlej8Nw51erY#8VNg(fWXhdcB z4j8CDemgV;^pKWo7Nq#0h;oTy7 ztMASF=0s{uND}3|;ab1r>7{j_UW2}w-LXHpPq)}Sv){|<^uF*qmiMps%?}x!JDV?_ z$wYVbbDn1OJ9+lv<9+%S zFh9$JdE!iirBmzFyN34t`(a}=H3{y`jV!pu5ce4Xe#Zgod!vGJd?)B%-F*zx16af_B?llXuVJGraGho zTl$2rMnR5k=pF<*t`)Ny#bJI*L8D9_WrYbAnN0cUGYAz*+BMCA!am+LS(^Qjv%jxH(A?C_+P{2!Z*c0 zYJbfI7xxFZ3~z9wz(3UpytuPu-%8+Rla z-ttbVJ)c&pvpQY&K^plo9qCL1hBj95;r&Qe&0|jID^b>kG~2;^ger$w(rj3)7{vGg zWi%QMCbtm17=WYxV_-}?^pd6iQCk>CPZ|aRXs#MiB>BTIA;63Qbc`t*1iPWVg`~uB zhU}Zg%^Ms;`4RTf%$Lq(lAeVdx8sgUP*rNP;G@Hy!lCEE#&K`qm#LUcgFP$S=jUhL z{kP{G^Z2BDeAGSeLi9Q8Iyg#4QXY=sPPO|yBvVCYcT#+BM5)bfDvdr1a)Oh7dk4wmpczR;!Vf(>Dpb za^c}UO{%$Q_0U5`IoRlGjef z)LD?A30Xg$jV%~r5^Wh8w-y0d%h*5*){0+1;Fx=6WL6le<{l*TdHfy5%3|(9U^j#* zBhOkPtx)t?TBfV4k(op;0?V{U8bZO5rOhm{{+y6jb9fTnCBDnF?kusE`PZMtf9~V| zznuIp&8N-g^OXPpvyHF*|DWUMtN;I3|NjT{|DTh@<>&SrkfhDtdHdkUQb}Br4d%rF zEG;tyCdj7fGBVo<1F;;vJTK5A&qh1;NLO`Z;x^mPD9d@#mKT5O7ywG97@Y9&i$x2Wc= zq~c3QqOUv)v%EqmuLJH|H*f|vI|(Kyr`4r)T=WieF%{0tC0}~HH%~BO^@VNdKK6ZY zAU(D2(^f{B||#|MqwLsqn1cqG#Q2yt=$k+p>5KNot7jfKz`4vh z`ge<=Uw{6lpT+Kftn5RU2K$O)0LsLG&x!wTZfvCTe{MZ*ZhgJ~eTJW}_rI_AzX!Sh zl?eV$bCYD)wmPsVo-sPe_}s#1*SBv@5dnHkGz+a9)vcZZhB1zLFE{=>9cI4d0P2T| zF<;IdR}Yp}7Z|*gNcs z70b7!4O&^>2?{kz=q2A<*h3Nu+52PoQi<0cm1&FjEoo)rpOn z=7U%t{2?#{Y%eS7#l8@=_b93;8bF1))AbK%7*`Sdz#O&Qd_tC0N}q(C0oG>35)*%lT#fNQlsAVQ3j9FI&1Z;2Y< z(R6Hun8GqpR7$z28VLtL;i4ALzM$N^;*Y1~6pha~&uf+&VZ4QKagO5o>CW(xE+MaR zLmVQp?23|1F(1lfagvB_pJ=1@JMK;ome>*&Zsmjn5(+7!s9>KrVVy#agB`I(L`qeG zT~(0%_qwm&_Rcnd3~sATN%oEH_nm;YisS@*I9X$28lf#I9$5wL)A$Qkf53rgji~}D zOpJgcg#qkY)K9oZrFrx8Y0c37i(NGujVkF5Xn$jMhk9VkC^(*jaClMWCgU>`9wY(v zhS{cNfL#*Eiy6{60SCw8HBKE9V#-<(7dHCNcry?e22uth)(EEnw8qS0u)~?3j?1D%O6Sg6jLZv4y zqE^2xsHyO4bQr8peeViD8i*dTp9mh}2SZs&<-!iHZCgJeG|56t6U9vhUZC{`IJ~3; zuehReLDgdVYB7mN+X3(tQDq71gZ8MqAGjyfF>r-4O$})I7f$G78563y$&*wWWvN~f zra>Fdd=%Vjl34qw?O+`laP+_qD^=DslgosxyN4TuQ~Ao8o{3~4ZAtUQP*8J4NluKN z9i!Fc>blRiesuO%k_~&-&<=0kSpJA=d~R;M)V?6kp+w)WobmW4t_Dt<`K7=DBL31I zV^)+XYs&m>$#@z%qZywTn5-|hMdi^gc5!mY8g+FF#{`o!VWil{%q6+kb7kahoaw2> zRrUbN9WR{Z>MdD!CWqZzib}-@ED0xq!=S809l^onhcTU{=uqnbh4bMUHu!)J=73K- z?oPdItl&yYkBft7;##IcsiXv82}->P7zfZ&_D$*FlPa&3IH;s=0W~VFHNLi2QG*J< zmZ%aKhrP#qC>HF}c#=u{BA`A#SiPlO9F&s@aY&Q2#pukG?&@Xi6D;#<)a%+K-63U- zf&V7ek=itodrG1xkv_;yCLl1U*lx|y(ys2$BOjf1R+Yn#plc0|$Q4DdO0w`8p;Arc z=;U?fRr|bsRKrjaAB{>ROXIn-s=IpQI%LHFOET7ZZHlIaIZ3$3i_KgmmaLrM&Ussk z1V?poRH)Jgmv)rv2(Kc-{Wgm7=U(6nrRplwHyRu0WeXpWgp=SUz_({pK46jM1%l^s zKXIkExCG!LFxQJ%9*3OJO^TbqfiAdILrqMI&snTT8l9rKk%`nAjGKEuOPbiqa(K9*$brFPB$_Qc)R#kTUo*iPAgfMIMD`fgX zw?N7mG9Hk`#D!`_csDL;5K=jAaTGt|C*(S=%8lcbYL#6Z@%Kg$m;w6oNpKUd_$ow04xHs9F^8%wlo@@Pfqj8$ z316HoX2BN!q6AzUakw_h!DTBtXh}LCvv}%Cn<1#tYH>eFySrlVoXkhOo{(M}c{sVK zbI0r(Yn;uXU%Wg}nwOC)?p!M(z=G8nfVq(!^4$g5u>j=Sx^1Kp^brnojCYzkgG#j~ zXQ|LauM-#%R4lhqimNL5Ad}x_ZRbUSV7ZPmG^cd3>|2^TX*IDewWu2lEoz!7%gknD z-fZIC-hE!j-nAi8IZ4ixK0t_f#Ti;d2*(i!^r@-vhtD&LFRAJiO8W-WlvZ zf3fl1aBIWb=)d@GYwPLLr(2ufZN6x3efPq;cyaOF#@3)Y+-N>;%3&!DnD2lTh~6xO z5tJ~+gm!nEj35F1?rsD;m!u;7h3HFUsweFs!YlK-qrgR5(6?FP8TH;U-g!POf{$6_ z#f9)z_6J*w?#vRqu$$j>kAaAK=Rfv-tqHxgxc%d0oVWn#pmDiB!gjOAvNH;$il9en z4Ekpu`>d7B3MwFiLtKuT4Fl3)ORalY~)tE4rtf2&$e};#}i$cF_O^ zvCeJ*>ydZBx)TI5J6LaRJ$p(PV~Vl5m^tGC#_t*J=@f2rkp`YM+O%JQ2l*D3yCw4k zo!_KCIhpyQ8+O>73C}yU21z$DNA`sJSh)Y#ew|dAs!vkz5)X0k9H$oi@|LYmt}N#O zt!QjCF375X(hD+X-oZ9u)F zx6<_9aF0=CdqtX~`snUUjwW`s}mSxbD5R4D^~*!jo`Qa&KatfKKb_D6UB zP-X+IDg;4h4Q-JDTqZb9YjcDwO>s^51q=9GS1tNFW``$D0pG?GS8?SCkwOaYw9(kR z;I5<~PntXQ4WmkLva+po6M$pL=N(D?MjD(*6LoKs(*ry9FXA0JKPDiPCH~#w$=9C; z{<)|8Z{iM`7X&az{@-}^bTcXcKYb3*zRLd(|MOM;|0@6gZ}b0GzWy2vBV<(T^xq7} z{joQ~|1U3OJmyZ%MgWd=?vX5%@)#u9!^^4UBMgL;BGmLHPe2&VMd-ATD5a#~n9dGZl?7C;snQ>sc#x{y%-% z`g;C2~|<;0L&JcaM)st5`By;_30)c5Od$P9vJ)>XNCeb3(n+g*C0vn>hVgT}`-2+J2ZSwduwlIUXE8wl&e8(McKHC7>*03yP>D(+Ny; z2qbM&sfJgBz%zr{6m?Y4LX_fiy}CD*X&3DAkWxIrujJS$Gcc4b?RjcN5vivF%sy?9^Y~RfmS|AMs5+`t?K^p zQT;6m76H+LcAUKrR&;wC4j0>p!;TkD8t%8ZC)P~`vwv!}Hx0_bl0&KqB~UEj%r<^H z?41~<$sPu#AEJ?8n0uqzPtdU_c;AR)cjhAbgUHAp+HmCkNFANw(Z}7$n)I4KcM=KR z$UfABo4|}{D4cwY?n)rL88=Uf@SCn^8sh(sZtFAlrM4k#0m0#?wP5A=R z1$l-ZsqY_sAjuPB3nR~Sfk1-dh&~k=5?3=Rb+rc9yYBJZpUsWNv&QCk@Hh51H%Z7N z4LF(BFiLD$`G%pa^v=)CS8tCGSjVhAJU%)9<+P($tTXiaHq=6=bPo^7jk@UW)LuMv)-`34rr(!DIu|b=)g!4E$5{6U7>QQjrCp z)VXX#+=4vuDk|%BG2gf=JNOj$YLGRrSXDBa&O+hOh^HB+fZ|XwN*d(2#(RvsXBMI>GuI|jao*JsjIh&xN2myH!TgVD3b-od?v7YgHiPo4(iloeq0 zRFYjvAXit=3fwtOg* zC`=-Fl#_2dEf+ECKVzpPYeoR(ml=<7YKiBLEJK%WqF!+`;Ifi(C@{H8A)kB`CTJ=m zzca;m@FFNEWu9o_+6j<3v>wILycN~Un$qbh^bV@a`d%Db`ub zyGC~JNIuHLmgzm#a3`moAVa2#*A7PNT6)kpXTOy1N>|~ntsTQvGUBx29$?AVcmSem|R6^fa;AjJ4!u z6XUq{b$pznq}^$#3hpbsA@v2pgFCY-6P|=fa58cp$(4#j<4}(!5h%F=$RbmIj0%LL z;C$cufDEAUViSol;zW-!2?D;a5)RnuZ}uvp&WxB+8i?ix>Dv*^9P;hp6p-$Un%2qKGhBdynZUf5c9;EX8TRELTZ zNQgq}N|B`!CWIb$Bdi$4>cE@P-ot7Vt7Ia?gbBEa4&T-|=8N7NgBi(SSgJ-uiV0U4 z-=DFeNlg8l{9Co)G2P%y09VmAUK%UexDaXuv}#a^8-WyYa{ve~yzo-isX*^|N$He) zl#d>UG%cs4V5r5Uvt7w3(k(MKj@B~8;iFWjxOH72T%hM0Czla-8(D3`LrNoqpzNmA zY}T61rm)mdAE;tX_Cpspnm*~>u&36WecoF!jUs016!A4lnF4MDEz-Y(IM2T{U#2^V zQmbn0H2VgXfvfc5N16-0=iT&$Lft&lgu)gf41c->KIM<(E=Du=1VuDKy#`-)$@c70 zaD;1PEvbkVM~t{Zd1gRJ#;P{Auq>n~wJ=P>aqAe#ri}y((~fSbBHx7UP~2>}Y7|-A zMdlF>xFL?p`Dy4@-^fD9o?5tw?TH16r1FHsu3u_W-}41uc2! z(m&6FEO8Nw7`TK|Yr2zGPsgq+SvOvckhDfrZ5;)pod|M$Izk3g*ET}L)SSiSiVVr3 z@JNWJueACXc$hLz;|$U26XLs-2(3F23?OW(-*Qiy3;1lm~9XO`Z1 z`bwnqSXomNX|HQ|J`LII?s85AA){bEH&(V8ecuW$BM7p`*Ogw;eKs{odG&mU`|Y%S zP(SOO8D^@Tu&B`kL0r%fsL#&n%u>?ez^a?dO(z~62Kq(m(hp_`7{tSO~Sty2Y zxDQe|gbw?Bvy)T%?2Q&cCsJjJs|VW&#MHS5Yld7G*nq{BqH9~YQ=v?R!aO-0=l~)d zM`vA`T(4pL0N)7#Dfw~0i3+L8+VROL#rVx!0SGLQ0u(75Fa>ymF2=sI3McRC6MwY= zc&q9vJNTQ(S1JVz)(Uic!qwr`8G26$r2ssQ>jl=Segdb!5wr@jQwTS7KAJ9U&Js@5 z1mP@`PEHu@3|J!PXLgD)86H#Yg52_MpIH;Js44=N_$}Q+yMRxrwd0%xl+c{(i)qQt zMR6yhjgQWh^Z4ZHB;uNjDK}fosN)CwM@2@yK7M;(nvtfWw3fm&F_JWd-nofbn@Y19 z)tMH7popI+dW3Ug;vPY(O+=nDZDP9eHptT%(LLhTHL2UK(*2akwB3V7#8k_bN^YtLvZ> za~@+6PjSz)ZI@sNe~8sk1?Jv#P|- zs_grE8a=X9uF}*b?_MsP11r&kY;sGgre8+iCKn?^Qzs}iUjCA6p~?bGTE!*l1|<|i zdUg~ok}0ao!!{qxXEF0r+2?R~VcEXvnDd#*a;dxvA~lTCXdC`a#!mSjS$w2bOO}ik zJA_T37JC?v?T}aZW6t5 z(2>rNvto zE7WCIERkVAp2!axlG2$R$?;serHzsRMIFb>76R zL|Qp5@8$1YTs4mQZ(@0ien%aJ8s(+&dsKb3n5ks3m5f_=8cw-Oqm8>n$|y%0a_9^> zn3!-9+7& z`G|>5sjh(Gw^~L8`lk{C&~ugC%$^&SXfX6pZF2`U!yJ&iW9C?JxszQPwD*S24J<4< zx={ufmlB$2dI5I#&|st*p{l%$?5!4M*oI3qCtrg-o^m#cOq-Z1KQ>>sW}xXp$j1Yl z?n1b=l!71AM_5<9*%(R-^%cx%JnD&2!8tCjw6;Ox;obhYvg-eK&%eFW{&c}K<@!eH zw1vLA%2_w3@9TIYPkEjoz_3T%z+nT8ugnFCq^UWPnXsQn)^kIQ=8&^KS$42|mAJg( z9Va<2?N<0so?J{BSPBbSDeCRuY#0PJk>Xl+92copWEX_t5moN-qqxTAB;B`+pVPwG(yYk^Z z+D)n?m@iQAYIdY^LuWKYX9pc_rPQdXjQ6qRyg`NvM8nnYd|aWzmVgk5noV)fQ?&%; zph7qiUGB*q)%6lC%nM?ySDnGKW0 zi8c1p{D+nsVJIhIdU&g)%fk63tv|Se*TP6(VFB`qut6!Mf8a&DJi~I7G!UQ@mw+HP z*SMrb^J9?{x`sIfi<8(&-&U5Top=~01W!@z9s7OYh+8jlp;0d*jST^e^`dM{X`yNnhf1|xH1Uha&_uES0Ej(lDrh@=;{6g z0G$}eC+CJ#>XSDY>T=v$q5DNT1Y%!XU&QnP%kZlEdO^!W)M#GXaXnZ!ACuKs2JmcT zN7=q*rf*c~tcY~qiL~DF$z*rPX}OCNJo0e?E4aBK4aTdfAytC$bVi-?AF!6Bd318n zK4MiBxk#gueXKm=)h3NO6OJ2YCsAe!BTQN5^rJ~=qEu{sQeam}$JUtyeczdewyRMl z@)uYJ*!Tb4YZ!-~#un{~!DTt!0oo{RHVvgP*Ll-BIP0FCcaD?!*A+BHoKh~3;=S<&w80>jCC;kc%47sPY8F>h`@ zF)H$p^Cwj;WR$Cxvtz2LB8EqT{CG(9h|nIgW8VO$L$Bt`y=bh!xRA4}R3DabQizff z_=!~d5&q&_;P`}ZH|FUHv6lO1+Kd?~MBAy3Y-x~O8lg)Q1q{X% zcI&}4wH|mgzfTK-b=-rc;xmFN+KQrgt>d@7PR~5*?z45qXeE%IiNgpXmsVg3woE+9 zh&`(4B&1>N9mk*JiOC7{xJCqpbr6Fx>O%o~s8ZA`HJ_$L|2$l)XiiBIEvBYrLJXbi z(8j@tNPEQY(48jyW5~lrpFrxjk%wZEbRnxHd_;nkk&-esZvOg)o z(c$}7)_8m&0!At29M*43iMikEwO9%zz~$j<<|-)cK@w|=YLOyY_wT;$e*H=O+*$vV z765a{n5X~QYHcO;KhL(l`hR|wpRfL(U;RHH%K!6JR6|Q%8tNQ|IispgARdU%S#}`$ zW2qt04A;DGVJnLb>mjB!8IQewL%Fb^tDO91U|R!ti76Y6A8c!S>U&6O{$hTm+Vy&I z_tJD@&C4|6pz&H2S-Ho#rp5hIh$mcDMdjJmgH_|tl_()d1eJ*Q4P0v)TzVn82;gU% z8(CkmIA>nW(62MH_8QZEO_;j*RrxHWYAkj+P`Nn0iH(*|>0p5&F61XVvctGZpZ)z* zJ`j3C87lCl3|G|&Ca}lDx}+MSsZ&m<0UI6d{OGO%O<>Qv=v5dp6#{2K9|e&bEd_<# z4DUESgK37Wzanqf3!BFdWqC8{0}G3TVY^uA*t-^CzV*7uXNKls=~98LvyYCQ{V?*e z5t=1^{=8AhCv`HhrZo}nIupIQ#F5!u#l6KABboJsP6m1-`oJQN&;>gB0>V^60yQ%< z8~b*D=2K!+4wx67BC*wx@;;A1{>oS0N0=4mKw@u8Vcv!-!N|8Jj|p0o&u7%Kf*HPe zn)ns9WBm_xsHWSiVDwe>C5g$0{2Gse5RTSM+Zul11ZS@!O5+6UNzUHbwdW$8CX!UVJ$~Ek97f=T zy4KRq4o5~(>^pWJUiJZDeJ5F*@-7+z-iU=!6OGfUP|Fx zv&+5KwUv9R@UDHgV~`VetYtIv%RSxCFVRB1!IsKL$YCEL2L{oc^s4>Hln zd&hX9fh(|@?|nw1VU|r`C_MYTS(tL-Boap#Q}%}vCA0+LH&qEO-U?M?Ee3gYVdpO{ zpp{q%_(LHq?gW+XgjCo;rY~Q1Kh4PBiK5x-_4r0nS@E^C`dr>kvAAU8?{sZS%jSRg zUHtF(xwHN!p-?RvW1jx!S*w|@|GD|K{^#fT`KtfJj{~nJ z9e^@<2TzRE9WC;OYxMV+xA(yXDK-19~JIj>ZN zbpY`a4rbdGI2ZdBKlNO@PD>hGT6ly5U2t!xZ$N}qhyX0EK8%-0AwyvHL8GmbMDmcd zU6?p1`X;c3G83<;UKs&J71ivGBUMHx{@i<8$|??tsY9Hwq2)eo7Z@(;ZBxWH)DxKF}&>Bro^H5 z(k%)6EvR40YIO%4lh(}_uV>O}NT%+O>7KqSpZ-sz#Y@}{{;vD~o%KHn7s;YAiuFGm zTdn7*{BO_b{pUcySN+dd{m)nZ&%@|{M4|=#>TDR@#}i{Tv#F4>QMvS{@b5R(=)Nok z?6LEa13Cc0n-|ZZ>;53&Ao^#^$8M&IHF_0j-B zTOWA+nL6#)q2F~M?@<%`GMtRp&(7O^|FZt{y9WN5=njdA+z$)l z>(gof+1C2$=|LSXpU<|e3#Z;{a9`ijQNX(jx`0bUfVoASvBeqUwrLm`Wom`}OHAp} z@ctMBUlxQ5ZJ>94`@J*ReevSO#zK0n)020dv(vliwGu7!ib-mUtzfb~6*{Ut7PN3t zPtVQc?rB5&P*zUl&(w!e#m310IBMg<4jRNYX??Cey_c2JFY(B`i%%7O;Z1=|oIiNk zbH2gYv;};!az9fCut*VOI)SN*=9OxQ1>H>%Ee9<`1q0WsdsE~)m@x$vBv{WJeq|jB ztKWiH);leU52i`h^4oDfop|mYDsj+|%3Yc8M#XC-zQ(n-MEX6g&WWnwW2{99Y(&n; z*LHYxR#6#?lp~5vDT&)^6W9gt=k|U#kX~N_93OoBPL!4u&L{EYR!$(8&td!QUH6#u zZ0+vPMul>ch?BwQxLDFJ(2l0fUq!z3nA5;a-*0>n9rb?c{S-A<-&bqgf!3t;p%LF; z2koOH6Go56z|d0$uNq0YYn5R7WP=kjrTRb^lHaz{->S&Wc+AZ!IQjN_hvIoE_Dm0d zhz0717_%rF6W2uKe3(?zkq?5&6jk+9d;%5Af;*|%uiGJIG@3I}hU1>YA)=CFwW2In z9Cdpv1OYxrImIGO7pacuno@sac#nhH=b3M-{8nF!NiVUObV_CQg;#MZkpMGUMY){3-NAZLIo=fWX(SXU3(=YsN=WVE8Ajmm2-qb*X@=*q%aLS*jwt z;3$Oau16PLaS}ICvw%DL8S5|Qj~4@#vX_!EdOmMOTPn) znM~pLXIs)tDLWEr_HM~IjPhASpPHy$>T+31JU4t}O-@PgHoHs|qca-?yUDpn>eBoY z(LWvbPI@8%1ilVPc)G){NDo?(y57&5g#hM(gQn+EP<;3Loh&8vXosYNz{olsg-g zE6dHhp;kM!C-{fdIkK?mwt+CAXffrrsZk)G zw#DHNT}=&wWxu3&Nrg2NqpfOHbd8*in&c9Ni4==BMq(vWd0sR3+FqK3O03Hw6Zj{0f^5o!sQRkqtyt6= zt&K#UMa~H3YL9~Vr|0Hb z>w~&9mFYG?YDJ^K?>I_*Z>X(ZJsC6^HW#PVn6Ohi}APzGB{o;BvX2q}u9R5_mB z85Xfa0mw2|2i^?T+e2$M4p-F``5Fsl>NQU3y)l@P`vp4e=-tU{tEg8ms;5SH%0D{f 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 #6 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πX7Bhi*#8BG-p2YjY+U+jEWuoU+eYPmgMD@JYz# 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 z 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෠L?%eSi`8Pr7< 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%0DV9FA$DvHuCu9z>iLnFsVoF_SE|nFpN~ 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�?k40>&EB*CS3 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

-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\q~q}nXz(b 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

dxN=NU4fv`!tozdh<6z=-v-pPZ2qn|8e+$f} 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 {ojSJbo&-mriKBi#k_{v1VRBr| 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�Y@$w~GeFOTJ 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

Ds*lxz@_p{M``&m1 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 'abseil-io@googlegroups.com' } + s.source = { + :git => 'https://github.com/abseil/abseil-cpp.git', + :tag => '${tag}', + } + s.resource_bundles = { + s.module_name => 'PrivacyInfo.xcprivacy', + } + s.module_name = 'absl' + s.header_mappings_dir = 'absl' + s.header_dir = 'absl' + s.libraries = 'c++' + s.compiler_flags = '-Wno-everything' + s.pod_target_xcconfig = { + 'USER_HEADER_SEARCH_PATHS' => '$(inherited) "$(PODS_TARGET_SRCROOT)"', + 'USE_HEADERMAP' => 'NO', + 'ALWAYS_SEARCH_USER_PATHS' => 'NO', + } + s.ios.deployment_target = '9.0' + s.osx.deployment_target = '10.11' + s.tvos.deployment_target = '9.0' + s.watchos.deployment_target = '2.0' + s.subspec 'xcprivacy' do |ss| + ss.resource_bundles = { + ss.module_name => 'PrivacyInfo.xcprivacy', + } + end +""" + +# Rule object representing the rule of Bazel BUILD. +Rule = collections.namedtuple( + "Rule", "type name package srcs hdrs textual_hdrs deps visibility testonly") + + +def get_elem_value(elem, name): + """Returns the value of XML element with the given name.""" + for child in elem: + if child.attrib.get("name") != name: + continue + if child.tag == "string": + return child.attrib.get("value") + if child.tag == "boolean": + return child.attrib.get("value") == "true" + if child.tag == "list": + return [nested_child.attrib.get("value") for nested_child in child] + raise "Cannot recognize tag: " + child.tag + return None + + +def normalize_paths(paths): + """Returns the list of normalized path.""" + # e.g. ["//absl/strings:dir/header.h"] -> ["absl/strings/dir/header.h"] + return [path.lstrip("/").replace(":", "/") for path in paths] + + +def parse_rule(elem, package): + """Returns a rule from bazel XML rule.""" + return Rule( + type=elem.attrib["class"], + name=get_elem_value(elem, "name"), + package=package, + srcs=normalize_paths(get_elem_value(elem, "srcs") or []), + hdrs=normalize_paths(get_elem_value(elem, "hdrs") or []), + textual_hdrs=normalize_paths(get_elem_value(elem, "textual_hdrs") or []), + deps=get_elem_value(elem, "deps") or [], + visibility=get_elem_value(elem, "visibility") or [], + testonly=get_elem_value(elem, "testonly") or False) + + +def read_build(package): + """Runs bazel query on given package file and returns all cc rules.""" + result = subprocess.check_output( + ["bazel", "query", package + ":all", "--output", "xml"]) + root = xml.etree.ElementTree.fromstring(result) + return [ + parse_rule(elem, package) + for elem in root + if elem.tag == "rule" and elem.attrib["class"].startswith("cc_") + ] + + +def collect_rules(root_path): + """Collects and returns all rules from root path recursively.""" + rules = [] + for cur, _, _ in os.walk(root_path): + build_path = os.path.join(cur, "BUILD.bazel") + if os.path.exists(build_path): + rules.extend(read_build("//" + cur)) + return rules + + +def relevant_rule(rule): + """Returns true if a given rule is relevant when generating a podspec.""" + return ( + # cc_library only (ignore cc_test, cc_binary) + rule.type == "cc_library" and + # ignore empty rule + (rule.hdrs + rule.textual_hdrs + rule.srcs) and + # ignore test-only rule + not rule.testonly) + + +def get_spec_var(depth): + """Returns the name of variable for spec with given depth.""" + return "s" if depth == 0 else "s{}".format(depth) + + +def get_spec_name(label): + """Converts the label of bazel rule to the name of podspec.""" + assert label.startswith("//absl/"), "{} doesn't start with //absl/".format( + label) + # e.g. //absl/apple/banana -> abseil/apple/banana + return "abseil/" + label[7:] + + +def write_podspec(f, rules, args): + """Writes a podspec from given rules and args.""" + rule_dir = build_rule_directory(rules)["abseil"] + # Write root part with given arguments + spec = re.sub(r"\$\{(\w+)\}", lambda x: args[x.group(1)], + SPEC_TEMPLATE).lstrip() + f.write(spec) + # Write all target rules + write_podspec_map(f, rule_dir, 0) + f.write("end\n") + + +def build_rule_directory(rules): + """Builds a tree-style rule directory from given rules.""" + rule_dir = {} + for rule in rules: + cur = rule_dir + for frag in get_spec_name(rule.package).split("/"): + cur = cur.setdefault(frag, {}) + cur[rule.name] = rule + return rule_dir + + +def write_podspec_map(f, cur_map, depth): + """Writes podspec from rule map recursively.""" + for key, value in sorted(cur_map.items()): + indent = " " * (depth + 1) + f.write("{indent}{var0}.subspec '{key}' do |{var1}|\n".format( + indent=indent, + key=key, + var0=get_spec_var(depth), + var1=get_spec_var(depth + 1))) + if isinstance(value, dict): + write_podspec_map(f, value, depth + 1) + else: + write_podspec_rule(f, value, depth + 1) + f.write("{indent}end\n".format(indent=indent)) + + +def write_podspec_rule(f, rule, depth): + """Writes podspec from given rule.""" + indent = " " * (depth + 1) + spec_var = get_spec_var(depth) + # Puts all files in hdrs, textual_hdrs, and srcs into source_files. + # Since CocoaPods treats header_files a bit differently from bazel, + # this won't generate a header_files field so that all source_files + # are considered as header files. + srcs = sorted(set(rule.hdrs + rule.textual_hdrs + rule.srcs)) + write_indented_list( + f, "{indent}{var}.source_files = ".format(indent=indent, var=spec_var), + srcs) + # Writes dependencies of this rule. + for dep in sorted(rule.deps): + name = get_spec_name(dep.replace(":", "/")) + f.write("{indent}{var}.dependency '{dep}'\n".format( + indent=indent, var=spec_var, dep=name)) + # Writes dependency to xcprivacy + f.write( + "{indent}{var}.dependency '{dep}'\n".format( + indent=indent, var=spec_var, dep="abseil/xcprivacy" + ) + ) + + +def write_indented_list(f, leading, values): + """Writes leading values in an indented style.""" + f.write(leading) + f.write((",\n" + " " * len(leading)).join("'{}'".format(v) for v in values)) + f.write("\n") + + +def generate(args): + """Generates a podspec file from all BUILD files under absl directory.""" + rules = filter(relevant_rule, collect_rules("absl")) + with open(args.output, "wt") as f: + write_podspec(f, rules, vars(args)) + + +def main(): + parser = argparse.ArgumentParser( + description="Generates abseil.podspec from BUILD.bazel") + parser.add_argument( + "-v", "--version", help="The version of podspec", required=True) + parser.add_argument( + "-t", + "--tag", + default=None, + help="The name of git tag (default: version)") + parser.add_argument( + "-o", + "--output", + default="abseil.podspec", + help="The name of output file (default: abseil.podspec)") + args = parser.parse_args() + if args.tag is None: + args.tag = args.version + generate(args) + + +if __name__ == "__main__": + main() diff --git a/absl/algorithm/BUILD.bazel b/absl/algorithm/BUILD.bazel new file mode 100644 index 0000000..9a723e5 --- /dev/null +++ b/absl/algorithm/BUILD.bazel @@ -0,0 +1,90 @@ +# +# Copyright 2017 The Abseil Authors. +# +# 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 +# +# https://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. +# + +load( + "//absl:copts/configure_copts.bzl", + "ABSL_DEFAULT_COPTS", + "ABSL_DEFAULT_LINKOPTS", + "ABSL_TEST_COPTS", +) + +package( + default_visibility = ["//visibility:public"], + features = [ + "header_modules", + "layering_check", + "parse_headers", + ], +) + +licenses(["notice"]) + +cc_library( + name = "algorithm", + hdrs = ["algorithm.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + "//absl/base:config", + ], +) + +cc_test( + name = "algorithm_test", + size = "small", + srcs = ["algorithm_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":algorithm", + "//absl/base:config", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_library( + name = "container", + hdrs = [ + "container.h", + ], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":algorithm", + "//absl/base:config", + "//absl/base:core_headers", + "//absl/base:nullability", + "//absl/meta:type_traits", + ], +) + +cc_test( + name = "container_test", + srcs = ["container_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":container", + "//absl/base", + "//absl/base:config", + "//absl/base:core_headers", + "//absl/memory", + "//absl/types:span", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) diff --git a/absl/algorithm/CMakeLists.txt b/absl/algorithm/CMakeLists.txt new file mode 100644 index 0000000..252b6b2 --- /dev/null +++ b/absl/algorithm/CMakeLists.txt @@ -0,0 +1,73 @@ +# +# Copyright 2017 The Abseil Authors. +# +# 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 +# +# https://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. +# + +absl_cc_library( + NAME + algorithm + HDRS + "algorithm.h" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::config + PUBLIC +) + +absl_cc_test( + NAME + algorithm_test + SRCS + "algorithm_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::algorithm + absl::config + GTest::gmock_main +) + +absl_cc_library( + NAME + algorithm_container + HDRS + "container.h" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::algorithm + absl::config + absl::core_headers + absl::meta + absl::nullability + PUBLIC +) + +absl_cc_test( + NAME + container_test + SRCS + "container_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::algorithm_container + absl::base + absl::config + absl::core_headers + absl::memory + absl::span + GTest::gmock_main +) diff --git a/absl/algorithm/algorithm.h b/absl/algorithm/algorithm.h new file mode 100644 index 0000000..48f5950 --- /dev/null +++ b/absl/algorithm/algorithm.h @@ -0,0 +1,64 @@ +// Copyright 2017 The Abseil Authors. +// +// 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 +// +// https://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. +// +// ----------------------------------------------------------------------------- +// File: algorithm.h +// ----------------------------------------------------------------------------- +// +// This header file contains Google extensions to the standard C++ +// header. + +#ifndef ABSL_ALGORITHM_ALGORITHM_H_ +#define ABSL_ALGORITHM_ALGORITHM_H_ + +#include +#include +#include + +#include "absl/base/config.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN + +// equal() +// rotate() +// +// Historical note: Abseil once provided implementations of these algorithms +// prior to their adoption in C++14. New code should prefer to use the std +// variants. +// +// See the documentation for the STL header for more information: +// https://en.cppreference.com/w/cpp/header/algorithm +using std::equal; +using std::rotate; + +// linear_search() +// +// Performs a linear search for `value` using the iterator `first` up to +// but not including `last`, returning true if [`first`, `last`) contains an +// element equal to `value`. +// +// A linear search is of O(n) complexity which is guaranteed to make at most +// n = (`last` - `first`) comparisons. A linear search over short containers +// may be faster than a binary search, even when the container is sorted. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool linear_search( + InputIterator first, InputIterator last, const EqualityComparable& value) { + return std::find(first, last, value) != last; +} + +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_ALGORITHM_ALGORITHM_H_ diff --git a/absl/algorithm/algorithm_test.cc b/absl/algorithm/algorithm_test.cc new file mode 100644 index 0000000..1c1a307 --- /dev/null +++ b/absl/algorithm/algorithm_test.cc @@ -0,0 +1,60 @@ +// Copyright 2017 The Abseil Authors. +// +// 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 +// +// https://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 "absl/algorithm/algorithm.h" + +#include +#include + +#include "gtest/gtest.h" +#include "absl/base/config.h" + +namespace { + +class LinearSearchTest : public testing::Test { + protected: + LinearSearchTest() : container_{1, 2, 3} {} + + static bool Is3(int n) { return n == 3; } + static bool Is4(int n) { return n == 4; } + + std::vector container_; +}; + +TEST_F(LinearSearchTest, linear_search) { + EXPECT_TRUE(absl::linear_search(container_.begin(), container_.end(), 3)); + EXPECT_FALSE(absl::linear_search(container_.begin(), container_.end(), 4)); +} + +TEST_F(LinearSearchTest, linear_searchConst) { + const std::vector *const const_container = &container_; + EXPECT_TRUE( + absl::linear_search(const_container->begin(), const_container->end(), 3)); + EXPECT_FALSE( + absl::linear_search(const_container->begin(), const_container->end(), 4)); +} + +#if defined(ABSL_INTERNAL_CPLUSPLUS_LANG) && \ + ABSL_INTERNAL_CPLUSPLUS_LANG >= 202002L + +TEST_F(LinearSearchTest, Constexpr) { + static constexpr std::array kArray = {1, 2, 3}; + static_assert(absl::linear_search(kArray.begin(), kArray.end(), 3)); + static_assert(!absl::linear_search(kArray.begin(), kArray.end(), 4)); +} + +#endif // defined(ABSL_INTERNAL_CPLUSPLUS_LANG) && + // ABSL_INTERNAL_CPLUSPLUS_LANG >= 202002L + +} // namespace diff --git a/absl/algorithm/container.h b/absl/algorithm/container.h new file mode 100644 index 0000000..3193656 --- /dev/null +++ b/absl/algorithm/container.h @@ -0,0 +1,1830 @@ +// Copyright 2017 The Abseil Authors. +// +// 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 +// +// https://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. +// +// ----------------------------------------------------------------------------- +// File: container.h +// ----------------------------------------------------------------------------- +// +// This header file provides Container-based versions of algorithmic functions +// within the C++ standard library. The following standard library sets of +// functions are covered within this file: +// +// * Algorithmic functions +// * Algorithmic functions +// * functions +// +// The standard library functions operate on iterator ranges; the functions +// within this API operate on containers, though many return iterator ranges. +// +// All functions within this API are named with a `c_` prefix. Calls such as +// `absl::c_xx(container, ...) are equivalent to std:: functions such as +// `std::xx(std::begin(cont), std::end(cont), ...)`. Functions that act on +// iterators but not conceptually on iterator ranges (e.g. `std::iter_swap`) +// have no equivalent here. +// +// For template parameter and variable naming, `C` indicates the container type +// to which the function is applied, `Pred` indicates the predicate object type +// to be used by the function and `T` indicates the applicable element type. + +#ifndef ABSL_ALGORITHM_CONTAINER_H_ +#define ABSL_ALGORITHM_CONTAINER_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "absl/algorithm/algorithm.h" +#include "absl/base/config.h" +#include "absl/base/macros.h" +#include "absl/base/nullability.h" +#include "absl/meta/type_traits.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_algorithm_internal { + +// NOTE: it is important to defer to ADL lookup for building with C++ modules, +// especially for headers like which are not visible from this file +// but specialize std::begin and std::end. +using std::begin; +using std::end; + +// The type of the iterator given by begin(c) (possibly std::begin(c)). +// ContainerIter> gives vector::const_iterator, +// while ContainerIter> gives vector::iterator. +template +using ContainerIter = decltype(begin(std::declval())); + +// An MSVC bug involving template parameter substitution requires us to use +// decltype() here instead of just std::pair. +template +using ContainerIterPairType = + decltype(std::make_pair(ContainerIter(), ContainerIter())); + +template +using ContainerDifferenceType = decltype(std::distance( + std::declval>(), std::declval>())); + +template +using ContainerPointerType = + typename std::iterator_traits>::pointer; + +// container_algorithm_internal::c_begin and +// container_algorithm_internal::c_end are abbreviations for proper ADL +// lookup of std::begin and std::end, i.e. +// using std::begin; +// using std::end; +// std::foo(begin(c), end(c)); +// becomes +// std::foo(container_algorithm_internal::c_begin(c), +// container_algorithm_internal::c_end(c)); +// These are meant for internal use only. + +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17 ContainerIter c_begin(C& c) { + return begin(c); +} + +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17 ContainerIter c_end(C& c) { + return end(c); +} + +template +struct IsUnorderedContainer : std::false_type {}; + +template +struct IsUnorderedContainer< + std::unordered_map> : std::true_type {}; + +template +struct IsUnorderedContainer> + : std::true_type {}; + +} // namespace container_algorithm_internal + +// PUBLIC API + +//------------------------------------------------------------------------------ +// Abseil algorithm.h functions +//------------------------------------------------------------------------------ + +// c_linear_search() +// +// Container-based version of absl::linear_search() for performing a linear +// search within a container. +// +// For a generalization that uses a predicate, see absl::c_any_of(). +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_linear_search( + const C& c, EqualityComparable&& value) { + return absl::linear_search(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(value)); +} + +//------------------------------------------------------------------------------ +// algorithms +//------------------------------------------------------------------------------ + +// c_distance() +// +// Container-based version of the `std::distance()` function to +// return the number of elements within a container. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17 + container_algorithm_internal::ContainerDifferenceType + c_distance(const C& c) { + return std::distance(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c)); +} + +//------------------------------------------------------------------------------ +// Non-modifying sequence operations +//------------------------------------------------------------------------------ + +// c_all_of() +// +// Container-based version of the `std::all_of()` function to +// test if all elements within a container satisfy a condition. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_all_of(const C& c, Pred&& pred) { + return std::all_of(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(pred)); +} + +// c_any_of() +// +// Container-based version of the `std::any_of()` function to +// test if any element in a container fulfills a condition. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_any_of(const C& c, Pred&& pred) { + return std::any_of(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(pred)); +} + +// c_none_of() +// +// Container-based version of the `std::none_of()` function to +// test if no elements in a container fulfill a condition. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_none_of(const C& c, Pred&& pred) { + return std::none_of(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(pred)); +} + +// c_for_each() +// +// Container-based version of the `std::for_each()` function to +// apply a function to a container's elements. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 decay_t c_for_each(C&& c, + Function&& f) { + return std::for_each(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(f)); +} + +// c_find() +// +// Container-based version of the `std::find()` function to find +// the first element containing the passed value within a container value. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_find(C& c, T&& value) { + return std::find(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(value)); +} + +// c_contains() +// +// Container-based version of the `std::ranges::contains()` C++23 +// function to search a container for a value. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_contains(const Sequence& sequence, + T&& value) { + return absl::c_find(sequence, std::forward(value)) != + container_algorithm_internal::c_end(sequence); +} + +// c_find_if() +// +// Container-based version of the `std::find_if()` function to find +// the first element in a container matching the given condition. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_find_if(C& c, Pred&& pred) { + return std::find_if(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(pred)); +} + +// c_find_if_not() +// +// Container-based version of the `std::find_if_not()` function to +// find the first element in a container not matching the given condition. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_find_if_not(C& c, Pred&& pred) { + return std::find_if_not(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(pred)); +} + +// c_find_end() +// +// Container-based version of the `std::find_end()` function to +// find the last subsequence within a container. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_find_end(Sequence1& sequence, Sequence2& subsequence) { + return std::find_end(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + container_algorithm_internal::c_begin(subsequence), + container_algorithm_internal::c_end(subsequence)); +} + +// Overload of c_find_end() for using a predicate evaluation other than `==` as +// the function's test condition. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_find_end(Sequence1& sequence, Sequence2& subsequence, + BinaryPredicate&& pred) { + return std::find_end(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + container_algorithm_internal::c_begin(subsequence), + container_algorithm_internal::c_end(subsequence), + std::forward(pred)); +} + +// c_find_first_of() +// +// Container-based version of the `std::find_first_of()` function to +// find the first element within the container that is also within the options +// container. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_find_first_of(C1& container, const C2& options) { + return std::find_first_of(container_algorithm_internal::c_begin(container), + container_algorithm_internal::c_end(container), + container_algorithm_internal::c_begin(options), + container_algorithm_internal::c_end(options)); +} + +// Overload of c_find_first_of() for using a predicate evaluation other than +// `==` as the function's test condition. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_find_first_of(C1& container, const C2& options, BinaryPredicate&& pred) { + return std::find_first_of(container_algorithm_internal::c_begin(container), + container_algorithm_internal::c_end(container), + container_algorithm_internal::c_begin(options), + container_algorithm_internal::c_end(options), + std::forward(pred)); +} + +// c_adjacent_find() +// +// Container-based version of the `std::adjacent_find()` function to +// find equal adjacent elements within a container. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_adjacent_find(Sequence& sequence) { + return std::adjacent_find(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence)); +} + +// Overload of c_adjacent_find() for using a predicate evaluation other than +// `==` as the function's test condition. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_adjacent_find(Sequence& sequence, BinaryPredicate&& pred) { + return std::adjacent_find(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + std::forward(pred)); +} + +// c_count() +// +// Container-based version of the `std::count()` function to count +// values that match within a container. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerDifferenceType + c_count(const C& c, T&& value) { + return std::count(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(value)); +} + +// c_count_if() +// +// Container-based version of the `std::count_if()` function to +// count values matching a condition within a container. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerDifferenceType + c_count_if(const C& c, Pred&& pred) { + return std::count_if(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(pred)); +} + +// c_mismatch() +// +// Container-based version of the `std::mismatch()` function to +// return the first element where two ordered containers differ. Applies `==` to +// the first N elements of `c1` and `c2`, where N = min(size(c1), size(c2)). +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIterPairType + c_mismatch(C1& c1, C2& c2) { + return std::mismatch(container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2)); +} + +// Overload of c_mismatch() for using a predicate evaluation other than `==` as +// the function's test condition. Applies `pred`to the first N elements of `c1` +// and `c2`, where N = min(size(c1), size(c2)). +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIterPairType + c_mismatch(C1& c1, C2& c2, BinaryPredicate pred) { + return std::mismatch(container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2), pred); +} + +// c_equal() +// +// Container-based version of the `std::equal()` function to +// test whether two containers are equal. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_equal(const C1& c1, const C2& c2) { + return std::equal(container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2)); +} + +// Overload of c_equal() for using a predicate evaluation other than `==` as +// the function's test condition. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_equal(const C1& c1, const C2& c2, + BinaryPredicate&& pred) { + return std::equal(container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2), + std::forward(pred)); +} + +// c_is_permutation() +// +// Container-based version of the `std::is_permutation()` function +// to test whether a container is a permutation of another. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_is_permutation(const C1& c1, + const C2& c2) { + return std::is_permutation(container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2)); +} + +// Overload of c_is_permutation() for using a predicate evaluation other than +// `==` as the function's test condition. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_is_permutation( + const C1& c1, const C2& c2, BinaryPredicate&& pred) { + return std::is_permutation(container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2), + std::forward(pred)); +} + +// c_search() +// +// Container-based version of the `std::search()` function to search +// a container for a subsequence. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_search(Sequence1& sequence, Sequence2& subsequence) { + return std::search(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + container_algorithm_internal::c_begin(subsequence), + container_algorithm_internal::c_end(subsequence)); +} + +// Overload of c_search() for using a predicate evaluation other than +// `==` as the function's test condition. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_search(Sequence1& sequence, Sequence2& subsequence, + BinaryPredicate&& pred) { + return std::search(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + container_algorithm_internal::c_begin(subsequence), + container_algorithm_internal::c_end(subsequence), + std::forward(pred)); +} + +// c_contains_subrange() +// +// Container-based version of the `std::ranges::contains_subrange()` +// C++23 function to search a container for a subsequence. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_contains_subrange( + Sequence1& sequence, Sequence2& subsequence) { + return absl::c_search(sequence, subsequence) != + container_algorithm_internal::c_end(sequence); +} + +// Overload of c_contains_subrange() for using a predicate evaluation other than +// `==` as the function's test condition. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 bool c_contains_subrange( + Sequence1& sequence, Sequence2& subsequence, BinaryPredicate&& pred) { + return absl::c_search(sequence, subsequence, + std::forward(pred)) != + container_algorithm_internal::c_end(sequence); +} + +// c_search_n() +// +// Container-based version of the `std::search_n()` function to +// search a container for the first sequence of N elements. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_search_n(Sequence& sequence, Size count, T&& value) { + return std::search_n(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), count, + std::forward(value)); +} + +// Overload of c_search_n() for using a predicate evaluation other than +// `==` as the function's test condition. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX20 + container_algorithm_internal::ContainerIter + c_search_n(Sequence& sequence, Size count, T&& value, + BinaryPredicate&& pred) { + return std::search_n(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), count, + std::forward(value), + std::forward(pred)); +} + +//------------------------------------------------------------------------------ +// Modifying sequence operations +//------------------------------------------------------------------------------ + +// c_copy() +// +// Container-based version of the `std::copy()` function to copy a +// container's elements into an iterator. +template +OutputIterator c_copy(const InputSequence& input, OutputIterator output) { + return std::copy(container_algorithm_internal::c_begin(input), + container_algorithm_internal::c_end(input), output); +} + +// c_copy_n() +// +// Container-based version of the `std::copy_n()` function to copy a +// container's first N elements into an iterator. +template +OutputIterator c_copy_n(const C& input, Size n, OutputIterator output) { + return std::copy_n(container_algorithm_internal::c_begin(input), n, output); +} + +// c_copy_if() +// +// Container-based version of the `std::copy_if()` function to copy +// a container's elements satisfying some condition into an iterator. +template +OutputIterator c_copy_if(const InputSequence& input, OutputIterator output, + Pred&& pred) { + return std::copy_if(container_algorithm_internal::c_begin(input), + container_algorithm_internal::c_end(input), output, + std::forward(pred)); +} + +// c_copy_backward() +// +// Container-based version of the `std::copy_backward()` function to +// copy a container's elements in reverse order into an iterator. +template +BidirectionalIterator c_copy_backward(const C& src, + BidirectionalIterator dest) { + return std::copy_backward(container_algorithm_internal::c_begin(src), + container_algorithm_internal::c_end(src), dest); +} + +// c_move() +// +// Container-based version of the `std::move()` function to move +// a container's elements into an iterator. +template +OutputIterator c_move(C&& src, OutputIterator dest) { + return std::move(container_algorithm_internal::c_begin(src), + container_algorithm_internal::c_end(src), dest); +} + +// c_move_backward() +// +// Container-based version of the `std::move_backward()` function to +// move a container's elements into an iterator in reverse order. +template +BidirectionalIterator c_move_backward(C&& src, BidirectionalIterator dest) { + return std::move_backward(container_algorithm_internal::c_begin(src), + container_algorithm_internal::c_end(src), dest); +} + +// c_swap_ranges() +// +// Container-based version of the `std::swap_ranges()` function to +// swap a container's elements with another container's elements. Swaps the +// first N elements of `c1` and `c2`, where N = min(size(c1), size(c2)). +template +container_algorithm_internal::ContainerIter c_swap_ranges(C1& c1, C2& c2) { + auto first1 = container_algorithm_internal::c_begin(c1); + auto last1 = container_algorithm_internal::c_end(c1); + auto first2 = container_algorithm_internal::c_begin(c2); + auto last2 = container_algorithm_internal::c_end(c2); + + using std::swap; + for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) { + swap(*first1, *first2); + } + return first2; +} + +// c_transform() +// +// Container-based version of the `std::transform()` function to +// transform a container's elements using the unary operation, storing the +// result in an iterator pointing to the last transformed element in the output +// range. +template +OutputIterator c_transform(const InputSequence& input, OutputIterator output, + UnaryOp&& unary_op) { + return std::transform(container_algorithm_internal::c_begin(input), + container_algorithm_internal::c_end(input), output, + std::forward(unary_op)); +} + +// Overload of c_transform() for performing a transformation using a binary +// predicate. Applies `binary_op` to the first N elements of `c1` and `c2`, +// where N = min(size(c1), size(c2)). +template +OutputIterator c_transform(const InputSequence1& input1, + const InputSequence2& input2, OutputIterator output, + BinaryOp&& binary_op) { + auto first1 = container_algorithm_internal::c_begin(input1); + auto last1 = container_algorithm_internal::c_end(input1); + auto first2 = container_algorithm_internal::c_begin(input2); + auto last2 = container_algorithm_internal::c_end(input2); + for (; first1 != last1 && first2 != last2; + ++first1, (void)++first2, ++output) { + *output = binary_op(*first1, *first2); + } + + return output; +} + +// c_replace() +// +// Container-based version of the `std::replace()` function to +// replace a container's elements of some value with a new value. The container +// is modified in place. +template +void c_replace(Sequence& sequence, const T& old_value, const T& new_value) { + std::replace(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), old_value, + new_value); +} + +// c_replace_if() +// +// Container-based version of the `std::replace_if()` function to +// replace a container's elements of some value with a new value based on some +// condition. The container is modified in place. +template +void c_replace_if(C& c, Pred&& pred, T&& new_value) { + std::replace_if(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(pred), std::forward(new_value)); +} + +// c_replace_copy() +// +// Container-based version of the `std::replace_copy()` function to +// replace a container's elements of some value with a new value and return the +// results within an iterator. +template +OutputIterator c_replace_copy(const C& c, OutputIterator result, T&& old_value, + T&& new_value) { + return std::replace_copy(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), result, + std::forward(old_value), + std::forward(new_value)); +} + +// c_replace_copy_if() +// +// Container-based version of the `std::replace_copy_if()` function +// to replace a container's elements of some value with a new value based on +// some condition, and return the results within an iterator. +template +OutputIterator c_replace_copy_if(const C& c, OutputIterator result, Pred&& pred, + const T& new_value) { + return std::replace_copy_if(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), result, + std::forward(pred), new_value); +} + +// c_fill() +// +// Container-based version of the `std::fill()` function to fill a +// container with some value. +template +void c_fill(C& c, const T& value) { + std::fill(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), value); +} + +// c_fill_n() +// +// Container-based version of the `std::fill_n()` function to fill +// the first N elements in a container with some value. +template +void c_fill_n(C& c, Size n, const T& value) { + std::fill_n(container_algorithm_internal::c_begin(c), n, value); +} + +// c_generate() +// +// Container-based version of the `std::generate()` function to +// assign a container's elements to the values provided by the given generator. +template +void c_generate(C& c, Generator&& gen) { + std::generate(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(gen)); +} + +// c_generate_n() +// +// Container-based version of the `std::generate_n()` function to +// assign a container's first N elements to the values provided by the given +// generator. +template +container_algorithm_internal::ContainerIter c_generate_n(C& c, Size n, + Generator&& gen) { + return std::generate_n(container_algorithm_internal::c_begin(c), n, + std::forward(gen)); +} + +// Note: `c_xx()` container versions for `remove()`, `remove_if()`, +// and `unique()` are omitted, because it's not clear whether or not such +// functions should call erase on their supplied sequences afterwards. Either +// behavior would be surprising for a different set of users. + +// c_remove_copy() +// +// Container-based version of the `std::remove_copy()` function to +// copy a container's elements while removing any elements matching the given +// `value`. +template +OutputIterator c_remove_copy(const C& c, OutputIterator result, + const T& value) { + return std::remove_copy(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), result, + value); +} + +// c_remove_copy_if() +// +// Container-based version of the `std::remove_copy_if()` function +// to copy a container's elements while removing any elements matching the given +// condition. +template +OutputIterator c_remove_copy_if(const C& c, OutputIterator result, + Pred&& pred) { + return std::remove_copy_if(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), result, + std::forward(pred)); +} + +// c_unique_copy() +// +// Container-based version of the `std::unique_copy()` function to +// copy a container's elements while removing any elements containing duplicate +// values. +template +OutputIterator c_unique_copy(const C& c, OutputIterator result) { + return std::unique_copy(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), result); +} + +// Overload of c_unique_copy() for using a predicate evaluation other than +// `==` for comparing uniqueness of the element values. +template +OutputIterator c_unique_copy(const C& c, OutputIterator result, + BinaryPredicate&& pred) { + return std::unique_copy(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), result, + std::forward(pred)); +} + +// c_reverse() +// +// Container-based version of the `std::reverse()` function to +// reverse a container's elements. +template +void c_reverse(Sequence& sequence) { + std::reverse(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence)); +} + +// c_reverse_copy() +// +// Container-based version of the `std::reverse()` function to +// reverse a container's elements and write them to an iterator range. +template +OutputIterator c_reverse_copy(const C& sequence, OutputIterator result) { + return std::reverse_copy(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + result); +} + +// c_rotate() +// +// Container-based version of the `std::rotate()` function to +// shift a container's elements leftward such that the `middle` element becomes +// the first element in the container. +template > +Iterator c_rotate(C& sequence, Iterator middle) { + return absl::rotate(container_algorithm_internal::c_begin(sequence), middle, + container_algorithm_internal::c_end(sequence)); +} + +// c_rotate_copy() +// +// Container-based version of the `std::rotate_copy()` function to +// shift a container's elements leftward such that the `middle` element becomes +// the first element in a new iterator range. +template +OutputIterator c_rotate_copy( + const C& sequence, + container_algorithm_internal::ContainerIter middle, + OutputIterator result) { + return std::rotate_copy(container_algorithm_internal::c_begin(sequence), + middle, container_algorithm_internal::c_end(sequence), + result); +} + +// c_shuffle() +// +// Container-based version of the `std::shuffle()` function to +// randomly shuffle elements within the container using a `gen()` uniform random +// number generator. +template +void c_shuffle(RandomAccessContainer& c, UniformRandomBitGenerator&& gen) { + std::shuffle(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(gen)); +} + +// c_sample() +// +// Container-based version of the `std::sample()` function to +// randomly sample elements from the container without replacement using a +// `gen()` uniform random number generator and write them to an iterator range. +template +OutputIterator c_sample(const C& c, OutputIterator result, Distance n, + UniformRandomBitGenerator&& gen) { +#if defined(__cpp_lib_sample) && __cpp_lib_sample >= 201603L + return std::sample(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), result, n, + std::forward(gen)); +#else + // Fall back to a stable selection-sampling implementation. + auto first = container_algorithm_internal::c_begin(c); + Distance unsampled_elements = c_distance(c); + n = (std::min)(n, unsampled_elements); + for (; n != 0; ++first) { + Distance r = + std::uniform_int_distribution(0, --unsampled_elements)(gen); + if (r < n) { + *result++ = *first; + --n; + } + } + return result; +#endif +} + +//------------------------------------------------------------------------------ +// Partition functions +//------------------------------------------------------------------------------ + +// c_is_partitioned() +// +// Container-based version of the `std::is_partitioned()` function +// to test whether all elements in the container for which `pred` returns `true` +// precede those for which `pred` is `false`. +template +bool c_is_partitioned(const C& c, Pred&& pred) { + return std::is_partitioned(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(pred)); +} + +// c_partition() +// +// Container-based version of the `std::partition()` function +// to rearrange all elements in a container in such a way that all elements for +// which `pred` returns `true` precede all those for which it returns `false`, +// returning an iterator to the first element of the second group. +template +container_algorithm_internal::ContainerIter c_partition(C& c, Pred&& pred) { + return std::partition(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(pred)); +} + +// c_stable_partition() +// +// Container-based version of the `std::stable_partition()` function +// to rearrange all elements in a container in such a way that all elements for +// which `pred` returns `true` precede all those for which it returns `false`, +// preserving the relative ordering between the two groups. The function returns +// an iterator to the first element of the second group. +template +container_algorithm_internal::ContainerIter c_stable_partition(C& c, + Pred&& pred) { + return std::stable_partition(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(pred)); +} + +// c_partition_copy() +// +// Container-based version of the `std::partition_copy()` function +// to partition a container's elements and return them into two iterators: one +// for which `pred` returns `true`, and one for which `pred` returns `false.` + +template +std::pair c_partition_copy( + const C& c, OutputIterator1 out_true, OutputIterator2 out_false, + Pred&& pred) { + return std::partition_copy(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), out_true, + out_false, std::forward(pred)); +} + +// c_partition_point() +// +// Container-based version of the `std::partition_point()` function +// to return the first element of an already partitioned container for which +// the given `pred` is not `true`. +template +container_algorithm_internal::ContainerIter c_partition_point(C& c, + Pred&& pred) { + return std::partition_point(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(pred)); +} + +//------------------------------------------------------------------------------ +// Sorting functions +//------------------------------------------------------------------------------ + +// c_sort() +// +// Container-based version of the `std::sort()` function +// to sort elements in ascending order of their values. +template +void c_sort(C& c) { + std::sort(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c)); +} + +// Overload of c_sort() for performing a `comp` comparison other than the +// default `operator<`. +template +void c_sort(C& c, LessThan&& comp) { + std::sort(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(comp)); +} + +// c_stable_sort() +// +// Container-based version of the `std::stable_sort()` function +// to sort elements in ascending order of their values, preserving the order +// of equivalents. +template +void c_stable_sort(C& c) { + std::stable_sort(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c)); +} + +// Overload of c_stable_sort() for performing a `comp` comparison other than the +// default `operator<`. +template +void c_stable_sort(C& c, LessThan&& comp) { + std::stable_sort(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(comp)); +} + +// c_is_sorted() +// +// Container-based version of the `std::is_sorted()` function +// to evaluate whether the given container is sorted in ascending order. +template +bool c_is_sorted(const C& c) { + return std::is_sorted(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c)); +} + +// c_is_sorted() overload for performing a `comp` comparison other than the +// default `operator<`. +template +bool c_is_sorted(const C& c, LessThan&& comp) { + return std::is_sorted(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(comp)); +} + +// c_partial_sort() +// +// Container-based version of the `std::partial_sort()` function +// to rearrange elements within a container such that elements before `middle` +// are sorted in ascending order. +template +void c_partial_sort( + RandomAccessContainer& sequence, + container_algorithm_internal::ContainerIter middle) { + std::partial_sort(container_algorithm_internal::c_begin(sequence), middle, + container_algorithm_internal::c_end(sequence)); +} + +// Overload of c_partial_sort() for performing a `comp` comparison other than +// the default `operator<`. +template +void c_partial_sort( + RandomAccessContainer& sequence, + container_algorithm_internal::ContainerIter middle, + LessThan&& comp) { + std::partial_sort(container_algorithm_internal::c_begin(sequence), middle, + container_algorithm_internal::c_end(sequence), + std::forward(comp)); +} + +// c_partial_sort_copy() +// +// Container-based version of the `std::partial_sort_copy()` +// function to sort the elements in the given range `result` within the larger +// `sequence` in ascending order (and using `result` as the output parameter). +// At most min(result.last - result.first, sequence.last - sequence.first) +// elements from the sequence will be stored in the result. +template +container_algorithm_internal::ContainerIter +c_partial_sort_copy(const C& sequence, RandomAccessContainer& result) { + return std::partial_sort_copy(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + container_algorithm_internal::c_begin(result), + container_algorithm_internal::c_end(result)); +} + +// Overload of c_partial_sort_copy() for performing a `comp` comparison other +// than the default `operator<`. +template +container_algorithm_internal::ContainerIter +c_partial_sort_copy(const C& sequence, RandomAccessContainer& result, + LessThan&& comp) { + return std::partial_sort_copy(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + container_algorithm_internal::c_begin(result), + container_algorithm_internal::c_end(result), + std::forward(comp)); +} + +// c_is_sorted_until() +// +// Container-based version of the `std::is_sorted_until()` function +// to return the first element within a container that is not sorted in +// ascending order as an iterator. +template +container_algorithm_internal::ContainerIter c_is_sorted_until(C& c) { + return std::is_sorted_until(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c)); +} + +// Overload of c_is_sorted_until() for performing a `comp` comparison other than +// the default `operator<`. +template +container_algorithm_internal::ContainerIter c_is_sorted_until( + C& c, LessThan&& comp) { + return std::is_sorted_until(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(comp)); +} + +// c_nth_element() +// +// Container-based version of the `std::nth_element()` function +// to rearrange the elements within a container such that the `nth` element +// would be in that position in an ordered sequence; other elements may be in +// any order, except that all preceding `nth` will be less than that element, +// and all following `nth` will be greater than that element. +template +void c_nth_element( + RandomAccessContainer& sequence, + container_algorithm_internal::ContainerIter nth) { + std::nth_element(container_algorithm_internal::c_begin(sequence), nth, + container_algorithm_internal::c_end(sequence)); +} + +// Overload of c_nth_element() for performing a `comp` comparison other than +// the default `operator<`. +template +void c_nth_element( + RandomAccessContainer& sequence, + container_algorithm_internal::ContainerIter nth, + LessThan&& comp) { + std::nth_element(container_algorithm_internal::c_begin(sequence), nth, + container_algorithm_internal::c_end(sequence), + std::forward(comp)); +} + +//------------------------------------------------------------------------------ +// Binary Search +//------------------------------------------------------------------------------ + +// c_lower_bound() +// +// Container-based version of the `std::lower_bound()` function +// to return an iterator pointing to the first element in a sorted container +// which does not compare less than `value`. +template +container_algorithm_internal::ContainerIter c_lower_bound( + Sequence& sequence, const T& value) { + return std::lower_bound(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), value); +} + +// Overload of c_lower_bound() for performing a `comp` comparison other than +// the default `operator<`. +template +container_algorithm_internal::ContainerIter c_lower_bound( + Sequence& sequence, const T& value, LessThan&& comp) { + return std::lower_bound(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), value, + std::forward(comp)); +} + +// c_upper_bound() +// +// Container-based version of the `std::upper_bound()` function +// to return an iterator pointing to the first element in a sorted container +// which is greater than `value`. +template +container_algorithm_internal::ContainerIter c_upper_bound( + Sequence& sequence, const T& value) { + return std::upper_bound(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), value); +} + +// Overload of c_upper_bound() for performing a `comp` comparison other than +// the default `operator<`. +template +container_algorithm_internal::ContainerIter c_upper_bound( + Sequence& sequence, const T& value, LessThan&& comp) { + return std::upper_bound(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), value, + std::forward(comp)); +} + +// c_equal_range() +// +// Container-based version of the `std::equal_range()` function +// to return an iterator pair pointing to the first and last elements in a +// sorted container which compare equal to `value`. +template +container_algorithm_internal::ContainerIterPairType +c_equal_range(Sequence& sequence, const T& value) { + return std::equal_range(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), value); +} + +// Overload of c_equal_range() for performing a `comp` comparison other than +// the default `operator<`. +template +container_algorithm_internal::ContainerIterPairType +c_equal_range(Sequence& sequence, const T& value, LessThan&& comp) { + return std::equal_range(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), value, + std::forward(comp)); +} + +// c_binary_search() +// +// Container-based version of the `std::binary_search()` function +// to test if any element in the sorted container contains a value equivalent to +// 'value'. +template +bool c_binary_search(const Sequence& sequence, const T& value) { + return std::binary_search(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + value); +} + +// Overload of c_binary_search() for performing a `comp` comparison other than +// the default `operator<`. +template +bool c_binary_search(const Sequence& sequence, const T& value, + LessThan&& comp) { + return std::binary_search(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + value, std::forward(comp)); +} + +//------------------------------------------------------------------------------ +// Merge functions +//------------------------------------------------------------------------------ + +// c_merge() +// +// Container-based version of the `std::merge()` function +// to merge two sorted containers into a single sorted iterator. +template +OutputIterator c_merge(const C1& c1, const C2& c2, OutputIterator result) { + return std::merge(container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2), result); +} + +// Overload of c_merge() for performing a `comp` comparison other than +// the default `operator<`. +template +OutputIterator c_merge(const C1& c1, const C2& c2, OutputIterator result, + LessThan&& comp) { + return std::merge(container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2), result, + std::forward(comp)); +} + +// c_inplace_merge() +// +// Container-based version of the `std::inplace_merge()` function +// to merge a supplied iterator `middle` into a container. +template +void c_inplace_merge(C& c, + container_algorithm_internal::ContainerIter middle) { + std::inplace_merge(container_algorithm_internal::c_begin(c), middle, + container_algorithm_internal::c_end(c)); +} + +// Overload of c_inplace_merge() for performing a merge using a `comp` other +// than `operator<`. +template +void c_inplace_merge(C& c, + container_algorithm_internal::ContainerIter middle, + LessThan&& comp) { + std::inplace_merge(container_algorithm_internal::c_begin(c), middle, + container_algorithm_internal::c_end(c), + std::forward(comp)); +} + +// c_includes() +// +// Container-based version of the `std::includes()` function +// to test whether a sorted container `c1` entirely contains another sorted +// container `c2`. +template +bool c_includes(const C1& c1, const C2& c2) { + return std::includes(container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2)); +} + +// Overload of c_includes() for performing a merge using a `comp` other than +// `operator<`. +template +bool c_includes(const C1& c1, const C2& c2, LessThan&& comp) { + return std::includes(container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2), + std::forward(comp)); +} + +// c_set_union() +// +// Container-based version of the `std::set_union()` function +// to return an iterator containing the union of two containers; duplicate +// values are not copied into the output. +template ::value, + void>::type, + typename = typename std::enable_if< + !container_algorithm_internal::IsUnorderedContainer::value, + void>::type> +OutputIterator c_set_union(const C1& c1, const C2& c2, OutputIterator output) { + return std::set_union(container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2), output); +} + +// Overload of c_set_union() for performing a merge using a `comp` other than +// `operator<`. +template ::value, + void>::type, + typename = typename std::enable_if< + !container_algorithm_internal::IsUnorderedContainer::value, + void>::type> +OutputIterator c_set_union(const C1& c1, const C2& c2, OutputIterator output, + LessThan&& comp) { + return std::set_union(container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2), output, + std::forward(comp)); +} + +// c_set_intersection() +// +// Container-based version of the `std::set_intersection()` function +// to return an iterator containing the intersection of two sorted containers. +template ::value, + void>::type, + typename = typename std::enable_if< + !container_algorithm_internal::IsUnorderedContainer::value, + void>::type> +OutputIterator c_set_intersection(const C1& c1, const C2& c2, + OutputIterator output) { + // In debug builds, ensure that both containers are sorted with respect to the + // default comparator. std::set_intersection requires the containers be sorted + // using operator<. + assert(absl::c_is_sorted(c1)); + assert(absl::c_is_sorted(c2)); + return std::set_intersection(container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2), output); +} + +// Overload of c_set_intersection() for performing a merge using a `comp` other +// than `operator<`. +template ::value, + void>::type, + typename = typename std::enable_if< + !container_algorithm_internal::IsUnorderedContainer::value, + void>::type> +OutputIterator c_set_intersection(const C1& c1, const C2& c2, + OutputIterator output, LessThan&& comp) { + // In debug builds, ensure that both containers are sorted with respect to the + // default comparator. std::set_intersection requires the containers be sorted + // using the same comparator. + assert(absl::c_is_sorted(c1, comp)); + assert(absl::c_is_sorted(c2, comp)); + return std::set_intersection(container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2), output, + std::forward(comp)); +} + +// c_set_difference() +// +// Container-based version of the `std::set_difference()` function +// to return an iterator containing elements present in the first container but +// not in the second. +template ::value, + void>::type, + typename = typename std::enable_if< + !container_algorithm_internal::IsUnorderedContainer::value, + void>::type> +OutputIterator c_set_difference(const C1& c1, const C2& c2, + OutputIterator output) { + return std::set_difference(container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2), output); +} + +// Overload of c_set_difference() for performing a merge using a `comp` other +// than `operator<`. +template ::value, + void>::type, + typename = typename std::enable_if< + !container_algorithm_internal::IsUnorderedContainer::value, + void>::type> +OutputIterator c_set_difference(const C1& c1, const C2& c2, + OutputIterator output, LessThan&& comp) { + return std::set_difference(container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2), output, + std::forward(comp)); +} + +// c_set_symmetric_difference() +// +// Container-based version of the `std::set_symmetric_difference()` +// function to return an iterator containing elements present in either one +// container or the other, but not both. +template ::value, + void>::type, + typename = typename std::enable_if< + !container_algorithm_internal::IsUnorderedContainer::value, + void>::type> +OutputIterator c_set_symmetric_difference(const C1& c1, const C2& c2, + OutputIterator output) { + return std::set_symmetric_difference( + container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2), output); +} + +// Overload of c_set_symmetric_difference() for performing a merge using a +// `comp` other than `operator<`. +template ::value, + void>::type, + typename = typename std::enable_if< + !container_algorithm_internal::IsUnorderedContainer::value, + void>::type> +OutputIterator c_set_symmetric_difference(const C1& c1, const C2& c2, + OutputIterator output, + LessThan&& comp) { + return std::set_symmetric_difference( + container_algorithm_internal::c_begin(c1), + container_algorithm_internal::c_end(c1), + container_algorithm_internal::c_begin(c2), + container_algorithm_internal::c_end(c2), output, + std::forward(comp)); +} + +//------------------------------------------------------------------------------ +// Heap functions +//------------------------------------------------------------------------------ + +// c_push_heap() +// +// Container-based version of the `std::push_heap()` function +// to push a value onto a container heap. +template +void c_push_heap(RandomAccessContainer& sequence) { + std::push_heap(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence)); +} + +// Overload of c_push_heap() for performing a push operation on a heap using a +// `comp` other than `operator<`. +template +void c_push_heap(RandomAccessContainer& sequence, LessThan&& comp) { + std::push_heap(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + std::forward(comp)); +} + +// c_pop_heap() +// +// Container-based version of the `std::pop_heap()` function +// to pop a value from a heap container. +template +void c_pop_heap(RandomAccessContainer& sequence) { + std::pop_heap(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence)); +} + +// Overload of c_pop_heap() for performing a pop operation on a heap using a +// `comp` other than `operator<`. +template +void c_pop_heap(RandomAccessContainer& sequence, LessThan&& comp) { + std::pop_heap(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + std::forward(comp)); +} + +// c_make_heap() +// +// Container-based version of the `std::make_heap()` function +// to make a container a heap. +template +void c_make_heap(RandomAccessContainer& sequence) { + std::make_heap(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence)); +} + +// Overload of c_make_heap() for performing heap comparisons using a +// `comp` other than `operator<` +template +void c_make_heap(RandomAccessContainer& sequence, LessThan&& comp) { + std::make_heap(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + std::forward(comp)); +} + +// c_sort_heap() +// +// Container-based version of the `std::sort_heap()` function +// to sort a heap into ascending order (after which it is no longer a heap). +template +void c_sort_heap(RandomAccessContainer& sequence) { + std::sort_heap(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence)); +} + +// Overload of c_sort_heap() for performing heap comparisons using a +// `comp` other than `operator<` +template +void c_sort_heap(RandomAccessContainer& sequence, LessThan&& comp) { + std::sort_heap(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + std::forward(comp)); +} + +// c_is_heap() +// +// Container-based version of the `std::is_heap()` function +// to check whether the given container is a heap. +template +bool c_is_heap(const RandomAccessContainer& sequence) { + return std::is_heap(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence)); +} + +// Overload of c_is_heap() for performing heap comparisons using a +// `comp` other than `operator<` +template +bool c_is_heap(const RandomAccessContainer& sequence, LessThan&& comp) { + return std::is_heap(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + std::forward(comp)); +} + +// c_is_heap_until() +// +// Container-based version of the `std::is_heap_until()` function +// to find the first element in a given container which is not in heap order. +template +container_algorithm_internal::ContainerIter +c_is_heap_until(RandomAccessContainer& sequence) { + return std::is_heap_until(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence)); +} + +// Overload of c_is_heap_until() for performing heap comparisons using a +// `comp` other than `operator<` +template +container_algorithm_internal::ContainerIter +c_is_heap_until(RandomAccessContainer& sequence, LessThan&& comp) { + return std::is_heap_until(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + std::forward(comp)); +} + +//------------------------------------------------------------------------------ +// Min/max +//------------------------------------------------------------------------------ + +// c_min_element() +// +// Container-based version of the `std::min_element()` function +// to return an iterator pointing to the element with the smallest value, using +// `operator<` to make the comparisons. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17 + container_algorithm_internal::ContainerIter + c_min_element(Sequence& sequence) { + return std::min_element(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence)); +} + +// Overload of c_min_element() for performing a `comp` comparison other than +// `operator<`. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17 + container_algorithm_internal::ContainerIter + c_min_element(Sequence& sequence, LessThan&& comp) { + return std::min_element(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + std::forward(comp)); +} + +// c_max_element() +// +// Container-based version of the `std::max_element()` function +// to return an iterator pointing to the element with the largest value, using +// `operator<` to make the comparisons. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17 + container_algorithm_internal::ContainerIter + c_max_element(Sequence& sequence) { + return std::max_element(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence)); +} + +// Overload of c_max_element() for performing a `comp` comparison other than +// `operator<`. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17 + container_algorithm_internal::ContainerIter + c_max_element(Sequence& sequence, LessThan&& comp) { + return std::max_element(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + std::forward(comp)); +} + +// c_minmax_element() +// +// Container-based version of the `std::minmax_element()` function +// to return a pair of iterators pointing to the elements containing the +// smallest and largest values, respectively, using `operator<` to make the +// comparisons. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17 + container_algorithm_internal::ContainerIterPairType + c_minmax_element(C& c) { + return std::minmax_element(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c)); +} + +// Overload of c_minmax_element() for performing `comp` comparisons other than +// `operator<`. +template +ABSL_INTERNAL_CONSTEXPR_SINCE_CXX17 + container_algorithm_internal::ContainerIterPairType + c_minmax_element(C& c, LessThan&& comp) { + return std::minmax_element(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(comp)); +} + +//------------------------------------------------------------------------------ +// Lexicographical Comparisons +//------------------------------------------------------------------------------ + +// c_lexicographical_compare() +// +// Container-based version of the `std::lexicographical_compare()` +// function to lexicographically compare (e.g. sort words alphabetically) two +// container sequences. The comparison is performed using `operator<`. Note +// that capital letters ("A-Z") have ASCII values less than lowercase letters +// ("a-z"). +template +bool c_lexicographical_compare(const Sequence1& sequence1, + const Sequence2& sequence2) { + return std::lexicographical_compare( + container_algorithm_internal::c_begin(sequence1), + container_algorithm_internal::c_end(sequence1), + container_algorithm_internal::c_begin(sequence2), + container_algorithm_internal::c_end(sequence2)); +} + +// Overload of c_lexicographical_compare() for performing a lexicographical +// comparison using a `comp` operator instead of `operator<`. +template +bool c_lexicographical_compare(const Sequence1& sequence1, + const Sequence2& sequence2, LessThan&& comp) { + return std::lexicographical_compare( + container_algorithm_internal::c_begin(sequence1), + container_algorithm_internal::c_end(sequence1), + container_algorithm_internal::c_begin(sequence2), + container_algorithm_internal::c_end(sequence2), + std::forward(comp)); +} + +// c_next_permutation() +// +// Container-based version of the `std::next_permutation()` function +// to rearrange a container's elements into the next lexicographically greater +// permutation. +template +bool c_next_permutation(C& c) { + return std::next_permutation(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c)); +} + +// Overload of c_next_permutation() for performing a lexicographical +// comparison using a `comp` operator instead of `operator<`. +template +bool c_next_permutation(C& c, LessThan&& comp) { + return std::next_permutation(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(comp)); +} + +// c_prev_permutation() +// +// Container-based version of the `std::prev_permutation()` function +// to rearrange a container's elements into the next lexicographically lesser +// permutation. +template +bool c_prev_permutation(C& c) { + return std::prev_permutation(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c)); +} + +// Overload of c_prev_permutation() for performing a lexicographical +// comparison using a `comp` operator instead of `operator<`. +template +bool c_prev_permutation(C& c, LessThan&& comp) { + return std::prev_permutation(container_algorithm_internal::c_begin(c), + container_algorithm_internal::c_end(c), + std::forward(comp)); +} + +//------------------------------------------------------------------------------ +// algorithms +//------------------------------------------------------------------------------ + +// c_iota() +// +// Container-based version of the `std::iota()` function +// to compute successive values of `value`, as if incremented with `++value` +// after each element is written, and write them to the container. +template +void c_iota(Sequence& sequence, const T& value) { + std::iota(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), value); +} + +// c_accumulate() +// +// Container-based version of the `std::accumulate()` function +// to accumulate the element values of a container to `init` and return that +// accumulation by value. +// +// Note: Due to a language technicality this function has return type +// absl::decay_t. As a user of this function you can casually read +// this as "returns T by value" and assume it does the right thing. +template +decay_t c_accumulate(const Sequence& sequence, T&& init) { + return std::accumulate(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + std::forward(init)); +} + +// Overload of c_accumulate() for using a binary operations other than +// addition for computing the accumulation. +template +decay_t c_accumulate(const Sequence& sequence, T&& init, + BinaryOp&& binary_op) { + return std::accumulate(container_algorithm_internal::c_begin(sequence), + container_algorithm_internal::c_end(sequence), + std::forward(init), + std::forward(binary_op)); +} + +// c_inner_product() +// +// Container-based version of the `std::inner_product()` function +// to compute the cumulative inner product of container element pairs. +// +// Note: Due to a language technicality this function has return type +// absl::decay_t. As a user of this function you can casually read +// this as "returns T by value" and assume it does the right thing. +template +decay_t c_inner_product(const Sequence1& factors1, const Sequence2& factors2, + T&& sum) { + return std::inner_product(container_algorithm_internal::c_begin(factors1), + container_algorithm_internal::c_end(factors1), + container_algorithm_internal::c_begin(factors2), + std::forward(sum)); +} + +// Overload of c_inner_product() for using binary operations other than +// `operator+` (for computing the accumulation) and `operator*` (for computing +// the product between the two container's element pair). +template +decay_t c_inner_product(const Sequence1& factors1, const Sequence2& factors2, + T&& sum, BinaryOp1&& op1, BinaryOp2&& op2) { + return std::inner_product(container_algorithm_internal::c_begin(factors1), + container_algorithm_internal::c_end(factors1), + container_algorithm_internal::c_begin(factors2), + std::forward(sum), std::forward(op1), + std::forward(op2)); +} + +// c_adjacent_difference() +// +// Container-based version of the `std::adjacent_difference()` +// function to compute the difference between each element and the one preceding +// it and write it to an iterator. +template +OutputIt c_adjacent_difference(const InputSequence& input, + OutputIt output_first) { + return std::adjacent_difference(container_algorithm_internal::c_begin(input), + container_algorithm_internal::c_end(input), + output_first); +} + +// Overload of c_adjacent_difference() for using a binary operation other than +// subtraction to compute the adjacent difference. +template +OutputIt c_adjacent_difference(const InputSequence& input, + OutputIt output_first, BinaryOp&& op) { + return std::adjacent_difference(container_algorithm_internal::c_begin(input), + container_algorithm_internal::c_end(input), + output_first, std::forward(op)); +} + +// c_partial_sum() +// +// Container-based version of the `std::partial_sum()` function +// to compute the partial sum of the elements in a sequence and write them +// to an iterator. The partial sum is the sum of all element values so far in +// the sequence. +template +OutputIt c_partial_sum(const InputSequence& input, OutputIt output_first) { + return std::partial_sum(container_algorithm_internal::c_begin(input), + container_algorithm_internal::c_end(input), + output_first); +} + +// Overload of c_partial_sum() for using a binary operation other than addition +// to compute the "partial sum". +template +OutputIt c_partial_sum(const InputSequence& input, OutputIt output_first, + BinaryOp&& op) { + return std::partial_sum(container_algorithm_internal::c_begin(input), + container_algorithm_internal::c_end(input), + output_first, std::forward(op)); +} + +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_ALGORITHM_CONTAINER_H_ diff --git a/absl/algorithm/container_test.cc b/absl/algorithm/container_test.cc new file mode 100644 index 0000000..85e3b11 --- /dev/null +++ b/absl/algorithm/container_test.cc @@ -0,0 +1,1421 @@ +// Copyright 2017 The Abseil Authors. +// +// 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 +// +// https://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 "absl/algorithm/container.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/casts.h" +#include "absl/base/config.h" +#include "absl/base/macros.h" +#include "absl/memory/memory.h" +#include "absl/types/span.h" + +namespace { + +using ::testing::Each; +using ::testing::ElementsAre; +using ::testing::Gt; +using ::testing::IsNull; +using ::testing::IsSubsetOf; +using ::testing::Lt; +using ::testing::Pointee; +using ::testing::SizeIs; +using ::testing::Truly; +using ::testing::UnorderedElementsAre; + +// Most of these tests just check that the code compiles, not that it +// does the right thing. That's fine since the functions just forward +// to the STL implementation. +class NonMutatingTest : public testing::Test { + protected: + std::unordered_set container_ = {1, 2, 3}; + std::list sequence_ = {1, 2, 3}; + std::vector vector_ = {1, 2, 3}; + int array_[3] = {1, 2, 3}; +}; + +struct AccumulateCalls { + void operator()(int value) { calls.push_back(value); } + std::vector calls; +}; + +bool Predicate(int value) { return value < 3; } +bool BinPredicate(int v1, int v2) { return v1 < v2; } +bool Equals(int v1, int v2) { return v1 == v2; } +bool IsOdd(int x) { return x % 2 != 0; } + +TEST_F(NonMutatingTest, Distance) { + EXPECT_EQ(container_.size(), + static_cast(absl::c_distance(container_))); + EXPECT_EQ(sequence_.size(), static_cast(absl::c_distance(sequence_))); + EXPECT_EQ(vector_.size(), static_cast(absl::c_distance(vector_))); + EXPECT_EQ(ABSL_ARRAYSIZE(array_), + static_cast(absl::c_distance(array_))); + + // Works with a temporary argument. + EXPECT_EQ(vector_.size(), + static_cast(absl::c_distance(std::vector(vector_)))); +} + +TEST_F(NonMutatingTest, Distance_OverloadedBeginEnd) { + // Works with classes which have custom ADL-selected overloads of std::begin + // and std::end. + std::initializer_list a = {1, 2, 3}; + std::valarray b = {1, 2, 3}; + EXPECT_EQ(3, absl::c_distance(a)); + EXPECT_EQ(3, absl::c_distance(b)); + + // It is assumed that other c_* functions use the same mechanism for + // ADL-selecting begin/end overloads. +} + +TEST_F(NonMutatingTest, ForEach) { + AccumulateCalls c = absl::c_for_each(container_, AccumulateCalls()); + // Don't rely on the unordered_set's order. + std::sort(c.calls.begin(), c.calls.end()); + EXPECT_EQ(vector_, c.calls); + + // Works with temporary container, too. + AccumulateCalls c2 = + absl::c_for_each(std::unordered_set(container_), AccumulateCalls()); + std::sort(c2.calls.begin(), c2.calls.end()); + EXPECT_EQ(vector_, c2.calls); +} + +TEST_F(NonMutatingTest, FindReturnsCorrectType) { + auto it = absl::c_find(container_, 3); + EXPECT_EQ(3, *it); + absl::c_find(absl::implicit_cast&>(sequence_), 3); +} + +TEST_F(NonMutatingTest, Contains) { + EXPECT_TRUE(absl::c_contains(container_, 3)); + EXPECT_FALSE(absl::c_contains(container_, 4)); +} + +TEST_F(NonMutatingTest, FindIf) { absl::c_find_if(container_, Predicate); } + +TEST_F(NonMutatingTest, FindIfNot) { + absl::c_find_if_not(container_, Predicate); +} + +TEST_F(NonMutatingTest, FindEnd) { + absl::c_find_end(sequence_, vector_); + absl::c_find_end(vector_, sequence_); +} + +TEST_F(NonMutatingTest, FindEndWithPredicate) { + absl::c_find_end(sequence_, vector_, BinPredicate); + absl::c_find_end(vector_, sequence_, BinPredicate); +} + +TEST_F(NonMutatingTest, FindFirstOf) { + absl::c_find_first_of(container_, sequence_); + absl::c_find_first_of(sequence_, container_); + absl::c_find_first_of(sequence_, std::array{1, 2}); +} + +TEST_F(NonMutatingTest, FindFirstOfWithPredicate) { + absl::c_find_first_of(container_, sequence_, BinPredicate); + absl::c_find_first_of(sequence_, container_, BinPredicate); + absl::c_find_first_of(sequence_, std::array{1, 2}, BinPredicate); +} + +TEST_F(NonMutatingTest, AdjacentFind) { absl::c_adjacent_find(sequence_); } + +TEST_F(NonMutatingTest, AdjacentFindWithPredicate) { + absl::c_adjacent_find(sequence_, BinPredicate); +} + +TEST_F(NonMutatingTest, Count) { EXPECT_EQ(1, absl::c_count(container_, 3)); } + +TEST_F(NonMutatingTest, CountIf) { + EXPECT_EQ(2, absl::c_count_if(container_, Predicate)); + const std::unordered_set& const_container = container_; + EXPECT_EQ(2, absl::c_count_if(const_container, Predicate)); +} + +TEST_F(NonMutatingTest, Mismatch) { + // Testing necessary as absl::c_mismatch executes logic. + { + auto result = absl::c_mismatch(vector_, sequence_); + EXPECT_EQ(result.first, vector_.end()); + EXPECT_EQ(result.second, sequence_.end()); + } + { + auto result = absl::c_mismatch(sequence_, vector_); + EXPECT_EQ(result.first, sequence_.end()); + EXPECT_EQ(result.second, vector_.end()); + } + + sequence_.back() = 5; + { + auto result = absl::c_mismatch(vector_, sequence_); + EXPECT_EQ(result.first, std::prev(vector_.end())); + EXPECT_EQ(result.second, std::prev(sequence_.end())); + } + { + auto result = absl::c_mismatch(sequence_, vector_); + EXPECT_EQ(result.first, std::prev(sequence_.end())); + EXPECT_EQ(result.second, std::prev(vector_.end())); + } + + sequence_.pop_back(); + { + auto result = absl::c_mismatch(vector_, sequence_); + EXPECT_EQ(result.first, std::prev(vector_.end())); + EXPECT_EQ(result.second, sequence_.end()); + } + { + auto result = absl::c_mismatch(sequence_, vector_); + EXPECT_EQ(result.first, sequence_.end()); + EXPECT_EQ(result.second, std::prev(vector_.end())); + } + { + struct NoNotEquals { + constexpr bool operator==(NoNotEquals) const { return true; } + constexpr bool operator!=(NoNotEquals) const = delete; + }; + std::vector first; + std::list second; + + // Check this still compiles. + absl::c_mismatch(first, second); + } +} + +TEST_F(NonMutatingTest, MismatchWithPredicate) { + // Testing necessary as absl::c_mismatch executes logic. + { + auto result = absl::c_mismatch(vector_, sequence_, BinPredicate); + EXPECT_EQ(result.first, vector_.begin()); + EXPECT_EQ(result.second, sequence_.begin()); + } + { + auto result = absl::c_mismatch(sequence_, vector_, BinPredicate); + EXPECT_EQ(result.first, sequence_.begin()); + EXPECT_EQ(result.second, vector_.begin()); + } + + sequence_.front() = 0; + { + auto result = absl::c_mismatch(vector_, sequence_, BinPredicate); + EXPECT_EQ(result.first, vector_.begin()); + EXPECT_EQ(result.second, sequence_.begin()); + } + { + auto result = absl::c_mismatch(sequence_, vector_, BinPredicate); + EXPECT_EQ(result.first, std::next(sequence_.begin())); + EXPECT_EQ(result.second, std::next(vector_.begin())); + } + + sequence_.clear(); + { + auto result = absl::c_mismatch(vector_, sequence_, BinPredicate); + EXPECT_EQ(result.first, vector_.begin()); + EXPECT_EQ(result.second, sequence_.end()); + } + { + auto result = absl::c_mismatch(sequence_, vector_, BinPredicate); + EXPECT_EQ(result.first, sequence_.end()); + EXPECT_EQ(result.second, vector_.begin()); + } +} + +TEST_F(NonMutatingTest, Equal) { + EXPECT_TRUE(absl::c_equal(vector_, sequence_)); + EXPECT_TRUE(absl::c_equal(sequence_, vector_)); + EXPECT_TRUE(absl::c_equal(sequence_, array_)); + EXPECT_TRUE(absl::c_equal(array_, vector_)); + + // Test that behavior appropriately differs from that of equal(). + std::vector vector_plus = {1, 2, 3}; + vector_plus.push_back(4); + EXPECT_FALSE(absl::c_equal(vector_plus, sequence_)); + EXPECT_FALSE(absl::c_equal(sequence_, vector_plus)); + EXPECT_FALSE(absl::c_equal(array_, vector_plus)); +} + +TEST_F(NonMutatingTest, EqualWithPredicate) { + EXPECT_TRUE(absl::c_equal(vector_, sequence_, Equals)); + EXPECT_TRUE(absl::c_equal(sequence_, vector_, Equals)); + EXPECT_TRUE(absl::c_equal(array_, sequence_, Equals)); + EXPECT_TRUE(absl::c_equal(vector_, array_, Equals)); + + // Test that behavior appropriately differs from that of equal(). + std::vector vector_plus = {1, 2, 3}; + vector_plus.push_back(4); + EXPECT_FALSE(absl::c_equal(vector_plus, sequence_, Equals)); + EXPECT_FALSE(absl::c_equal(sequence_, vector_plus, Equals)); + EXPECT_FALSE(absl::c_equal(vector_plus, array_, Equals)); +} + +TEST_F(NonMutatingTest, IsPermutation) { + auto vector_permut_ = vector_; + std::next_permutation(vector_permut_.begin(), vector_permut_.end()); + EXPECT_TRUE(absl::c_is_permutation(vector_permut_, sequence_)); + EXPECT_TRUE(absl::c_is_permutation(sequence_, vector_permut_)); + + // Test that behavior appropriately differs from that of is_permutation(). + std::vector vector_plus = {1, 2, 3}; + vector_plus.push_back(4); + EXPECT_FALSE(absl::c_is_permutation(vector_plus, sequence_)); + EXPECT_FALSE(absl::c_is_permutation(sequence_, vector_plus)); +} + +TEST_F(NonMutatingTest, IsPermutationWithPredicate) { + auto vector_permut_ = vector_; + std::next_permutation(vector_permut_.begin(), vector_permut_.end()); + EXPECT_TRUE(absl::c_is_permutation(vector_permut_, sequence_, Equals)); + EXPECT_TRUE(absl::c_is_permutation(sequence_, vector_permut_, Equals)); + + // Test that behavior appropriately differs from that of is_permutation(). + std::vector vector_plus = {1, 2, 3}; + vector_plus.push_back(4); + EXPECT_FALSE(absl::c_is_permutation(vector_plus, sequence_, Equals)); + EXPECT_FALSE(absl::c_is_permutation(sequence_, vector_plus, Equals)); +} + +TEST_F(NonMutatingTest, Search) { + absl::c_search(sequence_, vector_); + absl::c_search(vector_, sequence_); + absl::c_search(array_, sequence_); +} + +TEST_F(NonMutatingTest, SearchWithPredicate) { + absl::c_search(sequence_, vector_, BinPredicate); + absl::c_search(vector_, sequence_, BinPredicate); +} + +TEST_F(NonMutatingTest, ContainsSubrange) { + EXPECT_TRUE(absl::c_contains_subrange(sequence_, vector_)); + EXPECT_TRUE(absl::c_contains_subrange(vector_, sequence_)); + EXPECT_TRUE(absl::c_contains_subrange(array_, sequence_)); +} + +TEST_F(NonMutatingTest, ContainsSubrangeWithPredicate) { + EXPECT_TRUE(absl::c_contains_subrange(sequence_, vector_, Equals)); + EXPECT_TRUE(absl::c_contains_subrange(vector_, sequence_, Equals)); +} + +TEST_F(NonMutatingTest, SearchN) { absl::c_search_n(sequence_, 3, 1); } + +TEST_F(NonMutatingTest, SearchNWithPredicate) { + absl::c_search_n(sequence_, 3, 1, BinPredicate); +} + +TEST_F(NonMutatingTest, LowerBound) { + std::list::iterator i = absl::c_lower_bound(sequence_, 3); + ASSERT_TRUE(i != sequence_.end()); + EXPECT_EQ(2, std::distance(sequence_.begin(), i)); + EXPECT_EQ(3, *i); +} + +TEST_F(NonMutatingTest, LowerBoundWithPredicate) { + std::vector v(vector_); + std::sort(v.begin(), v.end(), std::greater()); + std::vector::iterator i = absl::c_lower_bound(v, 3, std::greater()); + EXPECT_TRUE(i == v.begin()); + EXPECT_EQ(3, *i); +} + +TEST_F(NonMutatingTest, UpperBound) { + std::list::iterator i = absl::c_upper_bound(sequence_, 1); + ASSERT_TRUE(i != sequence_.end()); + EXPECT_EQ(1, std::distance(sequence_.begin(), i)); + EXPECT_EQ(2, *i); +} + +TEST_F(NonMutatingTest, UpperBoundWithPredicate) { + std::vector v(vector_); + std::sort(v.begin(), v.end(), std::greater()); + std::vector::iterator i = absl::c_upper_bound(v, 1, std::greater()); + EXPECT_EQ(3, i - v.begin()); + EXPECT_TRUE(i == v.end()); +} + +TEST_F(NonMutatingTest, EqualRange) { + std::pair::iterator, std::list::iterator> p = + absl::c_equal_range(sequence_, 2); + EXPECT_EQ(1, std::distance(sequence_.begin(), p.first)); + EXPECT_EQ(2, std::distance(sequence_.begin(), p.second)); +} + +TEST_F(NonMutatingTest, EqualRangeArray) { + auto p = absl::c_equal_range(array_, 2); + EXPECT_EQ(1, std::distance(std::begin(array_), p.first)); + EXPECT_EQ(2, std::distance(std::begin(array_), p.second)); +} + +TEST_F(NonMutatingTest, EqualRangeWithPredicate) { + std::vector v(vector_); + std::sort(v.begin(), v.end(), std::greater()); + std::pair::iterator, std::vector::iterator> p = + absl::c_equal_range(v, 2, std::greater()); + EXPECT_EQ(1, std::distance(v.begin(), p.first)); + EXPECT_EQ(2, std::distance(v.begin(), p.second)); +} + +TEST_F(NonMutatingTest, BinarySearch) { + EXPECT_TRUE(absl::c_binary_search(vector_, 2)); + EXPECT_TRUE(absl::c_binary_search(std::vector(vector_), 2)); +} + +TEST_F(NonMutatingTest, BinarySearchWithPredicate) { + std::vector v(vector_); + std::sort(v.begin(), v.end(), std::greater()); + EXPECT_TRUE(absl::c_binary_search(v, 2, std::greater())); + EXPECT_TRUE( + absl::c_binary_search(std::vector(v), 2, std::greater())); +} + +TEST_F(NonMutatingTest, MinElement) { + std::list::iterator i = absl::c_min_element(sequence_); + ASSERT_TRUE(i != sequence_.end()); + EXPECT_EQ(*i, 1); +} + +TEST_F(NonMutatingTest, MinElementWithPredicate) { + std::list::iterator i = + absl::c_min_element(sequence_, std::greater()); + ASSERT_TRUE(i != sequence_.end()); + EXPECT_EQ(*i, 3); +} + +TEST_F(NonMutatingTest, MaxElement) { + std::list::iterator i = absl::c_max_element(sequence_); + ASSERT_TRUE(i != sequence_.end()); + EXPECT_EQ(*i, 3); +} + +TEST_F(NonMutatingTest, MaxElementWithPredicate) { + std::list::iterator i = + absl::c_max_element(sequence_, std::greater()); + ASSERT_TRUE(i != sequence_.end()); + EXPECT_EQ(*i, 1); +} + +TEST_F(NonMutatingTest, LexicographicalCompare) { + EXPECT_FALSE(absl::c_lexicographical_compare(sequence_, sequence_)); + + std::vector v; + v.push_back(1); + v.push_back(2); + v.push_back(4); + + EXPECT_TRUE(absl::c_lexicographical_compare(sequence_, v)); + EXPECT_TRUE(absl::c_lexicographical_compare(std::list(sequence_), v)); +} + +TEST_F(NonMutatingTest, LexicographicalCopmareWithPredicate) { + EXPECT_FALSE(absl::c_lexicographical_compare(sequence_, sequence_, + std::greater())); + + std::vector v; + v.push_back(1); + v.push_back(2); + v.push_back(4); + + EXPECT_TRUE( + absl::c_lexicographical_compare(v, sequence_, std::greater())); + EXPECT_TRUE(absl::c_lexicographical_compare( + std::vector(v), std::list(sequence_), std::greater())); +} + +TEST_F(NonMutatingTest, Includes) { + std::set s(vector_.begin(), vector_.end()); + s.insert(4); + EXPECT_TRUE(absl::c_includes(s, vector_)); +} + +TEST_F(NonMutatingTest, IncludesWithPredicate) { + std::vector v = {3, 2, 1}; + std::set> s(v.begin(), v.end()); + s.insert(4); + EXPECT_TRUE(absl::c_includes(s, v, std::greater())); +} + +class NumericMutatingTest : public testing::Test { + protected: + std::list list_ = {1, 2, 3}; + std::vector output_; +}; + +TEST_F(NumericMutatingTest, Iota) { + absl::c_iota(list_, 5); + std::list expected{5, 6, 7}; + EXPECT_EQ(list_, expected); +} + +TEST_F(NonMutatingTest, Accumulate) { + EXPECT_EQ(absl::c_accumulate(sequence_, 4), 1 + 2 + 3 + 4); +} + +TEST_F(NonMutatingTest, AccumulateWithBinaryOp) { + EXPECT_EQ(absl::c_accumulate(sequence_, 4, std::multiplies()), + 1 * 2 * 3 * 4); +} + +TEST_F(NonMutatingTest, AccumulateLvalueInit) { + int lvalue = 4; + EXPECT_EQ(absl::c_accumulate(sequence_, lvalue), 1 + 2 + 3 + 4); +} + +TEST_F(NonMutatingTest, AccumulateWithBinaryOpLvalueInit) { + int lvalue = 4; + EXPECT_EQ(absl::c_accumulate(sequence_, lvalue, std::multiplies()), + 1 * 2 * 3 * 4); +} + +TEST_F(NonMutatingTest, InnerProduct) { + EXPECT_EQ(absl::c_inner_product(sequence_, vector_, 1000), + 1000 + 1 * 1 + 2 * 2 + 3 * 3); +} + +TEST_F(NonMutatingTest, InnerProductWithBinaryOps) { + EXPECT_EQ(absl::c_inner_product(sequence_, vector_, 10, + std::multiplies(), std::plus()), + 10 * (1 + 1) * (2 + 2) * (3 + 3)); +} + +TEST_F(NonMutatingTest, InnerProductLvalueInit) { + int lvalue = 1000; + EXPECT_EQ(absl::c_inner_product(sequence_, vector_, lvalue), + 1000 + 1 * 1 + 2 * 2 + 3 * 3); +} + +TEST_F(NonMutatingTest, InnerProductWithBinaryOpsLvalueInit) { + int lvalue = 10; + EXPECT_EQ(absl::c_inner_product(sequence_, vector_, lvalue, + std::multiplies(), std::plus()), + 10 * (1 + 1) * (2 + 2) * (3 + 3)); +} + +TEST_F(NumericMutatingTest, AdjacentDifference) { + auto last = absl::c_adjacent_difference(list_, std::back_inserter(output_)); + *last = 1000; + std::vector expected{1, 2 - 1, 3 - 2, 1000}; + EXPECT_EQ(output_, expected); +} + +TEST_F(NumericMutatingTest, AdjacentDifferenceWithBinaryOp) { + auto last = absl::c_adjacent_difference(list_, std::back_inserter(output_), + std::multiplies()); + *last = 1000; + std::vector expected{1, 2 * 1, 3 * 2, 1000}; + EXPECT_EQ(output_, expected); +} + +TEST_F(NumericMutatingTest, PartialSum) { + auto last = absl::c_partial_sum(list_, std::back_inserter(output_)); + *last = 1000; + std::vector expected{1, 1 + 2, 1 + 2 + 3, 1000}; + EXPECT_EQ(output_, expected); +} + +TEST_F(NumericMutatingTest, PartialSumWithBinaryOp) { + auto last = absl::c_partial_sum(list_, std::back_inserter(output_), + std::multiplies()); + *last = 1000; + std::vector expected{1, 1 * 2, 1 * 2 * 3, 1000}; + EXPECT_EQ(output_, expected); +} + +TEST_F(NonMutatingTest, LinearSearch) { + EXPECT_TRUE(absl::c_linear_search(container_, 3)); + EXPECT_FALSE(absl::c_linear_search(container_, 4)); +} + +TEST_F(NonMutatingTest, AllOf) { + const std::vector& v = vector_; + EXPECT_FALSE(absl::c_all_of(v, [](int x) { return x > 1; })); + EXPECT_TRUE(absl::c_all_of(v, [](int x) { return x > 0; })); +} + +TEST_F(NonMutatingTest, AnyOf) { + const std::vector& v = vector_; + EXPECT_TRUE(absl::c_any_of(v, [](int x) { return x > 2; })); + EXPECT_FALSE(absl::c_any_of(v, [](int x) { return x > 5; })); +} + +TEST_F(NonMutatingTest, NoneOf) { + const std::vector& v = vector_; + EXPECT_FALSE(absl::c_none_of(v, [](int x) { return x > 2; })); + EXPECT_TRUE(absl::c_none_of(v, [](int x) { return x > 5; })); +} + +TEST_F(NonMutatingTest, MinMaxElementLess) { + std::pair::const_iterator, std::vector::const_iterator> + p = absl::c_minmax_element(vector_, std::less()); + EXPECT_TRUE(p.first == vector_.begin()); + EXPECT_TRUE(p.second == vector_.begin() + 2); +} + +TEST_F(NonMutatingTest, MinMaxElementGreater) { + std::pair::const_iterator, std::vector::const_iterator> + p = absl::c_minmax_element(vector_, std::greater()); + EXPECT_TRUE(p.first == vector_.begin() + 2); + EXPECT_TRUE(p.second == vector_.begin()); +} + +TEST_F(NonMutatingTest, MinMaxElementNoPredicate) { + std::pair::const_iterator, std::vector::const_iterator> + p = absl::c_minmax_element(vector_); + EXPECT_TRUE(p.first == vector_.begin()); + EXPECT_TRUE(p.second == vector_.begin() + 2); +} + +class SortingTest : public testing::Test { + protected: + std::list sorted_ = {1, 2, 3, 4}; + std::list unsorted_ = {2, 4, 1, 3}; + std::list reversed_ = {4, 3, 2, 1}; +}; + +TEST_F(SortingTest, IsSorted) { + EXPECT_TRUE(absl::c_is_sorted(sorted_)); + EXPECT_FALSE(absl::c_is_sorted(unsorted_)); + EXPECT_FALSE(absl::c_is_sorted(reversed_)); +} + +TEST_F(SortingTest, IsSortedWithPredicate) { + EXPECT_FALSE(absl::c_is_sorted(sorted_, std::greater())); + EXPECT_FALSE(absl::c_is_sorted(unsorted_, std::greater())); + EXPECT_TRUE(absl::c_is_sorted(reversed_, std::greater())); +} + +TEST_F(SortingTest, IsSortedUntil) { + EXPECT_EQ(1, *absl::c_is_sorted_until(unsorted_)); + EXPECT_EQ(4, *absl::c_is_sorted_until(unsorted_, std::greater())); +} + +TEST_F(SortingTest, NthElement) { + std::vector unsorted = {2, 4, 1, 3}; + absl::c_nth_element(unsorted, unsorted.begin() + 2); + EXPECT_THAT(unsorted, ElementsAre(Lt(3), Lt(3), 3, Gt(3))); + absl::c_nth_element(unsorted, unsorted.begin() + 2, std::greater()); + EXPECT_THAT(unsorted, ElementsAre(Gt(2), Gt(2), 2, Lt(2))); +} + +TEST(MutatingTest, IsPartitioned) { + EXPECT_TRUE( + absl::c_is_partitioned(std::vector{1, 3, 5, 2, 4, 6}, IsOdd)); + EXPECT_FALSE( + absl::c_is_partitioned(std::vector{1, 2, 3, 4, 5, 6}, IsOdd)); + EXPECT_FALSE( + absl::c_is_partitioned(std::vector{2, 4, 6, 1, 3, 5}, IsOdd)); +} + +TEST(MutatingTest, Partition) { + std::vector actual = {1, 2, 3, 4, 5}; + absl::c_partition(actual, IsOdd); + EXPECT_THAT(actual, Truly([](const std::vector& c) { + return absl::c_is_partitioned(c, IsOdd); + })); +} + +TEST(MutatingTest, StablePartition) { + std::vector actual = {1, 2, 3, 4, 5}; + absl::c_stable_partition(actual, IsOdd); + EXPECT_THAT(actual, ElementsAre(1, 3, 5, 2, 4)); +} + +TEST(MutatingTest, PartitionCopy) { + const std::vector initial = {1, 2, 3, 4, 5}; + std::vector odds, evens; + auto ends = absl::c_partition_copy(initial, back_inserter(odds), + back_inserter(evens), IsOdd); + *ends.first = 7; + *ends.second = 6; + EXPECT_THAT(odds, ElementsAre(1, 3, 5, 7)); + EXPECT_THAT(evens, ElementsAre(2, 4, 6)); +} + +TEST(MutatingTest, PartitionPoint) { + const std::vector initial = {1, 3, 5, 2, 4}; + auto middle = absl::c_partition_point(initial, IsOdd); + EXPECT_EQ(2, *middle); +} + +TEST(MutatingTest, CopyMiddle) { + const std::vector initial = {4, -1, -2, -3, 5}; + const std::list input = {1, 2, 3}; + const std::vector expected = {4, 1, 2, 3, 5}; + + std::list test_list(initial.begin(), initial.end()); + absl::c_copy(input, ++test_list.begin()); + EXPECT_EQ(std::list(expected.begin(), expected.end()), test_list); + + std::vector test_vector = initial; + absl::c_copy(input, test_vector.begin() + 1); + EXPECT_EQ(expected, test_vector); +} + +TEST(MutatingTest, CopyFrontInserter) { + const std::list initial = {4, 5}; + const std::list input = {1, 2, 3}; + const std::list expected = {3, 2, 1, 4, 5}; + + std::list test_list = initial; + absl::c_copy(input, std::front_inserter(test_list)); + EXPECT_EQ(expected, test_list); +} + +TEST(MutatingTest, CopyBackInserter) { + const std::vector initial = {4, 5}; + const std::list input = {1, 2, 3}; + const std::vector expected = {4, 5, 1, 2, 3}; + + std::list test_list(initial.begin(), initial.end()); + absl::c_copy(input, std::back_inserter(test_list)); + EXPECT_EQ(std::list(expected.begin(), expected.end()), test_list); + + std::vector test_vector = initial; + absl::c_copy(input, std::back_inserter(test_vector)); + EXPECT_EQ(expected, test_vector); +} + +TEST(MutatingTest, CopyN) { + const std::vector initial = {1, 2, 3, 4, 5}; + const std::vector expected = {1, 2}; + std::vector actual; + absl::c_copy_n(initial, 2, back_inserter(actual)); + EXPECT_EQ(expected, actual); +} + +TEST(MutatingTest, CopyIf) { + const std::list input = {1, 2, 3}; + std::vector output; + absl::c_copy_if(input, std::back_inserter(output), + [](int i) { return i != 2; }); + EXPECT_THAT(output, ElementsAre(1, 3)); +} + +TEST(MutatingTest, CopyBackward) { + std::vector actual = {1, 2, 3, 4, 5}; + std::vector expected = {1, 2, 1, 2, 3}; + absl::c_copy_backward(absl::MakeSpan(actual.data(), 3), actual.end()); + EXPECT_EQ(expected, actual); +} + +TEST(MutatingTest, Move) { + std::vector> src; + src.emplace_back(absl::make_unique(1)); + src.emplace_back(absl::make_unique(2)); + src.emplace_back(absl::make_unique(3)); + src.emplace_back(absl::make_unique(4)); + src.emplace_back(absl::make_unique(5)); + + std::vector> dest = {}; + absl::c_move(src, std::back_inserter(dest)); + EXPECT_THAT(src, Each(IsNull())); + EXPECT_THAT(dest, ElementsAre(Pointee(1), Pointee(2), Pointee(3), Pointee(4), + Pointee(5))); +} + +TEST(MutatingTest, MoveBackward) { + std::vector> actual; + actual.emplace_back(absl::make_unique(1)); + actual.emplace_back(absl::make_unique(2)); + actual.emplace_back(absl::make_unique(3)); + actual.emplace_back(absl::make_unique(4)); + actual.emplace_back(absl::make_unique(5)); + auto subrange = absl::MakeSpan(actual.data(), 3); + absl::c_move_backward(subrange, actual.end()); + EXPECT_THAT(actual, ElementsAre(IsNull(), IsNull(), Pointee(1), Pointee(2), + Pointee(3))); +} + +TEST(MutatingTest, MoveWithRvalue) { + auto MakeRValueSrc = [] { + std::vector> src; + src.emplace_back(absl::make_unique(1)); + src.emplace_back(absl::make_unique(2)); + src.emplace_back(absl::make_unique(3)); + return src; + }; + + std::vector> dest = MakeRValueSrc(); + absl::c_move(MakeRValueSrc(), std::back_inserter(dest)); + EXPECT_THAT(dest, ElementsAre(Pointee(1), Pointee(2), Pointee(3), Pointee(1), + Pointee(2), Pointee(3))); +} + +TEST(MutatingTest, SwapRanges) { + std::vector odds = {2, 4, 6}; + std::vector evens = {1, 3, 5}; + absl::c_swap_ranges(odds, evens); + EXPECT_THAT(odds, ElementsAre(1, 3, 5)); + EXPECT_THAT(evens, ElementsAre(2, 4, 6)); + + odds.pop_back(); + absl::c_swap_ranges(odds, evens); + EXPECT_THAT(odds, ElementsAre(2, 4)); + EXPECT_THAT(evens, ElementsAre(1, 3, 6)); + + absl::c_swap_ranges(evens, odds); + EXPECT_THAT(odds, ElementsAre(1, 3)); + EXPECT_THAT(evens, ElementsAre(2, 4, 6)); +} + +TEST_F(NonMutatingTest, Transform) { + std::vector x{0, 2, 4}, y, z; + auto end = absl::c_transform(x, back_inserter(y), std::negate()); + EXPECT_EQ(std::vector({0, -2, -4}), y); + *end = 7; + EXPECT_EQ(std::vector({0, -2, -4, 7}), y); + + y = {1, 3, 0}; + end = absl::c_transform(x, y, back_inserter(z), std::plus()); + EXPECT_EQ(std::vector({1, 5, 4}), z); + *end = 7; + EXPECT_EQ(std::vector({1, 5, 4, 7}), z); + + z.clear(); + y.pop_back(); + end = absl::c_transform(x, y, std::back_inserter(z), std::plus()); + EXPECT_EQ(std::vector({1, 5}), z); + *end = 7; + EXPECT_EQ(std::vector({1, 5, 7}), z); + + z.clear(); + std::swap(x, y); + end = absl::c_transform(x, y, std::back_inserter(z), std::plus()); + EXPECT_EQ(std::vector({1, 5}), z); + *end = 7; + EXPECT_EQ(std::vector({1, 5, 7}), z); +} + +TEST(MutatingTest, Replace) { + const std::vector initial = {1, 2, 3, 1, 4, 5}; + const std::vector expected = {4, 2, 3, 4, 4, 5}; + + std::vector test_vector = initial; + absl::c_replace(test_vector, 1, 4); + EXPECT_EQ(expected, test_vector); + + std::list test_list(initial.begin(), initial.end()); + absl::c_replace(test_list, 1, 4); + EXPECT_EQ(std::list(expected.begin(), expected.end()), test_list); +} + +TEST(MutatingTest, ReplaceIf) { + std::vector actual = {1, 2, 3, 4, 5}; + const std::vector expected = {0, 2, 0, 4, 0}; + + absl::c_replace_if(actual, IsOdd, 0); + EXPECT_EQ(expected, actual); +} + +TEST(MutatingTest, ReplaceCopy) { + const std::vector initial = {1, 2, 3, 1, 4, 5}; + const std::vector expected = {4, 2, 3, 4, 4, 5}; + + std::vector actual; + absl::c_replace_copy(initial, back_inserter(actual), 1, 4); + EXPECT_EQ(expected, actual); +} + +TEST(MutatingTest, Sort) { + std::vector test_vector = {2, 3, 1, 4}; + absl::c_sort(test_vector); + EXPECT_THAT(test_vector, ElementsAre(1, 2, 3, 4)); +} + +TEST(MutatingTest, SortWithPredicate) { + std::vector test_vector = {2, 3, 1, 4}; + absl::c_sort(test_vector, std::greater()); + EXPECT_THAT(test_vector, ElementsAre(4, 3, 2, 1)); +} + +// For absl::c_stable_sort tests. Needs an operator< that does not cover all +// fields so that the test can check the sort preserves order of equal elements. +struct Element { + int key; + int value; + friend bool operator<(const Element& e1, const Element& e2) { + return e1.key < e2.key; + } + // Make gmock print useful diagnostics. + friend std::ostream& operator<<(std::ostream& o, const Element& e) { + return o << "{" << e.key << ", " << e.value << "}"; + } +}; + +MATCHER_P2(IsElement, key, value, "") { + return arg.key == key && arg.value == value; +} + +TEST(MutatingTest, StableSort) { + std::vector test_vector = {{1, 1}, {2, 1}, {2, 0}, {1, 0}, {2, 2}}; + absl::c_stable_sort(test_vector); + EXPECT_THAT(test_vector, + ElementsAre(IsElement(1, 1), IsElement(1, 0), IsElement(2, 1), + IsElement(2, 0), IsElement(2, 2))); +} + +TEST(MutatingTest, StableSortWithPredicate) { + std::vector test_vector = {{1, 1}, {2, 1}, {2, 0}, {1, 0}, {2, 2}}; + absl::c_stable_sort(test_vector, [](const Element& e1, const Element& e2) { + return e2 < e1; + }); + EXPECT_THAT(test_vector, + ElementsAre(IsElement(2, 1), IsElement(2, 0), IsElement(2, 2), + IsElement(1, 1), IsElement(1, 0))); +} + +TEST(MutatingTest, ReplaceCopyIf) { + const std::vector initial = {1, 2, 3, 4, 5}; + const std::vector expected = {0, 2, 0, 4, 0}; + + std::vector actual; + absl::c_replace_copy_if(initial, back_inserter(actual), IsOdd, 0); + EXPECT_EQ(expected, actual); +} + +TEST(MutatingTest, Fill) { + std::vector actual(5); + absl::c_fill(actual, 1); + EXPECT_THAT(actual, ElementsAre(1, 1, 1, 1, 1)); +} + +TEST(MutatingTest, FillN) { + std::vector actual(5, 0); + absl::c_fill_n(actual, 2, 1); + EXPECT_THAT(actual, ElementsAre(1, 1, 0, 0, 0)); +} + +TEST(MutatingTest, Generate) { + std::vector actual(5); + int x = 0; + absl::c_generate(actual, [&x]() { return ++x; }); + EXPECT_THAT(actual, ElementsAre(1, 2, 3, 4, 5)); +} + +TEST(MutatingTest, GenerateN) { + std::vector actual(5, 0); + int x = 0; + absl::c_generate_n(actual, 3, [&x]() { return ++x; }); + EXPECT_THAT(actual, ElementsAre(1, 2, 3, 0, 0)); +} + +TEST(MutatingTest, RemoveCopy) { + std::vector actual; + absl::c_remove_copy(std::vector{1, 2, 3}, back_inserter(actual), 2); + EXPECT_THAT(actual, ElementsAre(1, 3)); +} + +TEST(MutatingTest, RemoveCopyIf) { + std::vector actual; + absl::c_remove_copy_if(std::vector{1, 2, 3}, back_inserter(actual), + IsOdd); + EXPECT_THAT(actual, ElementsAre(2)); +} + +TEST(MutatingTest, UniqueCopy) { + std::vector actual; + absl::c_unique_copy(std::vector{1, 2, 2, 2, 3, 3, 2}, + back_inserter(actual)); + EXPECT_THAT(actual, ElementsAre(1, 2, 3, 2)); +} + +TEST(MutatingTest, UniqueCopyWithPredicate) { + std::vector actual; + absl::c_unique_copy(std::vector{1, 2, 3, -1, -2, -3, 1}, + back_inserter(actual), + [](int x, int y) { return (x < 0) == (y < 0); }); + EXPECT_THAT(actual, ElementsAre(1, -1, 1)); +} + +TEST(MutatingTest, Reverse) { + std::vector test_vector = {1, 2, 3, 4}; + absl::c_reverse(test_vector); + EXPECT_THAT(test_vector, ElementsAre(4, 3, 2, 1)); + + std::list test_list = {1, 2, 3, 4}; + absl::c_reverse(test_list); + EXPECT_THAT(test_list, ElementsAre(4, 3, 2, 1)); +} + +TEST(MutatingTest, ReverseCopy) { + std::vector actual; + absl::c_reverse_copy(std::vector{1, 2, 3, 4}, back_inserter(actual)); + EXPECT_THAT(actual, ElementsAre(4, 3, 2, 1)); +} + +TEST(MutatingTest, Rotate) { + std::vector actual = {1, 2, 3, 4}; + auto it = absl::c_rotate(actual, actual.begin() + 2); + EXPECT_THAT(actual, testing::ElementsAreArray({3, 4, 1, 2})); + EXPECT_EQ(*it, 1); +} + +TEST(MutatingTest, RotateCopy) { + std::vector initial = {1, 2, 3, 4}; + std::vector actual; + auto end = + absl::c_rotate_copy(initial, initial.begin() + 2, back_inserter(actual)); + *end = 5; + EXPECT_THAT(actual, ElementsAre(3, 4, 1, 2, 5)); +} + +template +T RandomlySeededPrng() { + std::random_device rdev; + std::seed_seq::result_type data[T::state_size]; + std::generate_n(data, T::state_size, std::ref(rdev)); + std::seed_seq prng_seed(data, data + T::state_size); + return T(prng_seed); +} + +TEST(MutatingTest, Shuffle) { + std::vector actual = {1, 2, 3, 4, 5}; + absl::c_shuffle(actual, RandomlySeededPrng()); + EXPECT_THAT(actual, UnorderedElementsAre(1, 2, 3, 4, 5)); +} + +TEST(MutatingTest, Sample) { + std::vector actual; + absl::c_sample(std::vector{1, 2, 3, 4, 5}, std::back_inserter(actual), 3, + RandomlySeededPrng()); + EXPECT_THAT(actual, IsSubsetOf({1, 2, 3, 4, 5})); + EXPECT_THAT(actual, SizeIs(3)); +} + +TEST(MutatingTest, PartialSort) { + std::vector sequence{5, 3, 42, 0}; + absl::c_partial_sort(sequence, sequence.begin() + 2); + EXPECT_THAT(absl::MakeSpan(sequence.data(), 2), ElementsAre(0, 3)); + absl::c_partial_sort(sequence, sequence.begin() + 2, std::greater()); + EXPECT_THAT(absl::MakeSpan(sequence.data(), 2), ElementsAre(42, 5)); +} + +TEST(MutatingTest, PartialSortCopy) { + const std::vector initial = {5, 3, 42, 0}; + std::vector actual(2); + absl::c_partial_sort_copy(initial, actual); + EXPECT_THAT(actual, ElementsAre(0, 3)); + absl::c_partial_sort_copy(initial, actual, std::greater()); + EXPECT_THAT(actual, ElementsAre(42, 5)); +} + +TEST(MutatingTest, Merge) { + std::vector actual; + absl::c_merge(std::vector{1, 3, 5}, std::vector{2, 4}, + back_inserter(actual)); + EXPECT_THAT(actual, ElementsAre(1, 2, 3, 4, 5)); +} + +TEST(MutatingTest, MergeWithComparator) { + std::vector actual; + absl::c_merge(std::vector{5, 3, 1}, std::vector{4, 2}, + back_inserter(actual), std::greater()); + EXPECT_THAT(actual, ElementsAre(5, 4, 3, 2, 1)); +} + +TEST(MutatingTest, InplaceMerge) { + std::vector actual = {1, 3, 5, 2, 4}; + absl::c_inplace_merge(actual, actual.begin() + 3); + EXPECT_THAT(actual, ElementsAre(1, 2, 3, 4, 5)); +} + +TEST(MutatingTest, InplaceMergeWithComparator) { + std::vector actual = {5, 3, 1, 4, 2}; + absl::c_inplace_merge(actual, actual.begin() + 3, std::greater()); + EXPECT_THAT(actual, ElementsAre(5, 4, 3, 2, 1)); +} + +class SetOperationsTest : public testing::Test { + protected: + std::vector a_ = {1, 2, 3}; + std::vector b_ = {1, 3, 5}; + + std::vector a_reversed_ = {3, 2, 1}; + std::vector b_reversed_ = {5, 3, 1}; +}; + +TEST_F(SetOperationsTest, SetUnion) { + std::vector actual; + absl::c_set_union(a_, b_, back_inserter(actual)); + EXPECT_THAT(actual, ElementsAre(1, 2, 3, 5)); +} + +TEST_F(SetOperationsTest, SetUnionWithComparator) { + std::vector actual; + absl::c_set_union(a_reversed_, b_reversed_, back_inserter(actual), + std::greater()); + EXPECT_THAT(actual, ElementsAre(5, 3, 2, 1)); +} + +TEST_F(SetOperationsTest, SetIntersection) { + std::vector actual; + absl::c_set_intersection(a_, b_, back_inserter(actual)); + EXPECT_THAT(actual, ElementsAre(1, 3)); +} + +TEST_F(SetOperationsTest, SetIntersectionWithComparator) { + std::vector actual; + absl::c_set_intersection(a_reversed_, b_reversed_, back_inserter(actual), + std::greater()); + EXPECT_THAT(actual, ElementsAre(3, 1)); +} + +TEST_F(SetOperationsTest, SetDifference) { + std::vector actual; + absl::c_set_difference(a_, b_, back_inserter(actual)); + EXPECT_THAT(actual, ElementsAre(2)); +} + +TEST_F(SetOperationsTest, SetDifferenceWithComparator) { + std::vector actual; + absl::c_set_difference(a_reversed_, b_reversed_, back_inserter(actual), + std::greater()); + EXPECT_THAT(actual, ElementsAre(2)); +} + +TEST_F(SetOperationsTest, SetSymmetricDifference) { + std::vector actual; + absl::c_set_symmetric_difference(a_, b_, back_inserter(actual)); + EXPECT_THAT(actual, ElementsAre(2, 5)); +} + +TEST_F(SetOperationsTest, SetSymmetricDifferenceWithComparator) { + std::vector actual; + absl::c_set_symmetric_difference(a_reversed_, b_reversed_, + back_inserter(actual), std::greater()); + EXPECT_THAT(actual, ElementsAre(5, 2)); +} + +TEST(HeapOperationsTest, WithoutComparator) { + std::vector heap = {1, 2, 3}; + EXPECT_FALSE(absl::c_is_heap(heap)); + absl::c_make_heap(heap); + EXPECT_TRUE(absl::c_is_heap(heap)); + heap.push_back(4); + EXPECT_EQ(3, absl::c_is_heap_until(heap) - heap.begin()); + absl::c_push_heap(heap); + EXPECT_EQ(4, heap[0]); + absl::c_pop_heap(heap); + EXPECT_EQ(4, heap[3]); + absl::c_make_heap(heap); + absl::c_sort_heap(heap); + EXPECT_THAT(heap, ElementsAre(1, 2, 3, 4)); + EXPECT_FALSE(absl::c_is_heap(heap)); +} + +TEST(HeapOperationsTest, WithComparator) { + using greater = std::greater; + std::vector heap = {3, 2, 1}; + EXPECT_FALSE(absl::c_is_heap(heap, greater())); + absl::c_make_heap(heap, greater()); + EXPECT_TRUE(absl::c_is_heap(heap, greater())); + heap.push_back(0); + EXPECT_EQ(3, absl::c_is_heap_until(heap, greater()) - heap.begin()); + absl::c_push_heap(heap, greater()); + EXPECT_EQ(0, heap[0]); + absl::c_pop_heap(heap, greater()); + EXPECT_EQ(0, heap[3]); + absl::c_make_heap(heap, greater()); + absl::c_sort_heap(heap, greater()); + EXPECT_THAT(heap, ElementsAre(3, 2, 1, 0)); + EXPECT_FALSE(absl::c_is_heap(heap, greater())); +} + +TEST(MutatingTest, PermutationOperations) { + std::vector initial = {1, 2, 3, 4}; + std::vector permuted = initial; + + absl::c_next_permutation(permuted); + EXPECT_TRUE(absl::c_is_permutation(initial, permuted)); + EXPECT_TRUE(absl::c_is_permutation(initial, permuted, std::equal_to())); + + std::vector permuted2 = initial; + absl::c_prev_permutation(permuted2, std::greater()); + EXPECT_EQ(permuted, permuted2); + + absl::c_prev_permutation(permuted); + EXPECT_EQ(initial, permuted); +} + +#if defined(ABSL_INTERNAL_CPLUSPLUS_LANG) && \ + ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L + +TEST(ConstexprTest, Distance) { + // Works at compile time with constexpr containers. + static_assert(absl::c_distance(std::array()) == 3); +} + +TEST(ConstexprTest, MinElement) { + constexpr std::array kArray = {1, 2, 3}; + static_assert(*absl::c_min_element(kArray) == 1); +} + +TEST(ConstexprTest, MinElementWithPredicate) { + constexpr std::array kArray = {1, 2, 3}; + static_assert(*absl::c_min_element(kArray, std::greater()) == 3); +} + +TEST(ConstexprTest, MaxElement) { + constexpr std::array kArray = {1, 2, 3}; + static_assert(*absl::c_max_element(kArray) == 3); +} + +TEST(ConstexprTest, MaxElementWithPredicate) { + constexpr std::array kArray = {1, 2, 3}; + static_assert(*absl::c_max_element(kArray, std::greater()) == 1); +} + +TEST(ConstexprTest, MinMaxElement) { + static constexpr std::array kArray = {1, 2, 3}; + constexpr auto kMinMaxPair = absl::c_minmax_element(kArray); + static_assert(*kMinMaxPair.first == 1); + static_assert(*kMinMaxPair.second == 3); +} + +TEST(ConstexprTest, MinMaxElementWithPredicate) { + static constexpr std::array kArray = {1, 2, 3}; + constexpr auto kMinMaxPair = + absl::c_minmax_element(kArray, std::greater()); + static_assert(*kMinMaxPair.first == 3); + static_assert(*kMinMaxPair.second == 1); +} +#endif // defined(ABSL_INTERNAL_CPLUSPLUS_LANG) && + // ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L + +#if defined(ABSL_INTERNAL_CPLUSPLUS_LANG) && \ + ABSL_INTERNAL_CPLUSPLUS_LANG >= 202002L + +TEST(ConstexprTest, LinearSearch) { + static constexpr std::array kArray = {1, 2, 3}; + static_assert(absl::c_linear_search(kArray, 3)); + static_assert(!absl::c_linear_search(kArray, 4)); +} + +TEST(ConstexprTest, AllOf) { + static constexpr std::array kArray = {1, 2, 3}; + static_assert(!absl::c_all_of(kArray, [](int x) { return x > 1; })); + static_assert(absl::c_all_of(kArray, [](int x) { return x > 0; })); +} + +TEST(ConstexprTest, AnyOf) { + static constexpr std::array kArray = {1, 2, 3}; + static_assert(absl::c_any_of(kArray, [](int x) { return x > 2; })); + static_assert(!absl::c_any_of(kArray, [](int x) { return x > 5; })); +} + +TEST(ConstexprTest, NoneOf) { + static constexpr std::array kArray = {1, 2, 3}; + static_assert(!absl::c_none_of(kArray, [](int x) { return x > 2; })); + static_assert(absl::c_none_of(kArray, [](int x) { return x > 5; })); +} + +TEST(ConstexprTest, ForEach) { + static constexpr std::array kArray = [] { + std::array array = {1, 2, 3}; + absl::c_for_each(array, [](int& x) { x += 1; }); + return array; + }(); + static_assert(kArray == std::array{2, 3, 4}); +} + +TEST(ConstexprTest, Find) { + static constexpr std::array kArray = {1, 2, 3}; + static_assert(absl::c_find(kArray, 1) == kArray.begin()); + static_assert(absl::c_find(kArray, 4) == kArray.end()); +} + +TEST(ConstexprTest, Contains) { + static constexpr std::array kArray = {1, 2, 3}; + static_assert(absl::c_contains(kArray, 1)); + static_assert(!absl::c_contains(kArray, 4)); +} + +TEST(ConstexprTest, FindIf) { + static constexpr std::array kArray = {1, 2, 3}; + static_assert(absl::c_find_if(kArray, [](int x) { return x > 2; }) == + kArray.begin() + 2); + static_assert(absl::c_find_if(kArray, [](int x) { return x > 5; }) == + kArray.end()); +} + +TEST(ConstexprTest, FindIfNot) { + static constexpr std::array kArray = {1, 2, 3}; + static_assert(absl::c_find_if_not(kArray, [](int x) { return x > 1; }) == + kArray.begin()); + static_assert(absl::c_find_if_not(kArray, [](int x) { return x > 0; }) == + kArray.end()); +} + +TEST(ConstexprTest, FindEnd) { + static constexpr std::array kHaystack = {1, 2, 3, 2, 3}; + static constexpr std::array kNeedle = {2, 3}; + static_assert(absl::c_find_end(kHaystack, kNeedle) == kHaystack.begin() + 3); +} + +TEST(ConstexprTest, FindFirstOf) { + static constexpr std::array kArray = {1, 2, 3}; + static_assert(absl::c_find_first_of(kArray, kArray) == kArray.begin()); +} + +TEST(ConstexprTest, AdjacentFind) { + static constexpr std::array kArray = {1, 2, 2, 3}; + static_assert(absl::c_adjacent_find(kArray) == kArray.begin() + 1); +} + +TEST(ConstexprTest, AdjacentFindWithPredicate) { + static constexpr std::array kArray = {1, 2, 3}; + static_assert(absl::c_adjacent_find(kArray, std::less()) == + kArray.begin()); +} + +TEST(ConstexprTest, Count) { + static constexpr std::array kArray = {1, 2, 3}; + static_assert(absl::c_count(kArray, 1) == 1); + static_assert(absl::c_count(kArray, 2) == 1); + static_assert(absl::c_count(kArray, 3) == 1); + static_assert(absl::c_count(kArray, 4) == 0); +} + +TEST(ConstexprTest, CountIf) { + static constexpr std::array kArray = {1, 2, 3}; + static_assert(absl::c_count_if(kArray, [](int x) { return x > 0; }) == 3); + static_assert(absl::c_count_if(kArray, [](int x) { return x > 1; }) == 2); +} + +TEST(ConstexprTest, Mismatch) { + static constexpr std::array kArray1 = {1, 2, 3}; + static constexpr std::array kArray2 = {1, 2, 3}; + static constexpr std::array kArray3 = {2, 3, 4}; + static_assert(absl::c_mismatch(kArray1, kArray2) == + std::pair{kArray1.end(), kArray2.end()}); + static_assert(absl::c_mismatch(kArray1, kArray3) == + std::pair{kArray1.begin(), kArray3.begin()}); +} + +TEST(ConstexprTest, MismatchWithPredicate) { + static constexpr std::array kArray1 = {1, 2, 3}; + static constexpr std::array kArray2 = {1, 2, 3}; + static constexpr std::array kArray3 = {2, 3, 4}; + static_assert(absl::c_mismatch(kArray1, kArray2, std::not_equal_to()) == + std::pair{kArray1.begin(), kArray2.begin()}); + static_assert(absl::c_mismatch(kArray1, kArray3, std::not_equal_to()) == + std::pair{kArray1.end(), kArray3.end()}); +} + +TEST(ConstexprTest, Equal) { + static constexpr std::array kArray1 = {1, 2, 3}; + static constexpr std::array kArray2 = {1, 2, 3}; + static constexpr std::array kArray3 = {2, 3, 4}; + static_assert(absl::c_equal(kArray1, kArray2)); + static_assert(!absl::c_equal(kArray1, kArray3)); +} + +TEST(ConstexprTest, EqualWithPredicate) { + static constexpr std::array kArray1 = {1, 2, 3}; + static constexpr std::array kArray2 = {1, 2, 3}; + static constexpr std::array kArray3 = {2, 3, 4}; + static_assert(!absl::c_equal(kArray1, kArray2, std::not_equal_to())); + static_assert(absl::c_equal(kArray1, kArray3, std::not_equal_to())); +} + +TEST(ConstexprTest, IsPermutation) { + static constexpr std::array kArray1 = {1, 2, 3}; + static constexpr std::array kArray2 = {3, 2, 1}; + static constexpr std::array kArray3 = {2, 3, 4}; + static_assert(absl::c_is_permutation(kArray1, kArray2)); + static_assert(!absl::c_is_permutation(kArray1, kArray3)); +} + +TEST(ConstexprTest, IsPermutationWithPredicate) { + static constexpr std::array kArray1 = {1, 2, 3}; + static constexpr std::array kArray2 = {3, 2, 1}; + static constexpr std::array kArray3 = {2, 3, 4}; + static_assert(absl::c_is_permutation(kArray1, kArray2, std::equal_to())); + static_assert( + !absl::c_is_permutation(kArray1, kArray3, std::equal_to())); +} + +TEST(ConstexprTest, Search) { + static constexpr std::array kArray1 = {1, 2, 3}; + static constexpr std::array kArray2 = {1, 2, 3}; + static constexpr std::array kArray3 = {2, 3, 4}; + static_assert(absl::c_search(kArray1, kArray2) == kArray1.begin()); + static_assert(absl::c_search(kArray1, kArray3) == kArray1.end()); +} + +TEST(ConstexprTest, SearchWithPredicate) { + static constexpr std::array kArray1 = {1, 2, 3}; + static constexpr std::array kArray2 = {1, 2, 3}; + static constexpr std::array kArray3 = {2, 3, 4}; + static_assert(absl::c_search(kArray1, kArray2, std::not_equal_to()) == + kArray1.end()); + static_assert(absl::c_search(kArray1, kArray3, std::not_equal_to()) == + kArray1.begin()); +} + +TEST(ConstexprTest, ContainsSubrange) { + static constexpr std::array kArray1 = {1, 2, 3}; + static constexpr std::array kArray2 = {1, 2, 3}; + static constexpr std::array kArray3 = {2, 3, 4}; + static_assert(absl::c_contains_subrange(kArray1, kArray2)); + static_assert(!absl::c_contains_subrange(kArray1, kArray3)); +} + +TEST(ConstexprTest, ContainsSubrangeWithPredicate) { + static constexpr std::array kArray1 = {1, 2, 3}; + static constexpr std::array kArray2 = {1, 2, 3}; + static constexpr std::array kArray3 = {2, 3, 4}; + static_assert( + !absl::c_contains_subrange(kArray1, kArray2, std::not_equal_to<>())); + static_assert( + absl::c_contains_subrange(kArray1, kArray3, std::not_equal_to<>())); +} + +TEST(ConstexprTest, SearchN) { + static constexpr std::array kArray = {1, 2, 2, 3}; + static_assert(absl::c_search_n(kArray, 1, 1) == kArray.begin()); + static_assert(absl::c_search_n(kArray, 2, 2) == kArray.begin() + 1); + static_assert(absl::c_search_n(kArray, 1, 4) == kArray.end()); +} + +TEST(ConstexprTest, SearchNWithPredicate) { + static constexpr std::array kArray = {1, 2, 2, 3}; + static_assert(absl::c_search_n(kArray, 1, 1, std::not_equal_to()) == + kArray.begin() + 1); + static_assert(absl::c_search_n(kArray, 2, 2, std::not_equal_to()) == + kArray.end()); + static_assert(absl::c_search_n(kArray, 1, 4, std::not_equal_to()) == + kArray.begin()); +} + +#endif // defined(ABSL_INTERNAL_CPLUSPLUS_LANG) && + // ABSL_INTERNAL_CPLUSPLUS_LANG >= 202002L + +} // namespace diff --git a/absl/base/BUILD.bazel b/absl/base/BUILD.bazel new file mode 100644 index 0000000..a7827db --- /dev/null +++ b/absl/base/BUILD.bazel @@ -0,0 +1,982 @@ +# +# Copyright 2017 The Abseil Authors. +# +# 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 +# +# https://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. +# + +load( + "//absl:copts/configure_copts.bzl", + "ABSL_DEFAULT_COPTS", + "ABSL_DEFAULT_LINKOPTS", + "ABSL_TEST_COPTS", +) + +package( + default_visibility = ["//visibility:public"], + features = [ + "header_modules", + "layering_check", + "parse_headers", + ], +) + +licenses(["notice"]) + +cc_library( + name = "atomic_hook", + hdrs = ["internal/atomic_hook.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl:__subpackages__", + ], + deps = [ + ":config", + ":core_headers", + ], +) + +cc_library( + name = "errno_saver", + hdrs = ["internal/errno_saver.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl:__subpackages__", + ], + deps = [":config"], +) + +cc_library( + name = "log_severity", + srcs = ["log_severity.cc"], + hdrs = ["log_severity.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":config", + ":core_headers", + ], +) + +cc_library( + name = "no_destructor", + hdrs = ["no_destructor.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":config", + ":nullability", + ], +) + +cc_library( + name = "nullability", + srcs = ["internal/nullability_impl.h"], + hdrs = ["nullability.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":config", + ":core_headers", + "//absl/meta:type_traits", + ], +) + +cc_library( + name = "raw_logging_internal", + srcs = ["internal/raw_logging.cc"], + hdrs = ["internal/raw_logging.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl:__subpackages__", + ], + deps = [ + ":atomic_hook", + ":config", + ":core_headers", + ":errno_saver", + ":log_severity", + ], +) + +cc_library( + name = "spinlock_wait", + srcs = [ + "internal/spinlock_akaros.inc", + "internal/spinlock_linux.inc", + "internal/spinlock_posix.inc", + "internal/spinlock_wait.cc", + "internal/spinlock_win32.inc", + ], + hdrs = ["internal/spinlock_wait.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl/base:__pkg__", + ], + deps = [ + ":base_internal", + ":core_headers", + ":errno_saver", + ], +) + +cc_library( + name = "config", + hdrs = [ + "config.h", + "options.h", + "policy_checks.h", + ], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, +) + +cc_library( + name = "cycleclock_internal", + hdrs = [ + "internal/cycleclock_config.h", + "internal/unscaledcycleclock_config.h", + ], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl:__subpackages__", + ], + deps = [ + ":base_internal", + ":config", + ], +) + +cc_library( + name = "dynamic_annotations", + srcs = [ + "internal/dynamic_annotations.h", + ], + hdrs = [ + "dynamic_annotations.h", + ], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":config", + ":core_headers", + ], +) + +cc_library( + name = "core_headers", + hdrs = [ + "attributes.h", + "const_init.h", + "macros.h", + "optimization.h", + "port.h", + "thread_annotations.h", + ], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":config", + ], +) + +cc_library( + name = "malloc_internal", + srcs = [ + "internal/low_level_alloc.cc", + ], + hdrs = [ + "internal/direct_mmap.h", + "internal/low_level_alloc.h", + ], + copts = ABSL_DEFAULT_COPTS + select({ + "//conditions:default": [], + }), + linkopts = select({ + "@rules_cc//cc/compiler:msvc-cl": [], + "@rules_cc//cc/compiler:clang-cl": [], + "@rules_cc//cc/compiler:emscripten": [], + "//conditions:default": ["-pthread"], + }) + ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//visibility:public", + ], + deps = [ + ":base", + ":base_internal", + ":config", + ":core_headers", + ":dynamic_annotations", + ":raw_logging_internal", + ], +) + +cc_library( + name = "base_internal", + hdrs = [ + "internal/hide_ptr.h", + "internal/identity.h", + "internal/inline_variable.h", + "internal/invoke.h", + "internal/scheduling_mode.h", + ], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl:__subpackages__", + ], + deps = [ + ":config", + "//absl/meta:type_traits", + ], +) + +cc_library( + name = "base", + srcs = [ + "internal/cycleclock.cc", + "internal/spinlock.cc", + "internal/sysinfo.cc", + "internal/thread_identity.cc", + "internal/unscaledcycleclock.cc", + ], + hdrs = [ + "call_once.h", + "casts.h", + "internal/cycleclock.h", + "internal/low_level_scheduling.h", + "internal/per_thread_tls.h", + "internal/spinlock.h", + "internal/sysinfo.h", + "internal/thread_identity.h", + "internal/tsan_mutex_interface.h", + "internal/unscaledcycleclock.h", + ], + copts = ABSL_DEFAULT_COPTS, + linkopts = select({ + "@rules_cc//cc/compiler:msvc-cl": [ + "-DEFAULTLIB:advapi32.lib", + ], + "@rules_cc//cc/compiler:clang-cl": [ + "-DEFAULTLIB:advapi32.lib", + ], + "//absl:mingw_compiler": [ + "-DEFAULTLIB:advapi32.lib", + "-ladvapi32", + ], + "@rules_cc//cc/compiler:emscripten": [], + "//conditions:default": ["-pthread"], + }) + ABSL_DEFAULT_LINKOPTS, + deps = [ + ":atomic_hook", + ":base_internal", + ":config", + ":core_headers", + ":cycleclock_internal", + ":dynamic_annotations", + ":log_severity", + ":nullability", + ":raw_logging_internal", + ":spinlock_wait", + "//absl/meta:type_traits", + ], +) + +cc_library( + name = "atomic_hook_test_helper", + testonly = True, + srcs = ["internal/atomic_hook_test_helper.cc"], + hdrs = ["internal/atomic_hook_test_helper.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":atomic_hook", + ":core_headers", + ], +) + +cc_test( + name = "atomic_hook_test", + size = "small", + srcs = ["internal/atomic_hook_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":atomic_hook", + ":atomic_hook_test_helper", + ":core_headers", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "bit_cast_test", + size = "small", + srcs = [ + "bit_cast_test.cc", + ], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":base", + ":core_headers", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "c_header_test", + srcs = ["c_header_test.c"], + tags = [ + "no_test_wasm", + ], + deps = [ + ":config", + ":core_headers", + ], +) + +cc_library( + name = "throw_delegate", + srcs = ["internal/throw_delegate.cc"], + hdrs = ["internal/throw_delegate.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl:__subpackages__", + ], + deps = [ + ":config", + ":raw_logging_internal", + ], +) + +cc_test( + name = "throw_delegate_test", + srcs = ["throw_delegate_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":config", + ":throw_delegate", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "errno_saver_test", + size = "small", + srcs = ["internal/errno_saver_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":errno_saver", + ":strerror", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_library( + name = "exception_testing", + testonly = True, + hdrs = ["internal/exception_testing.h"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl:__subpackages__", + ], + deps = [ + ":config", + "@googletest//:gtest", + ], +) + +cc_library( + name = "pretty_function", + hdrs = ["internal/pretty_function.h"], + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl:__subpackages__", + ], +) + +cc_library( + name = "exception_safety_testing", + testonly = True, + srcs = ["internal/exception_safety_testing.cc"], + hdrs = ["internal/exception_safety_testing.h"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":config", + ":pretty_function", + "//absl/memory", + "//absl/meta:type_traits", + "//absl/strings", + "//absl/utility", + "@googletest//:gtest", + ], +) + +cc_test( + name = "exception_safety_testing_test", + srcs = ["exception_safety_testing_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":exception_safety_testing", + "//absl/memory", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "inline_variable_test", + size = "small", + srcs = [ + "inline_variable_test.cc", + "inline_variable_test_a.cc", + "inline_variable_test_b.cc", + "internal/inline_variable_testing.h", + ], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":base_internal", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "invoke_test", + size = "small", + srcs = ["invoke_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":base_internal", + "//absl/memory", + "//absl/strings", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +# Common test library made available for use in non-absl code that overrides +# AbslInternalSpinLockDelay and AbslInternalSpinLockWake. +cc_library( + name = "spinlock_test_common", + testonly = True, + srcs = ["spinlock_test_common.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":base", + ":base_internal", + ":config", + ":core_headers", + "//absl/synchronization", + "@googletest//:gtest", + ], + alwayslink = 1, +) + +cc_test( + name = "spinlock_test", + size = "medium", + srcs = ["spinlock_test_common.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + tags = [ + "no_test_wasm", + ], + deps = [ + ":base", + ":base_internal", + ":config", + ":core_headers", + "//absl/synchronization", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_library( + name = "spinlock_benchmark_common", + testonly = True, + srcs = ["internal/spinlock_benchmark.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl/base:__pkg__", + ], + deps = [ + ":base", + ":base_internal", + ":no_destructor", + ":raw_logging_internal", + "//absl/synchronization", + "@google_benchmark//:benchmark_main", + ], + alwayslink = 1, +) + +cc_binary( + name = "spinlock_benchmark", + testonly = True, + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + tags = ["benchmark"], + visibility = ["//visibility:private"], + deps = [ + ":spinlock_benchmark_common", + ], +) + +cc_library( + name = "endian", + hdrs = [ + "internal/endian.h", + "internal/unaligned_access.h", + ], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":base", + ":config", + ":core_headers", + ":nullability", + ], +) + +cc_test( + name = "endian_test", + srcs = ["internal/endian_test.cc"], + copts = ABSL_TEST_COPTS, + deps = [ + ":config", + ":endian", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "config_test", + srcs = ["config_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":config", + "//absl/synchronization:thread_pool", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "call_once_test", + srcs = ["call_once_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":base", + ":core_headers", + "//absl/synchronization", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "no_destructor_test", + srcs = ["no_destructor_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":config", + ":no_destructor", + ":raw_logging_internal", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_binary( + name = "no_destructor_benchmark", + testonly = True, + srcs = ["no_destructor_benchmark.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + tags = ["benchmark"], + visibility = ["//visibility:private"], + deps = [ + ":no_destructor", + ":raw_logging_internal", + "@google_benchmark//:benchmark_main", + ], +) + +cc_test( + name = "nullability_test", + srcs = ["nullability_test.cc"], + deps = [ + ":core_headers", + ":nullability", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "nullability_default_nonnull_test", + srcs = ["nullability_default_nonnull_test.cc"], + deps = [ + ":nullability", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "raw_logging_test", + srcs = ["raw_logging_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":raw_logging_internal", + "//absl/strings", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "sysinfo_test", + size = "small", + srcs = ["internal/sysinfo_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":base", + "//absl/synchronization", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "low_level_alloc_test", + size = "medium", + srcs = ["internal/low_level_alloc_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + tags = [ + "no_test_ios_x86_64", + "no_test_wasm", + ], + deps = [ + ":malloc_internal", + "//absl/container:node_hash_map", + ], +) + +cc_test( + name = "thread_identity_test", + size = "small", + srcs = ["internal/thread_identity_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + tags = [ + "no_test_wasm", + ], + deps = [ + ":base", + ":core_headers", + "//absl/synchronization", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "thread_identity_benchmark", + srcs = ["internal/thread_identity_benchmark.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + tags = ["benchmark"], + visibility = ["//visibility:private"], + deps = [ + ":base", + "//absl/synchronization", + "@google_benchmark//:benchmark_main", + "@googletest//:gtest", + ], +) + +cc_library( + name = "scoped_set_env", + testonly = True, + srcs = ["internal/scoped_set_env.cc"], + hdrs = ["internal/scoped_set_env.h"], + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl:__subpackages__", + ], + deps = [ + ":config", + ":raw_logging_internal", + ], +) + +cc_test( + name = "scoped_set_env_test", + size = "small", + srcs = ["internal/scoped_set_env_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":scoped_set_env", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "log_severity_test", + size = "small", + srcs = ["log_severity_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":log_severity", + "//absl/flags:flag_internal", + "//absl/flags:marshalling", + "//absl/strings", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_library( + name = "strerror", + srcs = ["internal/strerror.cc"], + hdrs = ["internal/strerror.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl:__subpackages__", + ], + deps = [ + ":config", + ":core_headers", + ":errno_saver", + ], +) + +cc_test( + name = "strerror_test", + size = "small", + srcs = ["internal/strerror_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":strerror", + "//absl/strings", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_binary( + name = "strerror_benchmark", + testonly = True, + srcs = ["internal/strerror_benchmark.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + tags = ["benchmark"], + visibility = ["//visibility:private"], + deps = [ + ":strerror", + "@google_benchmark//:benchmark_main", + ], +) + +cc_library( + name = "fast_type_id", + hdrs = ["internal/fast_type_id.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl:__subpackages__", + ], + deps = [ + ":config", + ], +) + +cc_test( + name = "fast_type_id_test", + size = "small", + srcs = ["internal/fast_type_id_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":fast_type_id", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_library( + name = "prefetch", + hdrs = [ + "prefetch.h", + ], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":config", + ":core_headers", + ], +) + +cc_test( + name = "prefetch_test", + size = "small", + srcs = [ + "prefetch_test.cc", + ], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":prefetch", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_library( + name = "poison", + srcs = [ + "internal/poison.cc", + ], + hdrs = ["internal/poison.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl:__subpackages__", + ], + deps = [ + ":config", + ":core_headers", + ":malloc_internal", + ], +) + +cc_test( + name = "poison_test", + size = "small", + timeout = "short", + srcs = [ + "internal/poison_test.cc", + ], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":config", + ":poison", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "unique_small_name_test", + size = "small", + srcs = ["internal/unique_small_name_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + linkstatic = 1, + deps = [ + ":core_headers", + "//absl/strings", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "optimization_test", + size = "small", + srcs = ["optimization_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":core_headers", + "//absl/types:optional", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_library( + name = "tracing_internal", + srcs = ["internal/tracing.cc"], + hdrs = ["internal/tracing.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl:__subpackages__", + ], + deps = [ + "//absl/base:config", + "//absl/base:core_headers", + ], +) + +cc_test( + name = "tracing_internal_weak_test", + srcs = ["internal/tracing_weak_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":tracing_internal", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) + +cc_test( + name = "tracing_internal_strong_test", + srcs = ["internal/tracing_strong_test.cc"], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":config", + ":core_headers", + ":tracing_internal", + "@googletest//:gtest", + "@googletest//:gtest_main", + ], +) diff --git a/absl/base/CMakeLists.txt b/absl/base/CMakeLists.txt new file mode 100644 index 0000000..ac62a04 --- /dev/null +++ b/absl/base/CMakeLists.txt @@ -0,0 +1,823 @@ +# +# Copyright 2017 The Abseil Authors. +# +# 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 +# +# https://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. +# + +find_library(LIBRT rt) + +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + atomic_hook + HDRS + "internal/atomic_hook.h" + DEPS + absl::config + absl::core_headers + COPTS + ${ABSL_DEFAULT_COPTS} +) + +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + errno_saver + HDRS + "internal/errno_saver.h" + DEPS + absl::config + COPTS + ${ABSL_DEFAULT_COPTS} +) + +absl_cc_library( + NAME + log_severity + HDRS + "log_severity.h" + SRCS + "log_severity.cc" + DEPS + absl::config + absl::core_headers + COPTS + ${ABSL_DEFAULT_COPTS} +) + +absl_cc_library( + NAME + no_destructor + HDRS + "no_destructor.h" + DEPS + absl::config + absl::nullability + COPTS + ${ABSL_DEFAULT_COPTS} +) + +absl_cc_library( + NAME + nullability + HDRS + "nullability.h" + SRCS + "internal/nullability_impl.h" + DEPS + absl::config + absl::core_headers + absl::type_traits + COPTS + ${ABSL_DEFAULT_COPTS} +) + +absl_cc_test( + NAME + nullability_test + SRCS + "nullability_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::core_headers + absl::nullability + GTest::gtest_main +) + +absl_cc_test( + NAME + nullability_default_nonnull_test + SRCS + "nullability_default_nonnull_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::nullability + GTest::gtest_main +) + +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + raw_logging_internal + HDRS + "internal/raw_logging.h" + SRCS + "internal/raw_logging.cc" + DEPS + absl::atomic_hook + absl::config + absl::core_headers + absl::errno_saver + absl::log_severity + COPTS + ${ABSL_DEFAULT_COPTS} +) + +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + spinlock_wait + HDRS + "internal/spinlock_wait.h" + SRCS + "internal/spinlock_akaros.inc" + "internal/spinlock_linux.inc" + "internal/spinlock_posix.inc" + "internal/spinlock_wait.cc" + "internal/spinlock_win32.inc" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::base_internal + absl::core_headers + absl::errno_saver +) + +absl_cc_library( + NAME + config + HDRS + "config.h" + "options.h" + "policy_checks.h" + COPTS + ${ABSL_DEFAULT_COPTS} + PUBLIC +) + +absl_cc_library( + NAME + dynamic_annotations + HDRS + "dynamic_annotations.h" + SRCS + "internal/dynamic_annotations.h" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::config + PUBLIC +) + +absl_cc_library( + NAME + core_headers + HDRS + "attributes.h" + "const_init.h" + "macros.h" + "optimization.h" + "port.h" + "thread_annotations.h" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::config + PUBLIC +) + +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + malloc_internal + HDRS + "internal/direct_mmap.h" + "internal/low_level_alloc.h" + SRCS + "internal/low_level_alloc.cc" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::base + absl::base_internal + absl::config + absl::core_headers + absl::dynamic_annotations + absl::raw_logging_internal + Threads::Threads +) + +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + base_internal + HDRS + "internal/hide_ptr.h" + "internal/identity.h" + "internal/inline_variable.h" + "internal/invoke.h" + "internal/scheduling_mode.h" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::config + absl::type_traits +) + +absl_cc_library( + NAME + base + HDRS + "call_once.h" + "casts.h" + "internal/cycleclock.h" + "internal/cycleclock_config.h" + "internal/low_level_scheduling.h" + "internal/per_thread_tls.h" + "internal/spinlock.h" + "internal/sysinfo.h" + "internal/thread_identity.h" + "internal/tsan_mutex_interface.h" + "internal/unscaledcycleclock.h" + "internal/unscaledcycleclock_config.h" + SRCS + "internal/cycleclock.cc" + "internal/spinlock.cc" + "internal/sysinfo.cc" + "internal/thread_identity.cc" + "internal/unscaledcycleclock.cc" + COPTS + ${ABSL_DEFAULT_COPTS} + LINKOPTS + ${ABSL_DEFAULT_LINKOPTS} + $<$:-lrt> + $<$:-ladvapi32> + DEPS + absl::atomic_hook + absl::base_internal + absl::config + absl::core_headers + absl::dynamic_annotations + absl::log_severity + absl::nullability + absl::raw_logging_internal + absl::spinlock_wait + absl::type_traits + Threads::Threads + PUBLIC +) + +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + throw_delegate + HDRS + "internal/throw_delegate.h" + SRCS + "internal/throw_delegate.cc" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::config + absl::raw_logging_internal +) + +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + exception_testing + HDRS + "internal/exception_testing.h" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::config + GTest::gtest + TESTONLY +) + +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + pretty_function + HDRS + "internal/pretty_function.h" + COPTS + ${ABSL_DEFAULT_COPTS} +) + +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + exception_safety_testing + HDRS + "internal/exception_safety_testing.h" + SRCS + "internal/exception_safety_testing.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::config + absl::pretty_function + absl::memory + absl::meta + absl::strings + absl::utility + GTest::gtest + TESTONLY +) + +absl_cc_test( + NAME + absl_exception_safety_testing_test + SRCS + "exception_safety_testing_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::exception_safety_testing + absl::memory + GTest::gtest_main +) + +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + atomic_hook_test_helper + SRCS + "internal/atomic_hook_test_helper.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::atomic_hook + absl::core_headers + TESTONLY +) + +absl_cc_test( + NAME + atomic_hook_test + SRCS + "internal/atomic_hook_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::atomic_hook_test_helper + absl::atomic_hook + absl::core_headers + GTest::gmock + GTest::gtest_main +) + +absl_cc_test( + NAME + bit_cast_test + SRCS + "bit_cast_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::base + absl::core_headers + GTest::gtest_main +) + +absl_cc_test( + NAME + errno_saver_test + SRCS + "internal/errno_saver_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::errno_saver + absl::strerror + GTest::gmock + GTest::gtest_main +) + +absl_cc_test( + NAME + throw_delegate_test + SRCS + "throw_delegate_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::base + absl::config + absl::throw_delegate + GTest::gtest_main +) + +absl_cc_test( + NAME + inline_variable_test + SRCS + "internal/inline_variable_testing.h" + "inline_variable_test.cc" + "inline_variable_test_a.cc" + "inline_variable_test_b.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::base_internal + GTest::gtest_main +) + +absl_cc_test( + NAME + invoke_test + SRCS + "invoke_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::base_internal + absl::memory + absl::strings + GTest::gmock + GTest::gtest_main +) + +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + spinlock_test_common + SRCS + "spinlock_test_common.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::base + absl::config + absl::base_internal + absl::core_headers + absl::synchronization + GTest::gtest + TESTONLY +) + +# On bazel BUILD this target use "alwayslink = 1" which is not implemented here +absl_cc_test( + NAME + spinlock_test + SRCS + "spinlock_test_common.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::base + absl::base_internal + absl::config + absl::core_headers + absl::synchronization + GTest::gtest_main +) + +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + endian + HDRS + "internal/endian.h" + "internal/unaligned_access.h" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::base + absl::config + absl::core_headers + absl::nullability + PUBLIC +) + +absl_cc_test( + NAME + endian_test + SRCS + "internal/endian_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::base + absl::config + absl::endian + GTest::gtest_main +) + +absl_cc_test( + NAME + config_test + SRCS + "config_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::config + absl::synchronization + GTest::gtest_main +) + +absl_cc_test( + NAME + call_once_test + SRCS + "call_once_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::base + absl::core_headers + absl::synchronization + GTest::gtest_main +) + +absl_cc_test( + NAME + no_destructor_test + SRCS + "no_destructor_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::no_destructor + absl::config + absl::raw_logging_internal + GTest::gmock + GTest::gtest_main +) + +absl_cc_test( + NAME + raw_logging_test + SRCS + "raw_logging_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::raw_logging_internal + absl::strings + GTest::gtest_main +) + +absl_cc_test( + NAME + sysinfo_test + SRCS + "internal/sysinfo_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::base + absl::synchronization + GTest::gtest_main +) + +absl_cc_test( + NAME + low_level_alloc_test + SRCS + "internal/low_level_alloc_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::malloc_internal + absl::node_hash_map + Threads::Threads +) + +absl_cc_test( + NAME + thread_identity_test + SRCS + "internal/thread_identity_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::base + absl::core_headers + absl::synchronization + Threads::Threads + GTest::gtest_main +) + +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + scoped_set_env + SRCS + "internal/scoped_set_env.cc" + HDRS + "internal/scoped_set_env.h" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::config + absl::raw_logging_internal +) + +absl_cc_test( + NAME + scoped_set_env_test + SRCS + "internal/scoped_set_env_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::scoped_set_env + GTest::gtest_main +) + +absl_cc_test( + NAME + cmake_thread_test + SRCS + "internal/cmake_thread_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::base +) + +absl_cc_test( + NAME + log_severity_test + SRCS + "log_severity_test.cc" + DEPS + absl::flags_internal + absl::flags_marshalling + absl::log_severity + absl::strings + GTest::gmock + GTest::gtest_main +) + +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + strerror + SRCS + "internal/strerror.cc" + HDRS + "internal/strerror.h" + COPTS + ${ABSL_DEFAULT_COPTS} + LINKOPTS + ${ABSL_DEFAULT_LINKOPTS} + DEPS + absl::config + absl::core_headers + absl::errno_saver +) + +absl_cc_test( + NAME + strerror_test + SRCS + "internal/strerror_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::strerror + absl::strings + GTest::gmock + GTest::gtest_main +) + +# Internal-only target, do not depend on directly. +absl_cc_library( + NAME + fast_type_id + HDRS + "internal/fast_type_id.h" + COPTS + ${ABSL_DEFAULT_COPTS} + LINKOPTS + ${ABSL_DEFAULT_LINKOPTS} + DEPS + absl::config +) + +absl_cc_test( + NAME + fast_type_id_test + SRCS + "internal/fast_type_id_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::fast_type_id + GTest::gtest_main +) + +absl_cc_library( + NAME + prefetch + HDRS + "prefetch.h" + COPTS + ${ABSL_DEFAULT_COPTS} + LINKOPTS + ${ABSL_DEFAULT_LINKOPTS} + DEPS + absl::config + absl::core_headers +) + +absl_cc_test( + NAME + prefetch_test + SRCS + "prefetch_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::prefetch + GTest::gtest_main +) + +absl_cc_test( + NAME + optimization_test + SRCS + "optimization_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::core_headers + absl::optional + GTest::gtest_main +) + +absl_cc_library( + NAME + poison + SRCS + "internal/poison.cc" + HDRS + "internal/poison.h" + COPTS + ${ABSL_DEFAULT_COPTS} + LINKOPTS + ${ABSL_DEFAULT_LINKOPTS} + DEPS + absl::config + absl::core_headers + absl::malloc_internal +) + +absl_cc_test( + NAME + poison_test + SRCS + "internal/poison_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::config + absl::poison + GTest::gtest_main +) + +absl_cc_library( + NAME + tracing_internal + HDRS + "internal/tracing.h" + SRCS + "internal/tracing.cc" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::base +) + +absl_cc_test( + NAME + tracing_internal_weak_test + SRCS + "internal/tracing_weak_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::base + absl::tracing_internal + GTest::gtest_main +) + +absl_cc_test( + NAME + tracing_internal_strong_test + SRCS + "internal/tracing_strong_test.cc" + COPTS + ${ABSL_TEST_COPTS} + DEPS + absl::base + absl::tracing_internal + GTest::gtest_main +) diff --git a/absl/base/attributes.h b/absl/base/attributes.h new file mode 100644 index 0000000..95b102e --- /dev/null +++ b/absl/base/attributes.h @@ -0,0 +1,1008 @@ +// Copyright 2017 The Abseil Authors. +// +// 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 +// +// https://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 header file defines macros for declaring attributes for functions, +// types, and variables. +// +// These macros are used within Abseil and allow the compiler to optimize, where +// applicable, certain function calls. +// +// Most macros here are exposing GCC or Clang features, and are stubbed out for +// other compilers. +// +// GCC attributes documentation: +// https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Function-Attributes.html +// https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Variable-Attributes.html +// https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Type-Attributes.html +// +// Most attributes in this file are already supported by GCC 4.7. However, some +// of them are not supported in older version of Clang. Thus, we check +// `__has_attribute()` first. If the check fails, we check if we are on GCC and +// assume the attribute exists on GCC (which is verified on GCC 4.7). + +// SKIP_ABSL_INLINE_NAMESPACE_CHECK + +#ifndef ABSL_BASE_ATTRIBUTES_H_ +#define ABSL_BASE_ATTRIBUTES_H_ + +#include "absl/base/config.h" + +// ABSL_HAVE_ATTRIBUTE +// +// A function-like feature checking macro that is a wrapper around +// `__has_attribute`, which is defined by GCC 5+ and Clang and evaluates to a +// nonzero constant integer if the attribute is supported or 0 if not. +// +// It evaluates to zero if `__has_attribute` is not defined by the compiler. +// +// GCC: https://gcc.gnu.org/gcc-5/changes.html +// Clang: https://clang.llvm.org/docs/LanguageExtensions.html +#ifdef __has_attribute +#define ABSL_HAVE_ATTRIBUTE(x) __has_attribute(x) +#else +#define ABSL_HAVE_ATTRIBUTE(x) 0 +#endif + +// ABSL_HAVE_CPP_ATTRIBUTE +// +// A function-like feature checking macro that accepts C++11 style attributes. +// It's a wrapper around `__has_cpp_attribute`, defined by ISO C++ SD-6 +// (https://en.cppreference.com/w/cpp/experimental/feature_test). If we don't +// find `__has_cpp_attribute`, will evaluate to 0. +#if defined(__cplusplus) && defined(__has_cpp_attribute) +// NOTE: requiring __cplusplus above should not be necessary, but +// works around https://bugs.llvm.org/show_bug.cgi?id=23435. +#define ABSL_HAVE_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +#define ABSL_HAVE_CPP_ATTRIBUTE(x) 0 +#endif + +// ----------------------------------------------------------------------------- +// Function Attributes +// ----------------------------------------------------------------------------- +// +// GCC: https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html +// Clang: https://clang.llvm.org/docs/AttributeReference.html + +// ABSL_PRINTF_ATTRIBUTE +// ABSL_SCANF_ATTRIBUTE +// +// Tells the compiler to perform `printf` format string checking if the +// compiler supports it; see the 'format' attribute in +// . +// +// Note: As the GCC manual states, "[s]ince non-static C++ methods +// have an implicit 'this' argument, the arguments of such methods +// should be counted from two, not one." +#if ABSL_HAVE_ATTRIBUTE(format) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_PRINTF_ATTRIBUTE(string_index, first_to_check) \ + __attribute__((__format__(__printf__, string_index, first_to_check))) +#define ABSL_SCANF_ATTRIBUTE(string_index, first_to_check) \ + __attribute__((__format__(__scanf__, string_index, first_to_check))) +#else +#define ABSL_PRINTF_ATTRIBUTE(string_index, first_to_check) +#define ABSL_SCANF_ATTRIBUTE(string_index, first_to_check) +#endif + +// ABSL_ATTRIBUTE_ALWAYS_INLINE +// ABSL_ATTRIBUTE_NOINLINE +// +// Forces functions to either inline or not inline. Introduced in gcc 3.1. +#if ABSL_HAVE_ATTRIBUTE(always_inline) || \ + (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_ALWAYS_INLINE __attribute__((always_inline)) +#define ABSL_HAVE_ATTRIBUTE_ALWAYS_INLINE 1 +#else +#define ABSL_ATTRIBUTE_ALWAYS_INLINE +#endif + +#if ABSL_HAVE_ATTRIBUTE(noinline) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_NOINLINE __attribute__((noinline)) +#define ABSL_HAVE_ATTRIBUTE_NOINLINE 1 +#else +#define ABSL_ATTRIBUTE_NOINLINE +#endif + +// ABSL_ATTRIBUTE_NO_TAIL_CALL +// +// Prevents the compiler from optimizing away stack frames for functions which +// end in a call to another function. +#if ABSL_HAVE_ATTRIBUTE(disable_tail_calls) +#define ABSL_HAVE_ATTRIBUTE_NO_TAIL_CALL 1 +#define ABSL_ATTRIBUTE_NO_TAIL_CALL __attribute__((disable_tail_calls)) +#elif defined(__GNUC__) && !defined(__clang__) && !defined(__e2k__) +#define ABSL_HAVE_ATTRIBUTE_NO_TAIL_CALL 1 +#define ABSL_ATTRIBUTE_NO_TAIL_CALL \ + __attribute__((optimize("no-optimize-sibling-calls"))) +#else +#define ABSL_ATTRIBUTE_NO_TAIL_CALL +#define ABSL_HAVE_ATTRIBUTE_NO_TAIL_CALL 0 +#endif + +// ABSL_ATTRIBUTE_WEAK +// +// Tags a function as weak for the purposes of compilation and linking. +// Weak attributes did not work properly in LLVM's Windows backend before +// 9.0.0, so disable them there. See https://bugs.llvm.org/show_bug.cgi?id=37598 +// for further information. Weak attributes do not work across DLL boundary. +// The MinGW compiler doesn't complain about the weak attribute until the link +// step, presumably because Windows doesn't use ELF binaries. +#if (ABSL_HAVE_ATTRIBUTE(weak) || \ + (defined(__GNUC__) && !defined(__clang__))) && \ + (!defined(_WIN32) || \ + (defined(__clang__) && __clang_major__ >= 9 && \ + !defined(ABSL_BUILD_DLL) && !defined(ABSL_CONSUME_DLL))) && \ + !defined(__MINGW32__) +#undef ABSL_ATTRIBUTE_WEAK +#define ABSL_ATTRIBUTE_WEAK __attribute__((weak)) +#define ABSL_HAVE_ATTRIBUTE_WEAK 1 +#else +#define ABSL_ATTRIBUTE_WEAK +#define ABSL_HAVE_ATTRIBUTE_WEAK 0 +#endif + +// ABSL_ATTRIBUTE_NONNULL +// +// Tells the compiler either (a) that a particular function parameter +// should be a non-null pointer, or (b) that all pointer arguments should +// be non-null. +// +// Note: As the GCC manual states, "[s]ince non-static C++ methods +// have an implicit 'this' argument, the arguments of such methods +// should be counted from two, not one." +// +// Args are indexed starting at 1. +// +// For non-static class member functions, the implicit `this` argument +// is arg 1, and the first explicit argument is arg 2. For static class member +// functions, there is no implicit `this`, and the first explicit argument is +// arg 1. +// +// Example: +// +// /* arg_a cannot be null, but arg_b can */ +// void Function(void* arg_a, void* arg_b) ABSL_ATTRIBUTE_NONNULL(1); +// +// class C { +// /* arg_a cannot be null, but arg_b can */ +// void Method(void* arg_a, void* arg_b) ABSL_ATTRIBUTE_NONNULL(2); +// +// /* arg_a cannot be null, but arg_b can */ +// static void StaticMethod(void* arg_a, void* arg_b) +// ABSL_ATTRIBUTE_NONNULL(1); +// }; +// +// If no arguments are provided, then all pointer arguments should be non-null. +// +// /* No pointer arguments may be null. */ +// void Function(void* arg_a, void* arg_b, int arg_c) ABSL_ATTRIBUTE_NONNULL(); +// +// NOTE: The GCC nonnull attribute actually accepts a list of arguments, but +// ABSL_ATTRIBUTE_NONNULL does not. +#if ABSL_HAVE_ATTRIBUTE(nonnull) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_NONNULL(arg_index) __attribute__((nonnull(arg_index))) +#else +#define ABSL_ATTRIBUTE_NONNULL(...) +#endif + +// ABSL_ATTRIBUTE_NORETURN +// +// Tells the compiler that a given function never returns. +// +// Deprecated: Prefer the `[[noreturn]]` attribute standardized by C++11 over +// this macro. +#if ABSL_HAVE_ATTRIBUTE(noreturn) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_NORETURN __attribute__((noreturn)) +#elif defined(_MSC_VER) +#define ABSL_ATTRIBUTE_NORETURN __declspec(noreturn) +#else +#define ABSL_ATTRIBUTE_NORETURN +#endif + +// ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS +// +// Tells the AddressSanitizer (or other memory testing tools) to ignore a given +// function. Useful for cases when a function reads random locations on stack, +// calls _exit from a cloned subprocess, deliberately accesses buffer +// out of bounds or does other scary things with memory. +// NOTE: GCC supports AddressSanitizer(asan) since 4.8. +// https://gcc.gnu.org/gcc-4.8/changes.html +#if defined(ABSL_HAVE_ADDRESS_SANITIZER) && \ + ABSL_HAVE_ATTRIBUTE(no_sanitize_address) +#define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) +#elif defined(ABSL_HAVE_ADDRESS_SANITIZER) && defined(_MSC_VER) && \ + _MSC_VER >= 1928 +// https://docs.microsoft.com/en-us/cpp/cpp/no-sanitize-address +#define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS __declspec(no_sanitize_address) +#elif defined(ABSL_HAVE_HWADDRESS_SANITIZER) && ABSL_HAVE_ATTRIBUTE(no_sanitize) +// HWAddressSanitizer is a sanitizer similar to AddressSanitizer, which uses CPU +// features to detect similar bugs with less CPU and memory overhead. +// NOTE: GCC supports HWAddressSanitizer(hwasan) since 11. +// https://gcc.gnu.org/gcc-11/changes.html +#define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS \ + __attribute__((no_sanitize("hwaddress"))) +#else +#define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS +#endif + +// ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY +// +// Tells the MemorySanitizer to relax the handling of a given function. All "Use +// of uninitialized value" warnings from such functions will be suppressed, and +// all values loaded from memory will be considered fully initialized. This +// attribute is similar to the ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS attribute +// above, but deals with initialized-ness rather than addressability issues. +// NOTE: MemorySanitizer(msan) is supported by Clang but not GCC. +#if ABSL_HAVE_ATTRIBUTE(no_sanitize_memory) +#define ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize_memory)) +#else +#define ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY +#endif + +// ABSL_ATTRIBUTE_NO_SANITIZE_THREAD +// +// Tells the ThreadSanitizer to not instrument a given function. +// NOTE: GCC supports ThreadSanitizer(tsan) since 4.8. +// https://gcc.gnu.org/gcc-4.8/changes.html +#if ABSL_HAVE_ATTRIBUTE(no_sanitize_thread) +#define ABSL_ATTRIBUTE_NO_SANITIZE_THREAD __attribute__((no_sanitize_thread)) +#else +#define ABSL_ATTRIBUTE_NO_SANITIZE_THREAD +#endif + +// ABSL_ATTRIBUTE_NO_SANITIZE_UNDEFINED +// +// Tells the UndefinedSanitizer to ignore a given function. Useful for cases +// where certain behavior (eg. division by zero) is being used intentionally. +// NOTE: GCC supports UndefinedBehaviorSanitizer(ubsan) since 4.9. +// https://gcc.gnu.org/gcc-4.9/changes.html +#if ABSL_HAVE_ATTRIBUTE(no_sanitize_undefined) +#define ABSL_ATTRIBUTE_NO_SANITIZE_UNDEFINED \ + __attribute__((no_sanitize_undefined)) +#elif ABSL_HAVE_ATTRIBUTE(no_sanitize) +#define ABSL_ATTRIBUTE_NO_SANITIZE_UNDEFINED \ + __attribute__((no_sanitize("undefined"))) +#else +#define ABSL_ATTRIBUTE_NO_SANITIZE_UNDEFINED +#endif + +// ABSL_ATTRIBUTE_NO_SANITIZE_CFI +// +// Tells the ControlFlowIntegrity sanitizer to not instrument a given function. +// See https://clang.llvm.org/docs/ControlFlowIntegrity.html for details. +#if ABSL_HAVE_ATTRIBUTE(no_sanitize) && defined(__llvm__) +#define ABSL_ATTRIBUTE_NO_SANITIZE_CFI __attribute__((no_sanitize("cfi"))) +#else +#define ABSL_ATTRIBUTE_NO_SANITIZE_CFI +#endif + +// ABSL_ATTRIBUTE_NO_SANITIZE_SAFESTACK +// +// Tells the SafeStack to not instrument a given function. +// See https://clang.llvm.org/docs/SafeStack.html for details. +#if ABSL_HAVE_ATTRIBUTE(no_sanitize) +#define ABSL_ATTRIBUTE_NO_SANITIZE_SAFESTACK \ + __attribute__((no_sanitize("safe-stack"))) +#else +#define ABSL_ATTRIBUTE_NO_SANITIZE_SAFESTACK +#endif + +// ABSL_ATTRIBUTE_RETURNS_NONNULL +// +// Tells the compiler that a particular function never returns a null pointer. +#if ABSL_HAVE_ATTRIBUTE(returns_nonnull) +#define ABSL_ATTRIBUTE_RETURNS_NONNULL __attribute__((returns_nonnull)) +#else +#define ABSL_ATTRIBUTE_RETURNS_NONNULL +#endif + +// ABSL_HAVE_ATTRIBUTE_SECTION +// +// Indicates whether labeled sections are supported. Weak symbol support is +// a prerequisite. Labeled sections are not supported on Darwin/iOS. +#ifdef ABSL_HAVE_ATTRIBUTE_SECTION +#error ABSL_HAVE_ATTRIBUTE_SECTION cannot be directly set +#elif (ABSL_HAVE_ATTRIBUTE(section) || \ + (defined(__GNUC__) && !defined(__clang__))) && \ + !defined(__APPLE__) && ABSL_HAVE_ATTRIBUTE_WEAK +#define ABSL_HAVE_ATTRIBUTE_SECTION 1 + +// ABSL_ATTRIBUTE_SECTION +// +// Tells the compiler/linker to put a given function into a section and define +// `__start_ ## name` and `__stop_ ## name` symbols to bracket the section. +// This functionality is supported by GNU linker. Any function annotated with +// `ABSL_ATTRIBUTE_SECTION` must not be inlined, or it will be placed into +// whatever section its caller is placed into. +// +#ifndef ABSL_ATTRIBUTE_SECTION +#define ABSL_ATTRIBUTE_SECTION(name) \ + __attribute__((section(#name))) __attribute__((noinline)) +#endif + +// ABSL_ATTRIBUTE_SECTION_VARIABLE +// +// Tells the compiler/linker to put a given variable into a section and define +// `__start_ ## name` and `__stop_ ## name` symbols to bracket the section. +// This functionality is supported by GNU linker. +#ifndef ABSL_ATTRIBUTE_SECTION_VARIABLE +#ifdef _AIX +// __attribute__((section(#name))) on AIX is achieved by using the `.csect` +// psudo op which includes an additional integer as part of its syntax indcating +// alignment. If data fall under different alignments then you might get a +// compilation error indicating a `Section type conflict`. +#define ABSL_ATTRIBUTE_SECTION_VARIABLE(name) +#else +#define ABSL_ATTRIBUTE_SECTION_VARIABLE(name) __attribute__((section(#name))) +#endif +#endif + +// ABSL_DECLARE_ATTRIBUTE_SECTION_VARS +// +// A weak section declaration to be used as a global declaration +// for ABSL_ATTRIBUTE_SECTION_START|STOP(name) to compile and link +// even without functions with ABSL_ATTRIBUTE_SECTION(name). +// ABSL_DEFINE_ATTRIBUTE_SECTION should be in the exactly one file; it's +// a no-op on ELF but not on Mach-O. +// +#ifndef ABSL_DECLARE_ATTRIBUTE_SECTION_VARS +#define ABSL_DECLARE_ATTRIBUTE_SECTION_VARS(name) \ + extern char __start_##name[] ABSL_ATTRIBUTE_WEAK; \ + extern char __stop_##name[] ABSL_ATTRIBUTE_WEAK +#endif +#ifndef ABSL_DEFINE_ATTRIBUTE_SECTION_VARS +#define ABSL_INIT_ATTRIBUTE_SECTION_VARS(name) +#define ABSL_DEFINE_ATTRIBUTE_SECTION_VARS(name) +#endif + +// ABSL_ATTRIBUTE_SECTION_START +// +// Returns `void*` pointers to start/end of a section of code with +// functions having ABSL_ATTRIBUTE_SECTION(name). +// Returns 0 if no such functions exist. +// One must ABSL_DECLARE_ATTRIBUTE_SECTION_VARS(name) for this to compile and +// link. +// +#define ABSL_ATTRIBUTE_SECTION_START(name) \ + (reinterpret_cast(__start_##name)) +#define ABSL_ATTRIBUTE_SECTION_STOP(name) \ + (reinterpret_cast(__stop_##name)) + +#else // !ABSL_HAVE_ATTRIBUTE_SECTION + +#define ABSL_HAVE_ATTRIBUTE_SECTION 0 + +// provide dummy definitions +#define ABSL_ATTRIBUTE_SECTION(name) +#define ABSL_ATTRIBUTE_SECTION_VARIABLE(name) +#define ABSL_INIT_ATTRIBUTE_SECTION_VARS(name) +#define ABSL_DEFINE_ATTRIBUTE_SECTION_VARS(name) +#define ABSL_DECLARE_ATTRIBUTE_SECTION_VARS(name) +#define ABSL_ATTRIBUTE_SECTION_START(name) (reinterpret_cast(0)) +#define ABSL_ATTRIBUTE_SECTION_STOP(name) (reinterpret_cast(0)) + +#endif // ABSL_ATTRIBUTE_SECTION + +// ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC +// +// Support for aligning the stack on 32-bit x86. +#if ABSL_HAVE_ATTRIBUTE(force_align_arg_pointer) || \ + (defined(__GNUC__) && !defined(__clang__)) +#if defined(__i386__) +#define ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC \ + __attribute__((force_align_arg_pointer)) +#define ABSL_REQUIRE_STACK_ALIGN_TRAMPOLINE (0) +#elif defined(__x86_64__) +#define ABSL_REQUIRE_STACK_ALIGN_TRAMPOLINE (1) +#define ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC +#else // !__i386__ && !__x86_64 +#define ABSL_REQUIRE_STACK_ALIGN_TRAMPOLINE (0) +#define ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC +#endif // __i386__ +#else +#define ABSL_ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC +#define ABSL_REQUIRE_STACK_ALIGN_TRAMPOLINE (0) +#endif + +// ABSL_MUST_USE_RESULT +// +// Tells the compiler to warn about unused results. +// +// For code or headers that are assured to only build with C++17 and up, prefer +// just using the standard `[[nodiscard]]` directly over this macro. +// +// When annotating a function, it must appear as the first part of the +// declaration or definition. The compiler will warn if the return value from +// such a function is unused: +// +// ABSL_MUST_USE_RESULT Sprocket* AllocateSprocket(); +// AllocateSprocket(); // Triggers a warning. +// +// When annotating a class, it is equivalent to annotating every function which +// returns an instance. +// +// class ABSL_MUST_USE_RESULT Sprocket {}; +// Sprocket(); // Triggers a warning. +// +// Sprocket MakeSprocket(); +// MakeSprocket(); // Triggers a warning. +// +// Note that references and pointers are not instances: +// +// Sprocket* SprocketPointer(); +// SprocketPointer(); // Does *not* trigger a warning. +// +// ABSL_MUST_USE_RESULT allows using cast-to-void to suppress the unused result +// warning. For that, warn_unused_result is used only for clang but not for gcc. +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425 +// +// Note: past advice was to place the macro after the argument list. +// +// TODO(b/176172494): Use ABSL_HAVE_CPP_ATTRIBUTE(nodiscard) when all code is +// compliant with the stricter [[nodiscard]]. +#if defined(__clang__) && ABSL_HAVE_ATTRIBUTE(warn_unused_result) +#define ABSL_MUST_USE_RESULT __attribute__((warn_unused_result)) +#else +#define ABSL_MUST_USE_RESULT +#endif + +// ABSL_ATTRIBUTE_HOT, ABSL_ATTRIBUTE_COLD +// +// Tells GCC that a function is hot or cold. GCC can use this information to +// improve static analysis, i.e. a conditional branch to a cold function +// is likely to be not-taken. +// This annotation is used for function declarations. +// +// Example: +// +// int foo() ABSL_ATTRIBUTE_HOT; +#if ABSL_HAVE_ATTRIBUTE(hot) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_HOT __attribute__((hot)) +#else +#define ABSL_ATTRIBUTE_HOT +#endif + +#if ABSL_HAVE_ATTRIBUTE(cold) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_COLD __attribute__((cold)) +#else +#define ABSL_ATTRIBUTE_COLD +#endif + +// ABSL_XRAY_ALWAYS_INSTRUMENT, ABSL_XRAY_NEVER_INSTRUMENT, ABSL_XRAY_LOG_ARGS +// +// We define the ABSL_XRAY_ALWAYS_INSTRUMENT and ABSL_XRAY_NEVER_INSTRUMENT +// macro used as an attribute to mark functions that must always or never be +// instrumented by XRay. Currently, this is only supported in Clang/LLVM. +// +// For reference on the LLVM XRay instrumentation, see +// http://llvm.org/docs/XRay.html. +// +// A function with the XRAY_ALWAYS_INSTRUMENT macro attribute in its declaration +// will always get the XRay instrumentation sleds. These sleds may introduce +// some binary size and runtime overhead and must be used sparingly. +// +// These attributes only take effect when the following conditions are met: +// +// * The file/target is built in at least C++11 mode, with a Clang compiler +// that supports XRay attributes. +// * The file/target is built with the -fxray-instrument flag set for the +// Clang/LLVM compiler. +// * The function is defined in the translation unit (the compiler honors the +// attribute in either the definition or the declaration, and must match). +// +// There are cases when, even when building with XRay instrumentation, users +// might want to control specifically which functions are instrumented for a +// particular build using special-case lists provided to the compiler. These +// special case lists are provided to Clang via the +// -fxray-always-instrument=... and -fxray-never-instrument=... flags. The +// attributes in source take precedence over these special-case lists. +// +// To disable the XRay attributes at build-time, users may define +// ABSL_NO_XRAY_ATTRIBUTES. Do NOT define ABSL_NO_XRAY_ATTRIBUTES on specific +// packages/targets, as this may lead to conflicting definitions of functions at +// link-time. +// +// XRay isn't currently supported on Android: +// https://github.com/android/ndk/issues/368 +#if ABSL_HAVE_CPP_ATTRIBUTE(clang::xray_always_instrument) && \ + !defined(ABSL_NO_XRAY_ATTRIBUTES) && !defined(__ANDROID__) +#define ABSL_XRAY_ALWAYS_INSTRUMENT [[clang::xray_always_instrument]] +#define ABSL_XRAY_NEVER_INSTRUMENT [[clang::xray_never_instrument]] +#if ABSL_HAVE_CPP_ATTRIBUTE(clang::xray_log_args) +#define ABSL_XRAY_LOG_ARGS(N) \ + [[clang::xray_always_instrument, clang::xray_log_args(N)]] +#else +#define ABSL_XRAY_LOG_ARGS(N) [[clang::xray_always_instrument]] +#endif +#else +#define ABSL_XRAY_ALWAYS_INSTRUMENT +#define ABSL_XRAY_NEVER_INSTRUMENT +#define ABSL_XRAY_LOG_ARGS(N) +#endif + +// ABSL_ATTRIBUTE_REINITIALIZES +// +// Indicates that a member function reinitializes the entire object to a known +// state, independent of the previous state of the object. +// +// The clang-tidy check bugprone-use-after-move allows member functions marked +// with this attribute to be called on objects that have been moved from; +// without the attribute, this would result in a use-after-move warning. +#if ABSL_HAVE_CPP_ATTRIBUTE(clang::reinitializes) +#define ABSL_ATTRIBUTE_REINITIALIZES [[clang::reinitializes]] +#else +#define ABSL_ATTRIBUTE_REINITIALIZES +#endif + +// ----------------------------------------------------------------------------- +// Variable Attributes +// ----------------------------------------------------------------------------- + +// ABSL_ATTRIBUTE_UNUSED +// +// Prevents the compiler from complaining about variables that appear unused. +// +// For code or headers that are assured to only build with C++17 and up, prefer +// just using the standard '[[maybe_unused]]' directly over this macro. +// +// Due to differences in positioning requirements between the old, compiler +// specific __attribute__ syntax and the now standard [[maybe_unused]], this +// macro does not attempt to take advantage of '[[maybe_unused]]'. +#if ABSL_HAVE_ATTRIBUTE(unused) || (defined(__GNUC__) && !defined(__clang__)) +#undef ABSL_ATTRIBUTE_UNUSED +#define ABSL_ATTRIBUTE_UNUSED __attribute__((__unused__)) +#else +#define ABSL_ATTRIBUTE_UNUSED +#endif + +// ABSL_ATTRIBUTE_INITIAL_EXEC +// +// Tells the compiler to use "initial-exec" mode for a thread-local variable. +// See http://people.redhat.com/drepper/tls.pdf for the gory details. +#if ABSL_HAVE_ATTRIBUTE(tls_model) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_INITIAL_EXEC __attribute__((tls_model("initial-exec"))) +#else +#define ABSL_ATTRIBUTE_INITIAL_EXEC +#endif + +// ABSL_ATTRIBUTE_PACKED +// +// Instructs the compiler not to use natural alignment for a tagged data +// structure, but instead to reduce its alignment to 1. +// +// Therefore, DO NOT APPLY THIS ATTRIBUTE TO STRUCTS CONTAINING ATOMICS. Doing +// so can cause atomic variables to be mis-aligned and silently violate +// atomicity on x86. +// +// This attribute can either be applied to members of a structure or to a +// structure in its entirety. Applying this attribute (judiciously) to a +// structure in its entirety to optimize the memory footprint of very +// commonly-used structs is fine. Do not apply this attribute to a structure in +// its entirety if the purpose is to control the offsets of the members in the +// structure. Instead, apply this attribute only to structure members that need +// it. +// +// When applying ABSL_ATTRIBUTE_PACKED only to specific structure members the +// natural alignment of structure members not annotated is preserved. Aligned +// member accesses are faster than non-aligned member accesses even if the +// targeted microprocessor supports non-aligned accesses. +#if ABSL_HAVE_ATTRIBUTE(packed) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_PACKED __attribute__((__packed__)) +#else +#define ABSL_ATTRIBUTE_PACKED +#endif + +// ABSL_ATTRIBUTE_FUNC_ALIGN +// +// Tells the compiler to align the function start at least to certain +// alignment boundary +#if ABSL_HAVE_ATTRIBUTE(aligned) || (defined(__GNUC__) && !defined(__clang__)) +#define ABSL_ATTRIBUTE_FUNC_ALIGN(bytes) __attribute__((aligned(bytes))) +#else +#define ABSL_ATTRIBUTE_FUNC_ALIGN(bytes) +#endif + +// ABSL_FALLTHROUGH_INTENDED +// +// Annotates implicit fall-through between switch labels, allowing a case to +// indicate intentional fallthrough and turn off warnings about any lack of a +// `break` statement. The ABSL_FALLTHROUGH_INTENDED macro should be followed by +// a semicolon and can be used in most places where `break` can, provided that +// no statements exist between it and the next switch label. +// +// Example: +// +// switch (x) { +// case 40: +// case 41: +// if (truth_is_out_there) { +// ++x; +// ABSL_FALLTHROUGH_INTENDED; // Use instead of/along with annotations +// // in comments +// } else { +// return x; +// } +// case 42: +// ... +// +// Notes: When supported, GCC and Clang can issue a warning on switch labels +// with unannotated fallthrough using the warning `-Wimplicit-fallthrough`. See +// clang documentation on language extensions for details: +// https://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough +// +// When used with unsupported compilers, the ABSL_FALLTHROUGH_INTENDED macro has +// no effect on diagnostics. In any case this macro has no effect on runtime +// behavior and performance of code. + +#ifdef ABSL_FALLTHROUGH_INTENDED +#error "ABSL_FALLTHROUGH_INTENDED should not be defined." +#elif ABSL_HAVE_CPP_ATTRIBUTE(fallthrough) +#define ABSL_FALLTHROUGH_INTENDED [[fallthrough]] +#elif ABSL_HAVE_CPP_ATTRIBUTE(clang::fallthrough) +#define ABSL_FALLTHROUGH_INTENDED [[clang::fallthrough]] +#elif ABSL_HAVE_CPP_ATTRIBUTE(gnu::fallthrough) +#define ABSL_FALLTHROUGH_INTENDED [[gnu::fallthrough]] +#else +#define ABSL_FALLTHROUGH_INTENDED \ + do { \ + } while (0) +#endif + +// ABSL_DEPRECATED() +// +// Marks a deprecated class, struct, enum, function, method and variable +// declarations. The macro argument is used as a custom diagnostic message (e.g. +// suggestion of a better alternative). +// +// For code or headers that are assured to only build with C++14 and up, prefer +// just using the standard `[[deprecated("message")]]` directly over this macro. +// +// Examples: +// +// class ABSL_DEPRECATED("Use Bar instead") Foo {...}; +// +// ABSL_DEPRECATED("Use Baz() instead") void Bar() {...} +// +// template +// ABSL_DEPRECATED("Use DoThat() instead") +// void DoThis(); +// +// enum FooEnum { +// kBar ABSL_DEPRECATED("Use kBaz instead"), +// }; +// +// Every usage of a deprecated entity will trigger a warning when compiled with +// GCC/Clang's `-Wdeprecated-declarations` option. Google's production toolchain +// turns this warning off by default, instead relying on clang-tidy to report +// new uses of deprecated code. +#if ABSL_HAVE_ATTRIBUTE(deprecated) +#define ABSL_DEPRECATED(message) __attribute__((deprecated(message))) +#else +#define ABSL_DEPRECATED(message) +#endif + +// When deprecating Abseil code, it is sometimes necessary to turn off the +// warning within Abseil, until the deprecated code is actually removed. The +// deprecated code can be surrounded with these directives to achieve that +// result. +// +// class ABSL_DEPRECATED("Use Bar instead") Foo; +// +// ABSL_INTERNAL_DISABLE_DEPRECATED_DECLARATION_WARNING +// Baz ComputeBazFromFoo(Foo f); +// ABSL_INTERNAL_RESTORE_DEPRECATED_DECLARATION_WARNING +#if defined(__GNUC__) || defined(__clang__) +// Clang also supports these GCC pragmas. +#define ABSL_INTERNAL_DISABLE_DEPRECATED_DECLARATION_WARNING \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#define ABSL_INTERNAL_RESTORE_DEPRECATED_DECLARATION_WARNING \ + _Pragma("GCC diagnostic pop") +#elif defined(_MSC_VER) +#define ABSL_INTERNAL_DISABLE_DEPRECATED_DECLARATION_WARNING \ + _Pragma("warning(push)") _Pragma("warning(disable: 4996)") +#define ABSL_INTERNAL_RESTORE_DEPRECATED_DECLARATION_WARNING \ + _Pragma("warning(pop)") +#else +#define ABSL_INTERNAL_DISABLE_DEPRECATED_DECLARATION_WARNING +#define ABSL_INTERNAL_RESTORE_DEPRECATED_DECLARATION_WARNING +#endif // defined(__GNUC__) || defined(__clang__) + +// ABSL_CONST_INIT +// +// A variable declaration annotated with the `ABSL_CONST_INIT` attribute will +// not compile (on supported platforms) unless the variable has a constant +// initializer. This is useful for variables with static and thread storage +// duration, because it guarantees that they will not suffer from the so-called +// "static init order fiasco". +// +// This attribute must be placed on the initializing declaration of the +// variable. Some compilers will give a -Wmissing-constinit warning when this +// attribute is placed on some other declaration but missing from the +// initializing declaration. +// +// In some cases (notably with thread_local variables), `ABSL_CONST_INIT` can +// also be used in a non-initializing declaration to tell the compiler that a +// variable is already initialized, reducing overhead that would otherwise be +// incurred by a hidden guard variable. Thus annotating all declarations with +// this attribute is recommended to potentially enhance optimization. +// +// Example: +// +// class MyClass { +// public: +// ABSL_CONST_INIT static MyType my_var; +// }; +// +// ABSL_CONST_INIT MyType MyClass::my_var = MakeMyType(...); +// +// For code or headers that are assured to only build with C++20 and up, prefer +// just using the standard `constinit` keyword directly over this macro. +// +// Note that this attribute is redundant if the variable is declared constexpr. +#if defined(__cpp_constinit) && __cpp_constinit >= 201907L +#define ABSL_CONST_INIT constinit +#elif ABSL_HAVE_CPP_ATTRIBUTE(clang::require_constant_initialization) +#define ABSL_CONST_INIT [[clang::require_constant_initialization]] +#else +#define ABSL_CONST_INIT +#endif + +// ABSL_ATTRIBUTE_PURE_FUNCTION +// +// ABSL_ATTRIBUTE_PURE_FUNCTION is used to annotate declarations of "pure" +// functions. A function is pure if its return value is only a function of its +// arguments. The pure attribute prohibits a function from modifying the state +// of the program that is observable by means other than inspecting the +// function's return value. Declaring such functions with the pure attribute +// allows the compiler to avoid emitting some calls in repeated invocations of +// the function with the same argument values. +// +// Example: +// +// ABSL_ATTRIBUTE_PURE_FUNCTION std::string FormatTime(Time t); +#if ABSL_HAVE_CPP_ATTRIBUTE(gnu::pure) +#define ABSL_ATTRIBUTE_PURE_FUNCTION [[gnu::pure]] +#elif ABSL_HAVE_ATTRIBUTE(pure) +#define ABSL_ATTRIBUTE_PURE_FUNCTION __attribute__((pure)) +#else +// If the attribute isn't defined, we'll fallback to ABSL_MUST_USE_RESULT since +// pure functions are useless if its return is ignored. +#define ABSL_ATTRIBUTE_PURE_FUNCTION ABSL_MUST_USE_RESULT +#endif + +// ABSL_ATTRIBUTE_CONST_FUNCTION +// +// ABSL_ATTRIBUTE_CONST_FUNCTION is used to annotate declarations of "const" +// functions. A const function is similar to a pure function, with one +// exception: Pure functions may return value that depend on a non-volatile +// object that isn't provided as a function argument, while the const function +// is guaranteed to return the same result given the same arguments. +// +// Example: +// +// ABSL_ATTRIBUTE_CONST_FUNCTION int64_t ToInt64Milliseconds(Duration d); +#if defined(_MSC_VER) && !defined(__clang__) +// Put the MSVC case first since MSVC seems to parse const as a C++ keyword. +#define ABSL_ATTRIBUTE_CONST_FUNCTION ABSL_ATTRIBUTE_PURE_FUNCTION +#elif ABSL_HAVE_CPP_ATTRIBUTE(gnu::const) +#define ABSL_ATTRIBUTE_CONST_FUNCTION [[gnu::const]] +#elif ABSL_HAVE_ATTRIBUTE(const) +#define ABSL_ATTRIBUTE_CONST_FUNCTION __attribute__((const)) +#else +// Since const functions are more restrictive pure function, we'll fallback to a +// pure function if the const attribute is not handled. +#define ABSL_ATTRIBUTE_CONST_FUNCTION ABSL_ATTRIBUTE_PURE_FUNCTION +#endif + +// ABSL_ATTRIBUTE_LIFETIME_BOUND indicates that a resource owned by a function +// parameter or implicit object parameter is retained by the return value of the +// annotated function (or, for a parameter of a constructor, in the value of the +// constructed object). This attribute causes warnings to be produced if a +// temporary object does not live long enough. +// +// When applied to a reference parameter, the referenced object is assumed to be +// retained by the return value of the function. When applied to a non-reference +// parameter (for example, a pointer or a class type), all temporaries +// referenced by the parameter are assumed to be retained by the return value of +// the function. +// +// See also the upstream documentation: +// https://clang.llvm.org/docs/AttributeReference.html#lifetimebound +// https://learn.microsoft.com/en-us/cpp/code-quality/c26816?view=msvc-170 +#if ABSL_HAVE_CPP_ATTRIBUTE(clang::lifetimebound) +#define ABSL_ATTRIBUTE_LIFETIME_BOUND [[clang::lifetimebound]] +#elif ABSL_HAVE_CPP_ATTRIBUTE(msvc::lifetimebound) +#define ABSL_ATTRIBUTE_LIFETIME_BOUND [[msvc::lifetimebound]] +#elif ABSL_HAVE_ATTRIBUTE(lifetimebound) +#define ABSL_ATTRIBUTE_LIFETIME_BOUND __attribute__((lifetimebound)) +#else +#define ABSL_ATTRIBUTE_LIFETIME_BOUND +#endif + +// Internal attribute; name and documentation TBD. +// +// See the upstream documentation: +// https://clang.llvm.org/docs/AttributeReference.html#lifetime_capture_by +#if ABSL_HAVE_CPP_ATTRIBUTE(clang::lifetime_capture_by) +#define ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(Owner) \ + [[clang::lifetime_capture_by(Owner)]] +#else +#define ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(Owner) +#endif + +// ABSL_ATTRIBUTE_VIEW indicates that a type is solely a "view" of data that it +// points to, similarly to a span, string_view, or other non-owning reference +// type. +// This enables diagnosing certain lifetime issues similar to those enabled by +// ABSL_ATTRIBUTE_LIFETIME_BOUND, such as: +// +// struct ABSL_ATTRIBUTE_VIEW StringView { +// template +// StringView(const R&); +// }; +// +// StringView f(std::string s) { +// return s; // warning: address of stack memory returned +// } +// +// We disable this on Clang versions < 13 because of the following +// false-positive: +// +// absl::string_view f(absl::optional sv) { return *sv; } +// +// See the following links for details: +// https://reviews.llvm.org/D64448 +// https://lists.llvm.org/pipermail/cfe-dev/2018-November/060355.html +#if ABSL_HAVE_CPP_ATTRIBUTE(gsl::Pointer) && \ + (!defined(__clang_major__) || __clang_major__ >= 13) +#define ABSL_ATTRIBUTE_VIEW [[gsl::Pointer]] +#else +#define ABSL_ATTRIBUTE_VIEW +#endif + +// ABSL_ATTRIBUTE_OWNER indicates that a type is a container, smart pointer, or +// similar class that owns all the data that it points to. +// This enables diagnosing certain lifetime issues similar to those enabled by +// ABSL_ATTRIBUTE_LIFETIME_BOUND, such as: +// +// struct ABSL_ATTRIBUTE_VIEW StringView { +// template +// StringView(const R&); +// }; +// +// struct ABSL_ATTRIBUTE_OWNER String {}; +// +// StringView f(String s) { +// return s; // warning: address of stack memory returned +// } +// +// We disable this on Clang versions < 13 because of the following +// false-positive: +// +// absl::string_view f(absl::optional sv) { return *sv; } +// +// See the following links for details: +// https://reviews.llvm.org/D64448 +// https://lists.llvm.org/pipermail/cfe-dev/2018-November/060355.html +#if ABSL_HAVE_CPP_ATTRIBUTE(gsl::Owner) && \ + (!defined(__clang_major__) || __clang_major__ >= 13) +#define ABSL_ATTRIBUTE_OWNER [[gsl::Owner]] +#else +#define ABSL_ATTRIBUTE_OWNER +#endif + +// ABSL_ATTRIBUTE_TRIVIAL_ABI +// Indicates that a type is "trivially relocatable" -- meaning it can be +// relocated without invoking the constructor/destructor, using a form of move +// elision. +// +// From a memory safety point of view, putting aside destructor ordering, it's +// safe to apply ABSL_ATTRIBUTE_TRIVIAL_ABI if an object's location +// can change over the course of its lifetime: if a constructor can be run one +// place, and then the object magically teleports to another place where some +// methods are run, and then the object teleports to yet another place where it +// is destroyed. This is notably not true for self-referential types, where the +// move-constructor must keep the self-reference up to date. If the type changed +// location without invoking the move constructor, it would have a dangling +// self-reference. +// +// The use of this teleporting machinery means that the number of paired +// move/destroy operations can change, and so it is a bad idea to apply this to +// a type meant to count the number of moves. +// +// Warning: applying this can, rarely, break callers. Objects passed by value +// will be destroyed at the end of the call, instead of the end of the +// full-expression containing the call. In addition, it changes the ABI +// of functions accepting this type by value (e.g. to pass in registers). +// +// See also the upstream documentation: +// https://clang.llvm.org/docs/AttributeReference.html#trivial-abi +// +// b/321691395 - This is currently disabled in open-source builds since +// compiler support differs. If system libraries compiled with GCC are mixed +// with libraries compiled with Clang, types will have different ideas about +// their ABI, leading to hard to debug crashes. +#define ABSL_ATTRIBUTE_TRIVIAL_ABI + +// ABSL_ATTRIBUTE_NO_UNIQUE_ADDRESS +// +// Indicates a data member can be optimized to occupy no space (if it is empty) +// and/or its tail padding can be used for other members. +// +// For code that is assured to only build with C++20 or later, prefer using +// the standard attribute `[[no_unique_address]]` directly instead of this +// macro. +// +// https://devblogs.microsoft.com/cppblog/msvc-cpp20-and-the-std-cpp20-switch/#c20-no_unique_address +// Current versions of MSVC have disabled `[[no_unique_address]]` since it +// breaks ABI compatibility, but offers `[[msvc::no_unique_address]]` for +// situations when it can be assured that it is desired. Since Abseil does not +// claim ABI compatibility in mixed builds, we can offer it unconditionally. +#if defined(_MSC_VER) && _MSC_VER >= 1929 +#define ABSL_ATTRIBUTE_NO_UNIQUE_ADDRESS [[msvc::no_unique_address]] +#elif ABSL_HAVE_CPP_ATTRIBUTE(no_unique_address) +#define ABSL_ATTRIBUTE_NO_UNIQUE_ADDRESS [[no_unique_address]] +#else +#define ABSL_ATTRIBUTE_NO_UNIQUE_ADDRESS +#endif + +// ABSL_ATTRIBUTE_UNINITIALIZED +// +// GCC and Clang support a flag `-ftrivial-auto-var-init=; + // std::iterator_traits isn't guaranteed to be SFINAE-friendly until C++17, + // but this seems to be mostly pedantic. + template + using EnableIfForwardIterator = absl::enable_if_t::iterator_category, + std::forward_iterator_tag>::value>; + static constexpr bool NoexceptCopyable() { + return std::is_nothrow_copy_constructible::value && + absl::allocator_is_nothrow::value; + } + static constexpr bool NoexceptMovable() { + return std::is_nothrow_move_constructible::value && + absl::allocator_is_nothrow::value; + } + static constexpr bool DefaultConstructorIsNonTrivial() { + return !absl::is_trivially_default_constructible::value; + } + + public: + using allocator_type = typename AllocatorTraits::allocator_type; + using value_type = typename AllocatorTraits::value_type; + using pointer = typename AllocatorTraits::pointer; + using const_pointer = typename AllocatorTraits::const_pointer; + using reference = value_type&; + using const_reference = const value_type&; + using size_type = typename AllocatorTraits::size_type; + using difference_type = typename AllocatorTraits::difference_type; + using iterator = pointer; + using const_iterator = const_pointer; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + + static constexpr size_type inline_elements = + (N == kFixedArrayUseDefault ? kInlineBytesDefault / sizeof(value_type) + : static_cast(N)); + + FixedArray(const FixedArray& other) noexcept(NoexceptCopyable()) + : FixedArray(other, + AllocatorTraits::select_on_container_copy_construction( + other.storage_.alloc())) {} + + FixedArray(const FixedArray& other, + const allocator_type& a) noexcept(NoexceptCopyable()) + : FixedArray(other.begin(), other.end(), a) {} + + FixedArray(FixedArray&& other) noexcept(NoexceptMovable()) + : FixedArray(std::move(other), other.storage_.alloc()) {} + + FixedArray(FixedArray&& other, + const allocator_type& a) noexcept(NoexceptMovable()) + : FixedArray(std::make_move_iterator(other.begin()), + std::make_move_iterator(other.end()), a) {} + + // Creates an array object that can store `n` elements. + // Note that trivially constructible elements will be uninitialized. + explicit FixedArray(size_type n, const allocator_type& a = allocator_type()) + : storage_(n, a) { + if (DefaultConstructorIsNonTrivial()) { + memory_internal::ConstructRange(storage_.alloc(), storage_.begin(), + storage_.end()); + } + } + + // Creates an array initialized with `n` copies of `val`. + FixedArray(size_type n, const value_type& val, + const allocator_type& a = allocator_type()) + : storage_(n, a) { + memory_internal::ConstructRange(storage_.alloc(), storage_.begin(), + storage_.end(), val); + } + + // Creates an array initialized with the size and contents of `init_list`. + FixedArray(std::initializer_list init_list, + const allocator_type& a = allocator_type()) + : FixedArray(init_list.begin(), init_list.end(), a) {} + + // Creates an array initialized with the elements from the input + // range. The array's size will always be `std::distance(first, last)`. + // REQUIRES: Iterator must be a forward_iterator or better. + template * = nullptr> + FixedArray(Iterator first, Iterator last, + const allocator_type& a = allocator_type()) + : storage_(std::distance(first, last), a) { + memory_internal::CopyRange(storage_.alloc(), storage_.begin(), first, last); + } + + ~FixedArray() noexcept { + for (auto* cur = storage_.begin(); cur != storage_.end(); ++cur) { + AllocatorTraits::destroy(storage_.alloc(), cur); + } + } + + // Assignments are deleted because they break the invariant that the size of a + // `FixedArray` never changes. + void operator=(FixedArray&&) = delete; + void operator=(const FixedArray&) = delete; + + // FixedArray::size() + // + // Returns the length of the fixed array. + size_type size() const { return storage_.size(); } + + // FixedArray::max_size() + // + // Returns the largest possible value of `std::distance(begin(), end())` for a + // `FixedArray`. This is equivalent to the most possible addressable bytes + // over the number of bytes taken by T. + constexpr size_type max_size() const { + return (std::numeric_limits::max)() / sizeof(value_type); + } + + // FixedArray::empty() + // + // Returns whether or not the fixed array is empty. + bool empty() const { return size() == 0; } + + // FixedArray::memsize() + // + // Returns the memory size of the fixed array in bytes. + size_t memsize() const { return size() * sizeof(value_type); } + + // FixedArray::data() + // + // Returns a const T* pointer to elements of the `FixedArray`. This pointer + // can be used to access (but not modify) the contained elements. + const_pointer data() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return AsValueType(storage_.begin()); + } + + // Overload of FixedArray::data() to return a T* pointer to elements of the + // fixed array. This pointer can be used to access and modify the contained + // elements. + pointer data() ABSL_ATTRIBUTE_LIFETIME_BOUND { + return AsValueType(storage_.begin()); + } + + // FixedArray::operator[] + // + // Returns a reference the ith element of the fixed array. + // REQUIRES: 0 <= i < size() + reference operator[](size_type i) ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(i < size()); + return data()[i]; + } + + // Overload of FixedArray::operator()[] to return a const reference to the + // ith element of the fixed array. + // REQUIRES: 0 <= i < size() + const_reference operator[](size_type i) const ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(i < size()); + return data()[i]; + } + + // FixedArray::at + // + // Bounds-checked access. Returns a reference to the ith element of the fixed + // array, or throws std::out_of_range + reference at(size_type i) ABSL_ATTRIBUTE_LIFETIME_BOUND { + if (ABSL_PREDICT_FALSE(i >= size())) { + base_internal::ThrowStdOutOfRange("FixedArray::at failed bounds check"); + } + return data()[i]; + } + + // Overload of FixedArray::at() to return a const reference to the ith element + // of the fixed array. + const_reference at(size_type i) const ABSL_ATTRIBUTE_LIFETIME_BOUND { + if (ABSL_PREDICT_FALSE(i >= size())) { + base_internal::ThrowStdOutOfRange("FixedArray::at failed bounds check"); + } + return data()[i]; + } + + // FixedArray::front() + // + // Returns a reference to the first element of the fixed array. + reference front() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(!empty()); + return data()[0]; + } + + // Overload of FixedArray::front() to return a reference to the first element + // of a fixed array of const values. + const_reference front() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(!empty()); + return data()[0]; + } + + // FixedArray::back() + // + // Returns a reference to the last element of the fixed array. + reference back() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(!empty()); + return data()[size() - 1]; + } + + // Overload of FixedArray::back() to return a reference to the last element + // of a fixed array of const values. + const_reference back() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(!empty()); + return data()[size() - 1]; + } + + // FixedArray::begin() + // + // Returns an iterator to the beginning of the fixed array. + iterator begin() ABSL_ATTRIBUTE_LIFETIME_BOUND { return data(); } + + // Overload of FixedArray::begin() to return a const iterator to the + // beginning of the fixed array. + const_iterator begin() const ABSL_ATTRIBUTE_LIFETIME_BOUND { return data(); } + + // FixedArray::cbegin() + // + // Returns a const iterator to the beginning of the fixed array. + const_iterator cbegin() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return begin(); + } + + // FixedArray::end() + // + // Returns an iterator to the end of the fixed array. + iterator end() ABSL_ATTRIBUTE_LIFETIME_BOUND { return data() + size(); } + + // Overload of FixedArray::end() to return a const iterator to the end of the + // fixed array. + const_iterator end() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return data() + size(); + } + + // FixedArray::cend() + // + // Returns a const iterator to the end of the fixed array. + const_iterator cend() const ABSL_ATTRIBUTE_LIFETIME_BOUND { return end(); } + + // FixedArray::rbegin() + // + // Returns a reverse iterator from the end of the fixed array. + reverse_iterator rbegin() ABSL_ATTRIBUTE_LIFETIME_BOUND { + return reverse_iterator(end()); + } + + // Overload of FixedArray::rbegin() to return a const reverse iterator from + // the end of the fixed array. + const_reverse_iterator rbegin() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return const_reverse_iterator(end()); + } + + // FixedArray::crbegin() + // + // Returns a const reverse iterator from the end of the fixed array. + const_reverse_iterator crbegin() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return rbegin(); + } + + // FixedArray::rend() + // + // Returns a reverse iterator from the beginning of the fixed array. + reverse_iterator rend() ABSL_ATTRIBUTE_LIFETIME_BOUND { + return reverse_iterator(begin()); + } + + // Overload of FixedArray::rend() for returning a const reverse iterator + // from the beginning of the fixed array. + const_reverse_iterator rend() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return const_reverse_iterator(begin()); + } + + // FixedArray::crend() + // + // Returns a reverse iterator from the beginning of the fixed array. + const_reverse_iterator crend() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return rend(); + } + + // FixedArray::fill() + // + // Assigns the given `value` to all elements in the fixed array. + void fill(const value_type& val) { std::fill(begin(), end(), val); } + + // Relational operators. Equality operators are elementwise using + // `operator==`, while order operators order FixedArrays lexicographically. + friend bool operator==(const FixedArray& lhs, const FixedArray& rhs) { + return std::equal(lhs.begin(), lhs.end(), rhs.begin(), rhs.end()); + } + + friend bool operator!=(const FixedArray& lhs, const FixedArray& rhs) { + return !(lhs == rhs); + } + + friend bool operator<(const FixedArray& lhs, const FixedArray& rhs) { + return std::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), + rhs.end()); + } + + friend bool operator>(const FixedArray& lhs, const FixedArray& rhs) { + return rhs < lhs; + } + + friend bool operator<=(const FixedArray& lhs, const FixedArray& rhs) { + return !(rhs < lhs); + } + + friend bool operator>=(const FixedArray& lhs, const FixedArray& rhs) { + return !(lhs < rhs); + } + + template + friend H AbslHashValue(H h, const FixedArray& v) { + return H::combine(H::combine_contiguous(std::move(h), v.data(), v.size()), + v.size()); + } + + private: + // StorageElement + // + // For FixedArrays with a C-style-array value_type, StorageElement is a POD + // wrapper struct called StorageElementWrapper that holds the value_type + // instance inside. This is needed for construction and destruction of the + // entire array regardless of how many dimensions it has. For all other cases, + // StorageElement is just an alias of value_type. + // + // Maintainer's Note: The simpler solution would be to simply wrap value_type + // in a struct whether it's an array or not. That causes some paranoid + // diagnostics to misfire, believing that 'data()' returns a pointer to a + // single element, rather than the packed array that it really is. + // e.g.: + // + // FixedArray buf(1); + // sprintf(buf.data(), "foo"); + // + // error: call to int __builtin___sprintf_chk(etc...) + // will always overflow destination buffer [-Werror] + // + template , + size_t InnerN = std::extent::value> + struct StorageElementWrapper { + InnerT array[InnerN]; + }; + + using StorageElement = + absl::conditional_t::value, + StorageElementWrapper, value_type>; + + static pointer AsValueType(pointer ptr) { return ptr; } + static pointer AsValueType(StorageElementWrapper* ptr) { + return std::addressof(ptr->array); + } + + static_assert(sizeof(StorageElement) == sizeof(value_type), ""); + static_assert(alignof(StorageElement) == alignof(value_type), ""); + + class NonEmptyInlinedStorage { + public: + StorageElement* data() { return reinterpret_cast(buff_); } + void AnnotateConstruct(size_type n); + void AnnotateDestruct(size_type n); + +#ifdef ABSL_HAVE_ADDRESS_SANITIZER + void* RedzoneBegin() { return &redzone_begin_; } + void* RedzoneEnd() { return &redzone_end_ + 1; } +#endif // ABSL_HAVE_ADDRESS_SANITIZER + + private: + ABSL_ADDRESS_SANITIZER_REDZONE(redzone_begin_); + alignas(StorageElement) char buff_[sizeof(StorageElement[inline_elements])]; + ABSL_ADDRESS_SANITIZER_REDZONE(redzone_end_); + }; + + class EmptyInlinedStorage { + public: + StorageElement* data() { return nullptr; } + void AnnotateConstruct(size_type) {} + void AnnotateDestruct(size_type) {} + }; + + using InlinedStorage = + absl::conditional_t; + + // Storage + // + // An instance of Storage manages the inline and out-of-line memory for + // instances of FixedArray. This guarantees that even when construction of + // individual elements fails in the FixedArray constructor body, the + // destructor for Storage will still be called and out-of-line memory will be + // properly deallocated. + // + class Storage : public InlinedStorage { + public: + Storage(size_type n, const allocator_type& a) + : size_alloc_(n, a), data_(InitializeData()) {} + + ~Storage() noexcept { + if (UsingInlinedStorage(size())) { + InlinedStorage::AnnotateDestruct(size()); + } else { + AllocatorTraits::deallocate(alloc(), AsValueType(begin()), size()); + } + } + + size_type size() const { return size_alloc_.template get<0>(); } + StorageElement* begin() const { return data_; } + StorageElement* end() const { return begin() + size(); } + allocator_type& alloc() { return size_alloc_.template get<1>(); } + const allocator_type& alloc() const { + return size_alloc_.template get<1>(); + } + + private: + static bool UsingInlinedStorage(size_type n) { + return n <= inline_elements; + } + +#ifdef ABSL_HAVE_ADDRESS_SANITIZER + ABSL_ATTRIBUTE_NOINLINE +#endif // ABSL_HAVE_ADDRESS_SANITIZER + StorageElement* InitializeData() { + if (UsingInlinedStorage(size())) { + InlinedStorage::AnnotateConstruct(size()); + return InlinedStorage::data(); + } else { + return reinterpret_cast( + AllocatorTraits::allocate(alloc(), size())); + } + } + + // `CompressedTuple` takes advantage of EBCO for stateless `allocator_type`s + container_internal::CompressedTuple size_alloc_; + StorageElement* data_; + }; + + Storage storage_; +}; + +#ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL +template +constexpr size_t FixedArray::kInlineBytesDefault; + +template +constexpr typename FixedArray::size_type + FixedArray::inline_elements; +#endif + +template +void FixedArray::NonEmptyInlinedStorage::AnnotateConstruct( + typename FixedArray::size_type n) { +#ifdef ABSL_HAVE_ADDRESS_SANITIZER + if (!n) return; + ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(data(), RedzoneEnd(), RedzoneEnd(), + data() + n); + ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(RedzoneBegin(), data(), data(), + RedzoneBegin()); +#endif // ABSL_HAVE_ADDRESS_SANITIZER + static_cast(n); // Mark used when not in asan mode +} + +template +void FixedArray::NonEmptyInlinedStorage::AnnotateDestruct( + typename FixedArray::size_type n) { +#ifdef ABSL_HAVE_ADDRESS_SANITIZER + if (!n) return; + ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(data(), RedzoneEnd(), data() + n, + RedzoneEnd()); + ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(RedzoneBegin(), data(), RedzoneBegin(), + data()); +#endif // ABSL_HAVE_ADDRESS_SANITIZER + static_cast(n); // Mark used when not in asan mode +} +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_FIXED_ARRAY_H_ diff --git a/absl/container/fixed_array_benchmark.cc b/absl/container/fixed_array_benchmark.cc new file mode 100644 index 0000000..db6663e --- /dev/null +++ b/absl/container/fixed_array_benchmark.cc @@ -0,0 +1,67 @@ +// Copyright 2019 The Abseil Authors. +// +// 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 +// +// https://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 + +#include + +#include "absl/container/fixed_array.h" +#include "benchmark/benchmark.h" + +namespace { + +// For benchmarking -- simple class with constructor and destructor that +// set an int to a constant.. +class SimpleClass { + public: + SimpleClass() : i(3) {} + ~SimpleClass() { i = 0; } + + private: + int i; +}; + +template +void BM_FixedArray(benchmark::State& state) { + const int size = state.range(0); + for (auto _ : state) { + absl::FixedArray fa(size); + benchmark::DoNotOptimize(fa.data()); + } +} +BENCHMARK_TEMPLATE(BM_FixedArray, char, absl::kFixedArrayUseDefault) + ->Range(0, 1 << 16); +BENCHMARK_TEMPLATE(BM_FixedArray, char, 0)->Range(0, 1 << 16); +BENCHMARK_TEMPLATE(BM_FixedArray, char, 1)->Range(0, 1 << 16); +BENCHMARK_TEMPLATE(BM_FixedArray, char, 16)->Range(0, 1 << 16); +BENCHMARK_TEMPLATE(BM_FixedArray, char, 256)->Range(0, 1 << 16); +BENCHMARK_TEMPLATE(BM_FixedArray, char, 65536)->Range(0, 1 << 16); + +BENCHMARK_TEMPLATE(BM_FixedArray, SimpleClass, absl::kFixedArrayUseDefault) + ->Range(0, 1 << 16); +BENCHMARK_TEMPLATE(BM_FixedArray, SimpleClass, 0)->Range(0, 1 << 16); +BENCHMARK_TEMPLATE(BM_FixedArray, SimpleClass, 1)->Range(0, 1 << 16); +BENCHMARK_TEMPLATE(BM_FixedArray, SimpleClass, 16)->Range(0, 1 << 16); +BENCHMARK_TEMPLATE(BM_FixedArray, SimpleClass, 256)->Range(0, 1 << 16); +BENCHMARK_TEMPLATE(BM_FixedArray, SimpleClass, 65536)->Range(0, 1 << 16); + +BENCHMARK_TEMPLATE(BM_FixedArray, std::string, absl::kFixedArrayUseDefault) + ->Range(0, 1 << 16); +BENCHMARK_TEMPLATE(BM_FixedArray, std::string, 0)->Range(0, 1 << 16); +BENCHMARK_TEMPLATE(BM_FixedArray, std::string, 1)->Range(0, 1 << 16); +BENCHMARK_TEMPLATE(BM_FixedArray, std::string, 16)->Range(0, 1 << 16); +BENCHMARK_TEMPLATE(BM_FixedArray, std::string, 256)->Range(0, 1 << 16); +BENCHMARK_TEMPLATE(BM_FixedArray, std::string, 65536)->Range(0, 1 << 16); + +} // namespace diff --git a/absl/container/fixed_array_exception_safety_test.cc b/absl/container/fixed_array_exception_safety_test.cc new file mode 100644 index 0000000..e5f5929 --- /dev/null +++ b/absl/container/fixed_array_exception_safety_test.cc @@ -0,0 +1,201 @@ +// Copyright 2019 The Abseil Authors. +// +// 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 +// +// https://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 "absl/base/config.h" +#include "absl/container/fixed_array.h" + +#ifdef ABSL_HAVE_EXCEPTIONS + +#include + +#include "gtest/gtest.h" +#include "absl/base/internal/exception_safety_testing.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN + +namespace { + +constexpr size_t kInlined = 25; +constexpr size_t kSmallSize = kInlined / 2; +constexpr size_t kLargeSize = kInlined * 2; + +constexpr int kInitialValue = 5; +constexpr int kUpdatedValue = 10; + +using ::testing::TestThrowingCtor; + +using Thrower = testing::ThrowingValue; +using ThrowAlloc = + testing::ThrowingAllocator; +using MoveThrower = testing::ThrowingValue; +using MoveThrowAlloc = + testing::ThrowingAllocator; + +using FixedArr = absl::FixedArray; +using FixedArrWithAlloc = absl::FixedArray; + +using MoveFixedArr = absl::FixedArray; +using MoveFixedArrWithAlloc = + absl::FixedArray; + +TEST(FixedArrayExceptionSafety, CopyConstructor) { + auto small = FixedArr(kSmallSize); + TestThrowingCtor(small); + + auto large = FixedArr(kLargeSize); + TestThrowingCtor(large); +} + +TEST(FixedArrayExceptionSafety, CopyConstructorWithAlloc) { + auto small = FixedArrWithAlloc(kSmallSize); + TestThrowingCtor(small); + + auto large = FixedArrWithAlloc(kLargeSize); + TestThrowingCtor(large); +} + +TEST(FixedArrayExceptionSafety, MoveConstructor) { + TestThrowingCtor(FixedArr(kSmallSize)); + TestThrowingCtor(FixedArr(kLargeSize)); + + // TypeSpec::kNoThrowMove + TestThrowingCtor(MoveFixedArr(kSmallSize)); + TestThrowingCtor(MoveFixedArr(kLargeSize)); +} + +TEST(FixedArrayExceptionSafety, MoveConstructorWithAlloc) { + TestThrowingCtor(FixedArrWithAlloc(kSmallSize)); + TestThrowingCtor(FixedArrWithAlloc(kLargeSize)); + + // TypeSpec::kNoThrowMove + TestThrowingCtor(MoveFixedArrWithAlloc(kSmallSize)); + TestThrowingCtor(MoveFixedArrWithAlloc(kLargeSize)); +} + +TEST(FixedArrayExceptionSafety, SizeConstructor) { + TestThrowingCtor(kSmallSize); + TestThrowingCtor(kLargeSize); +} + +TEST(FixedArrayExceptionSafety, SizeConstructorWithAlloc) { + TestThrowingCtor(kSmallSize); + TestThrowingCtor(kLargeSize); +} + +TEST(FixedArrayExceptionSafety, SizeValueConstructor) { + TestThrowingCtor(kSmallSize, Thrower()); + TestThrowingCtor(kLargeSize, Thrower()); +} + +TEST(FixedArrayExceptionSafety, SizeValueConstructorWithAlloc) { + TestThrowingCtor(kSmallSize, Thrower()); + TestThrowingCtor(kLargeSize, Thrower()); +} + +TEST(FixedArrayExceptionSafety, IteratorConstructor) { + auto small = FixedArr(kSmallSize); + TestThrowingCtor(small.begin(), small.end()); + + auto large = FixedArr(kLargeSize); + TestThrowingCtor(large.begin(), large.end()); +} + +TEST(FixedArrayExceptionSafety, IteratorConstructorWithAlloc) { + auto small = FixedArrWithAlloc(kSmallSize); + TestThrowingCtor(small.begin(), small.end()); + + auto large = FixedArrWithAlloc(kLargeSize); + TestThrowingCtor(large.begin(), large.end()); +} + +TEST(FixedArrayExceptionSafety, InitListConstructor) { + constexpr int small_inlined = 3; + using SmallFixedArr = absl::FixedArray; + + TestThrowingCtor(std::initializer_list{}); + // Test inlined allocation + TestThrowingCtor( + std::initializer_list{Thrower{}, Thrower{}}); + // Test out of line allocation + TestThrowingCtor(std::initializer_list{ + Thrower{}, Thrower{}, Thrower{}, Thrower{}, Thrower{}}); +} + +TEST(FixedArrayExceptionSafety, InitListConstructorWithAlloc) { + constexpr int small_inlined = 3; + using SmallFixedArrWithAlloc = + absl::FixedArray; + + TestThrowingCtor(std::initializer_list{}); + // Test inlined allocation + TestThrowingCtor( + std::initializer_list{Thrower{}, Thrower{}}); + // Test out of line allocation + TestThrowingCtor(std::initializer_list{ + Thrower{}, Thrower{}, Thrower{}, Thrower{}, Thrower{}}); +} + +template +testing::AssertionResult ReadMemory(FixedArrT* fixed_arr) { + int sum = 0; + for (const auto& thrower : *fixed_arr) { + sum += thrower.Get(); + } + return testing::AssertionSuccess() << "Values sum to [" << sum << "]"; +} + +TEST(FixedArrayExceptionSafety, Fill) { + auto test_fill = testing::MakeExceptionSafetyTester() + .WithContracts(ReadMemory) + .WithOperation([&](FixedArr* fixed_arr_ptr) { + auto thrower = + Thrower(kUpdatedValue, testing::nothrow_ctor); + fixed_arr_ptr->fill(thrower); + }); + + EXPECT_TRUE( + test_fill.WithInitialValue(FixedArr(kSmallSize, Thrower(kInitialValue))) + .Test()); + EXPECT_TRUE( + test_fill.WithInitialValue(FixedArr(kLargeSize, Thrower(kInitialValue))) + .Test()); +} + +TEST(FixedArrayExceptionSafety, FillWithAlloc) { + auto test_fill = testing::MakeExceptionSafetyTester() + .WithContracts(ReadMemory) + .WithOperation([&](FixedArrWithAlloc* fixed_arr_ptr) { + auto thrower = + Thrower(kUpdatedValue, testing::nothrow_ctor); + fixed_arr_ptr->fill(thrower); + }); + + EXPECT_TRUE(test_fill + .WithInitialValue( + FixedArrWithAlloc(kSmallSize, Thrower(kInitialValue))) + .Test()); + EXPECT_TRUE(test_fill + .WithInitialValue( + FixedArrWithAlloc(kLargeSize, Thrower(kInitialValue))) + .Test()); +} + +} // namespace + +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_HAVE_EXCEPTIONS diff --git a/absl/container/fixed_array_test.cc b/absl/container/fixed_array_test.cc new file mode 100644 index 0000000..331d702 --- /dev/null +++ b/absl/container/fixed_array_test.cc @@ -0,0 +1,857 @@ +// Copyright 2019 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/fixed_array.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/config.h" +#include "absl/base/internal/exception_testing.h" +#include "absl/base/options.h" +#include "absl/container/internal/test_allocator.h" +#include "absl/hash/hash_testing.h" +#include "absl/memory/memory.h" + +using ::testing::ElementsAreArray; + +namespace { + +// Helper routine to determine if a absl::FixedArray used stack allocation. +template +static bool IsOnStack(const ArrayType& a) { + return a.size() <= ArrayType::inline_elements; +} + +class ConstructionTester { + public: + ConstructionTester() : self_ptr_(this), value_(0) { constructions++; } + ~ConstructionTester() { + assert(self_ptr_ == this); + self_ptr_ = nullptr; + destructions++; + } + + // These are incremented as elements are constructed and destructed so we can + // be sure all elements are properly cleaned up. + static int constructions; + static int destructions; + + void CheckConstructed() { assert(self_ptr_ == this); } + + void set(int value) { value_ = value; } + int get() { return value_; } + + private: + // self_ptr_ should always point to 'this' -- that's how we can be sure the + // constructor has been called. + ConstructionTester* self_ptr_; + int value_; +}; + +int ConstructionTester::constructions = 0; +int ConstructionTester::destructions = 0; + +// ThreeInts will initialize its three ints to the value stored in +// ThreeInts::counter. The constructor increments counter so that each object +// in an array of ThreeInts will have different values. +class ThreeInts { + public: + ThreeInts() { + x_ = counter; + y_ = counter; + z_ = counter; + ++counter; + } + + static int counter; + + int x_, y_, z_; +}; + +int ThreeInts::counter = 0; + +TEST(FixedArrayTest, CopyCtor) { + absl::FixedArray on_stack(5); + std::iota(on_stack.begin(), on_stack.end(), 0); + absl::FixedArray stack_copy = on_stack; + EXPECT_THAT(stack_copy, ElementsAreArray(on_stack)); + EXPECT_TRUE(IsOnStack(stack_copy)); + + absl::FixedArray allocated(15); + std::iota(allocated.begin(), allocated.end(), 0); + absl::FixedArray alloced_copy = allocated; + EXPECT_THAT(alloced_copy, ElementsAreArray(allocated)); + EXPECT_FALSE(IsOnStack(alloced_copy)); +} + +TEST(FixedArrayTest, MoveCtor) { + absl::FixedArray, 10> on_stack(5); + for (int i = 0; i < 5; ++i) { + on_stack[i] = absl::make_unique(i); + } + + absl::FixedArray, 10> stack_copy = std::move(on_stack); + for (int i = 0; i < 5; ++i) EXPECT_EQ(*(stack_copy[i]), i); + EXPECT_EQ(stack_copy.size(), on_stack.size()); + + absl::FixedArray, 10> allocated(15); + for (int i = 0; i < 15; ++i) { + allocated[i] = absl::make_unique(i); + } + + absl::FixedArray, 10> alloced_copy = + std::move(allocated); + for (int i = 0; i < 15; ++i) EXPECT_EQ(*(alloced_copy[i]), i); + EXPECT_EQ(allocated.size(), alloced_copy.size()); +} + +TEST(FixedArrayTest, SmallObjects) { + // Small object arrays + { + // Short arrays should be on the stack + absl::FixedArray array(4); + EXPECT_TRUE(IsOnStack(array)); + } + + { + // Large arrays should be on the heap + absl::FixedArray array(1048576); + EXPECT_FALSE(IsOnStack(array)); + } + + { + // Arrays of <= default size should be on the stack + absl::FixedArray array(100); + EXPECT_TRUE(IsOnStack(array)); + } + + { + // Arrays of > default size should be on the heap + absl::FixedArray array(101); + EXPECT_FALSE(IsOnStack(array)); + } + + { + // Arrays with different size elements should use approximately + // same amount of stack space + absl::FixedArray array1(0); + absl::FixedArray array2(0); + EXPECT_LE(sizeof(array1), sizeof(array2) + 100); + EXPECT_LE(sizeof(array2), sizeof(array1) + 100); + } + + { + // Ensure that vectors are properly constructed inside a fixed array. + absl::FixedArray> array(2); + EXPECT_EQ(0, array[0].size()); + EXPECT_EQ(0, array[1].size()); + } + + { + // Regardless of absl::FixedArray implementation, check that a type with a + // low alignment requirement and a non power-of-two size is initialized + // correctly. + ThreeInts::counter = 1; + absl::FixedArray array(2); + EXPECT_EQ(1, array[0].x_); + EXPECT_EQ(1, array[0].y_); + EXPECT_EQ(1, array[0].z_); + EXPECT_EQ(2, array[1].x_); + EXPECT_EQ(2, array[1].y_); + EXPECT_EQ(2, array[1].z_); + } +} + +TEST(FixedArrayTest, AtThrows) { + absl::FixedArray a = {1, 2, 3}; + EXPECT_EQ(a.at(2), 3); + ABSL_BASE_INTERNAL_EXPECT_FAIL(a.at(3), std::out_of_range, + "failed bounds check"); +} + +TEST(FixedArrayTest, Hardened) { +#if !defined(NDEBUG) || ABSL_OPTION_HARDENED + absl::FixedArray a = {1, 2, 3}; + EXPECT_EQ(a[2], 3); + EXPECT_DEATH_IF_SUPPORTED(a[3], ""); + EXPECT_DEATH_IF_SUPPORTED(a[-1], ""); + + absl::FixedArray empty(0); + EXPECT_DEATH_IF_SUPPORTED(empty[0], ""); + EXPECT_DEATH_IF_SUPPORTED(empty[-1], ""); + EXPECT_DEATH_IF_SUPPORTED(empty.front(), ""); + EXPECT_DEATH_IF_SUPPORTED(empty.back(), ""); +#endif +} + +TEST(FixedArrayRelationalsTest, EqualArrays) { + for (int i = 0; i < 10; ++i) { + absl::FixedArray a1(i); + std::iota(a1.begin(), a1.end(), 0); + absl::FixedArray a2(a1.begin(), a1.end()); + + EXPECT_TRUE(a1 == a2); + EXPECT_FALSE(a1 != a2); + EXPECT_TRUE(a2 == a1); + EXPECT_FALSE(a2 != a1); + EXPECT_FALSE(a1 < a2); + EXPECT_FALSE(a1 > a2); + EXPECT_FALSE(a2 < a1); + EXPECT_FALSE(a2 > a1); + EXPECT_TRUE(a1 <= a2); + EXPECT_TRUE(a1 >= a2); + EXPECT_TRUE(a2 <= a1); + EXPECT_TRUE(a2 >= a1); + } +} + +TEST(FixedArrayRelationalsTest, UnequalArrays) { + for (int i = 1; i < 10; ++i) { + absl::FixedArray a1(i); + std::iota(a1.begin(), a1.end(), 0); + absl::FixedArray a2(a1.begin(), a1.end()); + --a2[i / 2]; + + EXPECT_FALSE(a1 == a2); + EXPECT_TRUE(a1 != a2); + EXPECT_FALSE(a2 == a1); + EXPECT_TRUE(a2 != a1); + EXPECT_FALSE(a1 < a2); + EXPECT_TRUE(a1 > a2); + EXPECT_TRUE(a2 < a1); + EXPECT_FALSE(a2 > a1); + EXPECT_FALSE(a1 <= a2); + EXPECT_TRUE(a1 >= a2); + EXPECT_TRUE(a2 <= a1); + EXPECT_FALSE(a2 >= a1); + } +} + +template +static void TestArray(int n) { + SCOPED_TRACE(n); + SCOPED_TRACE(stack_elements); + ConstructionTester::constructions = 0; + ConstructionTester::destructions = 0; + { + absl::FixedArray array(n); + + EXPECT_THAT(array.size(), n); + EXPECT_THAT(array.memsize(), sizeof(ConstructionTester) * n); + EXPECT_THAT(array.begin() + n, array.end()); + + // Check that all elements were constructed + for (int i = 0; i < n; i++) { + array[i].CheckConstructed(); + } + // Check that no other elements were constructed + EXPECT_THAT(ConstructionTester::constructions, n); + + // Test operator[] + for (int i = 0; i < n; i++) { + array[i].set(i); + } + for (int i = 0; i < n; i++) { + EXPECT_THAT(array[i].get(), i); + EXPECT_THAT(array.data()[i].get(), i); + } + + // Test data() + for (int i = 0; i < n; i++) { + array.data()[i].set(i + 1); + } + for (int i = 0; i < n; i++) { + EXPECT_THAT(array[i].get(), i + 1); + EXPECT_THAT(array.data()[i].get(), i + 1); + } + } // Close scope containing 'array'. + + // Check that all constructed elements were destructed. + EXPECT_EQ(ConstructionTester::constructions, + ConstructionTester::destructions); +} + +template +static void TestArrayOfArrays(int n) { + SCOPED_TRACE(n); + SCOPED_TRACE(inline_elements); + SCOPED_TRACE(elements_per_inner_array); + ConstructionTester::constructions = 0; + ConstructionTester::destructions = 0; + { + using InnerArray = ConstructionTester[elements_per_inner_array]; + // Heap-allocate the FixedArray to avoid blowing the stack frame. + auto array_ptr = + absl::make_unique>(n); + auto& array = *array_ptr; + + ASSERT_EQ(array.size(), n); + ASSERT_EQ(array.memsize(), + sizeof(ConstructionTester) * elements_per_inner_array * n); + ASSERT_EQ(array.begin() + n, array.end()); + + // Check that all elements were constructed + for (int i = 0; i < n; i++) { + for (int j = 0; j < elements_per_inner_array; j++) { + (array[i])[j].CheckConstructed(); + } + } + // Check that no other elements were constructed + ASSERT_EQ(ConstructionTester::constructions, n * elements_per_inner_array); + + // Test operator[] + for (int i = 0; i < n; i++) { + for (int j = 0; j < elements_per_inner_array; j++) { + (array[i])[j].set(i * elements_per_inner_array + j); + } + } + for (int i = 0; i < n; i++) { + for (int j = 0; j < elements_per_inner_array; j++) { + ASSERT_EQ((array[i])[j].get(), i * elements_per_inner_array + j); + ASSERT_EQ((array.data()[i])[j].get(), i * elements_per_inner_array + j); + } + } + + // Test data() + for (int i = 0; i < n; i++) { + for (int j = 0; j < elements_per_inner_array; j++) { + (array.data()[i])[j].set((i + 1) * elements_per_inner_array + j); + } + } + for (int i = 0; i < n; i++) { + for (int j = 0; j < elements_per_inner_array; j++) { + ASSERT_EQ((array[i])[j].get(), (i + 1) * elements_per_inner_array + j); + ASSERT_EQ((array.data()[i])[j].get(), + (i + 1) * elements_per_inner_array + j); + } + } + } // Close scope containing 'array'. + + // Check that all constructed elements were destructed. + EXPECT_EQ(ConstructionTester::constructions, + ConstructionTester::destructions); +} + +TEST(IteratorConstructorTest, NonInline) { + int const kInput[] = {2, 3, 5, 7, 11, 13, 17}; + absl::FixedArray const fixed( + kInput, kInput + ABSL_ARRAYSIZE(kInput)); + ASSERT_EQ(ABSL_ARRAYSIZE(kInput), fixed.size()); + for (size_t i = 0; i < ABSL_ARRAYSIZE(kInput); ++i) { + ASSERT_EQ(kInput[i], fixed[i]); + } +} + +TEST(IteratorConstructorTest, Inline) { + int const kInput[] = {2, 3, 5, 7, 11, 13, 17}; + absl::FixedArray const fixed( + kInput, kInput + ABSL_ARRAYSIZE(kInput)); + ASSERT_EQ(ABSL_ARRAYSIZE(kInput), fixed.size()); + for (size_t i = 0; i < ABSL_ARRAYSIZE(kInput); ++i) { + ASSERT_EQ(kInput[i], fixed[i]); + } +} + +TEST(IteratorConstructorTest, NonPod) { + char const* kInput[] = {"red", "orange", "yellow", "green", + "blue", "indigo", "violet"}; + absl::FixedArray const fixed(kInput, + kInput + ABSL_ARRAYSIZE(kInput)); + ASSERT_EQ(ABSL_ARRAYSIZE(kInput), fixed.size()); + for (size_t i = 0; i < ABSL_ARRAYSIZE(kInput); ++i) { + ASSERT_EQ(kInput[i], fixed[i]); + } +} + +TEST(IteratorConstructorTest, FromEmptyVector) { + std::vector const empty; + absl::FixedArray const fixed(empty.begin(), empty.end()); + EXPECT_EQ(0, fixed.size()); + EXPECT_EQ(empty.size(), fixed.size()); +} + +TEST(IteratorConstructorTest, FromNonEmptyVector) { + int const kInput[] = {2, 3, 5, 7, 11, 13, 17}; + std::vector const items(kInput, kInput + ABSL_ARRAYSIZE(kInput)); + absl::FixedArray const fixed(items.begin(), items.end()); + ASSERT_EQ(items.size(), fixed.size()); + for (size_t i = 0; i < items.size(); ++i) { + ASSERT_EQ(items[i], fixed[i]); + } +} + +TEST(IteratorConstructorTest, FromBidirectionalIteratorRange) { + int const kInput[] = {2, 3, 5, 7, 11, 13, 17}; + std::list const items(kInput, kInput + ABSL_ARRAYSIZE(kInput)); + absl::FixedArray const fixed(items.begin(), items.end()); + EXPECT_THAT(fixed, testing::ElementsAreArray(kInput)); +} + +TEST(InitListConstructorTest, InitListConstruction) { + absl::FixedArray fixed = {1, 2, 3}; + EXPECT_THAT(fixed, testing::ElementsAreArray({1, 2, 3})); +} + +TEST(FillConstructorTest, NonEmptyArrays) { + absl::FixedArray stack_array(4, 1); + EXPECT_THAT(stack_array, testing::ElementsAreArray({1, 1, 1, 1})); + + absl::FixedArray heap_array(4, 1); + EXPECT_THAT(heap_array, testing::ElementsAreArray({1, 1, 1, 1})); +} + +TEST(FillConstructorTest, EmptyArray) { + absl::FixedArray empty_fill(0, 1); + absl::FixedArray empty_size(0); + EXPECT_EQ(empty_fill, empty_size); +} + +TEST(FillConstructorTest, NotTriviallyCopyable) { + std::string str = "abcd"; + absl::FixedArray strings = {str, str, str, str}; + + absl::FixedArray array(4, str); + EXPECT_EQ(array, strings); +} + +TEST(FillConstructorTest, Disambiguation) { + absl::FixedArray a(1, 2); + EXPECT_THAT(a, testing::ElementsAre(2)); +} + +TEST(FixedArrayTest, ManySizedArrays) { + std::vector sizes; + for (int i = 1; i < 100; i++) sizes.push_back(i); + for (int i = 100; i <= 1000; i += 100) sizes.push_back(i); + for (int n : sizes) { + TestArray<0>(n); + TestArray<1>(n); + TestArray<64>(n); + TestArray<1000>(n); + } +} + +TEST(FixedArrayTest, ManySizedArraysOfArraysOf1) { + for (int n = 1; n < 1000; n++) { + ASSERT_NO_FATAL_FAILURE((TestArrayOfArrays<1, 0>(n))); + ASSERT_NO_FATAL_FAILURE((TestArrayOfArrays<1, 1>(n))); + ASSERT_NO_FATAL_FAILURE((TestArrayOfArrays<1, 64>(n))); + ASSERT_NO_FATAL_FAILURE((TestArrayOfArrays<1, 1000>(n))); + } +} + +TEST(FixedArrayTest, ManySizedArraysOfArraysOf2) { + for (int n = 1; n < 1000; n++) { + TestArrayOfArrays<2, 0>(n); + TestArrayOfArrays<2, 1>(n); + TestArrayOfArrays<2, 64>(n); + TestArrayOfArrays<2, 1000>(n); + } +} + +// If value_type is put inside of a struct container, +// we might evoke this error in a hardened build unless data() is carefully +// written, so check on that. +// error: call to int __builtin___sprintf_chk(etc...) +// will always overflow destination buffer [-Werror] +TEST(FixedArrayTest, AvoidParanoidDiagnostics) { + absl::FixedArray buf(32); + sprintf(buf.data(), "foo"); // NOLINT(runtime/printf) +} + +TEST(FixedArrayTest, TooBigInlinedSpace) { + struct TooBig { + char c[1 << 20]; + }; // too big for even one on the stack + + // Simulate the data members of absl::FixedArray, a pointer and a size_t. + struct Data { + TooBig* p; + size_t size; + }; + + // Make sure TooBig objects are not inlined for 0 or default size. + static_assert(sizeof(absl::FixedArray) == sizeof(Data), + "0-sized absl::FixedArray should have same size as Data."); + static_assert(alignof(absl::FixedArray) == alignof(Data), + "0-sized absl::FixedArray should have same alignment as Data."); + static_assert(sizeof(absl::FixedArray) == sizeof(Data), + "default-sized absl::FixedArray should have same size as Data"); + static_assert( + alignof(absl::FixedArray) == alignof(Data), + "default-sized absl::FixedArray should have same alignment as Data."); +} + +// PickyDelete EXPECTs its class-scope deallocation funcs are unused. +struct PickyDelete { + PickyDelete() {} + ~PickyDelete() {} + void operator delete(void* p) { + EXPECT_TRUE(false) << __FUNCTION__; + ::operator delete(p); + } + void operator delete[](void* p) { + EXPECT_TRUE(false) << __FUNCTION__; + ::operator delete[](p); + } +}; + +TEST(FixedArrayTest, UsesGlobalAlloc) { + absl::FixedArray a(5); + EXPECT_EQ(a.size(), 5); +} + +TEST(FixedArrayTest, Data) { + static const int kInput[] = {2, 3, 5, 7, 11, 13, 17}; + absl::FixedArray fa(std::begin(kInput), std::end(kInput)); + EXPECT_EQ(fa.data(), &*fa.begin()); + EXPECT_EQ(fa.data(), &fa[0]); + + const absl::FixedArray& cfa = fa; + EXPECT_EQ(cfa.data(), &*cfa.begin()); + EXPECT_EQ(cfa.data(), &cfa[0]); +} + +TEST(FixedArrayTest, Empty) { + absl::FixedArray empty(0); + absl::FixedArray inline_filled(1); + absl::FixedArray heap_filled(1); + EXPECT_TRUE(empty.empty()); + EXPECT_FALSE(inline_filled.empty()); + EXPECT_FALSE(heap_filled.empty()); +} + +TEST(FixedArrayTest, FrontAndBack) { + absl::FixedArray inlined = {1, 2, 3}; + EXPECT_EQ(inlined.front(), 1); + EXPECT_EQ(inlined.back(), 3); + + absl::FixedArray allocated = {1, 2, 3}; + EXPECT_EQ(allocated.front(), 1); + EXPECT_EQ(allocated.back(), 3); + + absl::FixedArray one_element = {1}; + EXPECT_EQ(one_element.front(), one_element.back()); +} + +TEST(FixedArrayTest, ReverseIteratorInlined) { + absl::FixedArray a = {0, 1, 2, 3, 4}; + + int counter = 5; + for (absl::FixedArray::reverse_iterator iter = a.rbegin(); + iter != a.rend(); ++iter) { + counter--; + EXPECT_EQ(counter, *iter); + } + EXPECT_EQ(counter, 0); + + counter = 5; + for (absl::FixedArray::const_reverse_iterator iter = a.rbegin(); + iter != a.rend(); ++iter) { + counter--; + EXPECT_EQ(counter, *iter); + } + EXPECT_EQ(counter, 0); + + counter = 5; + for (auto iter = a.crbegin(); iter != a.crend(); ++iter) { + counter--; + EXPECT_EQ(counter, *iter); + } + EXPECT_EQ(counter, 0); +} + +TEST(FixedArrayTest, ReverseIteratorAllocated) { + absl::FixedArray a = {0, 1, 2, 3, 4}; + + int counter = 5; + for (absl::FixedArray::reverse_iterator iter = a.rbegin(); + iter != a.rend(); ++iter) { + counter--; + EXPECT_EQ(counter, *iter); + } + EXPECT_EQ(counter, 0); + + counter = 5; + for (absl::FixedArray::const_reverse_iterator iter = a.rbegin(); + iter != a.rend(); ++iter) { + counter--; + EXPECT_EQ(counter, *iter); + } + EXPECT_EQ(counter, 0); + + counter = 5; + for (auto iter = a.crbegin(); iter != a.crend(); ++iter) { + counter--; + EXPECT_EQ(counter, *iter); + } + EXPECT_EQ(counter, 0); +} + +TEST(FixedArrayTest, Fill) { + absl::FixedArray inlined(5); + int fill_val = 42; + inlined.fill(fill_val); + for (int i : inlined) EXPECT_EQ(i, fill_val); + + absl::FixedArray allocated(5); + allocated.fill(fill_val); + for (int i : allocated) EXPECT_EQ(i, fill_val); + + // It doesn't do anything, just make sure this compiles. + absl::FixedArray empty(0); + empty.fill(fill_val); +} + +#ifndef __GNUC__ +TEST(FixedArrayTest, DefaultCtorDoesNotValueInit) { + using T = char; + constexpr auto capacity = 10; + using FixedArrType = absl::FixedArray; + constexpr auto scrubbed_bits = 0x95; + constexpr auto length = capacity / 2; + + alignas(FixedArrType) unsigned char buff[sizeof(FixedArrType)]; + std::memset(std::addressof(buff), scrubbed_bits, sizeof(FixedArrType)); + + FixedArrType* arr = + ::new (static_cast(std::addressof(buff))) FixedArrType(length); + EXPECT_THAT(*arr, testing::Each(scrubbed_bits)); + arr->~FixedArrType(); +} +#endif // __GNUC__ + +TEST(AllocatorSupportTest, CountInlineAllocations) { + constexpr size_t inlined_size = 4; + using Alloc = absl::container_internal::CountingAllocator; + using AllocFxdArr = absl::FixedArray; + + int64_t allocated = 0; + int64_t active_instances = 0; + + { + const int ia[] = {0, 1, 2, 3, 4, 5, 6, 7}; + + Alloc alloc(&allocated, &active_instances); + + AllocFxdArr arr(ia, ia + inlined_size, alloc); + static_cast(arr); + } + + EXPECT_EQ(allocated, 0); + EXPECT_EQ(active_instances, 0); +} + +TEST(AllocatorSupportTest, CountOutoflineAllocations) { + constexpr size_t inlined_size = 4; + using Alloc = absl::container_internal::CountingAllocator; + using AllocFxdArr = absl::FixedArray; + + int64_t allocated = 0; + int64_t active_instances = 0; + + { + const int ia[] = {0, 1, 2, 3, 4, 5, 6, 7}; + Alloc alloc(&allocated, &active_instances); + + AllocFxdArr arr(ia, ia + ABSL_ARRAYSIZE(ia), alloc); + + EXPECT_EQ(allocated, arr.size() * sizeof(int)); + static_cast(arr); + } + + EXPECT_EQ(active_instances, 0); +} + +TEST(AllocatorSupportTest, CountCopyInlineAllocations) { + constexpr size_t inlined_size = 4; + using Alloc = absl::container_internal::CountingAllocator; + using AllocFxdArr = absl::FixedArray; + + int64_t allocated1 = 0; + int64_t allocated2 = 0; + int64_t active_instances = 0; + Alloc alloc(&allocated1, &active_instances); + Alloc alloc2(&allocated2, &active_instances); + + { + int initial_value = 1; + + AllocFxdArr arr1(inlined_size / 2, initial_value, alloc); + + EXPECT_EQ(allocated1, 0); + + AllocFxdArr arr2(arr1, alloc2); + + EXPECT_EQ(allocated2, 0); + static_cast(arr1); + static_cast(arr2); + } + + EXPECT_EQ(active_instances, 0); +} + +TEST(AllocatorSupportTest, CountCopyOutoflineAllocations) { + constexpr size_t inlined_size = 4; + using Alloc = absl::container_internal::CountingAllocator; + using AllocFxdArr = absl::FixedArray; + + int64_t allocated1 = 0; + int64_t allocated2 = 0; + int64_t active_instances = 0; + Alloc alloc(&allocated1, &active_instances); + Alloc alloc2(&allocated2, &active_instances); + + { + int initial_value = 1; + + AllocFxdArr arr1(inlined_size * 2, initial_value, alloc); + + EXPECT_EQ(allocated1, arr1.size() * sizeof(int)); + + AllocFxdArr arr2(arr1, alloc2); + + EXPECT_EQ(allocated2, inlined_size * 2 * sizeof(int)); + static_cast(arr1); + static_cast(arr2); + } + + EXPECT_EQ(active_instances, 0); +} + +TEST(AllocatorSupportTest, SizeValAllocConstructor) { + using testing::AllOf; + using testing::Each; + using testing::SizeIs; + + constexpr size_t inlined_size = 4; + using Alloc = absl::container_internal::CountingAllocator; + using AllocFxdArr = absl::FixedArray; + + { + auto len = inlined_size / 2; + auto val = 0; + int64_t allocated = 0; + AllocFxdArr arr(len, val, Alloc(&allocated)); + + EXPECT_EQ(allocated, 0); + EXPECT_THAT(arr, AllOf(SizeIs(len), Each(0))); + } + + { + auto len = inlined_size * 2; + auto val = 0; + int64_t allocated = 0; + AllocFxdArr arr(len, val, Alloc(&allocated)); + + EXPECT_EQ(allocated, len * sizeof(int)); + EXPECT_THAT(arr, AllOf(SizeIs(len), Each(0))); + } +} + +TEST(AllocatorSupportTest, PropagatesStatefulAllocator) { + constexpr size_t inlined_size = 4; + using Alloc = absl::container_internal::CountingAllocator; + using AllocFxdArr = absl::FixedArray; + + auto len = inlined_size * 2; + auto val = 0; + int64_t allocated = 0; + AllocFxdArr arr(len, val, Alloc(&allocated)); + + EXPECT_EQ(allocated, len * sizeof(int)); + + AllocFxdArr copy = arr; + EXPECT_EQ(allocated, len * sizeof(int) * 2); + EXPECT_EQ(copy, arr); +} + +#ifdef ABSL_HAVE_ADDRESS_SANITIZER +TEST(FixedArrayTest, AddressSanitizerAnnotations1) { + absl::FixedArray a(10); + int* raw = a.data(); + raw[0] = 0; + raw[9] = 0; + EXPECT_DEATH_IF_SUPPORTED(raw[-2] = 0, "container-overflow"); + EXPECT_DEATH_IF_SUPPORTED(raw[-1] = 0, "container-overflow"); + EXPECT_DEATH_IF_SUPPORTED(raw[10] = 0, "container-overflow"); + EXPECT_DEATH_IF_SUPPORTED(raw[31] = 0, "container-overflow"); +} + +TEST(FixedArrayTest, AddressSanitizerAnnotations2) { + absl::FixedArray a(12); + char* raw = a.data(); + raw[0] = 0; + raw[11] = 0; + EXPECT_DEATH_IF_SUPPORTED(raw[-7] = 0, "container-overflow"); + EXPECT_DEATH_IF_SUPPORTED(raw[-1] = 0, "container-overflow"); + EXPECT_DEATH_IF_SUPPORTED(raw[12] = 0, "container-overflow"); + EXPECT_DEATH_IF_SUPPORTED(raw[17] = 0, "container-overflow"); +} + +TEST(FixedArrayTest, AddressSanitizerAnnotations3) { + absl::FixedArray a(20); + uint64_t* raw = a.data(); + raw[0] = 0; + raw[19] = 0; + EXPECT_DEATH_IF_SUPPORTED(raw[-1] = 0, "container-overflow"); + EXPECT_DEATH_IF_SUPPORTED(raw[20] = 0, "container-overflow"); +} + +TEST(FixedArrayTest, AddressSanitizerAnnotations4) { + absl::FixedArray a(10); + ThreeInts* raw = a.data(); + raw[0] = ThreeInts(); + raw[9] = ThreeInts(); + // Note: raw[-1] is pointing to 12 bytes before the container range. However, + // there is only a 8-byte red zone before the container range, so we only + // access the last 4 bytes of the struct to make sure it stays within the red + // zone. + EXPECT_DEATH_IF_SUPPORTED(raw[-1].z_ = 0, "container-overflow"); + EXPECT_DEATH_IF_SUPPORTED(raw[10] = ThreeInts(), "container-overflow"); + // The actual size of storage is kDefaultBytes=256, 21*12 = 252, + // so reading raw[21] should still trigger the correct warning. + EXPECT_DEATH_IF_SUPPORTED(raw[21] = ThreeInts(), "container-overflow"); +} +#endif // ABSL_HAVE_ADDRESS_SANITIZER + +TEST(FixedArrayTest, AbslHashValueWorks) { + using V = absl::FixedArray; + std::vector cases; + + // Generate a variety of vectors some of these are small enough for the inline + // space but are stored out of line. + for (int i = 0; i < 10; ++i) { + V v(i); + for (int j = 0; j < i; ++j) { + v[j] = j; + } + cases.push_back(v); + } + + EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(cases)); +} + +} // namespace diff --git a/absl/container/flat_hash_map.h b/absl/container/flat_hash_map.h new file mode 100644 index 0000000..735ee34 --- /dev/null +++ b/absl/container/flat_hash_map.h @@ -0,0 +1,687 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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. +// +// ----------------------------------------------------------------------------- +// File: flat_hash_map.h +// ----------------------------------------------------------------------------- +// +// An `absl::flat_hash_map` is an unordered associative container of +// unique keys and associated values designed to be a more efficient replacement +// for `std::unordered_map`. Like `unordered_map`, search, insertion, and +// deletion of map elements can be done as an `O(1)` operation. However, +// `flat_hash_map` (and other unordered associative containers known as the +// collection of Abseil "Swiss tables") contain other optimizations that result +// in both memory and computation advantages. +// +// In most cases, your default choice for a hash map should be a map of type +// `flat_hash_map`. +// +// `flat_hash_map` is not exception-safe. + +#ifndef ABSL_CONTAINER_FLAT_HASH_MAP_H_ +#define ABSL_CONTAINER_FLAT_HASH_MAP_H_ + +#include +#include +#include +#include + +#include "absl/algorithm/container.h" +#include "absl/base/attributes.h" +#include "absl/base/macros.h" +#include "absl/container/hash_container_defaults.h" +#include "absl/container/internal/container_memory.h" +#include "absl/container/internal/raw_hash_map.h" // IWYU pragma: export +#include "absl/meta/type_traits.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +template +struct FlatHashMapPolicy; +} // namespace container_internal + +// ----------------------------------------------------------------------------- +// absl::flat_hash_map +// ----------------------------------------------------------------------------- +// +// An `absl::flat_hash_map` is an unordered associative container which +// has been optimized for both speed and memory footprint in most common use +// cases. Its interface is similar to that of `std::unordered_map` with +// the following notable differences: +// +// * Requires keys that are CopyConstructible +// * Requires values that are MoveConstructible +// * Supports heterogeneous lookup, through `find()`, `operator[]()` and +// `insert()`, provided that the map is provided a compatible heterogeneous +// hashing function and equality operator. See below for details. +// * Invalidates any references and pointers to elements within the table after +// `rehash()` and when the table is moved. +// * Contains a `capacity()` member function indicating the number of element +// slots (open, deleted, and empty) within the hash map. +// * Returns `void` from the `erase(iterator)` overload. +// +// By default, `flat_hash_map` uses the `absl::Hash` hashing framework. +// All fundamental and Abseil types that support the `absl::Hash` framework have +// a compatible equality operator for comparing insertions into `flat_hash_map`. +// If your type is not yet supported by the `absl::Hash` framework, see +// absl/hash/hash.h for information on extending Abseil hashing to user-defined +// types. +// +// Using `absl::flat_hash_map` at interface boundaries in dynamically loaded +// libraries (e.g. .dll, .so) is unsupported due to way `absl::Hash` values may +// be randomized across dynamically loaded libraries. +// +// To achieve heterogeneous lookup for custom types either `Hash` and `Eq` type +// parameters can be used or `T` should have public inner types +// `absl_container_hash` and (optionally) `absl_container_eq`. In either case, +// `typename Hash::is_transparent` and `typename Eq::is_transparent` should be +// well-formed. Both types are basically functors: +// * `Hash` should support `size_t operator()(U val) const` that returns a hash +// for the given `val`. +// * `Eq` should support `bool operator()(U lhs, V rhs) const` that returns true +// if `lhs` is equal to `rhs`. +// +// In most cases `T` needs only to provide the `absl_container_hash`. In this +// case `std::equal_to` will be used instead of `eq` part. +// +// NOTE: A `flat_hash_map` stores its value types directly inside its +// implementation array to avoid memory indirection. Because a `flat_hash_map` +// is designed to move data when rehashed, map values will not retain pointer +// stability. If you require pointer stability, or if your values are large, +// consider using `absl::flat_hash_map>` instead. +// If your types are not moveable or you require pointer stability for keys, +// consider `absl::node_hash_map`. +// +// Example: +// +// // Create a flat hash map of three strings (that map to strings) +// absl::flat_hash_map ducks = +// {{"a", "huey"}, {"b", "dewey"}, {"c", "louie"}}; +// +// // Insert a new element into the flat hash map +// ducks.insert({"d", "donald"}); +// +// // Force a rehash of the flat hash map +// ducks.rehash(0); +// +// // Find the element with the key "b" +// std::string search_key = "b"; +// auto result = ducks.find(search_key); +// if (result != ducks.end()) { +// std::cout << "Result: " << result->second << std::endl; +// } +template , + class Eq = DefaultHashContainerEq, + class Allocator = std::allocator>> +class ABSL_ATTRIBUTE_OWNER flat_hash_map + : public absl::container_internal::raw_hash_map< + absl::container_internal::FlatHashMapPolicy, Hash, Eq, + Allocator> { + using Base = typename flat_hash_map::raw_hash_map; + + public: + // Constructors and Assignment Operators + // + // A flat_hash_map supports the same overload set as `std::unordered_map` + // for construction and assignment: + // + // * Default constructor + // + // // No allocation for the table's elements is made. + // absl::flat_hash_map map1; + // + // * Initializer List constructor + // + // absl::flat_hash_map map2 = + // {{1, "huey"}, {2, "dewey"}, {3, "louie"},}; + // + // * Copy constructor + // + // absl::flat_hash_map map3(map2); + // + // * Copy assignment operator + // + // // Hash functor and Comparator are copied as well + // absl::flat_hash_map map4; + // map4 = map3; + // + // * Move constructor + // + // // Move is guaranteed efficient + // absl::flat_hash_map map5(std::move(map4)); + // + // * Move assignment operator + // + // // May be efficient if allocators are compatible + // absl::flat_hash_map map6; + // map6 = std::move(map5); + // + // * Range constructor + // + // std::vector> v = {{1, "a"}, {2, "b"}}; + // absl::flat_hash_map map7(v.begin(), v.end()); + flat_hash_map() {} + using Base::Base; + + // flat_hash_map::begin() + // + // Returns an iterator to the beginning of the `flat_hash_map`. + using Base::begin; + + // flat_hash_map::cbegin() + // + // Returns a const iterator to the beginning of the `flat_hash_map`. + using Base::cbegin; + + // flat_hash_map::cend() + // + // Returns a const iterator to the end of the `flat_hash_map`. + using Base::cend; + + // flat_hash_map::end() + // + // Returns an iterator to the end of the `flat_hash_map`. + using Base::end; + + // flat_hash_map::capacity() + // + // Returns the number of element slots (assigned, deleted, and empty) + // available within the `flat_hash_map`. + // + // NOTE: this member function is particular to `absl::flat_hash_map` and is + // not provided in the `std::unordered_map` API. + using Base::capacity; + + // flat_hash_map::empty() + // + // Returns whether or not the `flat_hash_map` is empty. + using Base::empty; + + // flat_hash_map::max_size() + // + // Returns the largest theoretical possible number of elements within a + // `flat_hash_map` under current memory constraints. This value can be thought + // of the largest value of `std::distance(begin(), end())` for a + // `flat_hash_map`. + using Base::max_size; + + // flat_hash_map::size() + // + // Returns the number of elements currently within the `flat_hash_map`. + using Base::size; + + // flat_hash_map::clear() + // + // Removes all elements from the `flat_hash_map`. Invalidates any references, + // pointers, or iterators referring to contained elements. + // + // NOTE: this operation may shrink the underlying buffer. To avoid shrinking + // the underlying buffer call `erase(begin(), end())`. + using Base::clear; + + // flat_hash_map::erase() + // + // Erases elements within the `flat_hash_map`. Erasing does not trigger a + // rehash. Overloads are listed below. + // + // void erase(const_iterator pos): + // + // Erases the element at `position` of the `flat_hash_map`, returning + // `void`. + // + // NOTE: returning `void` in this case is different than that of STL + // containers in general and `std::unordered_map` in particular (which + // return an iterator to the element following the erased element). If that + // iterator is needed, simply post increment the iterator: + // + // map.erase(it++); + // + // iterator erase(const_iterator first, const_iterator last): + // + // Erases the elements in the open interval [`first`, `last`), returning an + // iterator pointing to `last`. The special case of calling + // `erase(begin(), end())` resets the reserved growth such that if + // `reserve(N)` has previously been called and there has been no intervening + // call to `clear()`, then after calling `erase(begin(), end())`, it is safe + // to assume that inserting N elements will not cause a rehash. + // + // size_type erase(const key_type& key): + // + // Erases the element with the matching key, if it exists, returning the + // number of elements erased (0 or 1). + using Base::erase; + + // flat_hash_map::insert() + // + // Inserts an element of the specified value into the `flat_hash_map`, + // returning an iterator pointing to the newly inserted element, provided that + // an element with the given key does not already exist. If rehashing occurs + // due to the insertion, all iterators are invalidated. Overloads are listed + // below. + // + // std::pair insert(const init_type& value): + // + // Inserts a value into the `flat_hash_map`. Returns a pair consisting of an + // iterator to the inserted element (or to the element that prevented the + // insertion) and a bool denoting whether the insertion took place. + // + // std::pair insert(T&& value): + // std::pair insert(init_type&& value): + // + // Inserts a moveable value into the `flat_hash_map`. Returns a pair + // consisting of an iterator to the inserted element (or to the element that + // prevented the insertion) and a bool denoting whether the insertion took + // place. + // + // iterator insert(const_iterator hint, const init_type& value): + // iterator insert(const_iterator hint, T&& value): + // iterator insert(const_iterator hint, init_type&& value); + // + // Inserts a value, using the position of `hint` as a non-binding suggestion + // for where to begin the insertion search. Returns an iterator to the + // inserted element, or to the existing element that prevented the + // insertion. + // + // void insert(InputIterator first, InputIterator last): + // + // Inserts a range of values [`first`, `last`). + // + // NOTE: Although the STL does not specify which element may be inserted if + // multiple keys compare equivalently, for `flat_hash_map` we guarantee the + // first match is inserted. + // + // void insert(std::initializer_list ilist): + // + // Inserts the elements within the initializer list `ilist`. + // + // NOTE: Although the STL does not specify which element may be inserted if + // multiple keys compare equivalently within the initializer list, for + // `flat_hash_map` we guarantee the first match is inserted. + using Base::insert; + + // flat_hash_map::insert_or_assign() + // + // Inserts an element of the specified value into the `flat_hash_map` provided + // that a value with the given key does not already exist, or replaces it with + // the element value if a key for that value already exists, returning an + // iterator pointing to the newly inserted element. If rehashing occurs due + // to the insertion, all existing iterators are invalidated. Overloads are + // listed below. + // + // pair insert_or_assign(const init_type& k, T&& obj): + // pair insert_or_assign(init_type&& k, T&& obj): + // + // Inserts/Assigns (or moves) the element of the specified key into the + // `flat_hash_map`. + // + // iterator insert_or_assign(const_iterator hint, + // const init_type& k, T&& obj): + // iterator insert_or_assign(const_iterator hint, init_type&& k, T&& obj): + // + // Inserts/Assigns (or moves) the element of the specified key into the + // `flat_hash_map` using the position of `hint` as a non-binding suggestion + // for where to begin the insertion search. + using Base::insert_or_assign; + + // flat_hash_map::emplace() + // + // Inserts an element of the specified value by constructing it in-place + // within the `flat_hash_map`, provided that no element with the given key + // already exists. + // + // The element may be constructed even if there already is an element with the + // key in the container, in which case the newly constructed element will be + // destroyed immediately. Prefer `try_emplace()` unless your key is not + // copyable or moveable. + // + // If rehashing occurs due to the insertion, all iterators are invalidated. + using Base::emplace; + + // flat_hash_map::emplace_hint() + // + // Inserts an element of the specified value by constructing it in-place + // within the `flat_hash_map`, using the position of `hint` as a non-binding + // suggestion for where to begin the insertion search, and only inserts + // provided that no element with the given key already exists. + // + // The element may be constructed even if there already is an element with the + // key in the container, in which case the newly constructed element will be + // destroyed immediately. Prefer `try_emplace()` unless your key is not + // copyable or moveable. + // + // If rehashing occurs due to the insertion, all iterators are invalidated. + using Base::emplace_hint; + + // flat_hash_map::try_emplace() + // + // Inserts an element of the specified value by constructing it in-place + // within the `flat_hash_map`, provided that no element with the given key + // already exists. Unlike `emplace()`, if an element with the given key + // already exists, we guarantee that no element is constructed. + // + // If rehashing occurs due to the insertion, all iterators are invalidated. + // Overloads are listed below. + // + // pair try_emplace(const key_type& k, Args&&... args): + // pair try_emplace(key_type&& k, Args&&... args): + // + // Inserts (via copy or move) the element of the specified key into the + // `flat_hash_map`. + // + // iterator try_emplace(const_iterator hint, + // const key_type& k, Args&&... args): + // iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args): + // + // Inserts (via copy or move) the element of the specified key into the + // `flat_hash_map` using the position of `hint` as a non-binding suggestion + // for where to begin the insertion search. + // + // All `try_emplace()` overloads make the same guarantees regarding rvalue + // arguments as `std::unordered_map::try_emplace()`, namely that these + // functions will not move from rvalue arguments if insertions do not happen. + using Base::try_emplace; + + // flat_hash_map::extract() + // + // Extracts the indicated element, erasing it in the process, and returns it + // as a C++17-compatible node handle. Overloads are listed below. + // + // node_type extract(const_iterator position): + // + // Extracts the key,value pair of the element at the indicated position and + // returns a node handle owning that extracted data. + // + // node_type extract(const key_type& x): + // + // Extracts the key,value pair of the element with a key matching the passed + // key value and returns a node handle owning that extracted data. If the + // `flat_hash_map` does not contain an element with a matching key, this + // function returns an empty node handle. + // + // NOTE: when compiled in an earlier version of C++ than C++17, + // `node_type::key()` returns a const reference to the key instead of a + // mutable reference. We cannot safely return a mutable reference without + // std::launder (which is not available before C++17). + using Base::extract; + + // flat_hash_map::merge() + // + // Extracts elements from a given `source` flat hash map into this + // `flat_hash_map`. If the destination `flat_hash_map` already contains an + // element with an equivalent key, that element is not extracted. + using Base::merge; + + // flat_hash_map::swap(flat_hash_map& other) + // + // Exchanges the contents of this `flat_hash_map` with those of the `other` + // flat hash map. + // + // All iterators and references on the `flat_hash_map` remain valid, excepting + // for the past-the-end iterator, which is invalidated. + // + // `swap()` requires that the flat hash map's hashing and key equivalence + // functions be Swappable, and are exchanged using unqualified calls to + // non-member `swap()`. If the map's allocator has + // `std::allocator_traits::propagate_on_container_swap::value` + // set to `true`, the allocators are also exchanged using an unqualified call + // to non-member `swap()`; otherwise, the allocators are not swapped. + using Base::swap; + + // flat_hash_map::rehash(count) + // + // Rehashes the `flat_hash_map`, setting the number of slots to be at least + // the passed value. If the new number of slots increases the load factor more + // than the current maximum load factor + // (`count` < `size()` / `max_load_factor()`), then the new number of slots + // will be at least `size()` / `max_load_factor()`. + // + // To force a rehash, pass rehash(0). + // + // NOTE: unlike behavior in `std::unordered_map`, references are also + // invalidated upon a `rehash()`. + using Base::rehash; + + // flat_hash_map::reserve(count) + // + // Sets the number of slots in the `flat_hash_map` to the number needed to + // accommodate at least `count` total elements without exceeding the current + // maximum load factor, and may rehash the container if needed. + using Base::reserve; + + // flat_hash_map::at() + // + // Returns a reference to the mapped value of the element with key equivalent + // to the passed key. + using Base::at; + + // flat_hash_map::contains() + // + // Determines whether an element with a key comparing equal to the given `key` + // exists within the `flat_hash_map`, returning `true` if so or `false` + // otherwise. + using Base::contains; + + // flat_hash_map::count(const Key& key) const + // + // Returns the number of elements with a key comparing equal to the given + // `key` within the `flat_hash_map`. note that this function will return + // either `1` or `0` since duplicate keys are not allowed within a + // `flat_hash_map`. + using Base::count; + + // flat_hash_map::equal_range() + // + // Returns a closed range [first, last], defined by a `std::pair` of two + // iterators, containing all elements with the passed key in the + // `flat_hash_map`. + using Base::equal_range; + + // flat_hash_map::find() + // + // Finds an element with the passed `key` within the `flat_hash_map`. + using Base::find; + + // flat_hash_map::operator[]() + // + // Returns a reference to the value mapped to the passed key within the + // `flat_hash_map`, performing an `insert()` if the key does not already + // exist. + // + // If an insertion occurs and results in a rehashing of the container, all + // iterators are invalidated. Otherwise iterators are not affected and + // references are not invalidated. Overloads are listed below. + // + // T& operator[](const Key& key): + // + // Inserts an init_type object constructed in-place if the element with the + // given key does not exist. + // + // T& operator[](Key&& key): + // + // Inserts an init_type object constructed in-place provided that an element + // with the given key does not exist. + using Base::operator[]; + + // flat_hash_map::bucket_count() + // + // Returns the number of "buckets" within the `flat_hash_map`. Note that + // because a flat hash map contains all elements within its internal storage, + // this value simply equals the current capacity of the `flat_hash_map`. + using Base::bucket_count; + + // flat_hash_map::load_factor() + // + // Returns the current load factor of the `flat_hash_map` (the average number + // of slots occupied with a value within the hash map). + using Base::load_factor; + + // flat_hash_map::max_load_factor() + // + // Manages the maximum load factor of the `flat_hash_map`. Overloads are + // listed below. + // + // float flat_hash_map::max_load_factor() + // + // Returns the current maximum load factor of the `flat_hash_map`. + // + // void flat_hash_map::max_load_factor(float ml) + // + // Sets the maximum load factor of the `flat_hash_map` to the passed value. + // + // NOTE: This overload is provided only for API compatibility with the STL; + // `flat_hash_map` will ignore any set load factor and manage its rehashing + // internally as an implementation detail. + using Base::max_load_factor; + + // flat_hash_map::get_allocator() + // + // Returns the allocator function associated with this `flat_hash_map`. + using Base::get_allocator; + + // flat_hash_map::hash_function() + // + // Returns the hashing function used to hash the keys within this + // `flat_hash_map`. + using Base::hash_function; + + // flat_hash_map::key_eq() + // + // Returns the function used for comparing keys equality. + using Base::key_eq; +}; + +// erase_if(flat_hash_map<>, Pred) +// +// Erases all elements that satisfy the predicate `pred` from the container `c`. +// Returns the number of erased elements. +template +typename flat_hash_map::size_type erase_if( + flat_hash_map& c, Predicate pred) { + return container_internal::EraseIf(pred, &c); +} + +// swap(flat_hash_map<>, flat_hash_map<>) +// +// Swaps the contents of two `flat_hash_map` containers. +// +// NOTE: we need to define this function template in order for +// `flat_hash_set::swap` to be called instead of `std::swap`. Even though we +// have `swap(raw_hash_set&, raw_hash_set&)` defined, that function requires a +// derived-to-base conversion, whereas `std::swap` is a function template so +// `std::swap` will be preferred by compiler. +template +void swap(flat_hash_map& x, + flat_hash_map& y) noexcept(noexcept(x.swap(y))) { + x.swap(y); +} + +namespace container_internal { + +// c_for_each_fast(flat_hash_map<>, Function) +// +// Container-based version of the `std::for_each()` function to +// apply a function to a container's elements. +// There is no guarantees on the order of the function calls. +// Erasure and/or insertion of elements in the function is not allowed. +template +decay_t c_for_each_fast(const flat_hash_map& c, + Function&& f) { + container_internal::ForEach(f, &c); + return f; +} +template +decay_t c_for_each_fast(flat_hash_map& c, + Function&& f) { + container_internal::ForEach(f, &c); + return f; +} +template +decay_t c_for_each_fast(flat_hash_map&& c, + Function&& f) { + container_internal::ForEach(f, &c); + return f; +} + +} // namespace container_internal + +namespace container_internal { + +template +struct FlatHashMapPolicy { + using slot_policy = container_internal::map_slot_policy; + using slot_type = typename slot_policy::slot_type; + using key_type = K; + using mapped_type = V; + using init_type = std::pair; + + template + static void construct(Allocator* alloc, slot_type* slot, Args&&... args) { + slot_policy::construct(alloc, slot, std::forward(args)...); + } + + // Returns std::true_type in case destroy is trivial. + template + static auto destroy(Allocator* alloc, slot_type* slot) { + return slot_policy::destroy(alloc, slot); + } + + template + static auto transfer(Allocator* alloc, slot_type* new_slot, + slot_type* old_slot) { + return slot_policy::transfer(alloc, new_slot, old_slot); + } + + template + static decltype(absl::container_internal::DecomposePair( + std::declval(), std::declval()...)) + apply(F&& f, Args&&... args) { + return absl::container_internal::DecomposePair(std::forward(f), + std::forward(args)...); + } + + template + static constexpr HashSlotFn get_hash_slot_fn() { + return memory_internal::IsLayoutCompatible::value + ? &TypeErasedApplyToSlotFn + : nullptr; + } + + static size_t space_used(const slot_type*) { return 0; } + + static std::pair& element(slot_type* slot) { return slot->value; } + + static V& value(std::pair* kv) { return kv->second; } + static const V& value(const std::pair* kv) { return kv->second; } +}; + +} // namespace container_internal + +namespace container_algorithm_internal { + +// Specialization of trait in absl/algorithm/container.h +template +struct IsUnorderedContainer< + absl::flat_hash_map> : std::true_type {}; + +} // namespace container_algorithm_internal + +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_FLAT_HASH_MAP_H_ diff --git a/absl/container/flat_hash_map_test.cc b/absl/container/flat_hash_map_test.cc new file mode 100644 index 0000000..08915e2 --- /dev/null +++ b/absl/container/flat_hash_map_test.cc @@ -0,0 +1,458 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/flat_hash_map.h" + +#include +#include +#include +#include +#include +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/config.h" +#include "absl/container/internal/hash_generator_testing.h" +#include "absl/container/internal/hash_policy_testing.h" +#include "absl/container/internal/test_allocator.h" +#include "absl/container/internal/unordered_map_constructor_test.h" +#include "absl/container/internal/unordered_map_lookup_test.h" +#include "absl/container/internal/unordered_map_members_test.h" +#include "absl/container/internal/unordered_map_modifiers_test.h" +#include "absl/log/check.h" +#include "absl/meta/type_traits.h" +#include "absl/types/any.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace { +using ::absl::container_internal::hash_internal::Enum; +using ::absl::container_internal::hash_internal::EnumClass; +using ::testing::_; +using ::testing::IsEmpty; +using ::testing::Pair; +using ::testing::UnorderedElementsAre; +using ::testing::UnorderedElementsAreArray; + +// Check that absl::flat_hash_map works in a global constructor. +struct BeforeMain { + BeforeMain() { + absl::flat_hash_map x; + x.insert({1, 1}); + CHECK(x.find(0) == x.end()) << "x should not contain 0"; + auto it = x.find(1); + CHECK(it != x.end()) << "x should contain 1"; + CHECK(it->second) << "1 should map to 1"; + } +}; +const BeforeMain before_main; + +template +using Map = flat_hash_map>>; + +static_assert(!std::is_standard_layout(), ""); + +using MapTypes = + ::testing::Types, Map, + Map, Map, + Map, Map>; + +INSTANTIATE_TYPED_TEST_SUITE_P(FlatHashMap, ConstructorTest, MapTypes); +INSTANTIATE_TYPED_TEST_SUITE_P(FlatHashMap, LookupTest, MapTypes); +INSTANTIATE_TYPED_TEST_SUITE_P(FlatHashMap, MembersTest, MapTypes); +INSTANTIATE_TYPED_TEST_SUITE_P(FlatHashMap, ModifiersTest, MapTypes); + +using UniquePtrMapTypes = ::testing::Types>>; + +INSTANTIATE_TYPED_TEST_SUITE_P(FlatHashMap, UniquePtrModifiersTest, + UniquePtrMapTypes); + +TEST(FlatHashMap, StandardLayout) { + struct Int { + explicit Int(size_t value) : value(value) {} + Int() : value(0) { ADD_FAILURE(); } + Int(const Int& other) : value(other.value) { ADD_FAILURE(); } + Int(Int&&) = default; + bool operator==(const Int& other) const { return value == other.value; } + size_t value; + }; + static_assert(std::is_standard_layout(), ""); + + struct Hash { + size_t operator()(const Int& obj) const { return obj.value; } + }; + + // Verify that neither the key nor the value get default-constructed or + // copy-constructed. + { + flat_hash_map m; + m.try_emplace(Int(1), Int(2)); + m.try_emplace(Int(3), Int(4)); + m.erase(Int(1)); + m.rehash(2 * m.bucket_count()); + } + { + flat_hash_map m; + m.try_emplace(Int(1), Int(2)); + m.try_emplace(Int(3), Int(4)); + m.erase(Int(1)); + m.clear(); + } +} + +TEST(FlatHashMap, Relocatability) { + static_assert(absl::is_trivially_relocatable::value, ""); + static_assert( + absl::is_trivially_relocatable>::value, ""); + static_assert( + std::is_same::transfer>(nullptr, + nullptr, + nullptr)), + std::true_type>::value, + ""); + + struct NonRelocatable { + NonRelocatable() = default; + NonRelocatable(NonRelocatable&&) {} + NonRelocatable& operator=(NonRelocatable&&) { return *this; } + void* self = nullptr; + }; + + EXPECT_FALSE(absl::is_trivially_relocatable::value); + EXPECT_TRUE( + (std::is_same:: + transfer>(nullptr, nullptr, + nullptr)), + std::false_type>::value)); +} + +// gcc becomes unhappy if this is inside the method, so pull it out here. +struct balast {}; + +TEST(FlatHashMap, IteratesMsan) { + // Because SwissTable randomizes on pointer addresses, we keep old tables + // around to ensure we don't reuse old memory. + std::vector> garbage; + for (int i = 0; i < 100; ++i) { + absl::flat_hash_map t; + for (int j = 0; j < 100; ++j) { + t[j]; + for (const auto& p : t) EXPECT_THAT(p, Pair(_, _)); + } + garbage.push_back(std::move(t)); + } +} + +// Demonstration of the "Lazy Key" pattern. This uses heterogeneous insert to +// avoid creating expensive key elements when the item is already present in the +// map. +struct LazyInt { + explicit LazyInt(size_t value, int* tracker) + : value(value), tracker(tracker) {} + + explicit operator size_t() const { + ++*tracker; + return value; + } + + size_t value; + int* tracker; +}; + +struct Hash { + using is_transparent = void; + int* tracker; + size_t operator()(size_t obj) const { + ++*tracker; + return obj; + } + size_t operator()(const LazyInt& obj) const { + ++*tracker; + return obj.value; + } +}; + +struct Eq { + using is_transparent = void; + bool operator()(size_t lhs, size_t rhs) const { return lhs == rhs; } + bool operator()(size_t lhs, const LazyInt& rhs) const { + return lhs == rhs.value; + } +}; + +TEST(FlatHashMap, LazyKeyPattern) { + // hashes are only guaranteed in opt mode, we use assertions to track internal + // state that can cause extra calls to hash. + int conversions = 0; + int hashes = 0; + flat_hash_map m(0, Hash{&hashes}); + m.reserve(3); + + m[LazyInt(1, &conversions)] = 1; + EXPECT_THAT(m, UnorderedElementsAre(Pair(1, 1))); + EXPECT_EQ(conversions, 1); +#ifdef NDEBUG + EXPECT_EQ(hashes, 1); +#endif + + m[LazyInt(1, &conversions)] = 2; + EXPECT_THAT(m, UnorderedElementsAre(Pair(1, 2))); + EXPECT_EQ(conversions, 1); +#ifdef NDEBUG + EXPECT_EQ(hashes, 2); +#endif + + m.try_emplace(LazyInt(2, &conversions), 3); + EXPECT_THAT(m, UnorderedElementsAre(Pair(1, 2), Pair(2, 3))); + EXPECT_EQ(conversions, 2); +#ifdef NDEBUG + EXPECT_EQ(hashes, 3); +#endif + + m.try_emplace(LazyInt(2, &conversions), 4); + EXPECT_THAT(m, UnorderedElementsAre(Pair(1, 2), Pair(2, 3))); + EXPECT_EQ(conversions, 2); +#ifdef NDEBUG + EXPECT_EQ(hashes, 4); +#endif +} + +TEST(FlatHashMap, BitfieldArgument) { + union { + int n : 1; + }; + n = 0; + flat_hash_map m; + m.erase(n); + m.count(n); + m.prefetch(n); + m.find(n); + m.contains(n); + m.equal_range(n); + m.insert_or_assign(n, n); + m.insert_or_assign(m.end(), n, n); + m.try_emplace(n); + m.try_emplace(m.end(), n); + m.at(n); + m[n]; +} + +TEST(FlatHashMap, MergeExtractInsert) { + // We can't test mutable keys, or non-copyable keys with flat_hash_map. + // Test that the nodes have the proper API. + absl::flat_hash_map m = {{1, 7}, {2, 9}}; + auto node = m.extract(1); + EXPECT_TRUE(node); + EXPECT_EQ(node.key(), 1); + EXPECT_EQ(node.mapped(), 7); + EXPECT_THAT(m, UnorderedElementsAre(Pair(2, 9))); + + node.mapped() = 17; + m.insert(std::move(node)); + EXPECT_THAT(m, UnorderedElementsAre(Pair(1, 17), Pair(2, 9))); +} + +bool FirstIsEven(std::pair p) { return p.first % 2 == 0; } + +TEST(FlatHashMap, EraseIf) { + // Erase all elements. + { + flat_hash_map s = {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}}; + EXPECT_EQ(erase_if(s, [](std::pair) { return true; }), 5); + EXPECT_THAT(s, IsEmpty()); + } + // Erase no elements. + { + flat_hash_map s = {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}}; + EXPECT_EQ(erase_if(s, [](std::pair) { return false; }), 0); + EXPECT_THAT(s, UnorderedElementsAre(Pair(1, 1), Pair(2, 2), Pair(3, 3), + Pair(4, 4), Pair(5, 5))); + } + // Erase specific elements. + { + flat_hash_map s = {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}}; + EXPECT_EQ(erase_if(s, + [](std::pair kvp) { + return kvp.first % 2 == 1; + }), + 3); + EXPECT_THAT(s, UnorderedElementsAre(Pair(2, 2), Pair(4, 4))); + } + // Predicate is function reference. + { + flat_hash_map s = {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}}; + EXPECT_EQ(erase_if(s, FirstIsEven), 2); + EXPECT_THAT(s, UnorderedElementsAre(Pair(1, 1), Pair(3, 3), Pair(5, 5))); + } + // Predicate is function pointer. + { + flat_hash_map s = {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}}; + EXPECT_EQ(erase_if(s, &FirstIsEven), 2); + EXPECT_THAT(s, UnorderedElementsAre(Pair(1, 1), Pair(3, 3), Pair(5, 5))); + } +} + +TEST(FlatHashMap, CForEach) { + flat_hash_map m; + std::vector> expected; + for (int i = 0; i < 100; ++i) { + { + SCOPED_TRACE("mutable object iteration"); + std::vector> v; + absl::container_internal::c_for_each_fast( + m, [&v](std::pair& p) { v.push_back(p); }); + EXPECT_THAT(v, UnorderedElementsAreArray(expected)); + } + { + SCOPED_TRACE("const object iteration"); + std::vector> v; + const flat_hash_map& cm = m; + absl::container_internal::c_for_each_fast( + cm, [&v](const std::pair& p) { v.push_back(p); }); + EXPECT_THAT(v, UnorderedElementsAreArray(expected)); + } + { + SCOPED_TRACE("const object iteration"); + std::vector> v; + absl::container_internal::c_for_each_fast( + flat_hash_map(m), + [&v](std::pair& p) { v.push_back(p); }); + EXPECT_THAT(v, UnorderedElementsAreArray(expected)); + } + m[i] = i; + expected.emplace_back(i, i); + } +} + +TEST(FlatHashMap, CForEachMutate) { + flat_hash_map s; + std::vector> expected; + for (int i = 0; i < 100; ++i) { + std::vector> v; + absl::container_internal::c_for_each_fast( + s, [&v](std::pair& p) { + v.push_back(p); + p.second++; + }); + EXPECT_THAT(v, UnorderedElementsAreArray(expected)); + for (auto& p : expected) { + p.second++; + } + EXPECT_THAT(s, UnorderedElementsAreArray(expected)); + s[i] = i; + expected.emplace_back(i, i); + } +} + +// This test requires std::launder for mutable key access in node handles. +#if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606 +TEST(FlatHashMap, NodeHandleMutableKeyAccess) { + flat_hash_map map; + + map["key1"] = "mapped"; + + auto nh = map.extract(map.begin()); + nh.key().resize(3); + map.insert(std::move(nh)); + + EXPECT_THAT(map, testing::ElementsAre(Pair("key", "mapped"))); +} +#endif + +TEST(FlatHashMap, Reserve) { + // Verify that if we reserve(size() + n) then we can perform n insertions + // without a rehash, i.e., without invalidating any references. + for (size_t trial = 0; trial < 20; ++trial) { + for (size_t initial = 3; initial < 100; ++initial) { + // Fill in `initial` entries, then erase 2 of them, then reserve space for + // two inserts and check for reference stability while doing the inserts. + flat_hash_map map; + for (size_t i = 0; i < initial; ++i) { + map[i] = i; + } + map.erase(0); + map.erase(1); + map.reserve(map.size() + 2); + size_t& a2 = map[2]; + // In the event of a failure, asan will complain in one of these two + // assignments. + map[initial] = a2; + map[initial + 1] = a2; + // Fail even when not under asan: + size_t& a2new = map[2]; + EXPECT_EQ(&a2, &a2new); + } + } +} + +TEST(FlatHashMap, RecursiveTypeCompiles) { + struct RecursiveType { + flat_hash_map m; + }; + RecursiveType t; + t.m[0] = RecursiveType{}; +} + +TEST(FlatHashMap, FlatHashMapPolicyDestroyReturnsTrue) { + EXPECT_TRUE( + (decltype(FlatHashMapPolicy::destroy>( + nullptr, nullptr))())); + EXPECT_FALSE( + (decltype(FlatHashMapPolicy::destroy>( + nullptr, nullptr))())); + EXPECT_FALSE((decltype(FlatHashMapPolicy>::destroy< + std::allocator>(nullptr, nullptr))())); +} + +struct InconsistentHashEqType { + InconsistentHashEqType(int v1, int v2) : v1(v1), v2(v2) {} + template + friend H AbslHashValue(H h, InconsistentHashEqType t) { + return H::combine(std::move(h), t.v1); + } + bool operator==(InconsistentHashEqType t) const { return v2 == t.v2; } + int v1, v2; +}; + +TEST(Iterator, InconsistentHashEqFunctorsValidation) { + if (!IsAssertEnabled()) GTEST_SKIP() << "Assertions not enabled."; + + absl::flat_hash_map m; + for (int i = 0; i < 10; ++i) m[{i, i}] = 1; + // We need to insert multiple times to guarantee that we get the assertion + // because it's possible for the hash to collide with the inserted element + // that has v2==0. In those cases, the new element won't be inserted. + auto insert_conflicting_elems = [&] { + for (int i = 100; i < 20000; ++i) { + EXPECT_EQ((m[{i, 0}]), 1); + } + }; + + const char* crash_message = "hash/eq functors are inconsistent."; +#if defined(__arm__) || defined(__aarch64__) + // On ARM, the crash message is garbled so don't expect a specific message. + crash_message = ""; +#endif + EXPECT_DEATH_IF_SUPPORTED(insert_conflicting_elems(), crash_message); +} + +} // namespace +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/flat_hash_set.h b/absl/container/flat_hash_set.h new file mode 100644 index 0000000..b5d0f7f --- /dev/null +++ b/absl/container/flat_hash_set.h @@ -0,0 +1,575 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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. +// +// ----------------------------------------------------------------------------- +// File: flat_hash_set.h +// ----------------------------------------------------------------------------- +// +// An `absl::flat_hash_set` is an unordered associative container designed to +// be a more efficient replacement for `std::unordered_set`. Like +// `unordered_set`, search, insertion, and deletion of set elements can be done +// as an `O(1)` operation. However, `flat_hash_set` (and other unordered +// associative containers known as the collection of Abseil "Swiss tables") +// contain other optimizations that result in both memory and computation +// advantages. +// +// In most cases, your default choice for a hash set should be a set of type +// `flat_hash_set`. +// +// `flat_hash_set` is not exception-safe. + +#ifndef ABSL_CONTAINER_FLAT_HASH_SET_H_ +#define ABSL_CONTAINER_FLAT_HASH_SET_H_ + +#include +#include +#include +#include + +#include "absl/algorithm/container.h" +#include "absl/base/attributes.h" +#include "absl/base/macros.h" +#include "absl/container/hash_container_defaults.h" +#include "absl/container/internal/container_memory.h" +#include "absl/container/internal/raw_hash_set.h" // IWYU pragma: export +#include "absl/memory/memory.h" +#include "absl/meta/type_traits.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +template +struct FlatHashSetPolicy; +} // namespace container_internal + +// ----------------------------------------------------------------------------- +// absl::flat_hash_set +// ----------------------------------------------------------------------------- +// +// An `absl::flat_hash_set` is an unordered associative container which has +// been optimized for both speed and memory footprint in most common use cases. +// Its interface is similar to that of `std::unordered_set` with the +// following notable differences: +// +// * Requires keys that are CopyConstructible +// * Supports heterogeneous lookup, through `find()` and `insert()`, provided +// that the set is provided a compatible heterogeneous hashing function and +// equality operator. See below for details. +// * Invalidates any references and pointers to elements within the table after +// `rehash()` and when the table is moved. +// * Contains a `capacity()` member function indicating the number of element +// slots (open, deleted, and empty) within the hash set. +// * Returns `void` from the `erase(iterator)` overload. +// +// By default, `flat_hash_set` uses the `absl::Hash` hashing framework. All +// fundamental and Abseil types that support the `absl::Hash` framework have a +// compatible equality operator for comparing insertions into `flat_hash_set`. +// If your type is not yet supported by the `absl::Hash` framework, see +// absl/hash/hash.h for information on extending Abseil hashing to user-defined +// types. +// +// Using `absl::flat_hash_set` at interface boundaries in dynamically loaded +// libraries (e.g. .dll, .so) is unsupported due to way `absl::Hash` values may +// be randomized across dynamically loaded libraries. +// +// To achieve heterogeneous lookup for custom types either `Hash` and `Eq` type +// parameters can be used or `T` should have public inner types +// `absl_container_hash` and (optionally) `absl_container_eq`. In either case, +// `typename Hash::is_transparent` and `typename Eq::is_transparent` should be +// well-formed. Both types are basically functors: +// * `Hash` should support `size_t operator()(U val) const` that returns a hash +// for the given `val`. +// * `Eq` should support `bool operator()(U lhs, V rhs) const` that returns true +// if `lhs` is equal to `rhs`. +// +// In most cases `T` needs only to provide the `absl_container_hash`. In this +// case `std::equal_to` will be used instead of `eq` part. +// +// NOTE: A `flat_hash_set` stores its keys directly inside its implementation +// array to avoid memory indirection. Because a `flat_hash_set` is designed to +// move data when rehashed, set keys will not retain pointer stability. If you +// require pointer stability, consider using +// `absl::flat_hash_set>`. If your type is not moveable and +// you require pointer stability, consider `absl::node_hash_set` instead. +// +// Example: +// +// // Create a flat hash set of three strings +// absl::flat_hash_set ducks = +// {"huey", "dewey", "louie"}; +// +// // Insert a new element into the flat hash set +// ducks.insert("donald"); +// +// // Force a rehash of the flat hash set +// ducks.rehash(0); +// +// // See if "dewey" is present +// if (ducks.contains("dewey")) { +// std::cout << "We found dewey!" << std::endl; +// } +template , + class Eq = DefaultHashContainerEq, + class Allocator = std::allocator> +class ABSL_ATTRIBUTE_OWNER flat_hash_set + : public absl::container_internal::raw_hash_set< + absl::container_internal::FlatHashSetPolicy, Hash, Eq, Allocator> { + using Base = typename flat_hash_set::raw_hash_set; + + public: + // Constructors and Assignment Operators + // + // A flat_hash_set supports the same overload set as `std::unordered_set` + // for construction and assignment: + // + // * Default constructor + // + // // No allocation for the table's elements is made. + // absl::flat_hash_set set1; + // + // * Initializer List constructor + // + // absl::flat_hash_set set2 = + // {{"huey"}, {"dewey"}, {"louie"},}; + // + // * Copy constructor + // + // absl::flat_hash_set set3(set2); + // + // * Copy assignment operator + // + // // Hash functor and Comparator are copied as well + // absl::flat_hash_set set4; + // set4 = set3; + // + // * Move constructor + // + // // Move is guaranteed efficient + // absl::flat_hash_set set5(std::move(set4)); + // + // * Move assignment operator + // + // // May be efficient if allocators are compatible + // absl::flat_hash_set set6; + // set6 = std::move(set5); + // + // * Range constructor + // + // std::vector v = {"a", "b"}; + // absl::flat_hash_set set7(v.begin(), v.end()); + flat_hash_set() {} + using Base::Base; + + // flat_hash_set::begin() + // + // Returns an iterator to the beginning of the `flat_hash_set`. + using Base::begin; + + // flat_hash_set::cbegin() + // + // Returns a const iterator to the beginning of the `flat_hash_set`. + using Base::cbegin; + + // flat_hash_set::cend() + // + // Returns a const iterator to the end of the `flat_hash_set`. + using Base::cend; + + // flat_hash_set::end() + // + // Returns an iterator to the end of the `flat_hash_set`. + using Base::end; + + // flat_hash_set::capacity() + // + // Returns the number of element slots (assigned, deleted, and empty) + // available within the `flat_hash_set`. + // + // NOTE: this member function is particular to `absl::flat_hash_set` and is + // not provided in the `std::unordered_set` API. + using Base::capacity; + + // flat_hash_set::empty() + // + // Returns whether or not the `flat_hash_set` is empty. + using Base::empty; + + // flat_hash_set::max_size() + // + // Returns the largest theoretical possible number of elements within a + // `flat_hash_set` under current memory constraints. This value can be thought + // of the largest value of `std::distance(begin(), end())` for a + // `flat_hash_set`. + using Base::max_size; + + // flat_hash_set::size() + // + // Returns the number of elements currently within the `flat_hash_set`. + using Base::size; + + // flat_hash_set::clear() + // + // Removes all elements from the `flat_hash_set`. Invalidates any references, + // pointers, or iterators referring to contained elements. + // + // NOTE: this operation may shrink the underlying buffer. To avoid shrinking + // the underlying buffer call `erase(begin(), end())`. + using Base::clear; + + // flat_hash_set::erase() + // + // Erases elements within the `flat_hash_set`. Erasing does not trigger a + // rehash. Overloads are listed below. + // + // void erase(const_iterator pos): + // + // Erases the element at `position` of the `flat_hash_set`, returning + // `void`. + // + // NOTE: returning `void` in this case is different than that of STL + // containers in general and `std::unordered_set` in particular (which + // return an iterator to the element following the erased element). If that + // iterator is needed, simply post increment the iterator: + // + // set.erase(it++); + // + // iterator erase(const_iterator first, const_iterator last): + // + // Erases the elements in the open interval [`first`, `last`), returning an + // iterator pointing to `last`. The special case of calling + // `erase(begin(), end())` resets the reserved growth such that if + // `reserve(N)` has previously been called and there has been no intervening + // call to `clear()`, then after calling `erase(begin(), end())`, it is safe + // to assume that inserting N elements will not cause a rehash. + // + // size_type erase(const key_type& key): + // + // Erases the element with the matching key, if it exists, returning the + // number of elements erased (0 or 1). + using Base::erase; + + // flat_hash_set::insert() + // + // Inserts an element of the specified value into the `flat_hash_set`, + // returning an iterator pointing to the newly inserted element, provided that + // an element with the given key does not already exist. If rehashing occurs + // due to the insertion, all iterators are invalidated. Overloads are listed + // below. + // + // std::pair insert(const T& value): + // + // Inserts a value into the `flat_hash_set`. Returns a pair consisting of an + // iterator to the inserted element (or to the element that prevented the + // insertion) and a bool denoting whether the insertion took place. + // + // std::pair insert(T&& value): + // + // Inserts a moveable value into the `flat_hash_set`. Returns a pair + // consisting of an iterator to the inserted element (or to the element that + // prevented the insertion) and a bool denoting whether the insertion took + // place. + // + // iterator insert(const_iterator hint, const T& value): + // iterator insert(const_iterator hint, T&& value): + // + // Inserts a value, using the position of `hint` as a non-binding suggestion + // for where to begin the insertion search. Returns an iterator to the + // inserted element, or to the existing element that prevented the + // insertion. + // + // void insert(InputIterator first, InputIterator last): + // + // Inserts a range of values [`first`, `last`). + // + // NOTE: Although the STL does not specify which element may be inserted if + // multiple keys compare equivalently, for `flat_hash_set` we guarantee the + // first match is inserted. + // + // void insert(std::initializer_list ilist): + // + // Inserts the elements within the initializer list `ilist`. + // + // NOTE: Although the STL does not specify which element may be inserted if + // multiple keys compare equivalently within the initializer list, for + // `flat_hash_set` we guarantee the first match is inserted. + using Base::insert; + + // flat_hash_set::emplace() + // + // Inserts an element of the specified value by constructing it in-place + // within the `flat_hash_set`, provided that no element with the given key + // already exists. + // + // The element may be constructed even if there already is an element with the + // key in the container, in which case the newly constructed element will be + // destroyed immediately. + // + // If rehashing occurs due to the insertion, all iterators are invalidated. + using Base::emplace; + + // flat_hash_set::emplace_hint() + // + // Inserts an element of the specified value by constructing it in-place + // within the `flat_hash_set`, using the position of `hint` as a non-binding + // suggestion for where to begin the insertion search, and only inserts + // provided that no element with the given key already exists. + // + // The element may be constructed even if there already is an element with the + // key in the container, in which case the newly constructed element will be + // destroyed immediately. + // + // If rehashing occurs due to the insertion, all iterators are invalidated. + using Base::emplace_hint; + + // flat_hash_set::extract() + // + // Extracts the indicated element, erasing it in the process, and returns it + // as a C++17-compatible node handle. Overloads are listed below. + // + // node_type extract(const_iterator position): + // + // Extracts the element at the indicated position and returns a node handle + // owning that extracted data. + // + // node_type extract(const key_type& x): + // + // Extracts the element with the key matching the passed key value and + // returns a node handle owning that extracted data. If the `flat_hash_set` + // does not contain an element with a matching key, this function returns an + // empty node handle. + using Base::extract; + + // flat_hash_set::merge() + // + // Extracts elements from a given `source` flat hash set into this + // `flat_hash_set`. If the destination `flat_hash_set` already contains an + // element with an equivalent key, that element is not extracted. + using Base::merge; + + // flat_hash_set::swap(flat_hash_set& other) + // + // Exchanges the contents of this `flat_hash_set` with those of the `other` + // flat hash set. + // + // All iterators and references on the `flat_hash_set` remain valid, excepting + // for the past-the-end iterator, which is invalidated. + // + // `swap()` requires that the flat hash set's hashing and key equivalence + // functions be Swappable, and are exchanged using unqualified calls to + // non-member `swap()`. If the set's allocator has + // `std::allocator_traits::propagate_on_container_swap::value` + // set to `true`, the allocators are also exchanged using an unqualified call + // to non-member `swap()`; otherwise, the allocators are not swapped. + using Base::swap; + + // flat_hash_set::rehash(count) + // + // Rehashes the `flat_hash_set`, setting the number of slots to be at least + // the passed value. If the new number of slots increases the load factor more + // than the current maximum load factor + // (`count` < `size()` / `max_load_factor()`), then the new number of slots + // will be at least `size()` / `max_load_factor()`. + // + // To force a rehash, pass rehash(0). + // + // NOTE: unlike behavior in `std::unordered_set`, references are also + // invalidated upon a `rehash()`. + using Base::rehash; + + // flat_hash_set::reserve(count) + // + // Sets the number of slots in the `flat_hash_set` to the number needed to + // accommodate at least `count` total elements without exceeding the current + // maximum load factor, and may rehash the container if needed. + using Base::reserve; + + // flat_hash_set::contains() + // + // Determines whether an element comparing equal to the given `key` exists + // within the `flat_hash_set`, returning `true` if so or `false` otherwise. + using Base::contains; + + // flat_hash_set::count(const Key& key) const + // + // Returns the number of elements comparing equal to the given `key` within + // the `flat_hash_set`. note that this function will return either `1` or `0` + // since duplicate elements are not allowed within a `flat_hash_set`. + using Base::count; + + // flat_hash_set::equal_range() + // + // Returns a closed range [first, last], defined by a `std::pair` of two + // iterators, containing all elements with the passed key in the + // `flat_hash_set`. + using Base::equal_range; + + // flat_hash_set::find() + // + // Finds an element with the passed `key` within the `flat_hash_set`. + using Base::find; + + // flat_hash_set::bucket_count() + // + // Returns the number of "buckets" within the `flat_hash_set`. Note that + // because a flat hash set contains all elements within its internal storage, + // this value simply equals the current capacity of the `flat_hash_set`. + using Base::bucket_count; + + // flat_hash_set::load_factor() + // + // Returns the current load factor of the `flat_hash_set` (the average number + // of slots occupied with a value within the hash set). + using Base::load_factor; + + // flat_hash_set::max_load_factor() + // + // Manages the maximum load factor of the `flat_hash_set`. Overloads are + // listed below. + // + // float flat_hash_set::max_load_factor() + // + // Returns the current maximum load factor of the `flat_hash_set`. + // + // void flat_hash_set::max_load_factor(float ml) + // + // Sets the maximum load factor of the `flat_hash_set` to the passed value. + // + // NOTE: This overload is provided only for API compatibility with the STL; + // `flat_hash_set` will ignore any set load factor and manage its rehashing + // internally as an implementation detail. + using Base::max_load_factor; + + // flat_hash_set::get_allocator() + // + // Returns the allocator function associated with this `flat_hash_set`. + using Base::get_allocator; + + // flat_hash_set::hash_function() + // + // Returns the hashing function used to hash the keys within this + // `flat_hash_set`. + using Base::hash_function; + + // flat_hash_set::key_eq() + // + // Returns the function used for comparing keys equality. + using Base::key_eq; +}; + +// erase_if(flat_hash_set<>, Pred) +// +// Erases all elements that satisfy the predicate `pred` from the container `c`. +// Returns the number of erased elements. +template +typename flat_hash_set::size_type erase_if( + flat_hash_set& c, Predicate pred) { + return container_internal::EraseIf(pred, &c); +} + +// swap(flat_hash_set<>, flat_hash_set<>) +// +// Swaps the contents of two `flat_hash_set` containers. +// +// NOTE: we need to define this function template in order for +// `flat_hash_set::swap` to be called instead of `std::swap`. Even though we +// have `swap(raw_hash_set&, raw_hash_set&)` defined, that function requires a +// derived-to-base conversion, whereas `std::swap` is a function template so +// `std::swap` will be preferred by compiler. +template +void swap(flat_hash_set& x, + flat_hash_set& y) noexcept(noexcept(x.swap(y))) { + return x.swap(y); +} + +namespace container_internal { + +// c_for_each_fast(flat_hash_set<>, Function) +// +// Container-based version of the `std::for_each()` function to +// apply a function to a container's elements. +// There is no guarantees on the order of the function calls. +// Erasure and/or insertion of elements in the function is not allowed. +template +decay_t c_for_each_fast(const flat_hash_set& c, + Function&& f) { + container_internal::ForEach(f, &c); + return f; +} +template +decay_t c_for_each_fast(flat_hash_set& c, Function&& f) { + container_internal::ForEach(f, &c); + return f; +} +template +decay_t c_for_each_fast(flat_hash_set&& c, Function&& f) { + container_internal::ForEach(f, &c); + return f; +} + +} // namespace container_internal + +namespace container_internal { + +template +struct FlatHashSetPolicy { + using slot_type = T; + using key_type = T; + using init_type = T; + using constant_iterators = std::true_type; + + template + static void construct(Allocator* alloc, slot_type* slot, Args&&... args) { + absl::allocator_traits::construct(*alloc, slot, + std::forward(args)...); + } + + // Return std::true_type in case destroy is trivial. + template + static auto destroy(Allocator* alloc, slot_type* slot) { + absl::allocator_traits::destroy(*alloc, slot); + return IsDestructionTrivial(); + } + + static T& element(slot_type* slot) { return *slot; } + + template + static decltype(absl::container_internal::DecomposeValue( + std::declval(), std::declval()...)) + apply(F&& f, Args&&... args) { + return absl::container_internal::DecomposeValue( + std::forward(f), std::forward(args)...); + } + + static size_t space_used(const T*) { return 0; } + + template + static constexpr HashSlotFn get_hash_slot_fn() { + return &TypeErasedApplyToSlotFn; + } +}; +} // namespace container_internal + +namespace container_algorithm_internal { + +// Specialization of trait in absl/algorithm/container.h +template +struct IsUnorderedContainer> + : std::true_type {}; + +} // namespace container_algorithm_internal + +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_FLAT_HASH_SET_H_ diff --git a/absl/container/flat_hash_set_test.cc b/absl/container/flat_hash_set_test.cc new file mode 100644 index 0000000..68ea7a0 --- /dev/null +++ b/absl/container/flat_hash_set_test.cc @@ -0,0 +1,357 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/flat_hash_set.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/config.h" +#include "absl/container/hash_container_defaults.h" +#include "absl/container/internal/container_memory.h" +#include "absl/container/internal/hash_generator_testing.h" +#include "absl/container/internal/test_allocator.h" +#include "absl/container/internal/unordered_set_constructor_test.h" +#include "absl/container/internal/unordered_set_lookup_test.h" +#include "absl/container/internal/unordered_set_members_test.h" +#include "absl/container/internal/unordered_set_modifiers_test.h" +#include "absl/hash/hash.h" +#include "absl/log/check.h" +#include "absl/memory/memory.h" +#include "absl/strings/string_view.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace { + +using ::absl::container_internal::hash_internal::Enum; +using ::absl::container_internal::hash_internal::EnumClass; +using ::testing::IsEmpty; +using ::testing::Pointee; +using ::testing::UnorderedElementsAre; +using ::testing::UnorderedElementsAreArray; + +// Check that absl::flat_hash_set works in a global constructor. +struct BeforeMain { + BeforeMain() { + absl::flat_hash_set x; + x.insert(1); + CHECK(!x.contains(0)) << "x should not contain 0"; + CHECK(x.contains(1)) << "x should contain 1"; + } +}; +const BeforeMain before_main; + +template +using Set = + absl::flat_hash_set>; + +using SetTypes = + ::testing::Types, Set, Set, Set>; + +INSTANTIATE_TYPED_TEST_SUITE_P(FlatHashSet, ConstructorTest, SetTypes); +INSTANTIATE_TYPED_TEST_SUITE_P(FlatHashSet, LookupTest, SetTypes); +INSTANTIATE_TYPED_TEST_SUITE_P(FlatHashSet, MembersTest, SetTypes); +INSTANTIATE_TYPED_TEST_SUITE_P(FlatHashSet, ModifiersTest, SetTypes); + +TEST(FlatHashSet, EmplaceString) { + std::vector v = {"a", "b"}; + absl::flat_hash_set hs(v.begin(), v.end()); + EXPECT_THAT(hs, UnorderedElementsAreArray(v)); +} + +TEST(FlatHashSet, BitfieldArgument) { + union { + int n : 1; + }; + n = 0; + absl::flat_hash_set s = {n}; + s.insert(n); + s.insert(s.end(), n); + s.insert({n}); + s.erase(n); + s.count(n); + s.prefetch(n); + s.find(n); + s.contains(n); + s.equal_range(n); +} + +TEST(FlatHashSet, MergeExtractInsert) { + struct Hash { + size_t operator()(const std::unique_ptr& p) const { return *p; } + }; + struct Eq { + bool operator()(const std::unique_ptr& a, + const std::unique_ptr& b) const { + return *a == *b; + } + }; + absl::flat_hash_set, Hash, Eq> set1, set2; + set1.insert(absl::make_unique(7)); + set1.insert(absl::make_unique(17)); + + set2.insert(absl::make_unique(7)); + set2.insert(absl::make_unique(19)); + + EXPECT_THAT(set1, UnorderedElementsAre(Pointee(7), Pointee(17))); + EXPECT_THAT(set2, UnorderedElementsAre(Pointee(7), Pointee(19))); + + set1.merge(set2); + + EXPECT_THAT(set1, UnorderedElementsAre(Pointee(7), Pointee(17), Pointee(19))); + EXPECT_THAT(set2, UnorderedElementsAre(Pointee(7))); + + auto node = set1.extract(absl::make_unique(7)); + EXPECT_TRUE(node); + EXPECT_THAT(node.value(), Pointee(7)); + EXPECT_THAT(set1, UnorderedElementsAre(Pointee(17), Pointee(19))); + + auto insert_result = set2.insert(std::move(node)); + EXPECT_FALSE(node); + EXPECT_FALSE(insert_result.inserted); + EXPECT_TRUE(insert_result.node); + EXPECT_THAT(insert_result.node.value(), Pointee(7)); + EXPECT_EQ(**insert_result.position, 7); + EXPECT_NE(insert_result.position->get(), insert_result.node.value().get()); + EXPECT_THAT(set2, UnorderedElementsAre(Pointee(7))); + + node = set1.extract(absl::make_unique(17)); + EXPECT_TRUE(node); + EXPECT_THAT(node.value(), Pointee(17)); + EXPECT_THAT(set1, UnorderedElementsAre(Pointee(19))); + + node.value() = absl::make_unique(23); + + insert_result = set2.insert(std::move(node)); + EXPECT_FALSE(node); + EXPECT_TRUE(insert_result.inserted); + EXPECT_FALSE(insert_result.node); + EXPECT_EQ(**insert_result.position, 23); + EXPECT_THAT(set2, UnorderedElementsAre(Pointee(7), Pointee(23))); +} + +bool IsEven(int k) { return k % 2 == 0; } + +TEST(FlatHashSet, EraseIf) { + // Erase all elements. + { + flat_hash_set s = {1, 2, 3, 4, 5}; + EXPECT_EQ(erase_if(s, [](int) { return true; }), 5); + EXPECT_THAT(s, IsEmpty()); + } + // Erase no elements. + { + flat_hash_set s = {1, 2, 3, 4, 5}; + EXPECT_EQ(erase_if(s, [](int) { return false; }), 0); + EXPECT_THAT(s, UnorderedElementsAre(1, 2, 3, 4, 5)); + } + // Erase specific elements. + { + flat_hash_set s = {1, 2, 3, 4, 5}; + EXPECT_EQ(erase_if(s, [](int k) { return k % 2 == 1; }), 3); + EXPECT_THAT(s, UnorderedElementsAre(2, 4)); + } + // Predicate is function reference. + { + flat_hash_set s = {1, 2, 3, 4, 5}; + EXPECT_EQ(erase_if(s, IsEven), 2); + EXPECT_THAT(s, UnorderedElementsAre(1, 3, 5)); + } + // Predicate is function pointer. + { + flat_hash_set s = {1, 2, 3, 4, 5}; + EXPECT_EQ(erase_if(s, &IsEven), 2); + EXPECT_THAT(s, UnorderedElementsAre(1, 3, 5)); + } +} + +TEST(FlatHashSet, CForEach) { + using ValueType = std::pair; + flat_hash_set s; + std::vector expected; + for (int i = 0; i < 100; ++i) { + { + SCOPED_TRACE("mutable object iteration"); + std::vector v; + absl::container_internal::c_for_each_fast( + s, [&v](const ValueType& p) { v.push_back(p); }); + ASSERT_THAT(v, UnorderedElementsAreArray(expected)); + } + { + SCOPED_TRACE("const object iteration"); + std::vector v; + const flat_hash_set& cs = s; + absl::container_internal::c_for_each_fast( + cs, [&v](const ValueType& p) { v.push_back(p); }); + ASSERT_THAT(v, UnorderedElementsAreArray(expected)); + } + { + SCOPED_TRACE("temporary object iteration"); + std::vector v; + absl::container_internal::c_for_each_fast( + flat_hash_set(s), + [&v](const ValueType& p) { v.push_back(p); }); + ASSERT_THAT(v, UnorderedElementsAreArray(expected)); + } + s.emplace(i, i); + expected.emplace_back(i, i); + } +} + +class PoisonSoo { + int64_t data_; + + public: + explicit PoisonSoo(int64_t d) : data_(d) { SanitizerPoisonObject(&data_); } + PoisonSoo(const PoisonSoo& that) : PoisonSoo(*that) {} + ~PoisonSoo() { SanitizerUnpoisonObject(&data_); } + + int64_t operator*() const { + SanitizerUnpoisonObject(&data_); + const int64_t ret = data_; + SanitizerPoisonObject(&data_); + return ret; + } + template + friend H AbslHashValue(H h, const PoisonSoo& pi) { + return H::combine(std::move(h), *pi); + } + bool operator==(const PoisonSoo& rhs) const { return **this == *rhs; } +}; + +TEST(FlatHashSet, PoisonSooBasic) { + PoisonSoo a(0), b(1); + flat_hash_set set; + set.insert(a); + EXPECT_THAT(set, UnorderedElementsAre(a)); + set.insert(b); + EXPECT_THAT(set, UnorderedElementsAre(a, b)); + set.erase(a); + EXPECT_THAT(set, UnorderedElementsAre(b)); + set.rehash(0); // Shrink to SOO. + EXPECT_THAT(set, UnorderedElementsAre(b)); +} + +TEST(FlatHashSet, PoisonSooMoveConstructSooToSoo) { + PoisonSoo a(0); + flat_hash_set set; + set.insert(a); + flat_hash_set set2(std::move(set)); + EXPECT_THAT(set2, UnorderedElementsAre(a)); +} + +TEST(FlatHashSet, PoisonSooAllocMoveConstructSooToSoo) { + PoisonSoo a(0); + flat_hash_set set; + set.insert(a); + flat_hash_set set2(std::move(set), std::allocator()); + EXPECT_THAT(set2, UnorderedElementsAre(a)); +} + +TEST(FlatHashSet, PoisonSooMoveAssignFullSooToEmptySoo) { + PoisonSoo a(0); + flat_hash_set set, set2; + set.insert(a); + set2 = std::move(set); + EXPECT_THAT(set2, UnorderedElementsAre(a)); +} + +TEST(FlatHashSet, PoisonSooMoveAssignFullSooToFullSoo) { + PoisonSoo a(0), b(1); + flat_hash_set set, set2; + set.insert(a); + set2.insert(b); + set2 = std::move(set); + EXPECT_THAT(set2, UnorderedElementsAre(a)); +} + +TEST(FlatHashSet, FlatHashSetPolicyDestroyReturnsTrue) { + EXPECT_TRUE((decltype(FlatHashSetPolicy::destroy>( + nullptr, nullptr))())); + EXPECT_FALSE( + (decltype(FlatHashSetPolicy::destroy>( + nullptr, nullptr))())); + EXPECT_FALSE((decltype(FlatHashSetPolicy>::destroy< + std::allocator>(nullptr, nullptr))())); +} + +struct HashEqInvalidOnMove { + HashEqInvalidOnMove() = default; + HashEqInvalidOnMove(const HashEqInvalidOnMove& rhs) = default; + HashEqInvalidOnMove(HashEqInvalidOnMove&& rhs) { rhs.moved = true; } + HashEqInvalidOnMove& operator=(const HashEqInvalidOnMove& rhs) = default; + HashEqInvalidOnMove& operator=(HashEqInvalidOnMove&& rhs) { + rhs.moved = true; + return *this; + } + + size_t operator()(int x) const { + CHECK(!moved); + return absl::HashOf(x); + } + + bool operator()(int x, int y) const { + CHECK(!moved); + return x == y; + } + + bool moved = false; +}; + +TEST(FlatHashSet, MovedFromCleared_HashMustBeValid) { + flat_hash_set s1, s2; + // Moving the hashtable must not move the hasher because we need to support + // this behavior. + s2 = std::move(s1); + s1.clear(); + s1.insert(2); + EXPECT_THAT(s1, UnorderedElementsAre(2)); +} + +TEST(FlatHashSet, MovedFromCleared_EqMustBeValid) { + flat_hash_set, HashEqInvalidOnMove> s1, s2; + // Moving the hashtable must not move the equality functor because we need to + // support this behavior. + s2 = std::move(s1); + s1.clear(); + s1.insert(2); + EXPECT_THAT(s1, UnorderedElementsAre(2)); +} + +TEST(FlatHashSet, Equality) { + { + flat_hash_set s1 = {1, 2, 3}; + flat_hash_set s2 = {1, 2, 3}; + EXPECT_EQ(s1, s2); + } + { + flat_hash_set s1 = {"a", "b", "c"}; + flat_hash_set s2 = {"a", "b", "c"}; + EXPECT_EQ(s1, s2); + } +} + +} // namespace +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/hash_container_defaults.h b/absl/container/hash_container_defaults.h new file mode 100644 index 0000000..eb944a7 --- /dev/null +++ b/absl/container/hash_container_defaults.h @@ -0,0 +1,45 @@ +// Copyright 2024 The Abseil Authors +// +// 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 +// +// https://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 ABSL_CONTAINER_HASH_CONTAINER_DEFAULTS_H_ +#define ABSL_CONTAINER_HASH_CONTAINER_DEFAULTS_H_ + +#include "absl/base/config.h" +#include "absl/container/internal/hash_function_defaults.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN + +// DefaultHashContainerHash is a convenience alias for the functor that is used +// by default by Abseil hash-based (unordered) containers for hashing when +// `Hash` type argument is not explicitly specified. +// +// This type alias can be used by generic code that wants to provide more +// flexibility for defining underlying containers. +template +using DefaultHashContainerHash = absl::container_internal::hash_default_hash; + +// DefaultHashContainerEq is a convenience alias for the functor that is used by +// default by Abseil hash-based (unordered) containers for equality check when +// `Eq` type argument is not explicitly specified. +// +// This type alias can be used by generic code that wants to provide more +// flexibility for defining underlying containers. +template +using DefaultHashContainerEq = absl::container_internal::hash_default_eq; + +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_HASH_CONTAINER_DEFAULTS_H_ diff --git a/absl/container/inlined_vector.h b/absl/container/inlined_vector.h new file mode 100644 index 0000000..cbf8bc2 --- /dev/null +++ b/absl/container/inlined_vector.h @@ -0,0 +1,1016 @@ +// Copyright 2019 The Abseil Authors. +// +// 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 +// +// https://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. +// +// ----------------------------------------------------------------------------- +// File: inlined_vector.h +// ----------------------------------------------------------------------------- +// +// This header file contains the declaration and definition of an "inlined +// vector" which behaves in an equivalent fashion to a `std::vector`, except +// that storage for small sequences of the vector are provided inline without +// requiring any heap allocation. +// +// An `absl::InlinedVector` specifies the default capacity `N` as one of +// its template parameters. Instances where `size() <= N` hold contained +// elements in inline space. Typically `N` is very small so that sequences that +// are expected to be short do not require allocations. +// +// An `absl::InlinedVector` does not usually require a specific allocator. If +// the inlined vector grows beyond its initial constraints, it will need to +// allocate (as any normal `std::vector` would). This is usually performed with +// the default allocator (defined as `std::allocator`). Optionally, a custom +// allocator type may be specified as `A` in `absl::InlinedVector`. + +#ifndef ABSL_CONTAINER_INLINED_VECTOR_H_ +#define ABSL_CONTAINER_INLINED_VECTOR_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "absl/algorithm/algorithm.h" +#include "absl/base/attributes.h" +#include "absl/base/internal/throw_delegate.h" +#include "absl/base/macros.h" +#include "absl/base/optimization.h" +#include "absl/base/port.h" +#include "absl/container/internal/inlined_vector.h" +#include "absl/memory/memory.h" +#include "absl/meta/type_traits.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +// ----------------------------------------------------------------------------- +// InlinedVector +// ----------------------------------------------------------------------------- +// +// An `absl::InlinedVector` is designed to be a drop-in replacement for +// `std::vector` for use cases where the vector's size is sufficiently small +// that it can be inlined. If the inlined vector does grow beyond its estimated +// capacity, it will trigger an initial allocation on the heap, and will behave +// as a `std::vector`. The API of the `absl::InlinedVector` within this file is +// designed to cover the same API footprint as covered by `std::vector`. +template > +class ABSL_ATTRIBUTE_WARN_UNUSED InlinedVector { + static_assert(N > 0, "`absl::InlinedVector` requires an inlined capacity."); + + using Storage = inlined_vector_internal::Storage; + + template + using AllocatorTraits = inlined_vector_internal::AllocatorTraits; + template + using MoveIterator = inlined_vector_internal::MoveIterator; + template + using IsMoveAssignOk = inlined_vector_internal::IsMoveAssignOk; + + template + using IteratorValueAdapter = + inlined_vector_internal::IteratorValueAdapter; + template + using CopyValueAdapter = inlined_vector_internal::CopyValueAdapter; + template + using DefaultValueAdapter = + inlined_vector_internal::DefaultValueAdapter; + + template + using EnableIfAtLeastForwardIterator = absl::enable_if_t< + inlined_vector_internal::IsAtLeastForwardIterator::value, int>; + template + using DisableIfAtLeastForwardIterator = absl::enable_if_t< + !inlined_vector_internal::IsAtLeastForwardIterator::value, int>; + + using MemcpyPolicy = typename Storage::MemcpyPolicy; + using ElementwiseAssignPolicy = typename Storage::ElementwiseAssignPolicy; + using ElementwiseConstructPolicy = + typename Storage::ElementwiseConstructPolicy; + using MoveAssignmentPolicy = typename Storage::MoveAssignmentPolicy; + + public: + using allocator_type = A; + using value_type = inlined_vector_internal::ValueType; + using pointer = inlined_vector_internal::Pointer; + using const_pointer = inlined_vector_internal::ConstPointer; + using size_type = inlined_vector_internal::SizeType; + using difference_type = inlined_vector_internal::DifferenceType; + using reference = inlined_vector_internal::Reference; + using const_reference = inlined_vector_internal::ConstReference; + using iterator = inlined_vector_internal::Iterator; + using const_iterator = inlined_vector_internal::ConstIterator; + using reverse_iterator = inlined_vector_internal::ReverseIterator; + using const_reverse_iterator = + inlined_vector_internal::ConstReverseIterator; + + // --------------------------------------------------------------------------- + // InlinedVector Constructors and Destructor + // --------------------------------------------------------------------------- + + // Creates an empty inlined vector with a value-initialized allocator. + InlinedVector() noexcept(noexcept(allocator_type())) : storage_() {} + + // Creates an empty inlined vector with a copy of `allocator`. + explicit InlinedVector(const allocator_type& allocator) noexcept + : storage_(allocator) {} + + // Creates an inlined vector with `n` copies of `value_type()`. + explicit InlinedVector(size_type n, + const allocator_type& allocator = allocator_type()) + : storage_(allocator) { + storage_.Initialize(DefaultValueAdapter(), n); + } + + // Creates an inlined vector with `n` copies of `v`. + InlinedVector(size_type n, const_reference v, + const allocator_type& allocator = allocator_type()) + : storage_(allocator) { + storage_.Initialize(CopyValueAdapter(std::addressof(v)), n); + } + + // Creates an inlined vector with copies of the elements of `list`. + InlinedVector(std::initializer_list list, + const allocator_type& allocator = allocator_type()) + : InlinedVector(list.begin(), list.end(), allocator) {} + + // Creates an inlined vector with elements constructed from the provided + // forward iterator range [`first`, `last`). + // + // NOTE: the `enable_if` prevents ambiguous interpretation between a call to + // this constructor with two integral arguments and a call to the above + // `InlinedVector(size_type, const_reference)` constructor. + template = 0> + InlinedVector(ForwardIterator first, ForwardIterator last, + const allocator_type& allocator = allocator_type()) + : storage_(allocator) { + storage_.Initialize(IteratorValueAdapter(first), + static_cast(std::distance(first, last))); + } + + // Creates an inlined vector with elements constructed from the provided input + // iterator range [`first`, `last`). + template = 0> + InlinedVector(InputIterator first, InputIterator last, + const allocator_type& allocator = allocator_type()) + : storage_(allocator) { + std::copy(first, last, std::back_inserter(*this)); + } + + // Creates an inlined vector by copying the contents of `other` using + // `other`'s allocator. + InlinedVector(const InlinedVector& other) + : InlinedVector(other, other.storage_.GetAllocator()) {} + + // Creates an inlined vector by copying the contents of `other` using the + // provided `allocator`. + InlinedVector(const InlinedVector& other, const allocator_type& allocator) + : storage_(allocator) { + // Fast path: if the other vector is empty, there's nothing for us to do. + if (other.empty()) { + return; + } + + // Fast path: if the value type is trivially copy constructible, we know the + // allocator doesn't do anything fancy, and there is nothing on the heap + // then we know it is legal for us to simply memcpy the other vector's + // inlined bytes to form our copy of its elements. + if (absl::is_trivially_copy_constructible::value && + std::is_same>::value && + !other.storage_.GetIsAllocated()) { + storage_.MemcpyFrom(other.storage_); + return; + } + + storage_.InitFrom(other.storage_); + } + + // Creates an inlined vector by moving in the contents of `other` without + // allocating. If `other` contains allocated memory, the newly-created inlined + // vector will take ownership of that memory. However, if `other` does not + // contain allocated memory, the newly-created inlined vector will perform + // element-wise move construction of the contents of `other`. + // + // NOTE: since no allocation is performed for the inlined vector in either + // case, the `noexcept(...)` specification depends on whether moving the + // underlying objects can throw. It is assumed assumed that... + // a) move constructors should only throw due to allocation failure. + // b) if `value_type`'s move constructor allocates, it uses the same + // allocation function as the inlined vector's allocator. + // Thus, the move constructor is non-throwing if the allocator is non-throwing + // or `value_type`'s move constructor is specified as `noexcept`. + InlinedVector(InlinedVector&& other) noexcept( + absl::allocator_is_nothrow::value || + std::is_nothrow_move_constructible::value) + : storage_(other.storage_.GetAllocator()) { + // Fast path: if the value type can be trivially relocated (i.e. moved from + // and destroyed), and we know the allocator doesn't do anything fancy, then + // it's safe for us to simply adopt the contents of the storage for `other` + // and remove its own reference to them. It's as if we had individually + // move-constructed each value and then destroyed the original. + if (absl::is_trivially_relocatable::value && + std::is_same>::value) { + storage_.MemcpyFrom(other.storage_); + other.storage_.SetInlinedSize(0); + return; + } + + // Fast path: if the other vector is on the heap, we can simply take over + // its allocation. + if (other.storage_.GetIsAllocated()) { + storage_.SetAllocation({other.storage_.GetAllocatedData(), + other.storage_.GetAllocatedCapacity()}); + storage_.SetAllocatedSize(other.storage_.GetSize()); + + other.storage_.SetInlinedSize(0); + return; + } + + // Otherwise we must move each element individually. + IteratorValueAdapter> other_values( + MoveIterator(other.storage_.GetInlinedData())); + + inlined_vector_internal::ConstructElements( + storage_.GetAllocator(), storage_.GetInlinedData(), other_values, + other.storage_.GetSize()); + + storage_.SetInlinedSize(other.storage_.GetSize()); + } + + // Creates an inlined vector by moving in the contents of `other` with a copy + // of `allocator`. + // + // NOTE: if `other`'s allocator is not equal to `allocator`, even if `other` + // contains allocated memory, this move constructor will still allocate. Since + // allocation is performed, this constructor can only be `noexcept` if the + // specified allocator is also `noexcept`. + InlinedVector( + InlinedVector&& other, + const allocator_type& + allocator) noexcept(absl::allocator_is_nothrow::value) + : storage_(allocator) { + // Fast path: if the value type can be trivially relocated (i.e. moved from + // and destroyed), and we know the allocator doesn't do anything fancy, then + // it's safe for us to simply adopt the contents of the storage for `other` + // and remove its own reference to them. It's as if we had individually + // move-constructed each value and then destroyed the original. + if (absl::is_trivially_relocatable::value && + std::is_same>::value) { + storage_.MemcpyFrom(other.storage_); + other.storage_.SetInlinedSize(0); + return; + } + + // Fast path: if the other vector is on the heap and shared the same + // allocator, we can simply take over its allocation. + if ((storage_.GetAllocator() == other.storage_.GetAllocator()) && + other.storage_.GetIsAllocated()) { + storage_.SetAllocation({other.storage_.GetAllocatedData(), + other.storage_.GetAllocatedCapacity()}); + storage_.SetAllocatedSize(other.storage_.GetSize()); + + other.storage_.SetInlinedSize(0); + return; + } + + // Otherwise we must move each element individually. + storage_.Initialize( + IteratorValueAdapter>(MoveIterator(other.data())), + other.size()); + } + + ~InlinedVector() {} + + // --------------------------------------------------------------------------- + // InlinedVector Member Accessors + // --------------------------------------------------------------------------- + + // `InlinedVector::empty()` + // + // Returns whether the inlined vector contains no elements. + bool empty() const noexcept { return !size(); } + + // `InlinedVector::size()` + // + // Returns the number of elements in the inlined vector. + size_type size() const noexcept { return storage_.GetSize(); } + + // `InlinedVector::max_size()` + // + // Returns the maximum number of elements the inlined vector can hold. + size_type max_size() const noexcept { + // One bit of the size storage is used to indicate whether the inlined + // vector contains allocated memory. As a result, the maximum size that the + // inlined vector can express is the minimum of the limit of how many + // objects we can allocate and std::numeric_limits::max() / 2. + return (std::min)(AllocatorTraits::max_size(storage_.GetAllocator()), + (std::numeric_limits::max)() / 2); + } + + // `InlinedVector::capacity()` + // + // Returns the number of elements that could be stored in the inlined vector + // without requiring a reallocation. + // + // NOTE: for most inlined vectors, `capacity()` should be equal to the + // template parameter `N`. For inlined vectors which exceed this capacity, + // they will no longer be inlined and `capacity()` will equal the capactity of + // the allocated memory. + size_type capacity() const noexcept { + return storage_.GetIsAllocated() ? storage_.GetAllocatedCapacity() + : storage_.GetInlinedCapacity(); + } + + // `InlinedVector::data()` + // + // Returns a `pointer` to the elements of the inlined vector. This pointer + // can be used to access and modify the contained elements. + // + // NOTE: only elements within [`data()`, `data() + size()`) are valid. + pointer data() noexcept ABSL_ATTRIBUTE_LIFETIME_BOUND { + return storage_.GetIsAllocated() ? storage_.GetAllocatedData() + : storage_.GetInlinedData(); + } + + // Overload of `InlinedVector::data()` that returns a `const_pointer` to the + // elements of the inlined vector. This pointer can be used to access but not + // modify the contained elements. + // + // NOTE: only elements within [`data()`, `data() + size()`) are valid. + const_pointer data() const noexcept ABSL_ATTRIBUTE_LIFETIME_BOUND { + return storage_.GetIsAllocated() ? storage_.GetAllocatedData() + : storage_.GetInlinedData(); + } + + // `InlinedVector::operator[](...)` + // + // Returns a `reference` to the `i`th element of the inlined vector. + reference operator[](size_type i) ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(i < size()); + return data()[i]; + } + + // Overload of `InlinedVector::operator[](...)` that returns a + // `const_reference` to the `i`th element of the inlined vector. + const_reference operator[](size_type i) const ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(i < size()); + return data()[i]; + } + + // `InlinedVector::at(...)` + // + // Returns a `reference` to the `i`th element of the inlined vector. + // + // NOTE: if `i` is not within the required range of `InlinedVector::at(...)`, + // in both debug and non-debug builds, `std::out_of_range` will be thrown. + reference at(size_type i) ABSL_ATTRIBUTE_LIFETIME_BOUND { + if (ABSL_PREDICT_FALSE(i >= size())) { + base_internal::ThrowStdOutOfRange( + "`InlinedVector::at(size_type)` failed bounds check"); + } + return data()[i]; + } + + // Overload of `InlinedVector::at(...)` that returns a `const_reference` to + // the `i`th element of the inlined vector. + // + // NOTE: if `i` is not within the required range of `InlinedVector::at(...)`, + // in both debug and non-debug builds, `std::out_of_range` will be thrown. + const_reference at(size_type i) const ABSL_ATTRIBUTE_LIFETIME_BOUND { + if (ABSL_PREDICT_FALSE(i >= size())) { + base_internal::ThrowStdOutOfRange( + "`InlinedVector::at(size_type) const` failed bounds check"); + } + return data()[i]; + } + + // `InlinedVector::front()` + // + // Returns a `reference` to the first element of the inlined vector. + reference front() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(!empty()); + return data()[0]; + } + + // Overload of `InlinedVector::front()` that returns a `const_reference` to + // the first element of the inlined vector. + const_reference front() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(!empty()); + return data()[0]; + } + + // `InlinedVector::back()` + // + // Returns a `reference` to the last element of the inlined vector. + reference back() ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(!empty()); + return data()[size() - 1]; + } + + // Overload of `InlinedVector::back()` that returns a `const_reference` to the + // last element of the inlined vector. + const_reference back() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(!empty()); + return data()[size() - 1]; + } + + // `InlinedVector::begin()` + // + // Returns an `iterator` to the beginning of the inlined vector. + iterator begin() noexcept ABSL_ATTRIBUTE_LIFETIME_BOUND { return data(); } + + // Overload of `InlinedVector::begin()` that returns a `const_iterator` to + // the beginning of the inlined vector. + const_iterator begin() const noexcept ABSL_ATTRIBUTE_LIFETIME_BOUND { + return data(); + } + + // `InlinedVector::end()` + // + // Returns an `iterator` to the end of the inlined vector. + iterator end() noexcept ABSL_ATTRIBUTE_LIFETIME_BOUND { + return data() + size(); + } + + // Overload of `InlinedVector::end()` that returns a `const_iterator` to the + // end of the inlined vector. + const_iterator end() const noexcept ABSL_ATTRIBUTE_LIFETIME_BOUND { + return data() + size(); + } + + // `InlinedVector::cbegin()` + // + // Returns a `const_iterator` to the beginning of the inlined vector. + const_iterator cbegin() const noexcept ABSL_ATTRIBUTE_LIFETIME_BOUND { + return begin(); + } + + // `InlinedVector::cend()` + // + // Returns a `const_iterator` to the end of the inlined vector. + const_iterator cend() const noexcept ABSL_ATTRIBUTE_LIFETIME_BOUND { + return end(); + } + + // `InlinedVector::rbegin()` + // + // Returns a `reverse_iterator` from the end of the inlined vector. + reverse_iterator rbegin() noexcept ABSL_ATTRIBUTE_LIFETIME_BOUND { + return reverse_iterator(end()); + } + + // Overload of `InlinedVector::rbegin()` that returns a + // `const_reverse_iterator` from the end of the inlined vector. + const_reverse_iterator rbegin() const noexcept ABSL_ATTRIBUTE_LIFETIME_BOUND { + return const_reverse_iterator(end()); + } + + // `InlinedVector::rend()` + // + // Returns a `reverse_iterator` from the beginning of the inlined vector. + reverse_iterator rend() noexcept ABSL_ATTRIBUTE_LIFETIME_BOUND { + return reverse_iterator(begin()); + } + + // Overload of `InlinedVector::rend()` that returns a `const_reverse_iterator` + // from the beginning of the inlined vector. + const_reverse_iterator rend() const noexcept ABSL_ATTRIBUTE_LIFETIME_BOUND { + return const_reverse_iterator(begin()); + } + + // `InlinedVector::crbegin()` + // + // Returns a `const_reverse_iterator` from the end of the inlined vector. + const_reverse_iterator crbegin() const noexcept + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return rbegin(); + } + + // `InlinedVector::crend()` + // + // Returns a `const_reverse_iterator` from the beginning of the inlined + // vector. + const_reverse_iterator crend() const noexcept ABSL_ATTRIBUTE_LIFETIME_BOUND { + return rend(); + } + + // `InlinedVector::get_allocator()` + // + // Returns a copy of the inlined vector's allocator. + allocator_type get_allocator() const { return storage_.GetAllocator(); } + + // --------------------------------------------------------------------------- + // InlinedVector Member Mutators + // --------------------------------------------------------------------------- + + // `InlinedVector::operator=(...)` + // + // Replaces the elements of the inlined vector with copies of the elements of + // `list`. + InlinedVector& operator=(std::initializer_list list) { + assign(list.begin(), list.end()); + + return *this; + } + + // Overload of `InlinedVector::operator=(...)` that replaces the elements of + // the inlined vector with copies of the elements of `other`. + InlinedVector& operator=(const InlinedVector& other) { + if (ABSL_PREDICT_TRUE(this != std::addressof(other))) { + const_pointer other_data = other.data(); + assign(other_data, other_data + other.size()); + } + + return *this; + } + + // Overload of `InlinedVector::operator=(...)` that moves the elements of + // `other` into the inlined vector. + // + // NOTE: as a result of calling this overload, `other` is left in a valid but + // unspecified state. + InlinedVector& operator=(InlinedVector&& other) { + if (ABSL_PREDICT_TRUE(this != std::addressof(other))) { + MoveAssignment(MoveAssignmentPolicy{}, std::move(other)); + } + + return *this; + } + + // `InlinedVector::assign(...)` + // + // Replaces the contents of the inlined vector with `n` copies of `v`. + void assign(size_type n, const_reference v) { + storage_.Assign(CopyValueAdapter(std::addressof(v)), n); + } + + // Overload of `InlinedVector::assign(...)` that replaces the contents of the + // inlined vector with copies of the elements of `list`. + void assign(std::initializer_list list) { + assign(list.begin(), list.end()); + } + + // Overload of `InlinedVector::assign(...)` to replace the contents of the + // inlined vector with the range [`first`, `last`). + // + // NOTE: this overload is for iterators that are "forward" category or better. + template = 0> + void assign(ForwardIterator first, ForwardIterator last) { + storage_.Assign(IteratorValueAdapter(first), + static_cast(std::distance(first, last))); + } + + // Overload of `InlinedVector::assign(...)` to replace the contents of the + // inlined vector with the range [`first`, `last`). + // + // NOTE: this overload is for iterators that are "input" category. + template = 0> + void assign(InputIterator first, InputIterator last) { + size_type i = 0; + for (; i < size() && first != last; ++i, static_cast(++first)) { + data()[i] = *first; + } + + erase(data() + i, data() + size()); + std::copy(first, last, std::back_inserter(*this)); + } + + // `InlinedVector::resize(...)` + // + // Resizes the inlined vector to contain `n` elements. + // + // NOTE: If `n` is smaller than `size()`, extra elements are destroyed. If `n` + // is larger than `size()`, new elements are value-initialized. + void resize(size_type n) { + ABSL_HARDENING_ASSERT(n <= max_size()); + storage_.Resize(DefaultValueAdapter(), n); + } + + // Overload of `InlinedVector::resize(...)` that resizes the inlined vector to + // contain `n` elements. + // + // NOTE: if `n` is smaller than `size()`, extra elements are destroyed. If `n` + // is larger than `size()`, new elements are copied-constructed from `v`. + void resize(size_type n, const_reference v) { + ABSL_HARDENING_ASSERT(n <= max_size()); + storage_.Resize(CopyValueAdapter(std::addressof(v)), n); + } + + // `InlinedVector::insert(...)` + // + // Inserts a copy of `v` at `pos`, returning an `iterator` to the newly + // inserted element. + iterator insert(const_iterator pos, + const_reference v) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return emplace(pos, v); + } + + // Overload of `InlinedVector::insert(...)` that inserts `v` at `pos` using + // move semantics, returning an `iterator` to the newly inserted element. + iterator insert(const_iterator pos, + value_type&& v) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return emplace(pos, std::move(v)); + } + + // Overload of `InlinedVector::insert(...)` that inserts `n` contiguous copies + // of `v` starting at `pos`, returning an `iterator` pointing to the first of + // the newly inserted elements. + iterator insert(const_iterator pos, size_type n, + const_reference v) ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(pos >= begin()); + ABSL_HARDENING_ASSERT(pos <= end()); + + if (ABSL_PREDICT_TRUE(n != 0)) { + value_type dealias = v; + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102329#c2 + // It appears that GCC thinks that since `pos` is a const pointer and may + // point to uninitialized memory at this point, a warning should be + // issued. But `pos` is actually only used to compute an array index to + // write to. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + return storage_.Insert(pos, CopyValueAdapter(std::addressof(dealias)), + n); +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } else { + return const_cast(pos); + } + } + + // Overload of `InlinedVector::insert(...)` that inserts copies of the + // elements of `list` starting at `pos`, returning an `iterator` pointing to + // the first of the newly inserted elements. + iterator insert(const_iterator pos, std::initializer_list list) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert(pos, list.begin(), list.end()); + } + + // Overload of `InlinedVector::insert(...)` that inserts the range [`first`, + // `last`) starting at `pos`, returning an `iterator` pointing to the first + // of the newly inserted elements. + // + // NOTE: this overload is for iterators that are "forward" category or better. + template = 0> + iterator insert(const_iterator pos, ForwardIterator first, + ForwardIterator last) ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(pos >= begin()); + ABSL_HARDENING_ASSERT(pos <= end()); + + if (ABSL_PREDICT_TRUE(first != last)) { + return storage_.Insert( + pos, IteratorValueAdapter(first), + static_cast(std::distance(first, last))); + } else { + return const_cast(pos); + } + } + + // Overload of `InlinedVector::insert(...)` that inserts the range [`first`, + // `last`) starting at `pos`, returning an `iterator` pointing to the first + // of the newly inserted elements. + // + // NOTE: this overload is for iterators that are "input" category. + template = 0> + iterator insert(const_iterator pos, InputIterator first, + InputIterator last) ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(pos >= begin()); + ABSL_HARDENING_ASSERT(pos <= end()); + + size_type index = static_cast(std::distance(cbegin(), pos)); + for (size_type i = index; first != last; ++i, static_cast(++first)) { + insert(data() + i, *first); + } + + return iterator(data() + index); + } + + // `InlinedVector::emplace(...)` + // + // Constructs and inserts an element using `args...` in the inlined vector at + // `pos`, returning an `iterator` pointing to the newly emplaced element. + template + iterator emplace(const_iterator pos, + Args&&... args) ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(pos >= begin()); + ABSL_HARDENING_ASSERT(pos <= end()); + + value_type dealias(std::forward(args)...); + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102329#c2 + // It appears that GCC thinks that since `pos` is a const pointer and may + // point to uninitialized memory at this point, a warning should be + // issued. But `pos` is actually only used to compute an array index to + // write to. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + return storage_.Insert(pos, + IteratorValueAdapter>( + MoveIterator(std::addressof(dealias))), + 1); +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } + + // `InlinedVector::emplace_back(...)` + // + // Constructs and inserts an element using `args...` in the inlined vector at + // `end()`, returning a `reference` to the newly emplaced element. + template + reference emplace_back(Args&&... args) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return storage_.EmplaceBack(std::forward(args)...); + } + + // `InlinedVector::push_back(...)` + // + // Inserts a copy of `v` in the inlined vector at `end()`. + void push_back(const_reference v) { static_cast(emplace_back(v)); } + + // Overload of `InlinedVector::push_back(...)` for inserting `v` at `end()` + // using move semantics. + void push_back(value_type&& v) { + static_cast(emplace_back(std::move(v))); + } + + // `InlinedVector::pop_back()` + // + // Destroys the element at `back()`, reducing the size by `1`. + void pop_back() noexcept { + ABSL_HARDENING_ASSERT(!empty()); + + AllocatorTraits::destroy(storage_.GetAllocator(), data() + (size() - 1)); + storage_.SubtractSize(1); + } + + // `InlinedVector::erase(...)` + // + // Erases the element at `pos`, returning an `iterator` pointing to where the + // erased element was located. + // + // NOTE: may return `end()`, which is not dereferenceable. + iterator erase(const_iterator pos) ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(pos >= begin()); + ABSL_HARDENING_ASSERT(pos < end()); + + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102329#c2 + // It appears that GCC thinks that since `pos` is a const pointer and may + // point to uninitialized memory at this point, a warning should be + // issued. But `pos` is actually only used to compute an array index to + // write to. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#pragma GCC diagnostic ignored "-Wuninitialized" +#endif + return storage_.Erase(pos, pos + 1); +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } + + // Overload of `InlinedVector::erase(...)` that erases every element in the + // range [`from`, `to`), returning an `iterator` pointing to where the first + // erased element was located. + // + // NOTE: may return `end()`, which is not dereferenceable. + iterator erase(const_iterator from, + const_iterator to) ABSL_ATTRIBUTE_LIFETIME_BOUND { + ABSL_HARDENING_ASSERT(from >= begin()); + ABSL_HARDENING_ASSERT(from <= to); + ABSL_HARDENING_ASSERT(to <= end()); + + if (ABSL_PREDICT_TRUE(from != to)) { + return storage_.Erase(from, to); + } else { + return const_cast(from); + } + } + + // `InlinedVector::clear()` + // + // Destroys all elements in the inlined vector, setting the size to `0` and + // deallocating any held memory. + void clear() noexcept { + inlined_vector_internal::DestroyAdapter::DestroyElements( + storage_.GetAllocator(), data(), size()); + storage_.DeallocateIfAllocated(); + + storage_.SetInlinedSize(0); + } + + // `InlinedVector::reserve(...)` + // + // Ensures that there is enough room for at least `n` elements. + void reserve(size_type n) { storage_.Reserve(n); } + + // `InlinedVector::shrink_to_fit()` + // + // Attempts to reduce memory usage by moving elements to (or keeping elements + // in) the smallest available buffer sufficient for containing `size()` + // elements. + // + // If `size()` is sufficiently small, the elements will be moved into (or kept + // in) the inlined space. + void shrink_to_fit() { + if (storage_.GetIsAllocated()) { + storage_.ShrinkToFit(); + } + } + + // `InlinedVector::swap(...)` + // + // Swaps the contents of the inlined vector with `other`. + void swap(InlinedVector& other) { + if (ABSL_PREDICT_TRUE(this != std::addressof(other))) { + storage_.Swap(std::addressof(other.storage_)); + } + } + + private: + template + friend H AbslHashValue(H h, const absl::InlinedVector& a); + + void MoveAssignment(MemcpyPolicy, InlinedVector&& other) { + // Assumption check: we shouldn't be told to use memcpy to implement move + // assignment unless we have trivially destructible elements and an + // allocator that does nothing fancy. + static_assert(absl::is_trivially_destructible::value, ""); + static_assert(std::is_same>::value, ""); + + // Throw away our existing heap allocation, if any. There is no need to + // destroy the existing elements one by one because we know they are + // trivially destructible. + storage_.DeallocateIfAllocated(); + + // Adopt the other vector's inline elements or heap allocation. + storage_.MemcpyFrom(other.storage_); + other.storage_.SetInlinedSize(0); + } + + // Destroy our existing elements, if any, and adopt the heap-allocated + // elements of the other vector. + // + // REQUIRES: other.storage_.GetIsAllocated() + void DestroyExistingAndAdopt(InlinedVector&& other) { + ABSL_HARDENING_ASSERT(other.storage_.GetIsAllocated()); + + inlined_vector_internal::DestroyAdapter::DestroyElements( + storage_.GetAllocator(), data(), size()); + storage_.DeallocateIfAllocated(); + + storage_.MemcpyFrom(other.storage_); + other.storage_.SetInlinedSize(0); + } + + void MoveAssignment(ElementwiseAssignPolicy, InlinedVector&& other) { + // Fast path: if the other vector is on the heap then we don't worry about + // actually move-assigning each element. Instead we only throw away our own + // existing elements and adopt the heap allocation of the other vector. + if (other.storage_.GetIsAllocated()) { + DestroyExistingAndAdopt(std::move(other)); + return; + } + + storage_.Assign(IteratorValueAdapter>( + MoveIterator(other.storage_.GetInlinedData())), + other.size()); + } + + void MoveAssignment(ElementwiseConstructPolicy, InlinedVector&& other) { + // Fast path: if the other vector is on the heap then we don't worry about + // actually move-assigning each element. Instead we only throw away our own + // existing elements and adopt the heap allocation of the other vector. + if (other.storage_.GetIsAllocated()) { + DestroyExistingAndAdopt(std::move(other)); + return; + } + + inlined_vector_internal::DestroyAdapter::DestroyElements( + storage_.GetAllocator(), data(), size()); + storage_.DeallocateIfAllocated(); + + IteratorValueAdapter> other_values( + MoveIterator(other.storage_.GetInlinedData())); + inlined_vector_internal::ConstructElements( + storage_.GetAllocator(), storage_.GetInlinedData(), other_values, + other.storage_.GetSize()); + storage_.SetInlinedSize(other.storage_.GetSize()); + } + + Storage storage_; +}; + +// ----------------------------------------------------------------------------- +// InlinedVector Non-Member Functions +// ----------------------------------------------------------------------------- + +// `swap(...)` +// +// Swaps the contents of two inlined vectors. +template +void swap(absl::InlinedVector& a, + absl::InlinedVector& b) noexcept(noexcept(a.swap(b))) { + a.swap(b); +} + +// `operator==(...)` +// +// Tests for value-equality of two inlined vectors. +template +bool operator==(const absl::InlinedVector& a, + const absl::InlinedVector& b) { + auto a_data = a.data(); + auto b_data = b.data(); + return std::equal(a_data, a_data + a.size(), b_data, b_data + b.size()); +} + +// `operator!=(...)` +// +// Tests for value-inequality of two inlined vectors. +template +bool operator!=(const absl::InlinedVector& a, + const absl::InlinedVector& b) { + return !(a == b); +} + +// `operator<(...)` +// +// Tests whether the value of an inlined vector is less than the value of +// another inlined vector using a lexicographical comparison algorithm. +template +bool operator<(const absl::InlinedVector& a, + const absl::InlinedVector& b) { + auto a_data = a.data(); + auto b_data = b.data(); + return std::lexicographical_compare(a_data, a_data + a.size(), b_data, + b_data + b.size()); +} + +// `operator>(...)` +// +// Tests whether the value of an inlined vector is greater than the value of +// another inlined vector using a lexicographical comparison algorithm. +template +bool operator>(const absl::InlinedVector& a, + const absl::InlinedVector& b) { + return b < a; +} + +// `operator<=(...)` +// +// Tests whether the value of an inlined vector is less than or equal to the +// value of another inlined vector using a lexicographical comparison algorithm. +template +bool operator<=(const absl::InlinedVector& a, + const absl::InlinedVector& b) { + return !(b < a); +} + +// `operator>=(...)` +// +// Tests whether the value of an inlined vector is greater than or equal to the +// value of another inlined vector using a lexicographical comparison algorithm. +template +bool operator>=(const absl::InlinedVector& a, + const absl::InlinedVector& b) { + return !(a < b); +} + +// `AbslHashValue(...)` +// +// Provides `absl::Hash` support for `absl::InlinedVector`. It is uncommon to +// call this directly. +template +H AbslHashValue(H h, const absl::InlinedVector& a) { + auto size = a.size(); + return H::combine(H::combine_contiguous(std::move(h), a.data(), size), size); +} + +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_INLINED_VECTOR_H_ diff --git a/absl/container/inlined_vector_benchmark.cc b/absl/container/inlined_vector_benchmark.cc new file mode 100644 index 0000000..5a04277 --- /dev/null +++ b/absl/container/inlined_vector_benchmark.cc @@ -0,0 +1,829 @@ +// Copyright 2019 The Abseil Authors. +// +// 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 +// +// https://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 +#include +#include + +#include "absl/base/internal/raw_logging.h" +#include "absl/base/macros.h" +#include "absl/container/inlined_vector.h" +#include "absl/strings/str_cat.h" +#include "benchmark/benchmark.h" + +namespace { + +void BM_InlinedVectorFill(benchmark::State& state) { + const int len = state.range(0); + absl::InlinedVector v; + v.reserve(len); + for (auto _ : state) { + v.resize(0); // Use resize(0) as InlinedVector releases storage on clear(). + for (int i = 0; i < len; ++i) { + v.push_back(i); + } + benchmark::DoNotOptimize(v); + } +} +BENCHMARK(BM_InlinedVectorFill)->Range(1, 256); + +void BM_InlinedVectorFillRange(benchmark::State& state) { + const int len = state.range(0); + const std::vector src(len, len); + absl::InlinedVector v; + v.reserve(len); + for (auto _ : state) { + benchmark::DoNotOptimize(src); + v.assign(src.begin(), src.end()); + benchmark::DoNotOptimize(v); + } +} +BENCHMARK(BM_InlinedVectorFillRange)->Range(1, 256); + +void BM_StdVectorFill(benchmark::State& state) { + const int len = state.range(0); + std::vector v; + v.reserve(len); + for (auto _ : state) { + v.clear(); + for (int i = 0; i < len; ++i) { + v.push_back(i); + } + benchmark::DoNotOptimize(v); + } +} +BENCHMARK(BM_StdVectorFill)->Range(1, 256); + +// The purpose of the next two benchmarks is to verify that +// absl::InlinedVector is efficient when moving is more efficient than +// copying. To do so, we use strings that are larger than the short +// string optimization. +bool StringRepresentedInline(std::string s) { + const char* chars = s.data(); + std::string s1 = std::move(s); + return s1.data() != chars; +} + +int GetNonShortStringOptimizationSize() { + for (int i = 24; i <= 192; i *= 2) { + if (!StringRepresentedInline(std::string(i, 'A'))) { + return i; + } + } + ABSL_RAW_LOG( + FATAL, + "Failed to find a string larger than the short string optimization"); + return -1; +} + +void BM_InlinedVectorFillString(benchmark::State& state) { + const int len = state.range(0); + const int no_sso = GetNonShortStringOptimizationSize(); + std::string strings[4] = {std::string(no_sso, 'A'), std::string(no_sso, 'B'), + std::string(no_sso, 'C'), std::string(no_sso, 'D')}; + + for (auto _ : state) { + absl::InlinedVector v; + for (int i = 0; i < len; i++) { + v.push_back(strings[i & 3]); + } + } + state.SetItemsProcessed(static_cast(state.iterations()) * len); +} +BENCHMARK(BM_InlinedVectorFillString)->Range(0, 1024); + +void BM_StdVectorFillString(benchmark::State& state) { + const int len = state.range(0); + const int no_sso = GetNonShortStringOptimizationSize(); + std::string strings[4] = {std::string(no_sso, 'A'), std::string(no_sso, 'B'), + std::string(no_sso, 'C'), std::string(no_sso, 'D')}; + + for (auto _ : state) { + std::vector v; + for (int i = 0; i < len; i++) { + v.push_back(strings[i & 3]); + } + } + state.SetItemsProcessed(static_cast(state.iterations()) * len); +} +BENCHMARK(BM_StdVectorFillString)->Range(0, 1024); + +struct Buffer { // some arbitrary structure for benchmarking. + char* base; + int length; + int capacity; + void* user_data; +}; + +void BM_InlinedVectorAssignments(benchmark::State& state) { + const int len = state.range(0); + using BufferVec = absl::InlinedVector; + + BufferVec src; + src.resize(len); + + BufferVec dst; + for (auto _ : state) { + benchmark::DoNotOptimize(dst); + benchmark::DoNotOptimize(src); + dst = src; + } +} +BENCHMARK(BM_InlinedVectorAssignments) + ->Arg(0) + ->Arg(1) + ->Arg(2) + ->Arg(3) + ->Arg(4) + ->Arg(20); + +void BM_CreateFromContainer(benchmark::State& state) { + for (auto _ : state) { + absl::InlinedVector src{1, 2, 3}; + benchmark::DoNotOptimize(src); + absl::InlinedVector dst(std::move(src)); + benchmark::DoNotOptimize(dst); + } +} +BENCHMARK(BM_CreateFromContainer); + +struct LargeCopyableOnly { + LargeCopyableOnly() : d(1024, 17) {} + LargeCopyableOnly(const LargeCopyableOnly& o) = default; + LargeCopyableOnly& operator=(const LargeCopyableOnly& o) = default; + + std::vector d; +}; + +struct LargeCopyableSwappable { + LargeCopyableSwappable() : d(1024, 17) {} + + LargeCopyableSwappable(const LargeCopyableSwappable& o) = default; + + LargeCopyableSwappable& operator=(LargeCopyableSwappable o) { + using std::swap; + swap(*this, o); + return *this; + } + + friend void swap(LargeCopyableSwappable& a, LargeCopyableSwappable& b) { + using std::swap; + swap(a.d, b.d); + } + + std::vector d; +}; + +struct LargeCopyableMovable { + LargeCopyableMovable() : d(1024, 17) {} + // Use implicitly defined copy and move. + + std::vector d; +}; + +struct LargeCopyableMovableSwappable { + LargeCopyableMovableSwappable() : d(1024, 17) {} + LargeCopyableMovableSwappable(const LargeCopyableMovableSwappable& o) = + default; + LargeCopyableMovableSwappable(LargeCopyableMovableSwappable&& o) = default; + + LargeCopyableMovableSwappable& operator=(LargeCopyableMovableSwappable o) { + using std::swap; + swap(*this, o); + return *this; + } + LargeCopyableMovableSwappable& operator=(LargeCopyableMovableSwappable&& o) = + default; + + friend void swap(LargeCopyableMovableSwappable& a, + LargeCopyableMovableSwappable& b) { + using std::swap; + swap(a.d, b.d); + } + + std::vector d; +}; + +template +void BM_SwapElements(benchmark::State& state) { + const int len = state.range(0); + using Vec = absl::InlinedVector; + Vec a(len); + Vec b; + for (auto _ : state) { + using std::swap; + benchmark::DoNotOptimize(a); + benchmark::DoNotOptimize(b); + swap(a, b); + } +} +BENCHMARK_TEMPLATE(BM_SwapElements, LargeCopyableOnly)->Range(0, 1024); +BENCHMARK_TEMPLATE(BM_SwapElements, LargeCopyableSwappable)->Range(0, 1024); +BENCHMARK_TEMPLATE(BM_SwapElements, LargeCopyableMovable)->Range(0, 1024); +BENCHMARK_TEMPLATE(BM_SwapElements, LargeCopyableMovableSwappable) + ->Range(0, 1024); + +// The following benchmark is meant to track the efficiency of the vector size +// as a function of stored type via the benchmark label. It is not meant to +// output useful sizeof operator performance. The loop is a dummy operation +// to fulfill the requirement of running the benchmark. +template +void BM_Sizeof(benchmark::State& state) { + int size = 0; + for (auto _ : state) { + VecType vec; + size = sizeof(vec); + } + state.SetLabel(absl::StrCat("sz=", size)); +} +BENCHMARK_TEMPLATE(BM_Sizeof, absl::InlinedVector); +BENCHMARK_TEMPLATE(BM_Sizeof, absl::InlinedVector); +BENCHMARK_TEMPLATE(BM_Sizeof, absl::InlinedVector); +BENCHMARK_TEMPLATE(BM_Sizeof, absl::InlinedVector); + +BENCHMARK_TEMPLATE(BM_Sizeof, absl::InlinedVector); +BENCHMARK_TEMPLATE(BM_Sizeof, absl::InlinedVector); +BENCHMARK_TEMPLATE(BM_Sizeof, absl::InlinedVector); +BENCHMARK_TEMPLATE(BM_Sizeof, absl::InlinedVector); + +BENCHMARK_TEMPLATE(BM_Sizeof, absl::InlinedVector); +BENCHMARK_TEMPLATE(BM_Sizeof, absl::InlinedVector); +BENCHMARK_TEMPLATE(BM_Sizeof, absl::InlinedVector); +BENCHMARK_TEMPLATE(BM_Sizeof, absl::InlinedVector); + +BENCHMARK_TEMPLATE(BM_Sizeof, absl::InlinedVector); +BENCHMARK_TEMPLATE(BM_Sizeof, absl::InlinedVector); +BENCHMARK_TEMPLATE(BM_Sizeof, absl::InlinedVector); +BENCHMARK_TEMPLATE(BM_Sizeof, absl::InlinedVector); + +void BM_InlinedVectorIndexInlined(benchmark::State& state) { + absl::InlinedVector v = {1, 2, 3, 4, 5, 6, 7}; + for (auto _ : state) { + benchmark::DoNotOptimize(v); + benchmark::DoNotOptimize(v[4]); + } +} +BENCHMARK(BM_InlinedVectorIndexInlined); + +void BM_InlinedVectorIndexExternal(benchmark::State& state) { + absl::InlinedVector v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + for (auto _ : state) { + benchmark::DoNotOptimize(v); + benchmark::DoNotOptimize(v[4]); + } +} +BENCHMARK(BM_InlinedVectorIndexExternal); + +void BM_StdVectorIndex(benchmark::State& state) { + std::vector v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + for (auto _ : state) { + benchmark::DoNotOptimize(v); + benchmark::DoNotOptimize(v[4]); + } +} +BENCHMARK(BM_StdVectorIndex); + +void BM_InlinedVectorDataInlined(benchmark::State& state) { + absl::InlinedVector v = {1, 2, 3, 4, 5, 6, 7}; + for (auto _ : state) { + benchmark::DoNotOptimize(v); + benchmark::DoNotOptimize(v.data()); + } +} +BENCHMARK(BM_InlinedVectorDataInlined); + +void BM_InlinedVectorDataExternal(benchmark::State& state) { + absl::InlinedVector v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + for (auto _ : state) { + benchmark::DoNotOptimize(v); + benchmark::DoNotOptimize(v.data()); + } + state.SetItemsProcessed(16 * static_cast(state.iterations())); +} +BENCHMARK(BM_InlinedVectorDataExternal); + +void BM_StdVectorData(benchmark::State& state) { + std::vector v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + for (auto _ : state) { + benchmark::DoNotOptimize(v); + benchmark::DoNotOptimize(v.data()); + } + state.SetItemsProcessed(16 * static_cast(state.iterations())); +} +BENCHMARK(BM_StdVectorData); + +void BM_InlinedVectorSizeInlined(benchmark::State& state) { + absl::InlinedVector v = {1, 2, 3, 4, 5, 6, 7}; + for (auto _ : state) { + benchmark::DoNotOptimize(v); + benchmark::DoNotOptimize(v.size()); + } +} +BENCHMARK(BM_InlinedVectorSizeInlined); + +void BM_InlinedVectorSizeExternal(benchmark::State& state) { + absl::InlinedVector v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + for (auto _ : state) { + benchmark::DoNotOptimize(v); + benchmark::DoNotOptimize(v.size()); + } +} +BENCHMARK(BM_InlinedVectorSizeExternal); + +void BM_StdVectorSize(benchmark::State& state) { + std::vector v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + for (auto _ : state) { + benchmark::DoNotOptimize(v); + benchmark::DoNotOptimize(v.size()); + } +} +BENCHMARK(BM_StdVectorSize); + +void BM_InlinedVectorEmptyInlined(benchmark::State& state) { + absl::InlinedVector v = {1, 2, 3, 4, 5, 6, 7}; + for (auto _ : state) { + benchmark::DoNotOptimize(v); + benchmark::DoNotOptimize(v.empty()); + } +} +BENCHMARK(BM_InlinedVectorEmptyInlined); + +void BM_InlinedVectorEmptyExternal(benchmark::State& state) { + absl::InlinedVector v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + for (auto _ : state) { + benchmark::DoNotOptimize(v); + benchmark::DoNotOptimize(v.empty()); + } +} +BENCHMARK(BM_InlinedVectorEmptyExternal); + +void BM_StdVectorEmpty(benchmark::State& state) { + std::vector v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + for (auto _ : state) { + benchmark::DoNotOptimize(v); + benchmark::DoNotOptimize(v.empty()); + } +} +BENCHMARK(BM_StdVectorEmpty); + +constexpr size_t kInlinedCapacity = 4; +constexpr size_t kLargeSize = kInlinedCapacity * 2; +constexpr size_t kSmallSize = kInlinedCapacity / 2; +constexpr size_t kBatchSize = 100; + +#define ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_FunctionTemplate, T) \ + BENCHMARK_TEMPLATE(BM_FunctionTemplate, T, kLargeSize); \ + BENCHMARK_TEMPLATE(BM_FunctionTemplate, T, kSmallSize) + +#define ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_FunctionTemplate, T) \ + BENCHMARK_TEMPLATE(BM_FunctionTemplate, T, kLargeSize, kLargeSize); \ + BENCHMARK_TEMPLATE(BM_FunctionTemplate, T, kLargeSize, kSmallSize); \ + BENCHMARK_TEMPLATE(BM_FunctionTemplate, T, kSmallSize, kLargeSize); \ + BENCHMARK_TEMPLATE(BM_FunctionTemplate, T, kSmallSize, kSmallSize) + +template +using InlVec = absl::InlinedVector; + +struct TrivialType { + size_t val; +}; + +class NontrivialType { + public: + ABSL_ATTRIBUTE_NOINLINE NontrivialType() : val_() { + benchmark::DoNotOptimize(*this); + } + + ABSL_ATTRIBUTE_NOINLINE NontrivialType(const NontrivialType& other) + : val_(other.val_) { + benchmark::DoNotOptimize(*this); + } + + ABSL_ATTRIBUTE_NOINLINE NontrivialType& operator=( + const NontrivialType& other) { + val_ = other.val_; + benchmark::DoNotOptimize(*this); + return *this; + } + + ABSL_ATTRIBUTE_NOINLINE ~NontrivialType() noexcept { + benchmark::DoNotOptimize(*this); + } + + private: + size_t val_; +}; + +template +void BatchedBenchmark(benchmark::State& state, PrepareVecFn prepare_vec, + TestVecFn test_vec) { + std::array, kBatchSize> vector_batch{}; + + while (state.KeepRunningBatch(kBatchSize)) { + // Prepare batch + state.PauseTiming(); + for (size_t i = 0; i < kBatchSize; ++i) { + prepare_vec(vector_batch.data() + i, i); + } + benchmark::DoNotOptimize(vector_batch); + state.ResumeTiming(); + + // Test batch + for (size_t i = 0; i < kBatchSize; ++i) { + test_vec(vector_batch.data() + i, i); + } + } +} + +template +void BM_ConstructFromSize(benchmark::State& state) { + using VecT = InlVec; + auto size = ToSize; + BatchedBenchmark( + state, + /* prepare_vec = */ [](InlVec* vec, size_t) { vec->~VecT(); }, + /* test_vec = */ + [&](void* ptr, size_t) { + benchmark::DoNotOptimize(size); + ::new (ptr) VecT(size); + }); +} +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_ConstructFromSize, TrivialType); +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_ConstructFromSize, NontrivialType); + +template +void BM_ConstructFromSizeRef(benchmark::State& state) { + using VecT = InlVec; + auto size = ToSize; + auto ref = T(); + BatchedBenchmark( + state, + /* prepare_vec = */ [](InlVec* vec, size_t) { vec->~VecT(); }, + /* test_vec = */ + [&](void* ptr, size_t) { + benchmark::DoNotOptimize(size); + benchmark::DoNotOptimize(ref); + ::new (ptr) VecT(size, ref); + }); +} +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_ConstructFromSizeRef, TrivialType); +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_ConstructFromSizeRef, NontrivialType); + +template +void BM_ConstructFromRange(benchmark::State& state) { + using VecT = InlVec; + std::array arr{}; + BatchedBenchmark( + state, + /* prepare_vec = */ [](InlVec* vec, size_t) { vec->~VecT(); }, + /* test_vec = */ + [&](void* ptr, size_t) { + benchmark::DoNotOptimize(arr); + ::new (ptr) VecT(arr.begin(), arr.end()); + }); +} +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_ConstructFromRange, TrivialType); +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_ConstructFromRange, NontrivialType); + +template +void BM_ConstructFromCopy(benchmark::State& state) { + using VecT = InlVec; + VecT other_vec(ToSize); + BatchedBenchmark( + state, + /* prepare_vec = */ + [](InlVec* vec, size_t) { vec->~VecT(); }, + /* test_vec = */ + [&](void* ptr, size_t) { + benchmark::DoNotOptimize(other_vec); + ::new (ptr) VecT(other_vec); + }); +} +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_ConstructFromCopy, TrivialType); +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_ConstructFromCopy, NontrivialType); + +template +void BM_ConstructFromMove(benchmark::State& state) { + using VecT = InlVec; + std::array vector_batch{}; + BatchedBenchmark( + state, + /* prepare_vec = */ + [&](InlVec* vec, size_t i) { + vector_batch[i].clear(); + vector_batch[i].resize(ToSize); + vec->~VecT(); + }, + /* test_vec = */ + [&](void* ptr, size_t i) { + benchmark::DoNotOptimize(vector_batch[i]); + ::new (ptr) VecT(std::move(vector_batch[i])); + }); +} +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_ConstructFromMove, TrivialType); +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_ConstructFromMove, NontrivialType); + +// Measure cost of copy-constructor+destructor. +void BM_CopyTrivial(benchmark::State& state) { + const int n = state.range(0); + InlVec src(n); + for (auto s : state) { + InlVec copy(src); + benchmark::DoNotOptimize(copy); + } +} +BENCHMARK(BM_CopyTrivial)->Arg(0)->Arg(1)->Arg(kLargeSize); + +// Measure cost of copy-constructor+destructor. +void BM_CopyNonTrivial(benchmark::State& state) { + const int n = state.range(0); + InlVec> src(n); + for (auto s : state) { + InlVec> copy(src); + benchmark::DoNotOptimize(copy); + } +} +BENCHMARK(BM_CopyNonTrivial)->Arg(0)->Arg(1)->Arg(kLargeSize); + +template +void BM_AssignSizeRef(benchmark::State& state) { + auto size = ToSize; + auto ref = T(); + BatchedBenchmark( + state, + /* prepare_vec = */ [](InlVec* vec, size_t) { vec->resize(FromSize); }, + /* test_vec = */ + [&](InlVec* vec, size_t) { + benchmark::DoNotOptimize(size); + benchmark::DoNotOptimize(ref); + vec->assign(size, ref); + }); +} +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_AssignSizeRef, TrivialType); +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_AssignSizeRef, NontrivialType); + +template +void BM_AssignRange(benchmark::State& state) { + std::array arr{}; + BatchedBenchmark( + state, + /* prepare_vec = */ [](InlVec* vec, size_t) { vec->resize(FromSize); }, + /* test_vec = */ + [&](InlVec* vec, size_t) { + benchmark::DoNotOptimize(arr); + vec->assign(arr.begin(), arr.end()); + }); +} +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_AssignRange, TrivialType); +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_AssignRange, NontrivialType); + +template +void BM_AssignFromCopy(benchmark::State& state) { + InlVec other_vec(ToSize); + BatchedBenchmark( + state, + /* prepare_vec = */ [](InlVec* vec, size_t) { vec->resize(FromSize); }, + /* test_vec = */ + [&](InlVec* vec, size_t) { + benchmark::DoNotOptimize(other_vec); + *vec = other_vec; + }); +} +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_AssignFromCopy, TrivialType); +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_AssignFromCopy, NontrivialType); + +template +void BM_AssignFromMove(benchmark::State& state) { + using VecT = InlVec; + std::array vector_batch{}; + BatchedBenchmark( + state, + /* prepare_vec = */ + [&](InlVec* vec, size_t i) { + vector_batch[i].clear(); + vector_batch[i].resize(ToSize); + vec->resize(FromSize); + }, + /* test_vec = */ + [&](InlVec* vec, size_t i) { + benchmark::DoNotOptimize(vector_batch[i]); + *vec = std::move(vector_batch[i]); + }); +} +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_AssignFromMove, TrivialType); +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_AssignFromMove, NontrivialType); + +template +void BM_ResizeSize(benchmark::State& state) { + BatchedBenchmark( + state, + /* prepare_vec = */ + [](InlVec* vec, size_t) { + vec->clear(); + vec->resize(FromSize); + }, + /* test_vec = */ + [](InlVec* vec, size_t) { vec->resize(ToSize); }); +} +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_ResizeSize, TrivialType); +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_ResizeSize, NontrivialType); + +template +void BM_ResizeSizeRef(benchmark::State& state) { + auto t = T(); + BatchedBenchmark( + state, + /* prepare_vec = */ + [](InlVec* vec, size_t) { + vec->clear(); + vec->resize(FromSize); + }, + /* test_vec = */ + [&](InlVec* vec, size_t) { + benchmark::DoNotOptimize(t); + vec->resize(ToSize, t); + }); +} +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_ResizeSizeRef, TrivialType); +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_ResizeSizeRef, NontrivialType); + +template +void BM_InsertSizeRef(benchmark::State& state) { + auto t = T(); + BatchedBenchmark( + state, + /* prepare_vec = */ + [](InlVec* vec, size_t) { + vec->clear(); + vec->resize(FromSize); + }, + /* test_vec = */ + [&](InlVec* vec, size_t) { + benchmark::DoNotOptimize(t); + auto* pos = vec->data() + (vec->size() / 2); + vec->insert(pos, t); + }); +} +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_InsertSizeRef, TrivialType); +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_InsertSizeRef, NontrivialType); + +template +void BM_InsertRange(benchmark::State& state) { + InlVec other_vec(ToSize); + BatchedBenchmark( + state, + /* prepare_vec = */ + [](InlVec* vec, size_t) { + vec->clear(); + vec->resize(FromSize); + }, + /* test_vec = */ + [&](InlVec* vec, size_t) { + benchmark::DoNotOptimize(other_vec); + auto* pos = vec->data() + (vec->size() / 2); + vec->insert(pos, other_vec.begin(), other_vec.end()); + }); +} +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_InsertRange, TrivialType); +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_InsertRange, NontrivialType); + +template +void BM_EmplaceBack(benchmark::State& state) { + BatchedBenchmark( + state, + /* prepare_vec = */ + [](InlVec* vec, size_t) { + vec->clear(); + vec->resize(FromSize); + }, + /* test_vec = */ + [](InlVec* vec, size_t) { vec->emplace_back(); }); +} +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_EmplaceBack, TrivialType); +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_EmplaceBack, NontrivialType); + +template +void BM_PopBack(benchmark::State& state) { + BatchedBenchmark( + state, + /* prepare_vec = */ + [](InlVec* vec, size_t) { + vec->clear(); + vec->resize(FromSize); + }, + /* test_vec = */ + [](InlVec* vec, size_t) { vec->pop_back(); }); +} +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_PopBack, TrivialType); +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_PopBack, NontrivialType); + +template +void BM_EraseOne(benchmark::State& state) { + BatchedBenchmark( + state, + /* prepare_vec = */ + [](InlVec* vec, size_t) { + vec->clear(); + vec->resize(FromSize); + }, + /* test_vec = */ + [](InlVec* vec, size_t) { + auto* pos = vec->data() + (vec->size() / 2); + vec->erase(pos); + }); +} +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_EraseOne, TrivialType); +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_EraseOne, NontrivialType); + +template +void BM_EraseRange(benchmark::State& state) { + BatchedBenchmark( + state, + /* prepare_vec = */ + [](InlVec* vec, size_t) { + vec->clear(); + vec->resize(FromSize); + }, + /* test_vec = */ + [](InlVec* vec, size_t) { + auto* pos = vec->data() + (vec->size() / 2); + vec->erase(pos, pos + 1); + }); +} +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_EraseRange, TrivialType); +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_EraseRange, NontrivialType); + +template +void BM_Clear(benchmark::State& state) { + BatchedBenchmark( + state, + /* prepare_vec = */ [](InlVec* vec, size_t) { vec->resize(FromSize); }, + /* test_vec = */ [](InlVec* vec, size_t) { vec->clear(); }); +} +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_Clear, TrivialType); +ABSL_INTERNAL_BENCHMARK_ONE_SIZE(BM_Clear, NontrivialType); + +template +void BM_Reserve(benchmark::State& state) { + BatchedBenchmark( + state, + /* prepare_vec = */ + [](InlVec* vec, size_t) { + vec->clear(); + vec->resize(FromSize); + }, + /* test_vec = */ + [](InlVec* vec, size_t) { vec->reserve(ToCapacity); }); +} +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_Reserve, TrivialType); +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_Reserve, NontrivialType); + +template +void BM_ShrinkToFit(benchmark::State& state) { + BatchedBenchmark( + state, + /* prepare_vec = */ + [](InlVec* vec, size_t) { + vec->clear(); + vec->resize(ToCapacity); + vec->reserve(FromCapacity); + }, + /* test_vec = */ [](InlVec* vec, size_t) { vec->shrink_to_fit(); }); +} +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_ShrinkToFit, TrivialType); +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_ShrinkToFit, NontrivialType); + +template +void BM_Swap(benchmark::State& state) { + using VecT = InlVec; + std::array vector_batch{}; + BatchedBenchmark( + state, + /* prepare_vec = */ + [&](InlVec* vec, size_t i) { + vector_batch[i].clear(); + vector_batch[i].resize(ToSize); + vec->resize(FromSize); + }, + /* test_vec = */ + [&](InlVec* vec, size_t i) { + using std::swap; + benchmark::DoNotOptimize(vector_batch[i]); + swap(*vec, vector_batch[i]); + }); +} +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_Swap, TrivialType); +ABSL_INTERNAL_BENCHMARK_TWO_SIZE(BM_Swap, NontrivialType); + +} // namespace diff --git a/absl/container/inlined_vector_exception_safety_test.cc b/absl/container/inlined_vector_exception_safety_test.cc new file mode 100644 index 0000000..0e6a05b --- /dev/null +++ b/absl/container/inlined_vector_exception_safety_test.cc @@ -0,0 +1,508 @@ +// Copyright 2019 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/inlined_vector.h" + +#include "absl/base/config.h" + +#if defined(ABSL_HAVE_EXCEPTIONS) + +#include +#include +#include +#include +#include + +#include "gtest/gtest.h" +#include "absl/base/internal/exception_safety_testing.h" + +namespace { + +constexpr size_t kInlinedCapacity = 4; +constexpr size_t kLargeSize = kInlinedCapacity * 2; +constexpr size_t kSmallSize = kInlinedCapacity / 2; + +using Thrower = testing::ThrowingValue<>; +using MovableThrower = testing::ThrowingValue; +using ThrowAlloc = testing::ThrowingAllocator; + +using ThrowerVec = absl::InlinedVector; +using MovableThrowerVec = absl::InlinedVector; + +using ThrowAllocThrowerVec = + absl::InlinedVector; +using ThrowAllocMovableThrowerVec = + absl::InlinedVector; + +// In GCC, if an element of a `std::initializer_list` throws during construction +// the elements that were constructed before it are not destroyed. This causes +// incorrect exception safety test failures. Thus, `testing::nothrow_ctor` is +// required. See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66139 +#define ABSL_INTERNAL_MAKE_INIT_LIST(T, N) \ + (N > kInlinedCapacity \ + ? std::initializer_list{T(0, testing::nothrow_ctor), \ + T(1, testing::nothrow_ctor), \ + T(2, testing::nothrow_ctor), \ + T(3, testing::nothrow_ctor), \ + T(4, testing::nothrow_ctor), \ + T(5, testing::nothrow_ctor), \ + T(6, testing::nothrow_ctor), \ + T(7, testing::nothrow_ctor)} \ + \ + : std::initializer_list{T(0, testing::nothrow_ctor), \ + T(1, testing::nothrow_ctor)}) +static_assert(kLargeSize == 8, "Must update ABSL_INTERNAL_MAKE_INIT_LIST(...)"); +static_assert(kSmallSize == 2, "Must update ABSL_INTERNAL_MAKE_INIT_LIST(...)"); + +template +class TestParams { + public: + using VecT = TheVecT; + constexpr static size_t GetSizeAt(size_t i) { return kSizes[1 + i]; } + + private: + constexpr static size_t kSizes[1 + sizeof...(TheSizes)] = {1, TheSizes...}; +}; + +using NoSizeTestParams = + ::testing::Types, TestParams, + TestParams, + TestParams>; + +using OneSizeTestParams = + ::testing::Types, + TestParams, + TestParams, + TestParams, + TestParams, + TestParams, + TestParams, + TestParams>; + +using TwoSizeTestParams = ::testing::Types< + TestParams, + TestParams, + TestParams, + TestParams, + TestParams, + TestParams, + TestParams, + TestParams, + TestParams, + TestParams, + TestParams, + TestParams, + TestParams, + TestParams, + TestParams, + TestParams>; + +template +struct NoSizeTest : ::testing::Test {}; +TYPED_TEST_SUITE(NoSizeTest, NoSizeTestParams); + +template +struct OneSizeTest : ::testing::Test {}; +TYPED_TEST_SUITE(OneSizeTest, OneSizeTestParams); + +template +struct TwoSizeTest : ::testing::Test {}; +TYPED_TEST_SUITE(TwoSizeTest, TwoSizeTestParams); + +template +bool InlinedVectorInvariants(VecT* vec) { + if (*vec != *vec) return false; + if (vec->size() > vec->capacity()) return false; + if (vec->size() > vec->max_size()) return false; + if (vec->capacity() > vec->max_size()) return false; + if (vec->data() != std::addressof(vec->at(0))) return false; + if (vec->data() != vec->begin()) return false; + if (*vec->data() != *vec->begin()) return false; + if (vec->begin() > vec->end()) return false; + if ((vec->end() - vec->begin()) != vec->size()) return false; + if (std::distance(vec->begin(), vec->end()) != vec->size()) return false; + return true; +} + +// Function that always returns false is correct, but refactoring is required +// for clarity. It's needed to express that, as a contract, certain operations +// should not throw at all. Execution of this function means an exception was +// thrown and thus the test should fail. +// TODO(johnsoncj): Add `testing::NoThrowGuarantee` to the framework +template +bool NoThrowGuarantee(VecT* /* vec */) { + return false; +} + +TYPED_TEST(NoSizeTest, DefaultConstructor) { + using VecT = typename TypeParam::VecT; + using allocator_type = typename VecT::allocator_type; + + testing::TestThrowingCtor(); + + testing::TestThrowingCtor(allocator_type{}); +} + +TYPED_TEST(OneSizeTest, SizeConstructor) { + using VecT = typename TypeParam::VecT; + using allocator_type = typename VecT::allocator_type; + constexpr static auto size = TypeParam::GetSizeAt(0); + + testing::TestThrowingCtor(size); + + testing::TestThrowingCtor(size, allocator_type{}); +} + +TYPED_TEST(OneSizeTest, SizeRefConstructor) { + using VecT = typename TypeParam::VecT; + using value_type = typename VecT::value_type; + using allocator_type = typename VecT::allocator_type; + constexpr static auto size = TypeParam::GetSizeAt(0); + + testing::TestThrowingCtor(size, value_type{}); + + testing::TestThrowingCtor(size, value_type{}, allocator_type{}); +} + +TYPED_TEST(OneSizeTest, InitializerListConstructor) { + using VecT = typename TypeParam::VecT; + using value_type = typename VecT::value_type; + using allocator_type = typename VecT::allocator_type; + constexpr static auto size = TypeParam::GetSizeAt(0); + + testing::TestThrowingCtor( + ABSL_INTERNAL_MAKE_INIT_LIST(value_type, size)); + + testing::TestThrowingCtor( + ABSL_INTERNAL_MAKE_INIT_LIST(value_type, size), allocator_type{}); +} + +TYPED_TEST(OneSizeTest, RangeConstructor) { + using VecT = typename TypeParam::VecT; + using value_type = typename VecT::value_type; + using allocator_type = typename VecT::allocator_type; + constexpr static auto size = TypeParam::GetSizeAt(0); + + std::array arr{}; + + testing::TestThrowingCtor(arr.begin(), arr.end()); + + testing::TestThrowingCtor(arr.begin(), arr.end(), allocator_type{}); +} + +TYPED_TEST(OneSizeTest, CopyConstructor) { + using VecT = typename TypeParam::VecT; + using allocator_type = typename VecT::allocator_type; + constexpr static auto size = TypeParam::GetSizeAt(0); + + VecT other_vec{size}; + + testing::TestThrowingCtor(other_vec); + + testing::TestThrowingCtor(other_vec, allocator_type{}); +} + +TYPED_TEST(OneSizeTest, MoveConstructor) { + using VecT = typename TypeParam::VecT; + using allocator_type = typename VecT::allocator_type; + constexpr static auto size = TypeParam::GetSizeAt(0); + + if (!absl::allocator_is_nothrow::value) { + testing::TestThrowingCtor(VecT{size}); + + testing::TestThrowingCtor(VecT{size}, allocator_type{}); + } +} + +TYPED_TEST(TwoSizeTest, Assign) { + using VecT = typename TypeParam::VecT; + using value_type = typename VecT::value_type; + constexpr static auto from_size = TypeParam::GetSizeAt(0); + constexpr static auto to_size = TypeParam::GetSizeAt(1); + + auto tester = testing::MakeExceptionSafetyTester() + .WithInitialValue(VecT{from_size}) + .WithContracts(InlinedVectorInvariants); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + *vec = ABSL_INTERNAL_MAKE_INIT_LIST(value_type, to_size); + })); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + VecT other_vec{to_size}; + *vec = other_vec; + })); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + VecT other_vec{to_size}; + *vec = std::move(other_vec); + })); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + value_type val{}; + vec->assign(to_size, val); + })); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + vec->assign(ABSL_INTERNAL_MAKE_INIT_LIST(value_type, to_size)); + })); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + std::array arr{}; + vec->assign(arr.begin(), arr.end()); + })); +} + +TYPED_TEST(TwoSizeTest, Resize) { + using VecT = typename TypeParam::VecT; + using value_type = typename VecT::value_type; + constexpr static auto from_size = TypeParam::GetSizeAt(0); + constexpr static auto to_size = TypeParam::GetSizeAt(1); + + auto tester = testing::MakeExceptionSafetyTester() + .WithInitialValue(VecT{from_size}) + .WithContracts(InlinedVectorInvariants, + testing::strong_guarantee); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + vec->resize(to_size); // + })); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + vec->resize(to_size, value_type{}); // + })); +} + +TYPED_TEST(OneSizeTest, Insert) { + using VecT = typename TypeParam::VecT; + using value_type = typename VecT::value_type; + constexpr static auto from_size = TypeParam::GetSizeAt(0); + + auto tester = testing::MakeExceptionSafetyTester() + .WithInitialValue(VecT{from_size}) + .WithContracts(InlinedVectorInvariants); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin(); + vec->insert(it, value_type{}); + })); + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin() + (vec->size() / 2); + vec->insert(it, value_type{}); + })); + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->end(); + vec->insert(it, value_type{}); + })); +} + +TYPED_TEST(TwoSizeTest, Insert) { + using VecT = typename TypeParam::VecT; + using value_type = typename VecT::value_type; + constexpr static auto from_size = TypeParam::GetSizeAt(0); + constexpr static auto count = TypeParam::GetSizeAt(1); + + auto tester = testing::MakeExceptionSafetyTester() + .WithInitialValue(VecT{from_size}) + .WithContracts(InlinedVectorInvariants); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin(); + vec->insert(it, count, value_type{}); + })); + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin() + (vec->size() / 2); + vec->insert(it, count, value_type{}); + })); + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->end(); + vec->insert(it, count, value_type{}); + })); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin(); + vec->insert(it, ABSL_INTERNAL_MAKE_INIT_LIST(value_type, count)); + })); + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin() + (vec->size() / 2); + vec->insert(it, ABSL_INTERNAL_MAKE_INIT_LIST(value_type, count)); + })); + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->end(); + vec->insert(it, ABSL_INTERNAL_MAKE_INIT_LIST(value_type, count)); + })); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin(); + std::array arr{}; + vec->insert(it, arr.begin(), arr.end()); + })); + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin() + (vec->size() / 2); + std::array arr{}; + vec->insert(it, arr.begin(), arr.end()); + })); + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->end(); + std::array arr{}; + vec->insert(it, arr.begin(), arr.end()); + })); +} + +TYPED_TEST(OneSizeTest, EmplaceBack) { + using VecT = typename TypeParam::VecT; + constexpr static auto size = TypeParam::GetSizeAt(0); + + // For testing calls to `emplace_back(...)` that reallocate. + VecT full_vec{size}; + full_vec.resize(full_vec.capacity()); + + // For testing calls to `emplace_back(...)` that don't reallocate. + VecT nonfull_vec{size}; + nonfull_vec.reserve(size + 1); + + auto tester = testing::MakeExceptionSafetyTester().WithContracts( + InlinedVectorInvariants); + + EXPECT_TRUE(tester.WithInitialValue(nonfull_vec).Test([](VecT* vec) { + vec->emplace_back(); + })); + + EXPECT_TRUE(tester.WithInitialValue(full_vec).Test( + [](VecT* vec) { vec->emplace_back(); })); +} + +TYPED_TEST(OneSizeTest, PopBack) { + using VecT = typename TypeParam::VecT; + constexpr static auto size = TypeParam::GetSizeAt(0); + + auto tester = testing::MakeExceptionSafetyTester() + .WithInitialValue(VecT{size}) + .WithContracts(NoThrowGuarantee); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + vec->pop_back(); // + })); +} + +TYPED_TEST(OneSizeTest, Erase) { + using VecT = typename TypeParam::VecT; + constexpr static auto size = TypeParam::GetSizeAt(0); + + auto tester = testing::MakeExceptionSafetyTester() + .WithInitialValue(VecT{size}) + .WithContracts(InlinedVectorInvariants); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin(); + vec->erase(it); + })); + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin() + (vec->size() / 2); + vec->erase(it); + })); + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin() + (vec->size() - 1); + vec->erase(it); + })); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin(); + vec->erase(it, it); + })); + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin() + (vec->size() / 2); + vec->erase(it, it); + })); + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin() + (vec->size() - 1); + vec->erase(it, it); + })); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin(); + vec->erase(it, it + 1); + })); + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin() + (vec->size() / 2); + vec->erase(it, it + 1); + })); + EXPECT_TRUE(tester.Test([](VecT* vec) { + auto it = vec->begin() + (vec->size() - 1); + vec->erase(it, it + 1); + })); +} + +TYPED_TEST(OneSizeTest, Clear) { + using VecT = typename TypeParam::VecT; + constexpr static auto size = TypeParam::GetSizeAt(0); + + auto tester = testing::MakeExceptionSafetyTester() + .WithInitialValue(VecT{size}) + .WithContracts(NoThrowGuarantee); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + vec->clear(); // + })); +} + +TYPED_TEST(TwoSizeTest, Reserve) { + using VecT = typename TypeParam::VecT; + constexpr static auto from_size = TypeParam::GetSizeAt(0); + constexpr static auto to_capacity = TypeParam::GetSizeAt(1); + + auto tester = testing::MakeExceptionSafetyTester() + .WithInitialValue(VecT{from_size}) + .WithContracts(InlinedVectorInvariants); + + EXPECT_TRUE(tester.Test([](VecT* vec) { vec->reserve(to_capacity); })); +} + +TYPED_TEST(OneSizeTest, ShrinkToFit) { + using VecT = typename TypeParam::VecT; + constexpr static auto size = TypeParam::GetSizeAt(0); + + auto tester = testing::MakeExceptionSafetyTester() + .WithInitialValue(VecT{size}) + .WithContracts(InlinedVectorInvariants); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + vec->shrink_to_fit(); // + })); +} + +TYPED_TEST(TwoSizeTest, Swap) { + using VecT = typename TypeParam::VecT; + constexpr static auto from_size = TypeParam::GetSizeAt(0); + constexpr static auto to_size = TypeParam::GetSizeAt(1); + + auto tester = testing::MakeExceptionSafetyTester() + .WithInitialValue(VecT{from_size}) + .WithContracts(InlinedVectorInvariants); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + VecT other_vec{to_size}; + vec->swap(other_vec); + })); + + EXPECT_TRUE(tester.Test([](VecT* vec) { + using std::swap; + VecT other_vec{to_size}; + swap(*vec, other_vec); + })); +} + +} // namespace + +#endif // defined(ABSL_HAVE_EXCEPTIONS) diff --git a/absl/container/inlined_vector_test.cc b/absl/container/inlined_vector_test.cc new file mode 100644 index 0000000..54cd310 --- /dev/null +++ b/absl/container/inlined_vector_test.cc @@ -0,0 +1,2229 @@ +// Copyright 2019 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/inlined_vector.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/attributes.h" +#include "absl/base/internal/exception_testing.h" +#include "absl/base/macros.h" +#include "absl/base/options.h" +#include "absl/container/internal/test_allocator.h" +#include "absl/container/internal/test_instance_tracker.h" +#include "absl/hash/hash_testing.h" +#include "absl/log/check.h" +#include "absl/memory/memory.h" +#include "absl/strings/str_cat.h" + +namespace { + +using absl::container_internal::CountingAllocator; +using absl::test_internal::CopyableMovableInstance; +using absl::test_internal::CopyableOnlyInstance; +using absl::test_internal::InstanceTracker; +using testing::AllOf; +using testing::Each; +using testing::ElementsAre; +using testing::ElementsAreArray; +using testing::Eq; +using testing::Gt; +using testing::Pointee; +using testing::Pointwise; +using testing::PrintToString; +using testing::SizeIs; + +using IntVec = absl::InlinedVector; + +MATCHER_P(CapacityIs, n, "") { + return testing::ExplainMatchResult(n, arg.capacity(), result_listener); +} + +MATCHER_P(ValueIs, e, "") { + return testing::ExplainMatchResult(e, arg.value(), result_listener); +} + +// TODO(bsamwel): Add support for movable-only types. + +// Test fixture for typed tests on BaseCountedInstance derived classes, see +// test_instance_tracker.h. +template +class InstanceTest : public ::testing::Test {}; +TYPED_TEST_SUITE_P(InstanceTest); + +// A simple reference counted class to make sure that the proper elements are +// destroyed in the erase(begin, end) test. +class RefCounted { + public: + RefCounted(int value, int* count) : value_(value), count_(count) { Ref(); } + + RefCounted(const RefCounted& v) : value_(v.value_), count_(v.count_) { + Ref(); + } + + ~RefCounted() { + Unref(); + count_ = nullptr; + } + + friend void swap(RefCounted& a, RefCounted& b) { + using std::swap; + swap(a.value_, b.value_); + swap(a.count_, b.count_); + } + + RefCounted& operator=(RefCounted v) { + using std::swap; + swap(*this, v); + return *this; + } + + void Ref() const { + CHECK_NE(count_, nullptr); + ++(*count_); + } + + void Unref() const { + --(*count_); + CHECK_GE(*count_, 0); + } + + int value_; + int* count_; +}; + +using RefCountedVec = absl::InlinedVector; + +// A class with a vtable pointer +class Dynamic { + public: + virtual ~Dynamic() {} +}; + +using DynamicVec = absl::InlinedVector; + +// Append 0..len-1 to *v +template +static void Fill(Container* v, size_t len, int offset = 0) { + for (size_t i = 0; i < len; i++) { + v->push_back(static_cast(i) + offset); + } +} + +static IntVec Fill(size_t len, int offset = 0) { + IntVec v; + Fill(&v, len, offset); + return v; +} + +TEST(IntVec, SimpleOps) { + for (size_t len = 0; len < 20; len++) { + IntVec v; + const IntVec& cv = v; // const alias + + Fill(&v, len); + EXPECT_EQ(len, v.size()); + EXPECT_LE(len, v.capacity()); + + for (size_t i = 0; i < len; i++) { + EXPECT_EQ(static_cast(i), v[i]); + EXPECT_EQ(static_cast(i), v.at(i)); + } + EXPECT_EQ(v.begin(), v.data()); + EXPECT_EQ(cv.begin(), cv.data()); + + size_t counter = 0; + for (IntVec::iterator iter = v.begin(); iter != v.end(); ++iter) { + EXPECT_EQ(static_cast(counter), *iter); + counter++; + } + EXPECT_EQ(counter, len); + + counter = 0; + for (IntVec::const_iterator iter = v.begin(); iter != v.end(); ++iter) { + EXPECT_EQ(static_cast(counter), *iter); + counter++; + } + EXPECT_EQ(counter, len); + + counter = 0; + for (IntVec::const_iterator iter = v.cbegin(); iter != v.cend(); ++iter) { + EXPECT_EQ(static_cast(counter), *iter); + counter++; + } + EXPECT_EQ(counter, len); + + if (len > 0) { + EXPECT_EQ(0, v.front()); + EXPECT_EQ(static_cast(len - 1), v.back()); + v.pop_back(); + EXPECT_EQ(len - 1, v.size()); + for (size_t i = 0; i < v.size(); ++i) { + EXPECT_EQ(static_cast(i), v[i]); + EXPECT_EQ(static_cast(i), v.at(i)); + } + } + } +} + +TEST(IntVec, PopBackNoOverflow) { + IntVec v = {1}; + v.pop_back(); + EXPECT_EQ(v.size(), 0u); +} + +TEST(IntVec, AtThrows) { + IntVec v = {1, 2, 3}; + EXPECT_EQ(v.at(2), 3); + ABSL_BASE_INTERNAL_EXPECT_FAIL(v.at(3), std::out_of_range, + "failed bounds check"); +} + +TEST(IntVec, ReverseIterator) { + for (size_t len = 0; len < 20; len++) { + IntVec v; + Fill(&v, len); + + size_t counter = len; + for (IntVec::reverse_iterator iter = v.rbegin(); iter != v.rend(); ++iter) { + counter--; + EXPECT_EQ(static_cast(counter), *iter); + } + EXPECT_EQ(counter, 0u); + + counter = len; + for (IntVec::const_reverse_iterator iter = v.rbegin(); iter != v.rend(); + ++iter) { + counter--; + EXPECT_EQ(static_cast(counter), *iter); + } + EXPECT_EQ(counter, 0u); + + counter = len; + for (IntVec::const_reverse_iterator iter = v.crbegin(); iter != v.crend(); + ++iter) { + counter--; + EXPECT_EQ(static_cast(counter), *iter); + } + EXPECT_EQ(counter, 0u); + } +} + +TEST(IntVec, Erase) { + for (size_t len = 1; len < 20; len++) { + for (size_t i = 0; i < len; ++i) { + IntVec v; + Fill(&v, len); + v.erase(v.begin() + i); + EXPECT_EQ(len - 1, v.size()); + for (size_t j = 0; j < i; ++j) { + EXPECT_EQ(static_cast(j), v[j]); + } + for (size_t j = i; j < len - 1; ++j) { + EXPECT_EQ(static_cast(j + 1), v[j]); + } + } + } +} + +TEST(IntVec, Hardened) { + IntVec v; + Fill(&v, 10); + EXPECT_EQ(v[9], 9); +#if !defined(NDEBUG) || ABSL_OPTION_HARDENED + EXPECT_DEATH_IF_SUPPORTED(v[10], ""); + EXPECT_DEATH_IF_SUPPORTED(v[static_cast(-1)], ""); + EXPECT_DEATH_IF_SUPPORTED(v.resize(v.max_size() + 1), ""); +#endif +} + +// Move construction of a container of unique pointers should work fine, with no +// leaks, despite the fact that unique pointers are trivially relocatable but +// not trivially destructible. +TEST(UniquePtr, MoveConstruct) { + for (size_t size = 0; size < 16; ++size) { + SCOPED_TRACE(size); + + absl::InlinedVector, 2> a; + for (size_t i = 0; i < size; ++i) { + a.push_back(std::make_unique(i)); + } + + absl::InlinedVector, 2> b(std::move(a)); + + ASSERT_THAT(b, SizeIs(size)); + for (size_t i = 0; i < size; ++i) { + ASSERT_THAT(b[i], Pointee(i)); + } + } +} + +// Move assignment of a container of unique pointers should work fine, with no +// leaks, despite the fact that unique pointers are trivially relocatable but +// not trivially destructible. +TEST(UniquePtr, MoveAssign) { + for (size_t size = 0; size < 16; ++size) { + SCOPED_TRACE(size); + + absl::InlinedVector, 2> a; + for (size_t i = 0; i < size; ++i) { + a.push_back(std::make_unique(i)); + } + + absl::InlinedVector, 2> b; + b = std::move(a); + + ASSERT_THAT(b, SizeIs(size)); + for (size_t i = 0; i < size; ++i) { + ASSERT_THAT(b[i], Pointee(i)); + } + } +} + +// Swapping containers of unique pointers should work fine, with no +// leaks, despite the fact that unique pointers are trivially relocatable but +// not trivially destructible. +// TODO(absl-team): Using unique_ptr here is technically correct, but +// a trivially relocatable struct would be less semantically confusing. +TEST(UniquePtr, Swap) { + for (size_t size1 = 0; size1 < 5; ++size1) { + for (size_t size2 = 0; size2 < 5; ++size2) { + absl::InlinedVector, 2> a; + absl::InlinedVector, 2> b; + for (size_t i = 0; i < size1; ++i) { + a.push_back(std::make_unique(i + 10)); + } + for (size_t i = 0; i < size2; ++i) { + b.push_back(std::make_unique(i + 20)); + } + a.swap(b); + ASSERT_THAT(a, SizeIs(size2)); + ASSERT_THAT(b, SizeIs(size1)); + for (size_t i = 0; i < a.size(); ++i) { + ASSERT_THAT(a[i], Pointee(i + 20)); + } + for (size_t i = 0; i < b.size(); ++i) { + ASSERT_THAT(b[i], Pointee(i + 10)); + } + } + } +} + +// Erasing from a container of unique pointers should work fine, with no +// leaks, despite the fact that unique pointers are trivially relocatable but +// not trivially destructible. +// TODO(absl-team): Using unique_ptr here is technically correct, but +// a trivially relocatable struct would be less semantically confusing. +TEST(UniquePtr, EraseSingle) { + for (size_t size = 4; size < 16; ++size) { + absl::InlinedVector, 8> a; + for (size_t i = 0; i < size; ++i) { + a.push_back(std::make_unique(i)); + } + a.erase(a.begin()); + ASSERT_THAT(a, SizeIs(size - 1)); + for (size_t i = 0; i < size - 1; ++i) { + ASSERT_THAT(a[i], Pointee(i + 1)); + } + a.erase(a.begin() + 2); + ASSERT_THAT(a, SizeIs(size - 2)); + ASSERT_THAT(a[0], Pointee(1)); + ASSERT_THAT(a[1], Pointee(2)); + for (size_t i = 2; i < size - 2; ++i) { + ASSERT_THAT(a[i], Pointee(i + 2)); + } + } +} + +// Erasing from a container of unique pointers should work fine, with no +// leaks, despite the fact that unique pointers are trivially relocatable but +// not trivially destructible. +// TODO(absl-team): Using unique_ptr here is technically correct, but +// a trivially relocatable struct would be less semantically confusing. +TEST(UniquePtr, EraseMulti) { + for (size_t size = 5; size < 16; ++size) { + absl::InlinedVector, 8> a; + for (size_t i = 0; i < size; ++i) { + a.push_back(std::make_unique(i)); + } + a.erase(a.begin(), a.begin() + 2); + ASSERT_THAT(a, SizeIs(size - 2)); + for (size_t i = 0; i < size - 2; ++i) { + ASSERT_THAT(a[i], Pointee(i + 2)); + } + a.erase(a.begin() + 1, a.begin() + 3); + ASSERT_THAT(a, SizeIs(size - 4)); + ASSERT_THAT(a[0], Pointee(2)); + for (size_t i = 1; i < size - 4; ++i) { + ASSERT_THAT(a[i], Pointee(i + 4)); + } + } +} + +// At the end of this test loop, the elements between [erase_begin, erase_end) +// should have reference counts == 0, and all others elements should have +// reference counts == 1. +TEST(RefCountedVec, EraseBeginEnd) { + for (size_t len = 1; len < 20; ++len) { + for (size_t erase_begin = 0; erase_begin < len; ++erase_begin) { + for (size_t erase_end = erase_begin; erase_end <= len; ++erase_end) { + std::vector counts(len, 0); + RefCountedVec v; + for (size_t i = 0; i < len; ++i) { + v.push_back(RefCounted(static_cast(i), &counts[i])); + } + + size_t erase_len = erase_end - erase_begin; + + v.erase(v.begin() + erase_begin, v.begin() + erase_end); + + EXPECT_EQ(len - erase_len, v.size()); + + // Check the elements before the first element erased. + for (size_t i = 0; i < erase_begin; ++i) { + EXPECT_EQ(static_cast(i), v[i].value_); + } + + // Check the elements after the first element erased. + for (size_t i = erase_begin; i < v.size(); ++i) { + EXPECT_EQ(static_cast(i + erase_len), v[i].value_); + } + + // Check that the elements at the beginning are preserved. + for (size_t i = 0; i < erase_begin; ++i) { + EXPECT_EQ(1, counts[i]); + } + + // Check that the erased elements are destroyed + for (size_t i = erase_begin; i < erase_end; ++i) { + EXPECT_EQ(0, counts[i]); + } + + // Check that the elements at the end are preserved. + for (size_t i = erase_end; i < len; ++i) { + EXPECT_EQ(1, counts[i]); + } + } + } + } +} + +struct NoDefaultCtor { + explicit NoDefaultCtor(int) {} +}; +struct NoCopy { + NoCopy() {} + NoCopy(const NoCopy&) = delete; +}; +struct NoAssign { + NoAssign() {} + NoAssign& operator=(const NoAssign&) = delete; +}; +struct MoveOnly { + MoveOnly() {} + MoveOnly(MoveOnly&&) = default; + MoveOnly& operator=(MoveOnly&&) = default; +}; +TEST(InlinedVectorTest, NoDefaultCtor) { + absl::InlinedVector v(10, NoDefaultCtor(2)); + (void)v; +} +TEST(InlinedVectorTest, NoCopy) { + absl::InlinedVector v(10); + (void)v; +} +TEST(InlinedVectorTest, NoAssign) { + absl::InlinedVector v(10); + (void)v; +} +TEST(InlinedVectorTest, MoveOnly) { + absl::InlinedVector v; + v.push_back(MoveOnly{}); + v.push_back(MoveOnly{}); + v.push_back(MoveOnly{}); + v.erase(v.begin()); + v.push_back(MoveOnly{}); + v.erase(v.begin(), v.begin() + 1); + v.insert(v.begin(), MoveOnly{}); + v.emplace(v.begin()); + v.emplace(v.begin(), MoveOnly{}); +} +TEST(InlinedVectorTest, Noexcept) { + EXPECT_TRUE(std::is_nothrow_move_constructible::value); + EXPECT_TRUE((std::is_nothrow_move_constructible< + absl::InlinedVector>::value)); + + struct MoveCanThrow { + MoveCanThrow(MoveCanThrow&&) {} + }; + EXPECT_EQ(absl::default_allocator_is_nothrow::value, + (std::is_nothrow_move_constructible< + absl::InlinedVector>::value)); +} + +TEST(InlinedVectorTest, EmplaceBack) { + absl::InlinedVector, 1> v; + + auto& inlined_element = v.emplace_back("answer", 42); + EXPECT_EQ(&inlined_element, &v[0]); + EXPECT_EQ(inlined_element.first, "answer"); + EXPECT_EQ(inlined_element.second, 42); + + auto& allocated_element = v.emplace_back("taxicab", 1729); + EXPECT_EQ(&allocated_element, &v[1]); + EXPECT_EQ(allocated_element.first, "taxicab"); + EXPECT_EQ(allocated_element.second, 1729); +} + +TEST(InlinedVectorTest, ShrinkToFitGrowingVector) { + absl::InlinedVector, 1> v; + + v.shrink_to_fit(); + EXPECT_EQ(v.capacity(), 1u); + + v.emplace_back("answer", 42); + v.shrink_to_fit(); + EXPECT_EQ(v.capacity(), 1u); + + v.emplace_back("taxicab", 1729); + EXPECT_GE(v.capacity(), 2u); + v.shrink_to_fit(); + EXPECT_EQ(v.capacity(), 2u); + + v.reserve(100); + EXPECT_GE(v.capacity(), 100u); + v.shrink_to_fit(); + EXPECT_EQ(v.capacity(), 2u); +} + +TEST(InlinedVectorTest, ShrinkToFitEdgeCases) { + { + absl::InlinedVector, 1> v; + v.emplace_back("answer", 42); + v.emplace_back("taxicab", 1729); + EXPECT_GE(v.capacity(), 2u); + v.pop_back(); + v.shrink_to_fit(); + EXPECT_EQ(v.capacity(), 1u); + EXPECT_EQ(v[0].first, "answer"); + EXPECT_EQ(v[0].second, 42); + } + + { + absl::InlinedVector v(100); + v.resize(0); + v.shrink_to_fit(); + EXPECT_EQ(v.capacity(), 2u); // inlined capacity + } + + { + absl::InlinedVector v(100); + v.resize(1); + v.shrink_to_fit(); + EXPECT_EQ(v.capacity(), 2u); // inlined capacity + } + + { + absl::InlinedVector v(100); + v.resize(2); + v.shrink_to_fit(); + EXPECT_EQ(v.capacity(), 2u); + } + + { + absl::InlinedVector v(100); + v.resize(3); + v.shrink_to_fit(); + EXPECT_EQ(v.capacity(), 3u); + } +} + +TEST(IntVec, Insert) { + for (size_t len = 0; len < 20; len++) { + for (ptrdiff_t pos = 0; pos <= static_cast(len); pos++) { + { + // Single element + std::vector std_v; + Fill(&std_v, len); + IntVec v; + Fill(&v, len); + + std_v.insert(std_v.begin() + pos, 9999); + IntVec::iterator it = v.insert(v.cbegin() + pos, 9999); + EXPECT_THAT(v, ElementsAreArray(std_v)); + EXPECT_EQ(it, v.cbegin() + pos); + } + { + // n elements + std::vector std_v; + Fill(&std_v, len); + IntVec v; + Fill(&v, len); + + IntVec::size_type n = 5; + std_v.insert(std_v.begin() + pos, n, 9999); + IntVec::iterator it = v.insert(v.cbegin() + pos, n, 9999); + EXPECT_THAT(v, ElementsAreArray(std_v)); + EXPECT_EQ(it, v.cbegin() + pos); + } + { + // Iterator range (random access iterator) + std::vector std_v; + Fill(&std_v, len); + IntVec v; + Fill(&v, len); + + const std::vector input = {9999, 8888, 7777}; + std_v.insert(std_v.begin() + pos, input.cbegin(), input.cend()); + IntVec::iterator it = + v.insert(v.cbegin() + pos, input.cbegin(), input.cend()); + EXPECT_THAT(v, ElementsAreArray(std_v)); + EXPECT_EQ(it, v.cbegin() + pos); + } + { + // Iterator range (forward iterator) + std::vector std_v; + Fill(&std_v, len); + IntVec v; + Fill(&v, len); + + const std::forward_list input = {9999, 8888, 7777}; + std_v.insert(std_v.begin() + pos, input.cbegin(), input.cend()); + IntVec::iterator it = + v.insert(v.cbegin() + pos, input.cbegin(), input.cend()); + EXPECT_THAT(v, ElementsAreArray(std_v)); + EXPECT_EQ(it, v.cbegin() + pos); + } + { + // Iterator range (input iterator) + std::vector std_v; + Fill(&std_v, len); + IntVec v; + Fill(&v, len); + + std_v.insert(std_v.begin() + pos, {9999, 8888, 7777}); + std::istringstream input("9999 8888 7777"); + IntVec::iterator it = + v.insert(v.cbegin() + pos, std::istream_iterator(input), + std::istream_iterator()); + EXPECT_THAT(v, ElementsAreArray(std_v)); + EXPECT_EQ(it, v.cbegin() + pos); + } + { + // Initializer list + std::vector std_v; + Fill(&std_v, len); + IntVec v; + Fill(&v, len); + + std_v.insert(std_v.begin() + pos, {9999, 8888}); + IntVec::iterator it = v.insert(v.cbegin() + pos, {9999, 8888}); + EXPECT_THAT(v, ElementsAreArray(std_v)); + EXPECT_EQ(it, v.cbegin() + pos); + } + } + } +} + +TEST(RefCountedVec, InsertConstructorDestructor) { + // Make sure the proper construction/destruction happen during insert + // operations. + for (size_t len = 0; len < 20; len++) { + SCOPED_TRACE(len); + for (size_t pos = 0; pos <= len; pos++) { + SCOPED_TRACE(pos); + std::vector counts(len, 0); + int inserted_count = 0; + RefCountedVec v; + for (size_t i = 0; i < len; ++i) { + SCOPED_TRACE(i); + v.push_back(RefCounted(static_cast(i), &counts[i])); + } + + EXPECT_THAT(counts, Each(Eq(1))); + + RefCounted insert_element(9999, &inserted_count); + EXPECT_EQ(1, inserted_count); + v.insert(v.begin() + pos, insert_element); + EXPECT_EQ(2, inserted_count); + // Check that the elements at the end are preserved. + EXPECT_THAT(counts, Each(Eq(1))); + EXPECT_EQ(2, inserted_count); + } + } +} + +TEST(IntVec, Resize) { + for (size_t len = 0; len < 20; len++) { + IntVec v; + Fill(&v, len); + + // Try resizing up and down by k elements + static const int kResizeElem = 1000000; + for (size_t k = 0; k < 10; k++) { + // Enlarging resize + v.resize(len + k, kResizeElem); + EXPECT_EQ(len + k, v.size()); + EXPECT_LE(len + k, v.capacity()); + for (size_t i = 0; i < len + k; i++) { + if (i < len) { + EXPECT_EQ(static_cast(i), v[i]); + } else { + EXPECT_EQ(kResizeElem, v[i]); + } + } + + // Shrinking resize + v.resize(len, kResizeElem); + EXPECT_EQ(len, v.size()); + EXPECT_LE(len, v.capacity()); + for (size_t i = 0; i < len; i++) { + EXPECT_EQ(static_cast(i), v[i]); + } + } + } +} + +TEST(IntVec, InitWithLength) { + for (size_t len = 0; len < 20; len++) { + IntVec v(len, 7); + EXPECT_EQ(len, v.size()); + EXPECT_LE(len, v.capacity()); + for (size_t i = 0; i < len; i++) { + EXPECT_EQ(7, v[i]); + } + } +} + +TEST(IntVec, CopyConstructorAndAssignment) { + for (size_t len = 0; len < 20; len++) { + IntVec v; + Fill(&v, len); + EXPECT_EQ(len, v.size()); + EXPECT_LE(len, v.capacity()); + + IntVec v2(v); + EXPECT_TRUE(v == v2) << PrintToString(v) << PrintToString(v2); + + for (size_t start_len = 0; start_len < 20; start_len++) { + IntVec v3; + Fill(&v3, start_len, 99); // Add dummy elements that should go away + v3 = v; + EXPECT_TRUE(v == v3) << PrintToString(v) << PrintToString(v3); + } + } +} + +TEST(IntVec, AliasingCopyAssignment) { + for (size_t len = 0; len < 20; ++len) { + IntVec original; + Fill(&original, len); + IntVec dup = original; + dup = *&dup; + EXPECT_EQ(dup, original); + } +} + +TEST(IntVec, MoveConstructorAndAssignment) { + for (size_t len = 0; len < 20; len++) { + IntVec v_in; + const size_t inlined_capacity = v_in.capacity(); + Fill(&v_in, len); + EXPECT_EQ(len, v_in.size()); + EXPECT_LE(len, v_in.capacity()); + + { + IntVec v_temp(v_in); + auto* old_data = v_temp.data(); + IntVec v_out(std::move(v_temp)); + EXPECT_TRUE(v_in == v_out) << PrintToString(v_in) << PrintToString(v_out); + if (v_in.size() > inlined_capacity) { + // Allocation is moved as a whole, data stays in place. + EXPECT_TRUE(v_out.data() == old_data); + } else { + EXPECT_FALSE(v_out.data() == old_data); + } + } + for (size_t start_len = 0; start_len < 20; start_len++) { + IntVec v_out; + Fill(&v_out, start_len, 99); // Add dummy elements that should go away + IntVec v_temp(v_in); + auto* old_data = v_temp.data(); + v_out = std::move(v_temp); + EXPECT_TRUE(v_in == v_out) << PrintToString(v_in) << PrintToString(v_out); + if (v_in.size() > inlined_capacity) { + // Allocation is moved as a whole, data stays in place. + EXPECT_TRUE(v_out.data() == old_data); + } else { + EXPECT_FALSE(v_out.data() == old_data); + } + } + } +} + +class NotTriviallyDestructible { + public: + NotTriviallyDestructible() : p_(new int(1)) {} + explicit NotTriviallyDestructible(int i) : p_(new int(i)) {} + + NotTriviallyDestructible(const NotTriviallyDestructible& other) + : p_(new int(*other.p_)) {} + + NotTriviallyDestructible& operator=(const NotTriviallyDestructible& other) { + p_ = absl::make_unique(*other.p_); + return *this; + } + + bool operator==(const NotTriviallyDestructible& other) const { + return *p_ == *other.p_; + } + + private: + std::unique_ptr p_; +}; + +TEST(AliasingTest, Emplace) { + for (size_t i = 2; i < 20; ++i) { + absl::InlinedVector vec; + for (size_t j = 0; j < i; ++j) { + vec.push_back(NotTriviallyDestructible(static_cast(j))); + } + vec.emplace(vec.begin(), vec[0]); + EXPECT_EQ(vec[0], vec[1]); + vec.emplace(vec.begin() + i / 2, vec[i / 2]); + EXPECT_EQ(vec[i / 2], vec[i / 2 + 1]); + vec.emplace(vec.end() - 1, vec.back()); + EXPECT_EQ(vec[vec.size() - 2], vec.back()); + } +} + +TEST(AliasingTest, InsertWithCount) { + for (size_t i = 1; i < 20; ++i) { + absl::InlinedVector vec; + for (size_t j = 0; j < i; ++j) { + vec.push_back(NotTriviallyDestructible(static_cast(j))); + } + for (size_t n = 0; n < 5; ++n) { + // We use back where we can because it's guaranteed to become invalidated + vec.insert(vec.begin(), n, vec.back()); + auto b = vec.begin(); + EXPECT_TRUE( + std::all_of(b, b + n, [&vec](const NotTriviallyDestructible& x) { + return x == vec.back(); + })); + + auto m_idx = vec.size() / 2; + vec.insert(vec.begin() + m_idx, n, vec.back()); + auto m = vec.begin() + m_idx; + EXPECT_TRUE( + std::all_of(m, m + n, [&vec](const NotTriviallyDestructible& x) { + return x == vec.back(); + })); + + // We want distinct values so the equality test is meaningful, + // vec[vec.size() - 1] is also almost always invalidated. + auto old_e = vec.size() - 1; + auto val = vec[old_e]; + vec.insert(vec.end(), n, vec[old_e]); + auto e = vec.begin() + old_e; + EXPECT_TRUE(std::all_of( + e, e + n, + [&val](const NotTriviallyDestructible& x) { return x == val; })); + } + } +} + +TEST(OverheadTest, Storage) { + // Check for size overhead. + // In particular, ensure that std::allocator doesn't cost anything to store. + // The union should be absorbing some of the allocation bookkeeping overhead + // in the larger vectors, leaving only the size_ field as overhead. + + struct T { + void* val; + }; + size_t expected_overhead = sizeof(T); + + EXPECT_EQ((2 * expected_overhead), + sizeof(absl::InlinedVector) - sizeof(T[1])); + EXPECT_EQ(expected_overhead, + sizeof(absl::InlinedVector) - sizeof(T[2])); + EXPECT_EQ(expected_overhead, + sizeof(absl::InlinedVector) - sizeof(T[3])); + EXPECT_EQ(expected_overhead, + sizeof(absl::InlinedVector) - sizeof(T[4])); + EXPECT_EQ(expected_overhead, + sizeof(absl::InlinedVector) - sizeof(T[5])); + EXPECT_EQ(expected_overhead, + sizeof(absl::InlinedVector) - sizeof(T[6])); + EXPECT_EQ(expected_overhead, + sizeof(absl::InlinedVector) - sizeof(T[7])); + EXPECT_EQ(expected_overhead, + sizeof(absl::InlinedVector) - sizeof(T[8])); +} + +TEST(IntVec, Clear) { + for (size_t len = 0; len < 20; len++) { + SCOPED_TRACE(len); + IntVec v; + Fill(&v, len); + v.clear(); + EXPECT_EQ(0u, v.size()); + EXPECT_EQ(v.begin(), v.end()); + } +} + +TEST(IntVec, Reserve) { + for (size_t len = 0; len < 20; len++) { + IntVec v; + Fill(&v, len); + + for (size_t newlen = 0; newlen < 100; newlen++) { + const int* start_rep = v.data(); + v.reserve(newlen); + const int* final_rep = v.data(); + if (newlen <= len) { + EXPECT_EQ(start_rep, final_rep); + } + EXPECT_LE(newlen, v.capacity()); + + // Filling up to newlen should not change rep + while (v.size() < newlen) { + v.push_back(0); + } + EXPECT_EQ(final_rep, v.data()); + } + } +} + +TEST(StringVec, SelfRefPushBack) { + std::vector std_v; + absl::InlinedVector v; + const std::string s = "A quite long string to ensure heap."; + std_v.push_back(s); + v.push_back(s); + for (int i = 0; i < 20; ++i) { + EXPECT_THAT(v, ElementsAreArray(std_v)); + + v.push_back(v.back()); + std_v.push_back(std_v.back()); + } + EXPECT_THAT(v, ElementsAreArray(std_v)); +} + +TEST(StringVec, SelfRefPushBackWithMove) { + std::vector std_v; + absl::InlinedVector v; + const std::string s = "A quite long string to ensure heap."; + std_v.push_back(s); + v.push_back(s); + for (int i = 0; i < 20; ++i) { + EXPECT_EQ(v.back(), std_v.back()); + + v.push_back(std::move(v.back())); + std_v.push_back(std::move(std_v.back())); + } + EXPECT_EQ(v.back(), std_v.back()); +} + +TEST(StringVec, SelfMove) { + const std::string s = "A quite long string to ensure heap."; + for (int len = 0; len < 20; len++) { + SCOPED_TRACE(len); + absl::InlinedVector v; + for (int i = 0; i < len; ++i) { + SCOPED_TRACE(i); + v.push_back(s); + } + // Indirection necessary to avoid compiler warning. + v = std::move(*(&v)); + // Ensure that the inlined vector is still in a valid state by copying it. + // We don't expect specific contents since a self-move results in an + // unspecified valid state. + std::vector copy(v.begin(), v.end()); + } +} + +TEST(IntVec, Swap) { + for (size_t l1 = 0; l1 < 20; l1++) { + SCOPED_TRACE(l1); + for (size_t l2 = 0; l2 < 20; l2++) { + SCOPED_TRACE(l2); + IntVec a = Fill(l1, 0); + IntVec b = Fill(l2, 100); + { + using std::swap; + swap(a, b); + } + EXPECT_EQ(l1, b.size()); + EXPECT_EQ(l2, a.size()); + for (size_t i = 0; i < l1; i++) { + SCOPED_TRACE(i); + EXPECT_EQ(static_cast(i), b[i]); + } + for (size_t i = 0; i < l2; i++) { + SCOPED_TRACE(i); + EXPECT_EQ(100 + static_cast(i), a[i]); + } + } + } +} + +TYPED_TEST_P(InstanceTest, Swap) { + using Instance = TypeParam; + using InstanceVec = absl::InlinedVector; + for (size_t l1 = 0; l1 < 20; l1++) { + SCOPED_TRACE(l1); + for (size_t l2 = 0; l2 < 20; l2++) { + SCOPED_TRACE(l2); + InstanceTracker tracker; + InstanceVec a, b; + const size_t inlined_capacity = a.capacity(); + auto min_len = std::min(l1, l2); + auto max_len = std::max(l1, l2); + for (size_t i = 0; i < l1; i++) + a.push_back(Instance(static_cast(i))); + for (size_t i = 0; i < l2; i++) + b.push_back(Instance(100 + static_cast(i))); + EXPECT_EQ(tracker.instances(), static_cast(l1 + l2)); + tracker.ResetCopiesMovesSwaps(); + { + using std::swap; + swap(a, b); + } + EXPECT_EQ(tracker.instances(), static_cast(l1 + l2)); + if (a.size() > inlined_capacity && b.size() > inlined_capacity) { + EXPECT_EQ(tracker.swaps(), 0); // Allocations are swapped. + EXPECT_EQ(tracker.moves(), 0); + } else if (a.size() <= inlined_capacity && b.size() <= inlined_capacity) { + EXPECT_EQ(tracker.swaps(), static_cast(min_len)); + EXPECT_EQ((tracker.moves() ? tracker.moves() : tracker.copies()), + static_cast(max_len - min_len)); + } else { + // One is allocated and the other isn't. The allocation is transferred + // without copying elements, and the inlined instances are copied/moved. + EXPECT_EQ(tracker.swaps(), 0); + EXPECT_EQ((tracker.moves() ? tracker.moves() : tracker.copies()), + static_cast(min_len)); + } + + EXPECT_EQ(l1, b.size()); + EXPECT_EQ(l2, a.size()); + for (size_t i = 0; i < l1; i++) { + EXPECT_EQ(static_cast(i), b[i].value()); + } + for (size_t i = 0; i < l2; i++) { + EXPECT_EQ(100 + static_cast(i), a[i].value()); + } + } + } +} + +TEST(IntVec, EqualAndNotEqual) { + IntVec a, b; + EXPECT_TRUE(a == b); + EXPECT_FALSE(a != b); + + a.push_back(3); + EXPECT_FALSE(a == b); + EXPECT_TRUE(a != b); + + b.push_back(3); + EXPECT_TRUE(a == b); + EXPECT_FALSE(a != b); + + b.push_back(7); + EXPECT_FALSE(a == b); + EXPECT_TRUE(a != b); + + a.push_back(6); + EXPECT_FALSE(a == b); + EXPECT_TRUE(a != b); + + a.clear(); + b.clear(); + for (size_t i = 0; i < 100; i++) { + a.push_back(static_cast(i)); + b.push_back(static_cast(i)); + EXPECT_TRUE(a == b); + EXPECT_FALSE(a != b); + + b[i] = b[i] + 1; + EXPECT_FALSE(a == b); + EXPECT_TRUE(a != b); + + b[i] = b[i] - 1; // Back to before + EXPECT_TRUE(a == b); + EXPECT_FALSE(a != b); + } +} + +TEST(IntVec, RelationalOps) { + IntVec a, b; + EXPECT_FALSE(a < b); + EXPECT_FALSE(b < a); + EXPECT_FALSE(a > b); + EXPECT_FALSE(b > a); + EXPECT_TRUE(a <= b); + EXPECT_TRUE(b <= a); + EXPECT_TRUE(a >= b); + EXPECT_TRUE(b >= a); + b.push_back(3); + EXPECT_TRUE(a < b); + EXPECT_FALSE(b < a); + EXPECT_FALSE(a > b); + EXPECT_TRUE(b > a); + EXPECT_TRUE(a <= b); + EXPECT_FALSE(b <= a); + EXPECT_FALSE(a >= b); + EXPECT_TRUE(b >= a); +} + +TYPED_TEST_P(InstanceTest, CountConstructorsDestructors) { + using Instance = TypeParam; + using InstanceVec = absl::InlinedVector; + InstanceTracker tracker; + for (size_t len = 0; len < 20; len++) { + SCOPED_TRACE(len); + tracker.ResetCopiesMovesSwaps(); + + InstanceVec v; + const size_t inlined_capacity = v.capacity(); + for (size_t i = 0; i < len; i++) { + v.push_back(Instance(static_cast(i))); + } + EXPECT_EQ(tracker.instances(), static_cast(len)); + EXPECT_GE(tracker.copies() + tracker.moves(), + static_cast(len)); // More due to reallocation. + tracker.ResetCopiesMovesSwaps(); + + // Enlarging resize() must construct some objects + tracker.ResetCopiesMovesSwaps(); + v.resize(len + 10, Instance(100)); + EXPECT_EQ(tracker.instances(), static_cast(len) + 10); + if (len <= inlined_capacity && len + 10 > inlined_capacity) { + EXPECT_EQ(tracker.copies() + tracker.moves(), 10 + static_cast(len)); + } else { + // Only specify a minimum number of copies + moves. We don't want to + // depend on the reallocation policy here. + EXPECT_GE(tracker.copies() + tracker.moves(), + 10); // More due to reallocation. + } + + // Shrinking resize() must destroy some objects + tracker.ResetCopiesMovesSwaps(); + v.resize(len, Instance(100)); + EXPECT_EQ(tracker.instances(), static_cast(len)); + EXPECT_EQ(tracker.copies(), 0); + EXPECT_EQ(tracker.moves(), 0); + + // reserve() must not increase the number of initialized objects + SCOPED_TRACE("reserve"); + v.reserve(len + 1000); + EXPECT_EQ(tracker.instances(), static_cast(len)); + EXPECT_EQ(tracker.copies() + tracker.moves(), static_cast(len)); + + // pop_back() and erase() must destroy one object + if (len > 0) { + tracker.ResetCopiesMovesSwaps(); + v.pop_back(); + EXPECT_EQ(tracker.instances(), static_cast(len) - 1); + EXPECT_EQ(tracker.copies(), 0); + EXPECT_EQ(tracker.moves(), 0); + + if (!v.empty()) { + tracker.ResetCopiesMovesSwaps(); + v.erase(v.begin()); + EXPECT_EQ(tracker.instances(), static_cast(len) - 2); + EXPECT_EQ(tracker.copies() + tracker.moves(), + static_cast(len) - 2); + } + } + + tracker.ResetCopiesMovesSwaps(); + int instances_before_empty_erase = tracker.instances(); + v.erase(v.begin(), v.begin()); + EXPECT_EQ(tracker.instances(), instances_before_empty_erase); + EXPECT_EQ(tracker.copies() + tracker.moves(), 0); + } +} + +TYPED_TEST_P(InstanceTest, CountConstructorsDestructorsOnCopyConstruction) { + using Instance = TypeParam; + using InstanceVec = absl::InlinedVector; + InstanceTracker tracker; + for (int len = 0; len < 20; len++) { + SCOPED_TRACE(len); + tracker.ResetCopiesMovesSwaps(); + + InstanceVec v; + for (int i = 0; i < len; i++) { + v.push_back(Instance(i)); + } + EXPECT_EQ(tracker.instances(), len); + EXPECT_GE(tracker.copies() + tracker.moves(), + len); // More due to reallocation. + tracker.ResetCopiesMovesSwaps(); + { // Copy constructor should create 'len' more instances. + InstanceVec v_copy(v); + EXPECT_EQ(v_copy.size(), v.size()); + EXPECT_EQ(tracker.instances(), len + len); + EXPECT_EQ(tracker.copies(), len); + EXPECT_EQ(tracker.moves(), 0); + } + EXPECT_EQ(tracker.instances(), len); + } +} + +TYPED_TEST_P(InstanceTest, CountConstructorsDestructorsOnMoveConstruction) { + using Instance = TypeParam; + using InstanceVec = absl::InlinedVector; + InstanceTracker tracker; + for (int len = 0; len < 20; len++) { + SCOPED_TRACE(len); + tracker.ResetCopiesMovesSwaps(); + + InstanceVec v; + const size_t inlined_capacity = v.capacity(); + for (int i = 0; i < len; i++) { + v.push_back(Instance(i)); + } + EXPECT_EQ(tracker.instances(), len); + EXPECT_GE(tracker.copies() + tracker.moves(), + len); // More due to reallocation. + tracker.ResetCopiesMovesSwaps(); + { + InstanceVec v_copy(std::move(v)); + EXPECT_EQ(v_copy.size(), len); + if (static_cast(len) > inlined_capacity) { + // Allocation is moved as a whole. + EXPECT_EQ(tracker.instances(), len); + EXPECT_EQ(tracker.live_instances(), len); + // Tests an implementation detail, don't rely on this in your code. + EXPECT_EQ(v.size(), 0u); // NOLINT misc-use-after-move + EXPECT_EQ(tracker.copies(), 0); + EXPECT_EQ(tracker.moves(), 0); + } else { + EXPECT_EQ(tracker.instances(), len + len); + if (Instance::supports_move()) { + EXPECT_EQ(tracker.live_instances(), len); + EXPECT_EQ(tracker.copies(), 0); + EXPECT_EQ(tracker.moves(), len); + } else { + EXPECT_EQ(tracker.live_instances(), len + len); + EXPECT_EQ(tracker.copies(), len); + EXPECT_EQ(tracker.moves(), 0); + } + } + EXPECT_EQ(tracker.swaps(), 0); + } + } +} + +TYPED_TEST_P(InstanceTest, CountConstructorsDestructorsOnAssignment) { + using Instance = TypeParam; + using InstanceVec = absl::InlinedVector; + InstanceTracker tracker; + for (int len = 0; len < 20; len++) { + SCOPED_TRACE(len); + for (int longorshort = 0; longorshort <= 1; ++longorshort) { + SCOPED_TRACE(longorshort); + tracker.ResetCopiesMovesSwaps(); + + InstanceVec longer, shorter; + for (int i = 0; i < len; i++) { + longer.push_back(Instance(i)); + shorter.push_back(Instance(i)); + } + longer.push_back(Instance(len)); + EXPECT_EQ(tracker.instances(), len + len + 1); + EXPECT_GE(tracker.copies() + tracker.moves(), + len + len + 1); // More due to reallocation. + + tracker.ResetCopiesMovesSwaps(); + if (longorshort) { + shorter = longer; + EXPECT_EQ(tracker.instances(), (len + 1) + (len + 1)); + EXPECT_GE(tracker.copies() + tracker.moves(), + len + 1); // More due to reallocation. + } else { + longer = shorter; + EXPECT_EQ(tracker.instances(), len + len); + EXPECT_EQ(tracker.copies() + tracker.moves(), len); + } + } + } +} + +TYPED_TEST_P(InstanceTest, CountConstructorsDestructorsOnMoveAssignment) { + using Instance = TypeParam; + using InstanceVec = absl::InlinedVector; + InstanceTracker tracker; + for (int len = 0; len < 20; len++) { + SCOPED_TRACE(len); + for (int longorshort = 0; longorshort <= 1; ++longorshort) { + SCOPED_TRACE(longorshort); + tracker.ResetCopiesMovesSwaps(); + + InstanceVec longer, shorter; + const size_t inlined_capacity = longer.capacity(); + for (int i = 0; i < len; i++) { + longer.push_back(Instance(i)); + shorter.push_back(Instance(i)); + } + longer.push_back(Instance(len)); + EXPECT_EQ(tracker.instances(), len + len + 1); + EXPECT_GE(tracker.copies() + tracker.moves(), + len + len + 1); // More due to reallocation. + + tracker.ResetCopiesMovesSwaps(); + int src_len; + if (longorshort) { + src_len = len + 1; + shorter = std::move(longer); + } else { + src_len = len; + longer = std::move(shorter); + } + if (static_cast(src_len) > inlined_capacity) { + // Allocation moved as a whole. + EXPECT_EQ(tracker.instances(), src_len); + EXPECT_EQ(tracker.live_instances(), src_len); + EXPECT_EQ(tracker.copies(), 0); + EXPECT_EQ(tracker.moves(), 0); + } else { + // Elements are all copied. + EXPECT_EQ(tracker.instances(), src_len + src_len); + if (Instance::supports_move()) { + EXPECT_EQ(tracker.copies(), 0); + EXPECT_EQ(tracker.moves(), src_len); + EXPECT_EQ(tracker.live_instances(), src_len); + } else { + EXPECT_EQ(tracker.copies(), src_len); + EXPECT_EQ(tracker.moves(), 0); + EXPECT_EQ(tracker.live_instances(), src_len + src_len); + } + } + EXPECT_EQ(tracker.swaps(), 0); + } + } +} + +TEST(CountElemAssign, SimpleTypeWithInlineBacking) { + const size_t inlined_capacity = absl::InlinedVector().capacity(); + + for (size_t original_size = 0; original_size <= 5; ++original_size) { + SCOPED_TRACE(original_size); + // Original contents are [12345, 12345, ...] + std::vector original_contents(original_size, 12345); + + absl::InlinedVector v(original_contents.begin(), + original_contents.end()); + v.assign(2, 123); + EXPECT_THAT(v, AllOf(SizeIs(2u), ElementsAre(123, 123))); + if (original_size <= inlined_capacity) { + // If the original had inline backing, it should stay inline. + EXPECT_EQ(v.capacity(), inlined_capacity); + } + } +} + +TEST(CountElemAssign, SimpleTypeWithAllocation) { + for (size_t original_size = 0; original_size <= 5; ++original_size) { + SCOPED_TRACE(original_size); + // Original contents are [12345, 12345, ...] + std::vector original_contents(original_size, 12345); + + absl::InlinedVector v(original_contents.begin(), + original_contents.end()); + v.assign(3, 123); + EXPECT_THAT(v, AllOf(SizeIs(3u), ElementsAre(123, 123, 123))); + EXPECT_LE(v.size(), v.capacity()); + } +} + +TYPED_TEST_P(InstanceTest, CountElemAssignInlineBacking) { + using Instance = TypeParam; + for (size_t original_size = 0; original_size <= 5; ++original_size) { + SCOPED_TRACE(original_size); + // Original contents are [12345, 12345, ...] + std::vector original_contents(original_size, Instance(12345)); + + absl::InlinedVector v(original_contents.begin(), + original_contents.end()); + v.assign(2, Instance(123)); + EXPECT_THAT(v, AllOf(SizeIs(2u), ElementsAre(ValueIs(123), ValueIs(123)))); + if (original_size <= 2) { + // If the original had inline backing, it should stay inline. + EXPECT_EQ(2u, v.capacity()); + } + } +} + +template +void InstanceCountElemAssignWithAllocationTest() { + for (size_t original_size = 0; original_size <= 5; ++original_size) { + SCOPED_TRACE(original_size); + // Original contents are [12345, 12345, ...] + std::vector original_contents(original_size, Instance(12345)); + + absl::InlinedVector v(original_contents.begin(), + original_contents.end()); + v.assign(3, Instance(123)); + EXPECT_THAT(v, AllOf(SizeIs(3u), ElementsAre(ValueIs(123), ValueIs(123), + ValueIs(123)))); + EXPECT_LE(v.size(), v.capacity()); + } +} +TEST(CountElemAssign, WithAllocationCopyableInstance) { + InstanceCountElemAssignWithAllocationTest(); +} +TEST(CountElemAssign, WithAllocationCopyableMovableInstance) { + InstanceCountElemAssignWithAllocationTest(); +} + +TEST(RangedConstructor, SimpleType) { + std::vector source_v = {4, 5, 6}; + // First try to fit in inline backing + absl::InlinedVector v(source_v.begin(), source_v.end()); + EXPECT_EQ(3u, v.size()); + EXPECT_EQ(4u, + v.capacity()); // Indication that we're still on inlined storage + EXPECT_EQ(4, v[0]); + EXPECT_EQ(5, v[1]); + EXPECT_EQ(6, v[2]); + + // Now, force a re-allocate + absl::InlinedVector realloc_v(source_v.begin(), source_v.end()); + EXPECT_EQ(3u, realloc_v.size()); + EXPECT_LT(2u, realloc_v.capacity()); + EXPECT_EQ(4, realloc_v[0]); + EXPECT_EQ(5, realloc_v[1]); + EXPECT_EQ(6, realloc_v[2]); +} + +// Test for ranged constructors using Instance as the element type and +// SourceContainer as the source container type. +template +void InstanceRangedConstructorTestForContainer() { + InstanceTracker tracker; + SourceContainer source_v = {Instance(0), Instance(1)}; + tracker.ResetCopiesMovesSwaps(); + absl::InlinedVector v(source_v.begin(), + source_v.end()); + EXPECT_EQ(2u, v.size()); + EXPECT_LT(1u, v.capacity()); + EXPECT_EQ(0, v[0].value()); + EXPECT_EQ(1, v[1].value()); + EXPECT_EQ(tracker.copies(), 2); + EXPECT_EQ(tracker.moves(), 0); +} + +template +void InstanceRangedConstructorTestWithCapacity() { + // Test with const and non-const, random access and non-random-access sources. + // TODO(bsamwel): Test with an input iterator source. + { + SCOPED_TRACE("std::list"); + InstanceRangedConstructorTestForContainer, + inlined_capacity>(); + { + SCOPED_TRACE("const std::list"); + InstanceRangedConstructorTestForContainer< + Instance, const std::list, inlined_capacity>(); + } + { + SCOPED_TRACE("std::vector"); + InstanceRangedConstructorTestForContainer, + inlined_capacity>(); + } + { + SCOPED_TRACE("const std::vector"); + InstanceRangedConstructorTestForContainer< + Instance, const std::vector, inlined_capacity>(); + } + } +} + +TYPED_TEST_P(InstanceTest, RangedConstructor) { + using Instance = TypeParam; + SCOPED_TRACE("capacity=1"); + InstanceRangedConstructorTestWithCapacity(); + SCOPED_TRACE("capacity=2"); + InstanceRangedConstructorTestWithCapacity(); +} + +TEST(RangedConstructor, ElementsAreConstructed) { + std::vector source_v = {"cat", "dog"}; + + // Force expansion and re-allocation of v. Ensures that when the vector is + // expanded that new elements are constructed. + absl::InlinedVector v(source_v.begin(), source_v.end()); + EXPECT_EQ("cat", v[0]); + EXPECT_EQ("dog", v[1]); +} + +TEST(RangedAssign, SimpleType) { + const size_t inlined_capacity = absl::InlinedVector().capacity(); + + // Test for all combinations of original sizes (empty and non-empty inline, + // and out of line) and target sizes. + for (size_t original_size = 0; original_size <= 5; ++original_size) { + SCOPED_TRACE(original_size); + // Original contents are [12345, 12345, ...] + std::vector original_contents(original_size, 12345); + + for (size_t target_size = 0; target_size <= 5; ++target_size) { + SCOPED_TRACE(target_size); + + // New contents are [3, 4, ...] + std::vector new_contents; + for (size_t i = 0; i < target_size; ++i) { + new_contents.push_back(static_cast(i + 3)); + } + + absl::InlinedVector v(original_contents.begin(), + original_contents.end()); + v.assign(new_contents.begin(), new_contents.end()); + + EXPECT_EQ(new_contents.size(), v.size()); + EXPECT_LE(new_contents.size(), v.capacity()); + if (target_size <= inlined_capacity && + original_size <= inlined_capacity) { + // Storage should stay inline when target size is small. + EXPECT_EQ(v.capacity(), inlined_capacity); + } + EXPECT_THAT(v, ElementsAreArray(new_contents)); + } + } +} + +// Returns true if lhs and rhs have the same value. +template +static bool InstanceValuesEqual(const Instance& lhs, const Instance& rhs) { + return lhs.value() == rhs.value(); +} + +// Test for ranged assign() using Instance as the element type and +// SourceContainer as the source container type. +template +void InstanceRangedAssignTestForContainer() { + // Test for all combinations of original sizes (empty and non-empty inline, + // and out of line) and target sizes. + for (size_t original_size = 0; original_size <= 5; ++original_size) { + SCOPED_TRACE(original_size); + // Original contents are [12345, 12345, ...] + std::vector original_contents(original_size, Instance(12345)); + + for (size_t target_size = 0; target_size <= 5; ++target_size) { + SCOPED_TRACE(target_size); + + // New contents are [3, 4, ...] + // Generate data using a non-const container, because SourceContainer + // itself may be const. + // TODO(bsamwel): Test with an input iterator. + std::vector new_contents_in; + for (size_t i = 0; i < target_size; ++i) { + new_contents_in.push_back(Instance(static_cast(i) + 3)); + } + SourceContainer new_contents(new_contents_in.begin(), + new_contents_in.end()); + + absl::InlinedVector v(original_contents.begin(), + original_contents.end()); + v.assign(new_contents.begin(), new_contents.end()); + + EXPECT_EQ(new_contents.size(), v.size()); + EXPECT_LE(new_contents.size(), v.capacity()); + if (target_size <= 3 && original_size <= 3) { + // Storage should stay inline when target size is small. + EXPECT_EQ(3u, v.capacity()); + } + EXPECT_TRUE(std::equal(v.begin(), v.end(), new_contents.begin(), + InstanceValuesEqual)); + } + } +} + +TYPED_TEST_P(InstanceTest, RangedAssign) { + using Instance = TypeParam; + // Test with const and non-const, random access and non-random-access sources. + // TODO(bsamwel): Test with an input iterator source. + SCOPED_TRACE("std::list"); + InstanceRangedAssignTestForContainer>(); + SCOPED_TRACE("const std::list"); + InstanceRangedAssignTestForContainer>(); + SCOPED_TRACE("std::vector"); + InstanceRangedAssignTestForContainer>(); + SCOPED_TRACE("const std::vector"); + InstanceRangedAssignTestForContainer>(); +} + +TEST(InitializerListConstructor, SimpleTypeWithInlineBacking) { + EXPECT_THAT((absl::InlinedVector{4, 5, 6}), + AllOf(SizeIs(3u), CapacityIs(4u), ElementsAre(4, 5, 6))); +} + +TEST(InitializerListConstructor, SimpleTypeWithReallocationRequired) { + EXPECT_THAT((absl::InlinedVector{4, 5, 6}), + AllOf(SizeIs(3u), CapacityIs(Gt(2u)), ElementsAre(4, 5, 6))); +} + +TEST(InitializerListConstructor, DisparateTypesInList) { + EXPECT_THAT((absl::InlinedVector{-7, 8ULL}), ElementsAre(-7, 8)); + + EXPECT_THAT((absl::InlinedVector{"foo", std::string("bar")}), + ElementsAre("foo", "bar")); +} + +TEST(InitializerListConstructor, ComplexTypeWithInlineBacking) { + const size_t inlined_capacity = + absl::InlinedVector().capacity(); + EXPECT_THAT( + (absl::InlinedVector{ + CopyableMovableInstance(0)}), + AllOf(SizeIs(1u), CapacityIs(inlined_capacity), ElementsAre(ValueIs(0)))); +} + +TEST(InitializerListConstructor, ComplexTypeWithReallocationRequired) { + EXPECT_THAT((absl::InlinedVector{ + CopyableMovableInstance(0), CopyableMovableInstance(1)}), + AllOf(SizeIs(2u), CapacityIs(Gt(1u)), + ElementsAre(ValueIs(0), ValueIs(1)))); +} + +TEST(InitializerListAssign, SimpleTypeFitsInlineBacking) { + for (size_t original_size = 0; original_size <= 4; ++original_size) { + SCOPED_TRACE(original_size); + + absl::InlinedVector v1(original_size, 12345); + const size_t original_capacity_v1 = v1.capacity(); + v1.assign({3}); + EXPECT_THAT(v1, AllOf(SizeIs(1u), CapacityIs(original_capacity_v1), + ElementsAre(3))); + + absl::InlinedVector v2(original_size, 12345); + const size_t original_capacity_v2 = v2.capacity(); + v2 = {3}; + EXPECT_THAT(v2, AllOf(SizeIs(1u), CapacityIs(original_capacity_v2), + ElementsAre(3))); + } +} + +TEST(InitializerListAssign, SimpleTypeDoesNotFitInlineBacking) { + for (size_t original_size = 0; original_size <= 4; ++original_size) { + SCOPED_TRACE(original_size); + absl::InlinedVector v1(original_size, 12345); + v1.assign({3, 4, 5}); + EXPECT_THAT(v1, AllOf(SizeIs(3u), ElementsAre(3, 4, 5))); + EXPECT_LE(3u, v1.capacity()); + + absl::InlinedVector v2(original_size, 12345); + v2 = {3, 4, 5}; + EXPECT_THAT(v2, AllOf(SizeIs(3u), ElementsAre(3, 4, 5))); + EXPECT_LE(3u, v2.capacity()); + } +} + +TEST(InitializerListAssign, DisparateTypesInList) { + absl::InlinedVector v_int1; + v_int1.assign({-7, 8ULL}); + EXPECT_THAT(v_int1, ElementsAre(-7, 8)); + + absl::InlinedVector v_int2; + v_int2 = {-7, 8ULL}; + EXPECT_THAT(v_int2, ElementsAre(-7, 8)); + + absl::InlinedVector v_string1; + v_string1.assign({"foo", std::string("bar")}); + EXPECT_THAT(v_string1, ElementsAre("foo", "bar")); + + absl::InlinedVector v_string2; + v_string2 = {"foo", std::string("bar")}; + EXPECT_THAT(v_string2, ElementsAre("foo", "bar")); +} + +TYPED_TEST_P(InstanceTest, InitializerListAssign) { + using Instance = TypeParam; + for (size_t original_size = 0; original_size <= 4; ++original_size) { + SCOPED_TRACE(original_size); + absl::InlinedVector v(original_size, Instance(12345)); + const size_t original_capacity = v.capacity(); + v.assign({Instance(3)}); + EXPECT_THAT(v, AllOf(SizeIs(1u), CapacityIs(original_capacity), + ElementsAre(ValueIs(3)))); + } + for (size_t original_size = 0; original_size <= 4; ++original_size) { + SCOPED_TRACE(original_size); + absl::InlinedVector v(original_size, Instance(12345)); + v.assign({Instance(3), Instance(4), Instance(5)}); + EXPECT_THAT( + v, AllOf(SizeIs(3u), ElementsAre(ValueIs(3), ValueIs(4), ValueIs(5)))); + EXPECT_LE(3u, v.capacity()); + } +} + +REGISTER_TYPED_TEST_SUITE_P(InstanceTest, Swap, CountConstructorsDestructors, + CountConstructorsDestructorsOnCopyConstruction, + CountConstructorsDestructorsOnMoveConstruction, + CountConstructorsDestructorsOnAssignment, + CountConstructorsDestructorsOnMoveAssignment, + CountElemAssignInlineBacking, RangedConstructor, + RangedAssign, InitializerListAssign); + +using InstanceTypes = + ::testing::Types; +INSTANTIATE_TYPED_TEST_SUITE_P(InstanceTestOnTypes, InstanceTest, + InstanceTypes); + +TEST(DynamicVec, DynamicVecCompiles) { + DynamicVec v; + (void)v; +} + +TEST(DynamicVec, CreateNonEmptyDynamicVec) { + DynamicVec v(1); + EXPECT_EQ(v.size(), 1u); +} + +TEST(DynamicVec, EmplaceBack) { + DynamicVec v; + v.emplace_back(Dynamic{}); + EXPECT_EQ(v.size(), 1u); +} + +TEST(DynamicVec, EmplaceBackAfterHeapAllocation) { + DynamicVec v; + v.reserve(10); + v.emplace_back(Dynamic{}); + EXPECT_EQ(v.size(), 1u); +} + +TEST(DynamicVec, EmptyIteratorComparison) { + DynamicVec v; + EXPECT_EQ(v.begin(), v.end()); + EXPECT_EQ(v.cbegin(), v.cend()); +} + +TEST(AllocatorSupportTest, Constructors) { + using MyAlloc = CountingAllocator; + using AllocVec = absl::InlinedVector; + const int ia[] = {0, 1, 2, 3, 4, 5, 6, 7}; + int64_t allocated = 0; + MyAlloc alloc(&allocated); + { AllocVec ABSL_ATTRIBUTE_UNUSED v; } + { AllocVec ABSL_ATTRIBUTE_UNUSED v(alloc); } + { AllocVec ABSL_ATTRIBUTE_UNUSED v(ia, ia + ABSL_ARRAYSIZE(ia), alloc); } + { AllocVec ABSL_ATTRIBUTE_UNUSED v({1, 2, 3}, alloc); } + + AllocVec v2; + { AllocVec ABSL_ATTRIBUTE_UNUSED v(v2, alloc); } + { AllocVec ABSL_ATTRIBUTE_UNUSED v(std::move(v2), alloc); } +} + +TEST(AllocatorSupportTest, CountAllocations) { + using MyAlloc = CountingAllocator; + using AllocVec = absl::InlinedVector; + const int ia[] = {0, 1, 2, 3, 4, 5, 6, 7}; + int64_t bytes_allocated = 0; + int64_t instance_count = 0; + MyAlloc alloc(&bytes_allocated, &instance_count); + { + AllocVec ABSL_ATTRIBUTE_UNUSED v(ia, ia + 4, alloc); + EXPECT_THAT(bytes_allocated, Eq(0)); + EXPECT_THAT(instance_count, Eq(4)); + } + EXPECT_THAT(bytes_allocated, Eq(0)); + EXPECT_THAT(instance_count, Eq(0)); + { + AllocVec ABSL_ATTRIBUTE_UNUSED v(ia, ia + ABSL_ARRAYSIZE(ia), alloc); + EXPECT_THAT(bytes_allocated, + Eq(static_cast(v.size() * sizeof(int)))); + EXPECT_THAT(instance_count, Eq(static_cast(v.size()))); + } + EXPECT_THAT(bytes_allocated, Eq(0)); + EXPECT_THAT(instance_count, Eq(0)); + { + AllocVec v(4, 1, alloc); + EXPECT_THAT(bytes_allocated, Eq(0)); + EXPECT_THAT(instance_count, Eq(4)); + + int64_t bytes_allocated2 = 0; + MyAlloc alloc2(&bytes_allocated2); + ABSL_ATTRIBUTE_UNUSED AllocVec v2(v, alloc2); + EXPECT_THAT(bytes_allocated2, Eq(0)); + + int64_t bytes_allocated3 = 0; + MyAlloc alloc3(&bytes_allocated3); + ABSL_ATTRIBUTE_UNUSED AllocVec v3(std::move(v), alloc3); + EXPECT_THAT(bytes_allocated3, Eq(0)); + } + EXPECT_THAT(bytes_allocated, Eq(0)); + EXPECT_THAT(instance_count, Eq(0)); + { + AllocVec v(8, 2, alloc); + EXPECT_THAT(bytes_allocated, + Eq(static_cast(v.size() * sizeof(int)))); + EXPECT_THAT(instance_count, Eq(static_cast(v.size()))); + + int64_t bytes_allocated2 = 0; + MyAlloc alloc2(&bytes_allocated2); + AllocVec v2(v, alloc2); + EXPECT_THAT(bytes_allocated2, + Eq(static_cast(v2.size() * sizeof(int)))); + + int64_t bytes_allocated3 = 0; + MyAlloc alloc3(&bytes_allocated3); + AllocVec v3(std::move(v), alloc3); + EXPECT_THAT(bytes_allocated3, + Eq(static_cast(v3.size() * sizeof(int)))); + } + EXPECT_EQ(bytes_allocated, 0); + EXPECT_EQ(instance_count, 0); + { + // Test shrink_to_fit deallocations. + AllocVec v(8, 2, alloc); + EXPECT_EQ(bytes_allocated, static_cast(8 * sizeof(int))); + EXPECT_EQ(instance_count, 8); + v.resize(5); + EXPECT_EQ(bytes_allocated, static_cast(8 * sizeof(int))); + EXPECT_EQ(instance_count, 5); + v.shrink_to_fit(); + EXPECT_EQ(bytes_allocated, static_cast(5 * sizeof(int))); + EXPECT_EQ(instance_count, 5); + v.resize(4); + EXPECT_EQ(bytes_allocated, static_cast(5 * sizeof(int))); + EXPECT_EQ(instance_count, 4); + v.shrink_to_fit(); + EXPECT_EQ(bytes_allocated, 0); + EXPECT_EQ(instance_count, 4); + } + EXPECT_EQ(instance_count, 0); +} + +TEST(AllocatorSupportTest, SwapBothAllocated) { + using MyAlloc = CountingAllocator; + using AllocVec = absl::InlinedVector; + int64_t allocated1 = 0; + int64_t allocated2 = 0; + { + const int ia1[] = {0, 1, 2, 3, 4, 5, 6, 7}; + const int ia2[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; + MyAlloc a1(&allocated1); + MyAlloc a2(&allocated2); + AllocVec v1(ia1, ia1 + ABSL_ARRAYSIZE(ia1), a1); + AllocVec v2(ia2, ia2 + ABSL_ARRAYSIZE(ia2), a2); + EXPECT_LT(v1.capacity(), v2.capacity()); + EXPECT_THAT(allocated1, + Eq(static_cast(v1.capacity() * sizeof(int)))); + EXPECT_THAT(allocated2, + Eq(static_cast(v2.capacity() * sizeof(int)))); + v1.swap(v2); + EXPECT_THAT(v1, ElementsAreArray(ia2)); + EXPECT_THAT(v2, ElementsAreArray(ia1)); + EXPECT_THAT(allocated1, + Eq(static_cast(v2.capacity() * sizeof(int)))); + EXPECT_THAT(allocated2, + Eq(static_cast(v1.capacity() * sizeof(int)))); + } + EXPECT_THAT(allocated1, 0); + EXPECT_THAT(allocated2, 0); +} + +TEST(AllocatorSupportTest, SwapOneAllocated) { + using MyAlloc = CountingAllocator; + using AllocVec = absl::InlinedVector; + int64_t allocated1 = 0; + int64_t allocated2 = 0; + { + const int ia1[] = {0, 1, 2, 3, 4, 5, 6, 7}; + const int ia2[] = {0, 1, 2, 3}; + MyAlloc a1(&allocated1); + MyAlloc a2(&allocated2); + AllocVec v1(ia1, ia1 + ABSL_ARRAYSIZE(ia1), a1); + AllocVec v2(ia2, ia2 + ABSL_ARRAYSIZE(ia2), a2); + EXPECT_THAT(allocated1, + Eq(static_cast(v1.capacity() * sizeof(int)))); + EXPECT_THAT(allocated2, Eq(0)); + v1.swap(v2); + EXPECT_THAT(v1, ElementsAreArray(ia2)); + EXPECT_THAT(v2, ElementsAreArray(ia1)); + EXPECT_THAT(allocated1, + Eq(static_cast(v2.capacity() * sizeof(int)))); + EXPECT_THAT(allocated2, Eq(0)); + EXPECT_TRUE(v2.get_allocator() == a1); + EXPECT_TRUE(v1.get_allocator() == a2); + } + EXPECT_THAT(allocated1, 0); + EXPECT_THAT(allocated2, 0); +} + +TEST(AllocatorSupportTest, ScopedAllocatorWorksInlined) { + using StdVector = std::vector>; + using Alloc = CountingAllocator; + using ScopedAlloc = std::scoped_allocator_adaptor; + using AllocVec = absl::InlinedVector; + + int64_t total_allocated_byte_count = 0; + + AllocVec inlined_case(ScopedAlloc(Alloc(+&total_allocated_byte_count))); + + // Called only once to remain inlined + inlined_case.emplace_back(); + + int64_t absl_responsible_for_count = total_allocated_byte_count; + + // MSVC's allocator preemptively allocates in debug mode +#if !defined(_MSC_VER) + EXPECT_EQ(absl_responsible_for_count, 0); +#endif // !defined(_MSC_VER) + + inlined_case[0].emplace_back(); + EXPECT_GT(total_allocated_byte_count, absl_responsible_for_count); + + inlined_case.clear(); + inlined_case.shrink_to_fit(); + EXPECT_EQ(total_allocated_byte_count, 0); +} + +TEST(AllocatorSupportTest, ScopedAllocatorWorksAllocated) { + using StdVector = std::vector>; + using Alloc = CountingAllocator; + using ScopedAlloc = std::scoped_allocator_adaptor; + using AllocVec = absl::InlinedVector; + + int64_t total_allocated_byte_count = 0; + + AllocVec allocated_case(ScopedAlloc(Alloc(+&total_allocated_byte_count))); + + // Called twice to force into being allocated + allocated_case.emplace_back(); + allocated_case.emplace_back(); + + int64_t absl_responsible_for_count = total_allocated_byte_count; + EXPECT_GT(absl_responsible_for_count, 0); + + allocated_case[1].emplace_back(); + EXPECT_GT(total_allocated_byte_count, absl_responsible_for_count); + + allocated_case.clear(); + allocated_case.shrink_to_fit(); + EXPECT_EQ(total_allocated_byte_count, 0); +} + +TEST(AllocatorSupportTest, SizeAllocConstructor) { + constexpr size_t inlined_size = 4; + using Alloc = CountingAllocator; + using AllocVec = absl::InlinedVector; + + { + auto len = inlined_size / 2; + int64_t allocated = 0; + auto v = AllocVec(len, Alloc(&allocated)); + + // Inline storage used; allocator should not be invoked + EXPECT_THAT(allocated, Eq(0)); + EXPECT_THAT(v, AllOf(SizeIs(len), Each(0))); + } + + { + auto len = inlined_size * 2; + int64_t allocated = 0; + auto v = AllocVec(len, Alloc(&allocated)); + + // Out of line storage used; allocation of 8 elements expected + EXPECT_THAT(allocated, Eq(static_cast(len * sizeof(int)))); + EXPECT_THAT(v, AllOf(SizeIs(len), Each(0))); + } +} + +TEST(InlinedVectorTest, MinimumAllocatorCompilesUsingTraits) { + using T = int; + using A = std::allocator; + using ATraits = absl::allocator_traits; + + struct MinimumAllocator { + using value_type = T; + + value_type* allocate(size_t n) { + A a; + return ATraits::allocate(a, n); + } + + void deallocate(value_type* p, size_t n) { + A a; + ATraits::deallocate(a, p, n); + } + }; + + absl::InlinedVector vec; + vec.emplace_back(); + vec.resize(0); +} + +TEST(InlinedVectorTest, AbslHashValueWorks) { + using V = absl::InlinedVector; + std::vector cases; + + // Generate a variety of vectors some of these are small enough for the inline + // space but are stored out of line. + for (size_t i = 0; i < 10; ++i) { + V v; + for (int j = 0; j < static_cast(i); ++j) { + v.push_back(j); + } + cases.push_back(v); + v.resize(i % 4); + cases.push_back(v); + } + + EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(cases)); +} + +class MoveConstructibleOnlyInstance + : public absl::test_internal::BaseCountedInstance { + public: + explicit MoveConstructibleOnlyInstance(int x) : BaseCountedInstance(x) {} + MoveConstructibleOnlyInstance(MoveConstructibleOnlyInstance&& other) = + default; + MoveConstructibleOnlyInstance& operator=( + MoveConstructibleOnlyInstance&& other) = delete; +}; + +MATCHER(HasValue, "") { + return ::testing::get<0>(arg).value() == ::testing::get<1>(arg); +} + +TEST(NonAssignableMoveAssignmentTest, AllocatedToInline) { + using X = MoveConstructibleOnlyInstance; + InstanceTracker tracker; + absl::InlinedVector inlined; + inlined.emplace_back(1); + absl::InlinedVector allocated; + allocated.emplace_back(1); + allocated.emplace_back(2); + allocated.emplace_back(3); + tracker.ResetCopiesMovesSwaps(); + + inlined = std::move(allocated); + // passed ownership of the allocated storage + EXPECT_EQ(tracker.moves(), 0); + EXPECT_EQ(tracker.live_instances(), 3); + + EXPECT_THAT(inlined, Pointwise(HasValue(), {1, 2, 3})); +} + +TEST(NonAssignableMoveAssignmentTest, InlineToAllocated) { + using X = MoveConstructibleOnlyInstance; + InstanceTracker tracker; + absl::InlinedVector inlined; + inlined.emplace_back(1); + absl::InlinedVector allocated; + allocated.emplace_back(1); + allocated.emplace_back(2); + allocated.emplace_back(3); + tracker.ResetCopiesMovesSwaps(); + + allocated = std::move(inlined); + // Moved elements + EXPECT_EQ(tracker.moves(), 1); + EXPECT_EQ(tracker.live_instances(), 1); + + EXPECT_THAT(allocated, Pointwise(HasValue(), {1})); +} + +TEST(NonAssignableMoveAssignmentTest, InlineToInline) { + using X = MoveConstructibleOnlyInstance; + InstanceTracker tracker; + absl::InlinedVector inlined_a; + inlined_a.emplace_back(1); + absl::InlinedVector inlined_b; + inlined_b.emplace_back(1); + tracker.ResetCopiesMovesSwaps(); + + inlined_a = std::move(inlined_b); + // Moved elements + EXPECT_EQ(tracker.moves(), 1); + EXPECT_EQ(tracker.live_instances(), 1); + + EXPECT_THAT(inlined_a, Pointwise(HasValue(), {1})); +} + +TEST(NonAssignableMoveAssignmentTest, AllocatedToAllocated) { + using X = MoveConstructibleOnlyInstance; + InstanceTracker tracker; + absl::InlinedVector allocated_a; + allocated_a.emplace_back(1); + allocated_a.emplace_back(2); + allocated_a.emplace_back(3); + absl::InlinedVector allocated_b; + allocated_b.emplace_back(4); + allocated_b.emplace_back(5); + allocated_b.emplace_back(6); + allocated_b.emplace_back(7); + tracker.ResetCopiesMovesSwaps(); + + allocated_a = std::move(allocated_b); + // passed ownership of the allocated storage + EXPECT_EQ(tracker.moves(), 0); + EXPECT_EQ(tracker.live_instances(), 4); + + EXPECT_THAT(allocated_a, Pointwise(HasValue(), {4, 5, 6, 7})); +} + +TEST(NonAssignableMoveAssignmentTest, AssignThis) { + using X = MoveConstructibleOnlyInstance; + InstanceTracker tracker; + absl::InlinedVector v; + v.emplace_back(1); + v.emplace_back(2); + v.emplace_back(3); + + tracker.ResetCopiesMovesSwaps(); + + // Obfuscated in order to pass -Wself-move. + v = std::move(*std::addressof(v)); + // nothing happens + EXPECT_EQ(tracker.moves(), 0); + EXPECT_EQ(tracker.live_instances(), 3); + + EXPECT_THAT(v, Pointwise(HasValue(), {1, 2, 3})); +} + +class NonSwappableInstance : public absl::test_internal::BaseCountedInstance { + public: + explicit NonSwappableInstance(int x) : BaseCountedInstance(x) {} + NonSwappableInstance(const NonSwappableInstance& other) = default; + NonSwappableInstance& operator=(const NonSwappableInstance& other) = default; + NonSwappableInstance(NonSwappableInstance&& other) = default; + NonSwappableInstance& operator=(NonSwappableInstance&& other) = default; +}; + +void swap(NonSwappableInstance&, NonSwappableInstance&) = delete; + +TEST(NonSwappableSwapTest, InlineAndAllocatedTransferStorageAndMove) { + using X = NonSwappableInstance; + InstanceTracker tracker; + absl::InlinedVector inlined; + inlined.emplace_back(1); + absl::InlinedVector allocated; + allocated.emplace_back(1); + allocated.emplace_back(2); + allocated.emplace_back(3); + tracker.ResetCopiesMovesSwaps(); + + inlined.swap(allocated); + EXPECT_EQ(tracker.moves(), 1); + EXPECT_EQ(tracker.live_instances(), 4); + + EXPECT_THAT(inlined, Pointwise(HasValue(), {1, 2, 3})); +} + +TEST(NonSwappableSwapTest, InlineAndInlineMoveIndividualElements) { + using X = NonSwappableInstance; + InstanceTracker tracker; + absl::InlinedVector inlined_a; + inlined_a.emplace_back(1); + absl::InlinedVector inlined_b; + inlined_b.emplace_back(2); + tracker.ResetCopiesMovesSwaps(); + + inlined_a.swap(inlined_b); + EXPECT_EQ(tracker.moves(), 3); + EXPECT_EQ(tracker.live_instances(), 2); + + EXPECT_THAT(inlined_a, Pointwise(HasValue(), {2})); + EXPECT_THAT(inlined_b, Pointwise(HasValue(), {1})); +} + +TEST(NonSwappableSwapTest, AllocatedAndAllocatedOnlyTransferStorage) { + using X = NonSwappableInstance; + InstanceTracker tracker; + absl::InlinedVector allocated_a; + allocated_a.emplace_back(1); + allocated_a.emplace_back(2); + allocated_a.emplace_back(3); + absl::InlinedVector allocated_b; + allocated_b.emplace_back(4); + allocated_b.emplace_back(5); + allocated_b.emplace_back(6); + allocated_b.emplace_back(7); + tracker.ResetCopiesMovesSwaps(); + + allocated_a.swap(allocated_b); + EXPECT_EQ(tracker.moves(), 0); + EXPECT_EQ(tracker.live_instances(), 7); + + EXPECT_THAT(allocated_a, Pointwise(HasValue(), {4, 5, 6, 7})); + EXPECT_THAT(allocated_b, Pointwise(HasValue(), {1, 2, 3})); +} + +TEST(NonSwappableSwapTest, SwapThis) { + using X = NonSwappableInstance; + InstanceTracker tracker; + absl::InlinedVector v; + v.emplace_back(1); + v.emplace_back(2); + v.emplace_back(3); + + tracker.ResetCopiesMovesSwaps(); + + v.swap(v); + EXPECT_EQ(tracker.moves(), 0); + EXPECT_EQ(tracker.live_instances(), 3); + + EXPECT_THAT(v, Pointwise(HasValue(), {1, 2, 3})); +} + +template +using CharVec = absl::InlinedVector; + +// Warning: This struct "simulates" the type `InlinedVector::Storage::Allocated` +// to make reasonable expectations for inlined storage capacity optimization. If +// implementation changes `Allocated`, then `MySpan` and tests that use it need +// to be updated accordingly. +template +struct MySpan { + T* data; + size_t size; +}; + +TEST(StorageTest, InlinedCapacityAutoIncrease) { + // The requested capacity is auto increased to `sizeof(MySpan)`. + EXPECT_GT(CharVec<1>().capacity(), 1); + EXPECT_EQ(CharVec<1>().capacity(), sizeof(MySpan)); + EXPECT_EQ(CharVec<1>().capacity(), CharVec<2>().capacity()); + EXPECT_EQ(sizeof(CharVec<1>), sizeof(CharVec<2>)); + + // The requested capacity is auto increased to + // `sizeof(MySpan) / sizeof(int)`. + EXPECT_GT((absl::InlinedVector().capacity()), 1); + EXPECT_EQ((absl::InlinedVector().capacity()), + sizeof(MySpan) / sizeof(int)); +} + +} // anonymous namespace diff --git a/absl/container/internal/btree.h b/absl/container/internal/btree.h new file mode 100644 index 0000000..689e71a --- /dev/null +++ b/absl/container/internal/btree.h @@ -0,0 +1,3046 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 btree implementation of the STL set and map interfaces. A btree is smaller +// and generally also faster than STL set/map (refer to the benchmarks below). +// The red-black tree implementation of STL set/map has an overhead of 3 +// pointers (left, right and parent) plus the node color information for each +// stored value. So a set consumes 40 bytes for each value stored in +// 64-bit mode. This btree implementation stores multiple values on fixed +// size nodes (usually 256 bytes) and doesn't store child pointers for leaf +// nodes. The result is that a btree_set may use much less memory per +// stored value. For the random insertion benchmark in btree_bench.cc, a +// btree_set with node-size of 256 uses 5.1 bytes per stored value. +// +// The packing of multiple values on to each node of a btree has another effect +// besides better space utilization: better cache locality due to fewer cache +// lines being accessed. Better cache locality translates into faster +// operations. +// +// CAVEATS +// +// Insertions and deletions on a btree can cause splitting, merging or +// rebalancing of btree nodes. And even without these operations, insertions +// and deletions on a btree will move values around within a node. In both +// cases, the result is that insertions and deletions can invalidate iterators +// pointing to values other than the one being inserted/deleted. Therefore, this +// container does not provide pointer stability. This is notably different from +// STL set/map which takes care to not invalidate iterators on insert/erase +// except, of course, for iterators pointing to the value being erased. A +// partial workaround when erasing is available: erase() returns an iterator +// pointing to the item just after the one that was erased (or end() if none +// exists). + +#ifndef ABSL_CONTAINER_INTERNAL_BTREE_H_ +#define ABSL_CONTAINER_INTERNAL_BTREE_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "absl/base/config.h" +#include "absl/base/internal/raw_logging.h" +#include "absl/base/macros.h" +#include "absl/container/internal/common.h" +#include "absl/container/internal/common_policy_traits.h" +#include "absl/container/internal/compressed_tuple.h" +#include "absl/container/internal/container_memory.h" +#include "absl/container/internal/layout.h" +#include "absl/memory/memory.h" +#include "absl/meta/type_traits.h" +#include "absl/strings/cord.h" +#include "absl/strings/string_view.h" +#include "absl/types/compare.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +#ifdef ABSL_BTREE_ENABLE_GENERATIONS +#error ABSL_BTREE_ENABLE_GENERATIONS cannot be directly set +#elif (defined(ABSL_HAVE_ADDRESS_SANITIZER) || \ + defined(ABSL_HAVE_HWADDRESS_SANITIZER) || \ + defined(ABSL_HAVE_MEMORY_SANITIZER)) && \ + !defined(NDEBUG_SANITIZER) // If defined, performance is important. +// When compiled in sanitizer mode, we add generation integers to the nodes and +// iterators. When iterators are used, we validate that the container has not +// been mutated since the iterator was constructed. +#define ABSL_BTREE_ENABLE_GENERATIONS +#endif + +#ifdef ABSL_BTREE_ENABLE_GENERATIONS +constexpr bool BtreeGenerationsEnabled() { return true; } +#else +constexpr bool BtreeGenerationsEnabled() { return false; } +#endif + +template +using compare_result_t = absl::result_of_t; + +// A helper class that indicates if the Compare parameter is a key-compare-to +// comparator. +template +using btree_is_key_compare_to = + std::is_convertible, absl::weak_ordering>; + +struct StringBtreeDefaultLess { + using is_transparent = void; + + StringBtreeDefaultLess() = default; + + // Compatibility constructor. + StringBtreeDefaultLess(std::less) {} // NOLINT + StringBtreeDefaultLess(std::less) {} // NOLINT + + // Allow converting to std::less for use in key_comp()/value_comp(). + explicit operator std::less() const { return {}; } + explicit operator std::less() const { return {}; } + explicit operator std::less() const { return {}; } + + absl::weak_ordering operator()(absl::string_view lhs, + absl::string_view rhs) const { + return compare_internal::compare_result_as_ordering(lhs.compare(rhs)); + } + StringBtreeDefaultLess(std::less) {} // NOLINT + absl::weak_ordering operator()(const absl::Cord &lhs, + const absl::Cord &rhs) const { + return compare_internal::compare_result_as_ordering(lhs.Compare(rhs)); + } + absl::weak_ordering operator()(const absl::Cord &lhs, + absl::string_view rhs) const { + return compare_internal::compare_result_as_ordering(lhs.Compare(rhs)); + } + absl::weak_ordering operator()(absl::string_view lhs, + const absl::Cord &rhs) const { + return compare_internal::compare_result_as_ordering(-rhs.Compare(lhs)); + } +}; + +struct StringBtreeDefaultGreater { + using is_transparent = void; + + StringBtreeDefaultGreater() = default; + + StringBtreeDefaultGreater(std::greater) {} // NOLINT + StringBtreeDefaultGreater(std::greater) {} // NOLINT + + // Allow converting to std::greater for use in key_comp()/value_comp(). + explicit operator std::greater() const { return {}; } + explicit operator std::greater() const { return {}; } + explicit operator std::greater() const { return {}; } + + absl::weak_ordering operator()(absl::string_view lhs, + absl::string_view rhs) const { + return compare_internal::compare_result_as_ordering(rhs.compare(lhs)); + } + StringBtreeDefaultGreater(std::greater) {} // NOLINT + absl::weak_ordering operator()(const absl::Cord &lhs, + const absl::Cord &rhs) const { + return compare_internal::compare_result_as_ordering(rhs.Compare(lhs)); + } + absl::weak_ordering operator()(const absl::Cord &lhs, + absl::string_view rhs) const { + return compare_internal::compare_result_as_ordering(-lhs.Compare(rhs)); + } + absl::weak_ordering operator()(absl::string_view lhs, + const absl::Cord &rhs) const { + return compare_internal::compare_result_as_ordering(rhs.Compare(lhs)); + } +}; + +// See below comments for checked_compare. +template ::value> +struct checked_compare_base : Compare { + using Compare::Compare; + explicit checked_compare_base(Compare c) : Compare(std::move(c)) {} + const Compare &comp() const { return *this; } +}; +template +struct checked_compare_base { + explicit checked_compare_base(Compare c) : compare(std::move(c)) {} + const Compare &comp() const { return compare; } + Compare compare; +}; + +// A mechanism for opting out of checked_compare for use only in btree_test.cc. +struct BtreeTestOnlyCheckedCompareOptOutBase {}; + +// A helper class to adapt the specified comparator for two use cases: +// (1) When using common Abseil string types with common comparison functors, +// convert a boolean comparison into a three-way comparison that returns an +// `absl::weak_ordering`. This helper class is specialized for +// less, greater, less, +// greater, less, and greater. +// (2) Adapt the comparator to diagnose cases of non-strict-weak-ordering (see +// https://en.cppreference.com/w/cpp/named_req/Compare) in debug mode. Whenever +// a comparison is made, we will make assertions to verify that the comparator +// is valid. +template +struct key_compare_adapter { + // Inherit from checked_compare_base to support function pointers and also + // keep empty-base-optimization (EBO) support for classes. + // Note: we can't use CompressedTuple here because that would interfere + // with the EBO for `btree::rightmost_`. `btree::rightmost_` is itself a + // CompressedTuple and nested `CompressedTuple`s don't support EBO. + // TODO(b/214288561): use CompressedTuple instead once it supports EBO for + // nested `CompressedTuple`s. + struct checked_compare : checked_compare_base { + private: + using Base = typename checked_compare::checked_compare_base; + using Base::comp; + + // If possible, returns whether `t` is equivalent to itself. We can only do + // this for `Key`s because we can't be sure that it's safe to call + // `comp()(k, k)` otherwise. Even if SFINAE allows it, there could be a + // compilation failure inside the implementation of the comparison operator. + bool is_self_equivalent(const Key &k) const { + // Note: this works for both boolean and three-way comparators. + return comp()(k, k) == 0; + } + // If we can't compare `t` with itself, returns true unconditionally. + template + bool is_self_equivalent(const T &) const { + return true; + } + + public: + using Base::Base; + checked_compare(Compare comp) : Base(std::move(comp)) {} // NOLINT + + // Allow converting to Compare for use in key_comp()/value_comp(). + explicit operator Compare() const { return comp(); } + + template >::value, + int> = 0> + bool operator()(const T &lhs, const U &rhs) const { + // NOTE: if any of these assertions fail, then the comparator does not + // establish a strict-weak-ordering (see + // https://en.cppreference.com/w/cpp/named_req/Compare). + assert(is_self_equivalent(lhs)); + assert(is_self_equivalent(rhs)); + const bool lhs_comp_rhs = comp()(lhs, rhs); + assert(!lhs_comp_rhs || !comp()(rhs, lhs)); + return lhs_comp_rhs; + } + + template < + typename T, typename U, + absl::enable_if_t, + absl::weak_ordering>::value, + int> = 0> + absl::weak_ordering operator()(const T &lhs, const U &rhs) const { + // NOTE: if any of these assertions fail, then the comparator does not + // establish a strict-weak-ordering (see + // https://en.cppreference.com/w/cpp/named_req/Compare). + assert(is_self_equivalent(lhs)); + assert(is_self_equivalent(rhs)); + const absl::weak_ordering lhs_comp_rhs = comp()(lhs, rhs); +#ifndef NDEBUG + const absl::weak_ordering rhs_comp_lhs = comp()(rhs, lhs); + if (lhs_comp_rhs > 0) { + assert(rhs_comp_lhs < 0 && "lhs_comp_rhs > 0 -> rhs_comp_lhs < 0"); + } else if (lhs_comp_rhs == 0) { + assert(rhs_comp_lhs == 0 && "lhs_comp_rhs == 0 -> rhs_comp_lhs == 0"); + } else { + assert(rhs_comp_lhs > 0 && "lhs_comp_rhs < 0 -> rhs_comp_lhs > 0"); + } +#endif + return lhs_comp_rhs; + } + }; + using type = absl::conditional_t< + std::is_base_of::value, + Compare, checked_compare>; +}; + +template <> +struct key_compare_adapter, std::string> { + using type = StringBtreeDefaultLess; +}; + +template <> +struct key_compare_adapter, std::string> { + using type = StringBtreeDefaultGreater; +}; + +template <> +struct key_compare_adapter, absl::string_view> { + using type = StringBtreeDefaultLess; +}; + +template <> +struct key_compare_adapter, absl::string_view> { + using type = StringBtreeDefaultGreater; +}; + +template <> +struct key_compare_adapter, absl::Cord> { + using type = StringBtreeDefaultLess; +}; + +template <> +struct key_compare_adapter, absl::Cord> { + using type = StringBtreeDefaultGreater; +}; + +// Detects an 'absl_btree_prefer_linear_node_search' member. This is +// a protocol used as an opt-in or opt-out of linear search. +// +// For example, this would be useful for key types that wrap an integer +// and define their own cheap operator<(). For example: +// +// class K { +// public: +// using absl_btree_prefer_linear_node_search = std::true_type; +// ... +// private: +// friend bool operator<(K a, K b) { return a.k_ < b.k_; } +// int k_; +// }; +// +// btree_map m; // Uses linear search +// +// If T has the preference tag, then it has a preference. +// Btree will use the tag's truth value. +template +struct has_linear_node_search_preference : std::false_type {}; +template +struct prefers_linear_node_search : std::false_type {}; +template +struct has_linear_node_search_preference< + T, absl::void_t> + : std::true_type {}; +template +struct prefers_linear_node_search< + T, absl::void_t> + : T::absl_btree_prefer_linear_node_search {}; + +template +constexpr bool compare_has_valid_result_type() { + using compare_result_type = compare_result_t; + return std::is_same::value || + std::is_convertible::value; +} + +template +class map_value_compare { + template + friend class btree; + + // Note: this `protected` is part of the API of std::map::value_compare. See + // https://en.cppreference.com/w/cpp/container/map/value_compare. + protected: + explicit map_value_compare(original_key_compare c) : comp(std::move(c)) {} + + original_key_compare comp; // NOLINT + + public: + auto operator()(const value_type &lhs, const value_type &rhs) const + -> decltype(comp(lhs.first, rhs.first)) { + return comp(lhs.first, rhs.first); + } +}; + +template +struct common_params : common_policy_traits { + using original_key_compare = Compare; + + // If Compare is a common comparator for a string-like type, then we adapt it + // to use heterogeneous lookup and to be a key-compare-to comparator. + // We also adapt the comparator to diagnose invalid comparators in debug mode. + // We disable this when `Compare` is invalid in a way that will cause + // adaptation to fail (having invalid return type) so that we can give a + // better compilation failure in static_assert_validation. If we don't do + // this, then there will be cascading compilation failures that are confusing + // for users. + using key_compare = + absl::conditional_t(), + Compare, + typename key_compare_adapter::type>; + + static constexpr bool kIsKeyCompareStringAdapted = + std::is_same::value || + std::is_same::value; + static constexpr bool kIsKeyCompareTransparent = + IsTransparent::value || kIsKeyCompareStringAdapted; + + // A type which indicates if we have a key-compare-to functor or a plain old + // key-compare functor. + using is_key_compare_to = btree_is_key_compare_to; + + using allocator_type = Alloc; + using key_type = Key; + using size_type = size_t; + using difference_type = ptrdiff_t; + + using slot_policy = SlotPolicy; + using slot_type = typename slot_policy::slot_type; + using value_type = typename slot_policy::value_type; + using init_type = typename slot_policy::mutable_value_type; + using pointer = value_type *; + using const_pointer = const value_type *; + using reference = value_type &; + using const_reference = const value_type &; + + using value_compare = + absl::conditional_t, + original_key_compare>; + using is_map_container = std::integral_constant; + + // For the given lookup key type, returns whether we can have multiple + // equivalent keys in the btree. If this is a multi-container, then we can. + // Otherwise, we can have multiple equivalent keys only if all of the + // following conditions are met: + // - The comparator is transparent. + // - The lookup key type is not the same as key_type. + // - The comparator is not a StringBtreeDefault{Less,Greater} comparator + // that we know has the same equivalence classes for all lookup types. + template + constexpr static bool can_have_multiple_equivalent_keys() { + return IsMulti || (IsTransparent::value && + !std::is_same::value && + !kIsKeyCompareStringAdapted); + } + + enum { + kTargetNodeSize = TargetNodeSize, + + // Upper bound for the available space for slots. This is largest for leaf + // nodes, which have overhead of at least a pointer + 4 bytes (for storing + // 3 field_types and an enum). + kNodeSlotSpace = TargetNodeSize - /*minimum overhead=*/(sizeof(void *) + 4), + }; + + // This is an integral type large enough to hold as many slots as will fit a + // node of TargetNodeSize bytes. + using node_count_type = + absl::conditional_t<(kNodeSlotSpace / sizeof(slot_type) > + (std::numeric_limits::max)()), + uint16_t, uint8_t>; // NOLINT +}; + +// An adapter class that converts a lower-bound compare into an upper-bound +// compare. Note: there is no need to make a version of this adapter specialized +// for key-compare-to functors because the upper-bound (the first value greater +// than the input) is never an exact match. +template +struct upper_bound_adapter { + explicit upper_bound_adapter(const Compare &c) : comp(c) {} + template + bool operator()(const K1 &a, const K2 &b) const { + // Returns true when a is not greater than b. + return !compare_internal::compare_result_as_less_than(comp(b, a)); + } + + private: + Compare comp; +}; + +enum class MatchKind : uint8_t { kEq, kNe }; + +template +struct SearchResult { + V value; + MatchKind match; + + static constexpr bool HasMatch() { return true; } + bool IsEq() const { return match == MatchKind::kEq; } +}; + +// When we don't use CompareTo, `match` is not present. +// This ensures that callers can't use it accidentally when it provides no +// useful information. +template +struct SearchResult { + SearchResult() = default; + explicit SearchResult(V v) : value(v) {} + SearchResult(V v, MatchKind /*match*/) : value(v) {} + + V value; + + static constexpr bool HasMatch() { return false; } + static constexpr bool IsEq() { return false; } +}; + +// A node in the btree holding. The same node type is used for both internal +// and leaf nodes in the btree, though the nodes are allocated in such a way +// that the children array is only valid in internal nodes. +template +class btree_node { + using is_key_compare_to = typename Params::is_key_compare_to; + using field_type = typename Params::node_count_type; + using allocator_type = typename Params::allocator_type; + using slot_type = typename Params::slot_type; + using original_key_compare = typename Params::original_key_compare; + + public: + using params_type = Params; + using key_type = typename Params::key_type; + using value_type = typename Params::value_type; + using pointer = typename Params::pointer; + using const_pointer = typename Params::const_pointer; + using reference = typename Params::reference; + using const_reference = typename Params::const_reference; + using key_compare = typename Params::key_compare; + using size_type = typename Params::size_type; + using difference_type = typename Params::difference_type; + + // Btree decides whether to use linear node search as follows: + // - If the comparator expresses a preference, use that. + // - If the key expresses a preference, use that. + // - If the key is arithmetic and the comparator is std::less or + // std::greater, choose linear. + // - Otherwise, choose binary. + // TODO(ezb): Might make sense to add condition(s) based on node-size. + using use_linear_search = std::integral_constant< + bool, has_linear_node_search_preference::value + ? prefers_linear_node_search::value + : has_linear_node_search_preference::value + ? prefers_linear_node_search::value + : std::is_arithmetic::value && + (std::is_same, + original_key_compare>::value || + std::is_same, + original_key_compare>::value)>; + + // This class is organized by absl::container_internal::Layout as if it had + // the following structure: + // // A pointer to the node's parent. + // btree_node *parent; + // + // // When ABSL_BTREE_ENABLE_GENERATIONS is defined, we also have a + // // generation integer in order to check that when iterators are + // // used, they haven't been invalidated already. Only the generation on + // // the root is used, but we have one on each node because whether a node + // // is root or not can change. + // uint32_t generation; + // + // // The position of the node in the node's parent. + // field_type position; + // // The index of the first populated value in `values`. + // // TODO(ezb): right now, `start` is always 0. Update insertion/merge + // // logic to allow for floating storage within nodes. + // field_type start; + // // The index after the last populated value in `values`. Currently, this + // // is the same as the count of values. + // field_type finish; + // // The maximum number of values the node can hold. This is an integer in + // // [1, kNodeSlots] for root leaf nodes, kNodeSlots for non-root leaf + // // nodes, and kInternalNodeMaxCount (as a sentinel value) for internal + // // nodes (even though there are still kNodeSlots values in the node). + // // TODO(ezb): make max_count use only 4 bits and record log2(capacity) + // // to free extra bits for is_root, etc. + // field_type max_count; + // + // // The array of values. The capacity is `max_count` for leaf nodes and + // // kNodeSlots for internal nodes. Only the values in + // // [start, finish) have been initialized and are valid. + // slot_type values[max_count]; + // + // // The array of child pointers. The keys in children[i] are all less + // // than key(i). The keys in children[i + 1] are all greater than key(i). + // // There are 0 children for leaf nodes and kNodeSlots + 1 children for + // // internal nodes. + // btree_node *children[kNodeSlots + 1]; + // + // This class is only constructed by EmptyNodeType. Normally, pointers to the + // layout above are allocated, cast to btree_node*, and de-allocated within + // the btree implementation. + ~btree_node() = default; + btree_node(btree_node const &) = delete; + btree_node &operator=(btree_node const &) = delete; + + protected: + btree_node() = default; + + private: + using layout_type = + absl::container_internal::Layout; + using leaf_layout_type = typename layout_type::template WithStaticSizes< + /*parent*/ 1, + /*generation*/ BtreeGenerationsEnabled() ? 1 : 0, + /*position, start, finish, max_count*/ 4>; + constexpr static size_type SizeWithNSlots(size_type n) { + return leaf_layout_type(/*slots*/ n, /*children*/ 0).AllocSize(); + } + // A lower bound for the overhead of fields other than slots in a leaf node. + constexpr static size_type MinimumOverhead() { + return SizeWithNSlots(1) - sizeof(slot_type); + } + + // Compute how many values we can fit onto a leaf node taking into account + // padding. + constexpr static size_type NodeTargetSlots(const size_type begin, + const size_type end) { + return begin == end ? begin + : SizeWithNSlots((begin + end) / 2 + 1) > + params_type::kTargetNodeSize + ? NodeTargetSlots(begin, (begin + end) / 2) + : NodeTargetSlots((begin + end) / 2 + 1, end); + } + + constexpr static size_type kTargetNodeSize = params_type::kTargetNodeSize; + constexpr static size_type kNodeTargetSlots = + NodeTargetSlots(0, kTargetNodeSize); + + // We need a minimum of 3 slots per internal node in order to perform + // splitting (1 value for the two nodes involved in the split and 1 value + // propagated to the parent as the delimiter for the split). For performance + // reasons, we don't allow 3 slots-per-node due to bad worst case occupancy of + // 1/3 (for a node, not a b-tree). + constexpr static size_type kMinNodeSlots = 4; + + constexpr static size_type kNodeSlots = + kNodeTargetSlots >= kMinNodeSlots ? kNodeTargetSlots : kMinNodeSlots; + + using internal_layout_type = typename layout_type::template WithStaticSizes< + /*parent*/ 1, + /*generation*/ BtreeGenerationsEnabled() ? 1 : 0, + /*position, start, finish, max_count*/ 4, /*slots*/ kNodeSlots, + /*children*/ kNodeSlots + 1>; + + // The node is internal (i.e. is not a leaf node) if and only if `max_count` + // has this value. + constexpr static field_type kInternalNodeMaxCount = 0; + + // Leaves can have less than kNodeSlots values. + constexpr static leaf_layout_type LeafLayout( + const size_type slot_count = kNodeSlots) { + return leaf_layout_type(slot_count, 0); + } + constexpr static auto InternalLayout() { return internal_layout_type(); } + constexpr static size_type LeafSize(const size_type slot_count = kNodeSlots) { + return LeafLayout(slot_count).AllocSize(); + } + constexpr static size_type InternalSize() { + return InternalLayout().AllocSize(); + } + + constexpr static size_type Alignment() { + static_assert(LeafLayout(1).Alignment() == InternalLayout().Alignment(), + "Alignment of all nodes must be equal."); + return InternalLayout().Alignment(); + } + + // N is the index of the type in the Layout definition. + // ElementType is the Nth type in the Layout definition. + template + inline typename layout_type::template ElementType *GetField() { + // We assert that we don't read from values that aren't there. + assert(N < 4 || is_internal()); + return InternalLayout().template Pointer(reinterpret_cast(this)); + } + template + inline const typename layout_type::template ElementType *GetField() const { + assert(N < 4 || is_internal()); + return InternalLayout().template Pointer( + reinterpret_cast(this)); + } + void set_parent(btree_node *p) { *GetField<0>() = p; } + field_type &mutable_finish() { return GetField<2>()[2]; } + slot_type *slot(size_type i) { return &GetField<3>()[i]; } + slot_type *start_slot() { return slot(start()); } + slot_type *finish_slot() { return slot(finish()); } + const slot_type *slot(size_type i) const { return &GetField<3>()[i]; } + void set_position(field_type v) { GetField<2>()[0] = v; } + void set_start(field_type v) { GetField<2>()[1] = v; } + void set_finish(field_type v) { GetField<2>()[2] = v; } + // This method is only called by the node init methods. + void set_max_count(field_type v) { GetField<2>()[3] = v; } + + public: + // Whether this is a leaf node or not. This value doesn't change after the + // node is created. + bool is_leaf() const { return GetField<2>()[3] != kInternalNodeMaxCount; } + // Whether this is an internal node or not. This value doesn't change after + // the node is created. + bool is_internal() const { return !is_leaf(); } + + // Getter for the position of this node in its parent. + field_type position() const { return GetField<2>()[0]; } + + // Getter for the offset of the first value in the `values` array. + field_type start() const { + // TODO(ezb): when floating storage is implemented, return GetField<2>()[1]; + assert(GetField<2>()[1] == 0); + return 0; + } + + // Getter for the offset after the last value in the `values` array. + field_type finish() const { return GetField<2>()[2]; } + + // Getters for the number of values stored in this node. + field_type count() const { + assert(finish() >= start()); + return finish() - start(); + } + field_type max_count() const { + // Internal nodes have max_count==kInternalNodeMaxCount. + // Leaf nodes have max_count in [1, kNodeSlots]. + const field_type max_count = GetField<2>()[3]; + return max_count == field_type{kInternalNodeMaxCount} + ? field_type{kNodeSlots} + : max_count; + } + + // Getter for the parent of this node. + btree_node *parent() const { return *GetField<0>(); } + // Getter for whether the node is the root of the tree. The parent of the + // root of the tree is the leftmost node in the tree which is guaranteed to + // be a leaf. + bool is_root() const { return parent()->is_leaf(); } + void make_root() { + assert(parent()->is_root()); + set_generation(parent()->generation()); + set_parent(parent()->parent()); + } + + // Gets the root node's generation integer, which is the one used by the tree. + uint32_t *get_root_generation() const { + assert(BtreeGenerationsEnabled()); + const btree_node *curr = this; + for (; !curr->is_root(); curr = curr->parent()) continue; + return const_cast(&curr->GetField<1>()[0]); + } + + // Returns the generation for iterator validation. + uint32_t generation() const { + return BtreeGenerationsEnabled() ? *get_root_generation() : 0; + } + // Updates generation. Should only be called on a root node or during node + // initialization. + void set_generation(uint32_t generation) { + if (BtreeGenerationsEnabled()) GetField<1>()[0] = generation; + } + // Updates the generation. We do this whenever the node is mutated. + void next_generation() { + if (BtreeGenerationsEnabled()) ++*get_root_generation(); + } + + // Getters for the key/value at position i in the node. + const key_type &key(size_type i) const { return params_type::key(slot(i)); } + reference value(size_type i) { return params_type::element(slot(i)); } + const_reference value(size_type i) const { + return params_type::element(slot(i)); + } + + // Getters/setter for the child at position i in the node. + btree_node *child(field_type i) const { return GetField<4>()[i]; } + btree_node *start_child() const { return child(start()); } + btree_node *&mutable_child(field_type i) { return GetField<4>()[i]; } + void clear_child(field_type i) { + absl::container_internal::SanitizerPoisonObject(&mutable_child(i)); + } + void set_child_noupdate_position(field_type i, btree_node *c) { + absl::container_internal::SanitizerUnpoisonObject(&mutable_child(i)); + mutable_child(i) = c; + } + void set_child(field_type i, btree_node *c) { + set_child_noupdate_position(i, c); + c->set_position(i); + } + void init_child(field_type i, btree_node *c) { + set_child(i, c); + c->set_parent(this); + } + + // Returns the position of the first value whose key is not less than k. + template + SearchResult lower_bound( + const K &k, const key_compare &comp) const { + return use_linear_search::value ? linear_search(k, comp) + : binary_search(k, comp); + } + // Returns the position of the first value whose key is greater than k. + template + size_type upper_bound(const K &k, const key_compare &comp) const { + auto upper_compare = upper_bound_adapter(comp); + return use_linear_search::value ? linear_search(k, upper_compare).value + : binary_search(k, upper_compare).value; + } + + template + SearchResult::value> + linear_search(const K &k, const Compare &comp) const { + return linear_search_impl(k, start(), finish(), comp, + btree_is_key_compare_to()); + } + + template + SearchResult::value> + binary_search(const K &k, const Compare &comp) const { + return binary_search_impl(k, start(), finish(), comp, + btree_is_key_compare_to()); + } + + // Returns the position of the first value whose key is not less than k using + // linear search performed using plain compare. + template + SearchResult linear_search_impl( + const K &k, size_type s, const size_type e, const Compare &comp, + std::false_type /* IsCompareTo */) const { + while (s < e) { + if (!comp(key(s), k)) { + break; + } + ++s; + } + return SearchResult{s}; + } + + // Returns the position of the first value whose key is not less than k using + // linear search performed using compare-to. + template + SearchResult linear_search_impl( + const K &k, size_type s, const size_type e, const Compare &comp, + std::true_type /* IsCompareTo */) const { + while (s < e) { + const absl::weak_ordering c = comp(key(s), k); + if (c == 0) { + return {s, MatchKind::kEq}; + } else if (c > 0) { + break; + } + ++s; + } + return {s, MatchKind::kNe}; + } + + // Returns the position of the first value whose key is not less than k using + // binary search performed using plain compare. + template + SearchResult binary_search_impl( + const K &k, size_type s, size_type e, const Compare &comp, + std::false_type /* IsCompareTo */) const { + while (s != e) { + const size_type mid = (s + e) >> 1; + if (comp(key(mid), k)) { + s = mid + 1; + } else { + e = mid; + } + } + return SearchResult{s}; + } + + // Returns the position of the first value whose key is not less than k using + // binary search performed using compare-to. + template + SearchResult binary_search_impl( + const K &k, size_type s, size_type e, const CompareTo &comp, + std::true_type /* IsCompareTo */) const { + if (params_type::template can_have_multiple_equivalent_keys()) { + MatchKind exact_match = MatchKind::kNe; + while (s != e) { + const size_type mid = (s + e) >> 1; + const absl::weak_ordering c = comp(key(mid), k); + if (c < 0) { + s = mid + 1; + } else { + e = mid; + if (c == 0) { + // Need to return the first value whose key is not less than k, + // which requires continuing the binary search if there could be + // multiple equivalent keys. + exact_match = MatchKind::kEq; + } + } + } + return {s, exact_match}; + } else { // Can't have multiple equivalent keys. + while (s != e) { + const size_type mid = (s + e) >> 1; + const absl::weak_ordering c = comp(key(mid), k); + if (c < 0) { + s = mid + 1; + } else if (c > 0) { + e = mid; + } else { + return {mid, MatchKind::kEq}; + } + } + return {s, MatchKind::kNe}; + } + } + + // Returns whether key i is ordered correctly with respect to the other keys + // in the node. The motivation here is to detect comparators that violate + // transitivity. Note: we only do comparisons of keys on this node rather than + // the whole tree so that this is constant time. + template + bool is_ordered_correctly(field_type i, const Compare &comp) const { + if (std::is_base_of::value || + params_type::kIsKeyCompareStringAdapted) { + return true; + } + + const auto compare = [&](field_type a, field_type b) { + const absl::weak_ordering cmp = + compare_internal::do_three_way_comparison(comp, key(a), key(b)); + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; + }; + int cmp = -1; + constexpr bool kCanHaveEquivKeys = + params_type::template can_have_multiple_equivalent_keys(); + for (field_type j = start(); j < finish(); ++j) { + if (j == i) { + if (cmp > 0) return false; + continue; + } + int new_cmp = compare(j, i); + if (new_cmp < cmp || (!kCanHaveEquivKeys && new_cmp == 0)) return false; + cmp = new_cmp; + } + return true; + } + + // Emplaces a value at position i, shifting all existing values and + // children at positions >= i to the right by 1. + template + void emplace_value(field_type i, allocator_type *alloc, Args &&...args); + + // Removes the values at positions [i, i + to_erase), shifting all existing + // values and children after that range to the left by to_erase. Clears all + // children between [i, i + to_erase). + void remove_values(field_type i, field_type to_erase, allocator_type *alloc); + + // Rebalances a node with its right sibling. + void rebalance_right_to_left(field_type to_move, btree_node *right, + allocator_type *alloc); + void rebalance_left_to_right(field_type to_move, btree_node *right, + allocator_type *alloc); + + // Splits a node, moving a portion of the node's values to its right sibling. + void split(int insert_position, btree_node *dest, allocator_type *alloc); + + // Merges a node with its right sibling, moving all of the values and the + // delimiting key in the parent node onto itself, and deleting the src node. + void merge(btree_node *src, allocator_type *alloc); + + // Node allocation/deletion routines. + void init_leaf(field_type position, field_type max_count, + btree_node *parent) { + set_generation(0); + set_parent(parent); + set_position(position); + set_start(0); + set_finish(0); + set_max_count(max_count); + absl::container_internal::SanitizerPoisonMemoryRegion( + start_slot(), max_count * sizeof(slot_type)); + } + void init_internal(field_type position, btree_node *parent) { + init_leaf(position, kNodeSlots, parent); + // Set `max_count` to a sentinel value to indicate that this node is + // internal. + set_max_count(kInternalNodeMaxCount); + absl::container_internal::SanitizerPoisonMemoryRegion( + &mutable_child(start()), (kNodeSlots + 1) * sizeof(btree_node *)); + } + + static void deallocate(const size_type size, btree_node *node, + allocator_type *alloc) { + absl::container_internal::SanitizerUnpoisonMemoryRegion(node, size); + absl::container_internal::Deallocate(alloc, node, size); + } + + // Deletes a node and all of its children. + static void clear_and_delete(btree_node *node, allocator_type *alloc); + + private: + template + void value_init(const field_type i, allocator_type *alloc, Args &&...args) { + next_generation(); + absl::container_internal::SanitizerUnpoisonObject(slot(i)); + params_type::construct(alloc, slot(i), std::forward(args)...); + } + void value_destroy(const field_type i, allocator_type *alloc) { + next_generation(); + params_type::destroy(alloc, slot(i)); + absl::container_internal::SanitizerPoisonObject(slot(i)); + } + void value_destroy_n(const field_type i, const field_type n, + allocator_type *alloc) { + next_generation(); + for (slot_type *s = slot(i), *end = slot(i + n); s != end; ++s) { + params_type::destroy(alloc, s); + absl::container_internal::SanitizerPoisonObject(s); + } + } + + static void transfer(slot_type *dest, slot_type *src, allocator_type *alloc) { + absl::container_internal::SanitizerUnpoisonObject(dest); + params_type::transfer(alloc, dest, src); + absl::container_internal::SanitizerPoisonObject(src); + } + + // Transfers value from slot `src_i` in `src_node` to slot `dest_i` in `this`. + void transfer(const size_type dest_i, const size_type src_i, + btree_node *src_node, allocator_type *alloc) { + next_generation(); + transfer(slot(dest_i), src_node->slot(src_i), alloc); + } + + // Transfers `n` values starting at value `src_i` in `src_node` into the + // values starting at value `dest_i` in `this`. + void transfer_n(const size_type n, const size_type dest_i, + const size_type src_i, btree_node *src_node, + allocator_type *alloc) { + next_generation(); + for (slot_type *src = src_node->slot(src_i), *end = src + n, + *dest = slot(dest_i); + src != end; ++src, ++dest) { + transfer(dest, src, alloc); + } + } + + // Same as above, except that we start at the end and work our way to the + // beginning. + void transfer_n_backward(const size_type n, const size_type dest_i, + const size_type src_i, btree_node *src_node, + allocator_type *alloc) { + next_generation(); + for (slot_type *src = src_node->slot(src_i + n), *end = src - n, + *dest = slot(dest_i + n); + src != end; --src, --dest) { + // If we modified the loop index calculations above to avoid the -1s here, + // it would result in UB in the computation of `end` (and possibly `src` + // as well, if n == 0), since slot() is effectively an array index and it + // is UB to compute the address of any out-of-bounds array element except + // for one-past-the-end. + transfer(dest - 1, src - 1, alloc); + } + } + + template + friend class btree; + template + friend class btree_iterator; + friend class BtreeNodePeer; + friend struct btree_access; +}; + +template +bool AreNodesFromSameContainer(const Node *node_a, const Node *node_b) { + // If either node is null, then give up on checking whether they're from the + // same container. (If exactly one is null, then we'll trigger the + // default-constructed assert in Equals.) + if (node_a == nullptr || node_b == nullptr) return true; + while (!node_a->is_root()) node_a = node_a->parent(); + while (!node_b->is_root()) node_b = node_b->parent(); + return node_a == node_b; +} + +class btree_iterator_generation_info_enabled { + public: + explicit btree_iterator_generation_info_enabled(uint32_t g) + : generation_(g) {} + + // Updates the generation. For use internally right before we return an + // iterator to the user. + template + void update_generation(const Node *node) { + if (node != nullptr) generation_ = node->generation(); + } + uint32_t generation() const { return generation_; } + + template + void assert_valid_generation(const Node *node) const { + if (node != nullptr && node->generation() != generation_) { + ABSL_INTERNAL_LOG( + FATAL, + "Attempting to use an invalidated iterator. The corresponding b-tree " + "container has been mutated since this iterator was constructed."); + } + } + + private: + // Used to check that the iterator hasn't been invalidated. + uint32_t generation_; +}; + +class btree_iterator_generation_info_disabled { + public: + explicit btree_iterator_generation_info_disabled(uint32_t) {} + static void update_generation(const void *) {} + static uint32_t generation() { return 0; } + static void assert_valid_generation(const void *) {} +}; + +#ifdef ABSL_BTREE_ENABLE_GENERATIONS +using btree_iterator_generation_info = btree_iterator_generation_info_enabled; +#else +using btree_iterator_generation_info = btree_iterator_generation_info_disabled; +#endif + +template +class btree_iterator : private btree_iterator_generation_info { + using field_type = typename Node::field_type; + using key_type = typename Node::key_type; + using size_type = typename Node::size_type; + using params_type = typename Node::params_type; + using is_map_container = typename params_type::is_map_container; + + using node_type = Node; + using normal_node = typename std::remove_const::type; + using const_node = const Node; + using normal_pointer = typename params_type::pointer; + using normal_reference = typename params_type::reference; + using const_pointer = typename params_type::const_pointer; + using const_reference = typename params_type::const_reference; + using slot_type = typename params_type::slot_type; + + // In sets, all iterators are const. + using iterator = absl::conditional_t< + is_map_container::value, + btree_iterator, + btree_iterator>; + using const_iterator = + btree_iterator; + + public: + // These aliases are public for std::iterator_traits. + using difference_type = typename Node::difference_type; + using value_type = typename params_type::value_type; + using pointer = Pointer; + using reference = Reference; + using iterator_category = std::bidirectional_iterator_tag; + + btree_iterator() : btree_iterator(nullptr, -1) {} + explicit btree_iterator(Node *n) : btree_iterator(n, n->start()) {} + btree_iterator(Node *n, int p) + : btree_iterator_generation_info(n != nullptr ? n->generation() + : ~uint32_t{}), + node_(n), + position_(p) {} + + // NOTE: this SFINAE allows for implicit conversions from iterator to + // const_iterator, but it specifically avoids hiding the copy constructor so + // that the trivial one will be used when possible. + template , iterator>::value && + std::is_same::value, + int> = 0> + btree_iterator(const btree_iterator other) // NOLINT + : btree_iterator_generation_info(other), + node_(other.node_), + position_(other.position_) {} + + bool operator==(const iterator &other) const { + return Equals(other); + } + bool operator==(const const_iterator &other) const { + return Equals(other); + } + bool operator!=(const iterator &other) const { + return !Equals(other); + } + bool operator!=(const const_iterator &other) const { + return !Equals(other); + } + + // Returns n such that n calls to ++other yields *this. + // Precondition: n exists. + difference_type operator-(const_iterator other) const { + if (node_ == other.node_) { + if (node_->is_leaf()) return position_ - other.position_; + if (position_ == other.position_) return 0; + } + return distance_slow(other); + } + + // Accessors for the key/value the iterator is pointing at. + reference operator*() const { + ABSL_HARDENING_ASSERT(node_ != nullptr); + assert_valid_generation(node_); + ABSL_HARDENING_ASSERT(position_ >= node_->start()); + if (position_ >= node_->finish()) { + ABSL_HARDENING_ASSERT(!IsEndIterator() && "Dereferencing end() iterator"); + ABSL_HARDENING_ASSERT(position_ < node_->finish()); + } + return node_->value(static_cast(position_)); + } + pointer operator->() const { return &operator*(); } + + btree_iterator &operator++() { + increment(); + return *this; + } + btree_iterator &operator--() { + decrement(); + return *this; + } + btree_iterator operator++(int) { + btree_iterator tmp = *this; + ++*this; + return tmp; + } + btree_iterator operator--(int) { + btree_iterator tmp = *this; + --*this; + return tmp; + } + + private: + friend iterator; + friend const_iterator; + template + friend class btree; + template + friend class btree_container; + template + friend class btree_set_container; + template + friend class btree_map_container; + template + friend class btree_multiset_container; + template + friend class base_checker; + friend struct btree_access; + + // This SFINAE allows explicit conversions from const_iterator to + // iterator, but also avoids hiding the copy constructor. + // NOTE: the const_cast is safe because this constructor is only called by + // non-const methods and the container owns the nodes. + template , const_iterator>::value && + std::is_same::value, + int> = 0> + explicit btree_iterator(const btree_iterator other) + : btree_iterator_generation_info(other.generation()), + node_(const_cast(other.node_)), + position_(other.position_) {} + + bool Equals(const const_iterator other) const { + ABSL_HARDENING_ASSERT(((node_ == nullptr && other.node_ == nullptr) || + (node_ != nullptr && other.node_ != nullptr)) && + "Comparing default-constructed iterator with " + "non-default-constructed iterator."); + // Note: we use assert instead of ABSL_HARDENING_ASSERT here because this + // changes the complexity of Equals from O(1) to O(log(N) + log(M)) where + // N/M are sizes of the containers containing node_/other.node_. + assert(AreNodesFromSameContainer(node_, other.node_) && + "Comparing iterators from different containers."); + assert_valid_generation(node_); + other.assert_valid_generation(other.node_); + return node_ == other.node_ && position_ == other.position_; + } + + bool IsEndIterator() const { + if (position_ != node_->finish()) return false; + node_type *node = node_; + while (!node->is_root()) { + if (node->position() != node->parent()->finish()) return false; + node = node->parent(); + } + return true; + } + + // Returns n such that n calls to ++other yields *this. + // Precondition: n exists && (this->node_ != other.node_ || + // !this->node_->is_leaf() || this->position_ != other.position_). + difference_type distance_slow(const_iterator other) const; + + // Increment/decrement the iterator. + void increment() { + assert_valid_generation(node_); + if (node_->is_leaf() && ++position_ < node_->finish()) { + return; + } + increment_slow(); + } + void increment_slow(); + + void decrement() { + assert_valid_generation(node_); + if (node_->is_leaf() && --position_ >= node_->start()) { + return; + } + decrement_slow(); + } + void decrement_slow(); + + const key_type &key() const { + return node_->key(static_cast(position_)); + } + decltype(std::declval()->slot(0)) slot() { + return node_->slot(static_cast(position_)); + } + + void update_generation() { + btree_iterator_generation_info::update_generation(node_); + } + + // The node in the tree the iterator is pointing at. + Node *node_; + // The position within the node of the tree the iterator is pointing at. + // NOTE: this is an int rather than a field_type because iterators can point + // to invalid positions (such as -1) in certain circumstances. + int position_; +}; + +template +class btree { + using node_type = btree_node; + using is_key_compare_to = typename Params::is_key_compare_to; + using field_type = typename node_type::field_type; + + // We use a static empty node for the root/leftmost/rightmost of empty btrees + // in order to avoid branching in begin()/end(). + struct EmptyNodeType : node_type { + using field_type = typename node_type::field_type; + node_type *parent; +#ifdef ABSL_BTREE_ENABLE_GENERATIONS + uint32_t generation = 0; +#endif + field_type position = 0; + field_type start = 0; + field_type finish = 0; + // max_count must be != kInternalNodeMaxCount (so that this node is regarded + // as a leaf node). max_count() is never called when the tree is empty. + field_type max_count = node_type::kInternalNodeMaxCount + 1; + + constexpr EmptyNodeType() : parent(this) {} + }; + + static node_type *EmptyNode() { + alignas(node_type::Alignment()) static constexpr EmptyNodeType empty_node; + return const_cast(&empty_node); + } + + enum : uint32_t { + kNodeSlots = node_type::kNodeSlots, + kMinNodeValues = kNodeSlots / 2, + }; + + struct node_stats { + using size_type = typename Params::size_type; + + node_stats(size_type l, size_type i) : leaf_nodes(l), internal_nodes(i) {} + + node_stats &operator+=(const node_stats &other) { + leaf_nodes += other.leaf_nodes; + internal_nodes += other.internal_nodes; + return *this; + } + + size_type leaf_nodes; + size_type internal_nodes; + }; + + public: + using key_type = typename Params::key_type; + using value_type = typename Params::value_type; + using size_type = typename Params::size_type; + using difference_type = typename Params::difference_type; + using key_compare = typename Params::key_compare; + using original_key_compare = typename Params::original_key_compare; + using value_compare = typename Params::value_compare; + using allocator_type = typename Params::allocator_type; + using reference = typename Params::reference; + using const_reference = typename Params::const_reference; + using pointer = typename Params::pointer; + using const_pointer = typename Params::const_pointer; + using iterator = + typename btree_iterator::iterator; + using const_iterator = typename iterator::const_iterator; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + using node_handle_type = node_handle; + + // Internal types made public for use by btree_container types. + using params_type = Params; + using slot_type = typename Params::slot_type; + + private: + // Copies or moves (depending on the template parameter) the values in + // other into this btree in their order in other. This btree must be empty + // before this method is called. This method is used in copy construction, + // copy assignment, and move assignment. + template + void copy_or_move_values_in_order(Btree &other); + + // Validates that various assumptions/requirements are true at compile time. + constexpr static bool static_assert_validation(); + + public: + btree(const key_compare &comp, const allocator_type &alloc) + : root_(EmptyNode()), rightmost_(comp, alloc, EmptyNode()), size_(0) {} + + btree(const btree &other) : btree(other, other.allocator()) {} + btree(const btree &other, const allocator_type &alloc) + : btree(other.key_comp(), alloc) { + copy_or_move_values_in_order(other); + } + btree(btree &&other) noexcept + : root_(std::exchange(other.root_, EmptyNode())), + rightmost_(std::move(other.rightmost_)), + size_(std::exchange(other.size_, 0u)) { + other.mutable_rightmost() = EmptyNode(); + } + btree(btree &&other, const allocator_type &alloc) + : btree(other.key_comp(), alloc) { + if (alloc == other.allocator()) { + swap(other); + } else { + // Move values from `other` one at a time when allocators are different. + copy_or_move_values_in_order(other); + } + } + + ~btree() { + // Put static_asserts in destructor to avoid triggering them before the type + // is complete. + static_assert(static_assert_validation(), "This call must be elided."); + clear(); + } + + // Assign the contents of other to *this. + btree &operator=(const btree &other); + btree &operator=(btree &&other) noexcept; + + iterator begin() { return iterator(leftmost()); } + const_iterator begin() const { return const_iterator(leftmost()); } + iterator end() { return iterator(rightmost(), rightmost()->finish()); } + const_iterator end() const { + return const_iterator(rightmost(), rightmost()->finish()); + } + reverse_iterator rbegin() { return reverse_iterator(end()); } + const_reverse_iterator rbegin() const { + return const_reverse_iterator(end()); + } + reverse_iterator rend() { return reverse_iterator(begin()); } + const_reverse_iterator rend() const { + return const_reverse_iterator(begin()); + } + + // Finds the first element whose key is not less than `key`. + template + iterator lower_bound(const K &key) { + return internal_end(internal_lower_bound(key).value); + } + template + const_iterator lower_bound(const K &key) const { + return internal_end(internal_lower_bound(key).value); + } + + // Finds the first element whose key is not less than `key` and also returns + // whether that element is equal to `key`. + template + std::pair lower_bound_equal(const K &key) const; + + // Finds the first element whose key is greater than `key`. + template + iterator upper_bound(const K &key) { + return internal_end(internal_upper_bound(key)); + } + template + const_iterator upper_bound(const K &key) const { + return internal_end(internal_upper_bound(key)); + } + + // Finds the range of values which compare equal to key. The first member of + // the returned pair is equal to lower_bound(key). The second member of the + // pair is equal to upper_bound(key). + template + std::pair equal_range(const K &key); + template + std::pair equal_range(const K &key) const { + return const_cast(this)->equal_range(key); + } + + // Inserts a value into the btree only if it does not already exist. The + // boolean return value indicates whether insertion succeeded or failed. + // Requirement: if `key` already exists in the btree, does not consume `args`. + // Requirement: `key` is never referenced after consuming `args`. + template + std::pair insert_unique(const K &key, Args &&...args); + + // Inserts with hint. Checks to see if the value should be placed immediately + // before `position` in the tree. If so, then the insertion will take + // amortized constant time. If not, the insertion will take amortized + // logarithmic time as if a call to insert_unique() were made. + // Requirement: if `key` already exists in the btree, does not consume `args`. + // Requirement: `key` is never referenced after consuming `args`. + template + std::pair insert_hint_unique(iterator position, const K &key, + Args &&...args); + + // Insert a range of values into the btree. + // Note: the first overload avoids constructing a value_type if the key + // already exists in the btree. + template ()( + params_type::key(*std::declval()), + std::declval()))> + void insert_iterator_unique(InputIterator b, InputIterator e, int); + // We need the second overload for cases in which we need to construct a + // value_type in order to compare it with the keys already in the btree. + template + void insert_iterator_unique(InputIterator b, InputIterator e, char); + + // Inserts a value into the btree. + template + iterator insert_multi(const key_type &key, ValueType &&v); + + // Inserts a value into the btree. + template + iterator insert_multi(ValueType &&v) { + return insert_multi(params_type::key(v), std::forward(v)); + } + + // Insert with hint. Check to see if the value should be placed immediately + // before position in the tree. If it does, then the insertion will take + // amortized constant time. If not, the insertion will take amortized + // logarithmic time as if a call to insert_multi(v) were made. + template + iterator insert_hint_multi(iterator position, ValueType &&v); + + // Insert a range of values into the btree. + template + void insert_iterator_multi(InputIterator b, + InputIterator e); + + // Erase the specified iterator from the btree. The iterator must be valid + // (i.e. not equal to end()). Return an iterator pointing to the node after + // the one that was erased (or end() if none exists). + // Requirement: does not read the value at `*iter`. + iterator erase(iterator iter); + + // Erases range. Returns the number of keys erased and an iterator pointing + // to the element after the last erased element. + std::pair erase_range(iterator begin, iterator end); + + // Finds an element with key equivalent to `key` or returns `end()` if `key` + // is not present. + template + iterator find(const K &key) { + return internal_end(internal_find(key)); + } + template + const_iterator find(const K &key) const { + return internal_end(internal_find(key)); + } + + // Clear the btree, deleting all of the values it contains. + void clear(); + + // Swaps the contents of `this` and `other`. + void swap(btree &other); + + const key_compare &key_comp() const noexcept { + return rightmost_.template get<0>(); + } + template + bool compare_keys(const K1 &a, const K2 &b) const { + return compare_internal::compare_result_as_less_than(key_comp()(a, b)); + } + + value_compare value_comp() const { + return value_compare(original_key_compare(key_comp())); + } + + // Verifies the structure of the btree. + void verify() const; + + // Size routines. + size_type size() const { return size_; } + size_type max_size() const { return (std::numeric_limits::max)(); } + bool empty() const { return size_ == 0; } + + // The height of the btree. An empty tree will have height 0. + size_type height() const { + size_type h = 0; + if (!empty()) { + // Count the length of the chain from the leftmost node up to the + // root. We actually count from the root back around to the level below + // the root, but the calculation is the same because of the circularity + // of that traversal. + const node_type *n = root(); + do { + ++h; + n = n->parent(); + } while (n != root()); + } + return h; + } + + // The number of internal, leaf and total nodes used by the btree. + size_type leaf_nodes() const { return internal_stats(root()).leaf_nodes; } + size_type internal_nodes() const { + return internal_stats(root()).internal_nodes; + } + size_type nodes() const { + node_stats stats = internal_stats(root()); + return stats.leaf_nodes + stats.internal_nodes; + } + + // The total number of bytes used by the btree. + // TODO(b/169338300): update to support node_btree_*. + size_type bytes_used() const { + node_stats stats = internal_stats(root()); + if (stats.leaf_nodes == 1 && stats.internal_nodes == 0) { + return sizeof(*this) + node_type::LeafSize(root()->max_count()); + } else { + return sizeof(*this) + stats.leaf_nodes * node_type::LeafSize() + + stats.internal_nodes * node_type::InternalSize(); + } + } + + // The average number of bytes used per value stored in the btree assuming + // random insertion order. + static double average_bytes_per_value() { + // The expected number of values per node with random insertion order is the + // average of the maximum and minimum numbers of values per node. + const double expected_values_per_node = (kNodeSlots + kMinNodeValues) / 2.0; + return node_type::LeafSize() / expected_values_per_node; + } + + // The fullness of the btree. Computed as the number of elements in the btree + // divided by the maximum number of elements a tree with the current number + // of nodes could hold. A value of 1 indicates perfect space + // utilization. Smaller values indicate space wastage. + // Returns 0 for empty trees. + double fullness() const { + if (empty()) return 0.0; + return static_cast(size()) / (nodes() * kNodeSlots); + } + // The overhead of the btree structure in bytes per node. Computed as the + // total number of bytes used by the btree minus the number of bytes used for + // storing elements divided by the number of elements. + // Returns 0 for empty trees. + double overhead() const { + if (empty()) return 0.0; + return (bytes_used() - size() * sizeof(value_type)) / + static_cast(size()); + } + + // The allocator used by the btree. + allocator_type get_allocator() const { return allocator(); } + + private: + friend struct btree_access; + + // Internal accessor routines. + node_type *root() { return root_; } + const node_type *root() const { return root_; } + node_type *&mutable_root() noexcept { return root_; } + node_type *rightmost() { return rightmost_.template get<2>(); } + const node_type *rightmost() const { return rightmost_.template get<2>(); } + node_type *&mutable_rightmost() noexcept { + return rightmost_.template get<2>(); + } + key_compare *mutable_key_comp() noexcept { + return &rightmost_.template get<0>(); + } + + // The leftmost node is stored as the parent of the root node. + node_type *leftmost() { return root()->parent(); } + const node_type *leftmost() const { return root()->parent(); } + + // Allocator routines. + allocator_type *mutable_allocator() noexcept { + return &rightmost_.template get<1>(); + } + const allocator_type &allocator() const noexcept { + return rightmost_.template get<1>(); + } + + // Allocates a correctly aligned node of at least size bytes using the + // allocator. + node_type *allocate(size_type size) { + return reinterpret_cast( + absl::container_internal::Allocate( + mutable_allocator(), size)); + } + + // Node creation/deletion routines. + node_type *new_internal_node(field_type position, node_type *parent) { + node_type *n = allocate(node_type::InternalSize()); + n->init_internal(position, parent); + return n; + } + node_type *new_leaf_node(field_type position, node_type *parent) { + node_type *n = allocate(node_type::LeafSize()); + n->init_leaf(position, kNodeSlots, parent); + return n; + } + node_type *new_leaf_root_node(field_type max_count) { + node_type *n = allocate(node_type::LeafSize(max_count)); + n->init_leaf(/*position=*/0, max_count, /*parent=*/n); + return n; + } + + // Deletion helper routines. + iterator rebalance_after_delete(iterator iter); + + // Rebalances or splits the node iter points to. + void rebalance_or_split(iterator *iter); + + // Merges the values of left, right and the delimiting key on their parent + // onto left, removing the delimiting key and deleting right. + void merge_nodes(node_type *left, node_type *right); + + // Tries to merge node with its left or right sibling, and failing that, + // rebalance with its left or right sibling. Returns true if a merge + // occurred, at which point it is no longer valid to access node. Returns + // false if no merging took place. + bool try_merge_or_rebalance(iterator *iter); + + // Tries to shrink the height of the tree by 1. + void try_shrink(); + + iterator internal_end(iterator iter) { + return iter.node_ != nullptr ? iter : end(); + } + const_iterator internal_end(const_iterator iter) const { + return iter.node_ != nullptr ? iter : end(); + } + + // Emplaces a value into the btree immediately before iter. Requires that + // key(v) <= iter.key() and (--iter).key() <= key(v). + template + iterator internal_emplace(iterator iter, Args &&...args); + + // Returns an iterator pointing to the first value >= the value "iter" is + // pointing at. Note that "iter" might be pointing to an invalid location such + // as iter.position_ == iter.node_->finish(). This routine simply moves iter + // up in the tree to a valid location. Requires: iter.node_ is non-null. + template + static IterType internal_last(IterType iter); + + // Returns an iterator pointing to the leaf position at which key would + // reside in the tree, unless there is an exact match - in which case, the + // result may not be on a leaf. When there's a three-way comparator, we can + // return whether there was an exact match. This allows the caller to avoid a + // subsequent comparison to determine if an exact match was made, which is + // important for keys with expensive comparison, such as strings. + template + SearchResult internal_locate( + const K &key) const; + + // Internal routine which implements lower_bound(). + template + SearchResult internal_lower_bound( + const K &key) const; + + // Internal routine which implements upper_bound(). + template + iterator internal_upper_bound(const K &key) const; + + // Internal routine which implements find(). + template + iterator internal_find(const K &key) const; + + // Verifies the tree structure of node. + size_type internal_verify(const node_type *node, const key_type *lo, + const key_type *hi) const; + + node_stats internal_stats(const node_type *node) const { + // The root can be a static empty node. + if (node == nullptr || (node == root() && empty())) { + return node_stats(0, 0); + } + if (node->is_leaf()) { + return node_stats(1, 0); + } + node_stats res(0, 1); + for (int i = node->start(); i <= node->finish(); ++i) { + res += internal_stats(node->child(i)); + } + return res; + } + + node_type *root_; + + // A pointer to the rightmost node. Note that the leftmost node is stored as + // the root's parent. We use compressed tuple in order to save space because + // key_compare and allocator_type are usually empty. + absl::container_internal::CompressedTuple + rightmost_; + + // Number of values. + size_type size_; +}; + +//// +// btree_node methods +template +template +inline void btree_node

::emplace_value(const field_type i, + allocator_type *alloc, + Args &&...args) { + assert(i >= start()); + assert(i <= finish()); + // Shift old values to create space for new value and then construct it in + // place. + if (i < finish()) { + transfer_n_backward(finish() - i, /*dest_i=*/i + 1, /*src_i=*/i, this, + alloc); + } + value_init(static_cast(i), alloc, std::forward(args)...); + set_finish(finish() + 1); + + if (is_internal() && finish() > i + 1) { + for (field_type j = finish(); j > i + 1; --j) { + set_child(j, child(j - 1)); + } + clear_child(i + 1); + } +} + +template +inline void btree_node

::remove_values(const field_type i, + const field_type to_erase, + allocator_type *alloc) { + // Transfer values after the removed range into their new places. + value_destroy_n(i, to_erase, alloc); + const field_type orig_finish = finish(); + const field_type src_i = i + to_erase; + transfer_n(orig_finish - src_i, i, src_i, this, alloc); + + if (is_internal()) { + // Delete all children between begin and end. + for (field_type j = 0; j < to_erase; ++j) { + clear_and_delete(child(i + j + 1), alloc); + } + // Rotate children after end into new positions. + for (field_type j = i + to_erase + 1; j <= orig_finish; ++j) { + set_child(j - to_erase, child(j)); + clear_child(j); + } + } + set_finish(orig_finish - to_erase); +} + +template +void btree_node

::rebalance_right_to_left(field_type to_move, + btree_node *right, + allocator_type *alloc) { + assert(parent() == right->parent()); + assert(position() + 1 == right->position()); + assert(right->count() >= count()); + assert(to_move >= 1); + assert(to_move <= right->count()); + + // 1) Move the delimiting value in the parent to the left node. + transfer(finish(), position(), parent(), alloc); + + // 2) Move the (to_move - 1) values from the right node to the left node. + transfer_n(to_move - 1, finish() + 1, right->start(), right, alloc); + + // 3) Move the new delimiting value to the parent from the right node. + parent()->transfer(position(), right->start() + to_move - 1, right, alloc); + + // 4) Shift the values in the right node to their correct positions. + right->transfer_n(right->count() - to_move, right->start(), + right->start() + to_move, right, alloc); + + if (is_internal()) { + // Move the child pointers from the right to the left node. + for (field_type i = 0; i < to_move; ++i) { + init_child(finish() + i + 1, right->child(i)); + } + for (field_type i = right->start(); i <= right->finish() - to_move; ++i) { + assert(i + to_move <= right->max_count()); + right->init_child(i, right->child(i + to_move)); + right->clear_child(i + to_move); + } + } + + // Fixup `finish` on the left and right nodes. + set_finish(finish() + to_move); + right->set_finish(right->finish() - to_move); +} + +template +void btree_node

::rebalance_left_to_right(field_type to_move, + btree_node *right, + allocator_type *alloc) { + assert(parent() == right->parent()); + assert(position() + 1 == right->position()); + assert(count() >= right->count()); + assert(to_move >= 1); + assert(to_move <= count()); + + // Values in the right node are shifted to the right to make room for the + // new to_move values. Then, the delimiting value in the parent and the + // other (to_move - 1) values in the left node are moved into the right node. + // Lastly, a new delimiting value is moved from the left node into the + // parent, and the remaining empty left node entries are destroyed. + + // 1) Shift existing values in the right node to their correct positions. + right->transfer_n_backward(right->count(), right->start() + to_move, + right->start(), right, alloc); + + // 2) Move the delimiting value in the parent to the right node. + right->transfer(right->start() + to_move - 1, position(), parent(), alloc); + + // 3) Move the (to_move - 1) values from the left node to the right node. + right->transfer_n(to_move - 1, right->start(), finish() - (to_move - 1), this, + alloc); + + // 4) Move the new delimiting value to the parent from the left node. + parent()->transfer(position(), finish() - to_move, this, alloc); + + if (is_internal()) { + // Move the child pointers from the left to the right node. + for (field_type i = right->finish() + 1; i > right->start(); --i) { + right->init_child(i - 1 + to_move, right->child(i - 1)); + right->clear_child(i - 1); + } + for (field_type i = 1; i <= to_move; ++i) { + right->init_child(i - 1, child(finish() - to_move + i)); + clear_child(finish() - to_move + i); + } + } + + // Fixup the counts on the left and right nodes. + set_finish(finish() - to_move); + right->set_finish(right->finish() + to_move); +} + +template +void btree_node

::split(const int insert_position, btree_node *dest, + allocator_type *alloc) { + assert(dest->count() == 0); + assert(max_count() == kNodeSlots); + assert(position() + 1 == dest->position()); + assert(parent() == dest->parent()); + + // We bias the split based on the position being inserted. If we're + // inserting at the beginning of the left node then bias the split to put + // more values on the right node. If we're inserting at the end of the + // right node then bias the split to put more values on the left node. + if (insert_position == start()) { + dest->set_finish(dest->start() + finish() - 1); + } else if (insert_position == kNodeSlots) { + dest->set_finish(dest->start()); + } else { + dest->set_finish(dest->start() + count() / 2); + } + set_finish(finish() - dest->count()); + assert(count() >= 1); + + // Move values from the left sibling to the right sibling. + dest->transfer_n(dest->count(), dest->start(), finish(), this, alloc); + + // The split key is the largest value in the left sibling. + --mutable_finish(); + parent()->emplace_value(position(), alloc, finish_slot()); + value_destroy(finish(), alloc); + parent()->set_child_noupdate_position(position() + 1, dest); + + if (is_internal()) { + for (field_type i = dest->start(), j = finish() + 1; i <= dest->finish(); + ++i, ++j) { + assert(child(j) != nullptr); + dest->init_child(i, child(j)); + clear_child(j); + } + } +} + +template +void btree_node

::merge(btree_node *src, allocator_type *alloc) { + assert(parent() == src->parent()); + assert(position() + 1 == src->position()); + + // Move the delimiting value to the left node. + value_init(finish(), alloc, parent()->slot(position())); + + // Move the values from the right to the left node. + transfer_n(src->count(), finish() + 1, src->start(), src, alloc); + + if (is_internal()) { + // Move the child pointers from the right to the left node. + for (field_type i = src->start(), j = finish() + 1; i <= src->finish(); + ++i, ++j) { + init_child(j, src->child(i)); + src->clear_child(i); + } + } + + // Fixup `finish` on the src and dest nodes. + set_finish(start() + 1 + count() + src->count()); + src->set_finish(src->start()); + + // Remove the value on the parent node and delete the src node. + parent()->remove_values(position(), /*to_erase=*/1, alloc); +} + +template +void btree_node

::clear_and_delete(btree_node *node, allocator_type *alloc) { + if (node->is_leaf()) { + node->value_destroy_n(node->start(), node->count(), alloc); + deallocate(LeafSize(node->max_count()), node, alloc); + return; + } + if (node->count() == 0) { + deallocate(InternalSize(), node, alloc); + return; + } + + // The parent of the root of the subtree we are deleting. + btree_node *delete_root_parent = node->parent(); + + // Navigate to the leftmost leaf under node, and then delete upwards. + while (node->is_internal()) node = node->start_child(); +#ifdef ABSL_BTREE_ENABLE_GENERATIONS + // When generations are enabled, we delete the leftmost leaf last in case it's + // the parent of the root and we need to check whether it's a leaf before we + // can update the root's generation. + // TODO(ezb): if we change btree_node::is_root to check a bool inside the node + // instead of checking whether the parent is a leaf, we can remove this logic. + btree_node *leftmost_leaf = node; +#endif + // Use `size_type` because `pos` needs to be able to hold `kNodeSlots+1`, + // which isn't guaranteed to be a valid `field_type`. + size_type pos = node->position(); + btree_node *parent = node->parent(); + for (;;) { + // In each iteration of the next loop, we delete one leaf node and go right. + assert(pos <= parent->finish()); + do { + node = parent->child(static_cast(pos)); + if (node->is_internal()) { + // Navigate to the leftmost leaf under node. + while (node->is_internal()) node = node->start_child(); + pos = node->position(); + parent = node->parent(); + } + node->value_destroy_n(node->start(), node->count(), alloc); +#ifdef ABSL_BTREE_ENABLE_GENERATIONS + if (leftmost_leaf != node) +#endif + deallocate(LeafSize(node->max_count()), node, alloc); + ++pos; + } while (pos <= parent->finish()); + + // Once we've deleted all children of parent, delete parent and go up/right. + assert(pos > parent->finish()); + do { + node = parent; + pos = node->position(); + parent = node->parent(); + node->value_destroy_n(node->start(), node->count(), alloc); + deallocate(InternalSize(), node, alloc); + if (parent == delete_root_parent) { +#ifdef ABSL_BTREE_ENABLE_GENERATIONS + deallocate(LeafSize(leftmost_leaf->max_count()), leftmost_leaf, alloc); +#endif + return; + } + ++pos; + } while (pos > parent->finish()); + } +} + +//// +// btree_iterator methods + +// Note: the implementation here is based on btree_node::clear_and_delete. +template +auto btree_iterator::distance_slow(const_iterator other) const + -> difference_type { + const_iterator begin = other; + const_iterator end = *this; + assert(begin.node_ != end.node_ || !begin.node_->is_leaf() || + begin.position_ != end.position_); + + const node_type *node = begin.node_; + // We need to compensate for double counting if begin.node_ is a leaf node. + difference_type count = node->is_leaf() ? -begin.position_ : 0; + + // First navigate to the leftmost leaf node past begin. + if (node->is_internal()) { + ++count; + node = node->child(begin.position_ + 1); + } + while (node->is_internal()) node = node->start_child(); + + // Use `size_type` because `pos` needs to be able to hold `kNodeSlots+1`, + // which isn't guaranteed to be a valid `field_type`. + size_type pos = node->position(); + const node_type *parent = node->parent(); + for (;;) { + // In each iteration of the next loop, we count one leaf node and go right. + assert(pos <= parent->finish()); + do { + node = parent->child(static_cast(pos)); + if (node->is_internal()) { + // Navigate to the leftmost leaf under node. + while (node->is_internal()) node = node->start_child(); + pos = node->position(); + parent = node->parent(); + } + if (node == end.node_) return count + end.position_; + if (parent == end.node_ && pos == static_cast(end.position_)) + return count + node->count(); + // +1 is for the next internal node value. + count += node->count() + 1; + ++pos; + } while (pos <= parent->finish()); + + // Once we've counted all children of parent, go up/right. + assert(pos > parent->finish()); + do { + node = parent; + pos = node->position(); + parent = node->parent(); + // -1 because we counted the value at end and shouldn't. + if (parent == end.node_ && pos == static_cast(end.position_)) + return count - 1; + ++pos; + } while (pos > parent->finish()); + } +} + +template +void btree_iterator::increment_slow() { + if (node_->is_leaf()) { + assert(position_ >= node_->finish()); + btree_iterator save(*this); + while (position_ == node_->finish() && !node_->is_root()) { + assert(node_->parent()->child(node_->position()) == node_); + position_ = node_->position(); + node_ = node_->parent(); + } + // TODO(ezb): assert we aren't incrementing end() instead of handling. + if (position_ == node_->finish()) { + *this = save; + } + } else { + assert(position_ < node_->finish()); + node_ = node_->child(static_cast(position_ + 1)); + while (node_->is_internal()) { + node_ = node_->start_child(); + } + position_ = node_->start(); + } +} + +template +void btree_iterator::decrement_slow() { + if (node_->is_leaf()) { + assert(position_ <= -1); + btree_iterator save(*this); + while (position_ < node_->start() && !node_->is_root()) { + assert(node_->parent()->child(node_->position()) == node_); + position_ = node_->position() - 1; + node_ = node_->parent(); + } + // TODO(ezb): assert we aren't decrementing begin() instead of handling. + if (position_ < node_->start()) { + *this = save; + } + } else { + assert(position_ >= node_->start()); + node_ = node_->child(static_cast(position_)); + while (node_->is_internal()) { + node_ = node_->child(node_->finish()); + } + position_ = node_->finish() - 1; + } +} + +//// +// btree methods +template +template +void btree

::copy_or_move_values_in_order(Btree &other) { + static_assert(std::is_same::value || + std::is_same::value, + "Btree type must be same or const."); + assert(empty()); + + // We can avoid key comparisons because we know the order of the + // values is the same order we'll store them in. + auto iter = other.begin(); + if (iter == other.end()) return; + insert_multi(iter.slot()); + ++iter; + for (; iter != other.end(); ++iter) { + // If the btree is not empty, we can just insert the new value at the end + // of the tree. + internal_emplace(end(), iter.slot()); + } +} + +template +constexpr bool btree

::static_assert_validation() { + static_assert(std::is_nothrow_copy_constructible::value, + "Key comparison must be nothrow copy constructible"); + static_assert(std::is_nothrow_copy_constructible::value, + "Allocator must be nothrow copy constructible"); + static_assert(std::is_trivially_copyable::value, + "iterator not trivially copyable."); + + // Note: We assert that kTargetValues, which is computed from + // Params::kTargetNodeSize, must fit the node_type::field_type. + static_assert( + kNodeSlots < (1 << (8 * sizeof(typename node_type::field_type))), + "target node size too large"); + + // Verify that key_compare returns an absl::{weak,strong}_ordering or bool. + static_assert( + compare_has_valid_result_type(), + "key comparison function must return absl::{weak,strong}_ordering or " + "bool."); + + // Test the assumption made in setting kNodeSlotSpace. + static_assert(node_type::MinimumOverhead() >= sizeof(void *) + 4, + "node space assumption incorrect"); + + return true; +} + +template +template +auto btree

::lower_bound_equal(const K &key) const + -> std::pair { + const SearchResult res = + internal_lower_bound(key); + const iterator lower = iterator(internal_end(res.value)); + const bool equal = res.HasMatch() + ? res.IsEq() + : lower != end() && !compare_keys(key, lower.key()); + return {lower, equal}; +} + +template +template +auto btree

::equal_range(const K &key) -> std::pair { + const std::pair lower_and_equal = lower_bound_equal(key); + const iterator lower = lower_and_equal.first; + if (!lower_and_equal.second) { + return {lower, lower}; + } + + const iterator next = std::next(lower); + if (!params_type::template can_have_multiple_equivalent_keys()) { + // The next iterator after lower must point to a key greater than `key`. + // Note: if this assert fails, then it may indicate that the comparator does + // not meet the equivalence requirements for Compare + // (see https://en.cppreference.com/w/cpp/named_req/Compare). + assert(next == end() || compare_keys(key, next.key())); + return {lower, next}; + } + // Try once more to avoid the call to upper_bound() if there's only one + // equivalent key. This should prevent all calls to upper_bound() in cases of + // unique-containers with heterogeneous comparators in which all comparison + // operators have the same equivalence classes. + if (next == end() || compare_keys(key, next.key())) return {lower, next}; + + // In this case, we need to call upper_bound() to avoid worst case O(N) + // behavior if we were to iterate over equal keys. + return {lower, upper_bound(key)}; +} + +template +template +auto btree

::insert_unique(const K &key, Args &&...args) + -> std::pair { + if (empty()) { + mutable_root() = mutable_rightmost() = new_leaf_root_node(1); + } + + SearchResult res = internal_locate(key); + iterator iter = res.value; + + if (res.HasMatch()) { + if (res.IsEq()) { + // The key already exists in the tree, do nothing. + return {iter, false}; + } + } else { + iterator last = internal_last(iter); + if (last.node_ && !compare_keys(key, last.key())) { + // The key already exists in the tree, do nothing. + return {last, false}; + } + } + return {internal_emplace(iter, std::forward(args)...), true}; +} + +template +template +inline auto btree

::insert_hint_unique(iterator position, const K &key, + Args &&...args) + -> std::pair { + if (!empty()) { + if (position == end() || compare_keys(key, position.key())) { + if (position == begin() || compare_keys(std::prev(position).key(), key)) { + // prev.key() < key < position.key() + return {internal_emplace(position, std::forward(args)...), true}; + } + } else if (compare_keys(position.key(), key)) { + ++position; + if (position == end() || compare_keys(key, position.key())) { + // {original `position`}.key() < key < {current `position`}.key() + return {internal_emplace(position, std::forward(args)...), true}; + } + } else { + // position.key() == key + return {position, false}; + } + } + return insert_unique(key, std::forward(args)...); +} + +template +template +void btree

::insert_iterator_unique(InputIterator b, InputIterator e, int) { + for (; b != e; ++b) { + insert_hint_unique(end(), params_type::key(*b), *b); + } +} + +template +template +void btree

::insert_iterator_unique(InputIterator b, InputIterator e, char) { + for (; b != e; ++b) { + // Use a node handle to manage a temp slot. + auto node_handle = + CommonAccess::Construct(get_allocator(), *b); + slot_type *slot = CommonAccess::GetSlot(node_handle); + insert_hint_unique(end(), params_type::key(slot), slot); + } +} + +template +template +auto btree

::insert_multi(const key_type &key, ValueType &&v) -> iterator { + if (empty()) { + mutable_root() = mutable_rightmost() = new_leaf_root_node(1); + } + + iterator iter = internal_upper_bound(key); + if (iter.node_ == nullptr) { + iter = end(); + } + return internal_emplace(iter, std::forward(v)); +} + +template +template +auto btree

::insert_hint_multi(iterator position, ValueType &&v) -> iterator { + if (!empty()) { + const key_type &key = params_type::key(v); + if (position == end() || !compare_keys(position.key(), key)) { + if (position == begin() || + !compare_keys(key, std::prev(position).key())) { + // prev.key() <= key <= position.key() + return internal_emplace(position, std::forward(v)); + } + } else { + ++position; + if (position == end() || !compare_keys(position.key(), key)) { + // {original `position`}.key() < key < {current `position`}.key() + return internal_emplace(position, std::forward(v)); + } + } + } + return insert_multi(std::forward(v)); +} + +template +template +void btree

::insert_iterator_multi(InputIterator b, InputIterator e) { + for (; b != e; ++b) { + insert_hint_multi(end(), *b); + } +} + +template +auto btree

::operator=(const btree &other) -> btree & { + if (this != &other) { + clear(); + + *mutable_key_comp() = other.key_comp(); + if (absl::allocator_traits< + allocator_type>::propagate_on_container_copy_assignment::value) { + *mutable_allocator() = other.allocator(); + } + + copy_or_move_values_in_order(other); + } + return *this; +} + +template +auto btree

::operator=(btree &&other) noexcept -> btree & { + if (this != &other) { + clear(); + + using std::swap; + if (absl::allocator_traits< + allocator_type>::propagate_on_container_move_assignment::value) { + swap(root_, other.root_); + // Note: `rightmost_` also contains the allocator and the key comparator. + swap(rightmost_, other.rightmost_); + swap(size_, other.size_); + } else { + if (allocator() == other.allocator()) { + swap(mutable_root(), other.mutable_root()); + swap(*mutable_key_comp(), *other.mutable_key_comp()); + swap(mutable_rightmost(), other.mutable_rightmost()); + swap(size_, other.size_); + } else { + // We aren't allowed to propagate the allocator and the allocator is + // different so we can't take over its memory. We must move each element + // individually. We need both `other` and `this` to have `other`s key + // comparator while moving the values so we can't swap the key + // comparators. + *mutable_key_comp() = other.key_comp(); + copy_or_move_values_in_order(other); + } + } + } + return *this; +} + +template +auto btree

::erase(iterator iter) -> iterator { + iter.node_->value_destroy(static_cast(iter.position_), + mutable_allocator()); + iter.update_generation(); + + const bool internal_delete = iter.node_->is_internal(); + if (internal_delete) { + // Deletion of a value on an internal node. First, transfer the largest + // value from our left child here, then erase/rebalance from that position. + // We can get to the largest value from our left child by decrementing iter. + iterator internal_iter(iter); + --iter; + assert(iter.node_->is_leaf()); + internal_iter.node_->transfer( + static_cast(internal_iter.position_), + static_cast(iter.position_), iter.node_, + mutable_allocator()); + } else { + // Shift values after erased position in leaf. In the internal case, we + // don't need to do this because the leaf position is the end of the node. + const field_type transfer_from = + static_cast(iter.position_ + 1); + const field_type num_to_transfer = iter.node_->finish() - transfer_from; + iter.node_->transfer_n(num_to_transfer, + static_cast(iter.position_), + transfer_from, iter.node_, mutable_allocator()); + } + // Update node finish and container size. + iter.node_->set_finish(iter.node_->finish() - 1); + --size_; + + // We want to return the next value after the one we just erased. If we + // erased from an internal node (internal_delete == true), then the next + // value is ++(++iter). If we erased from a leaf node (internal_delete == + // false) then the next value is ++iter. Note that ++iter may point to an + // internal node and the value in the internal node may move to a leaf node + // (iter.node_) when rebalancing is performed at the leaf level. + + iterator res = rebalance_after_delete(iter); + + // If we erased from an internal node, advance the iterator. + if (internal_delete) { + ++res; + } + return res; +} + +template +auto btree

::rebalance_after_delete(iterator iter) -> iterator { + // Merge/rebalance as we walk back up the tree. + iterator res(iter); + bool first_iteration = true; + for (;;) { + if (iter.node_ == root()) { + try_shrink(); + if (empty()) { + return end(); + } + break; + } + if (iter.node_->count() >= kMinNodeValues) { + break; + } + bool merged = try_merge_or_rebalance(&iter); + // On the first iteration, we should update `res` with `iter` because `res` + // may have been invalidated. + if (first_iteration) { + res = iter; + first_iteration = false; + } + if (!merged) { + break; + } + iter.position_ = iter.node_->position(); + iter.node_ = iter.node_->parent(); + } + res.update_generation(); + + // Adjust our return value. If we're pointing at the end of a node, advance + // the iterator. + if (res.position_ == res.node_->finish()) { + res.position_ = res.node_->finish() - 1; + ++res; + } + + return res; +} + +// Note: we tried implementing this more efficiently by erasing all of the +// elements in [begin, end) at once and then doing rebalancing once at the end +// (rather than interleaving deletion and rebalancing), but that adds a lot of +// complexity, which seems to outweigh the performance win. +template +auto btree

::erase_range(iterator begin, iterator end) + -> std::pair { + size_type count = static_cast(end - begin); + assert(count >= 0); + + if (count == 0) { + return {0, begin}; + } + + if (static_cast(count) == size_) { + clear(); + return {count, this->end()}; + } + + if (begin.node_ == end.node_) { + assert(end.position_ > begin.position_); + begin.node_->remove_values( + static_cast(begin.position_), + static_cast(end.position_ - begin.position_), + mutable_allocator()); + size_ -= count; + return {count, rebalance_after_delete(begin)}; + } + + const size_type target_size = size_ - count; + while (size_ > target_size) { + if (begin.node_->is_leaf()) { + const size_type remaining_to_erase = size_ - target_size; + const size_type remaining_in_node = + static_cast(begin.node_->finish() - begin.position_); + const field_type to_erase = static_cast( + (std::min)(remaining_to_erase, remaining_in_node)); + begin.node_->remove_values(static_cast(begin.position_), + to_erase, mutable_allocator()); + size_ -= to_erase; + begin = rebalance_after_delete(begin); + } else { + begin = erase(begin); + } + } + begin.update_generation(); + return {count, begin}; +} + +template +void btree

::clear() { + if (!empty()) { + node_type::clear_and_delete(root(), mutable_allocator()); + } + mutable_root() = mutable_rightmost() = EmptyNode(); + size_ = 0; +} + +template +void btree

::swap(btree &other) { + using std::swap; + if (absl::allocator_traits< + allocator_type>::propagate_on_container_swap::value) { + // Note: `rightmost_` also contains the allocator and the key comparator. + swap(rightmost_, other.rightmost_); + } else { + // It's undefined behavior if the allocators are unequal here. + assert(allocator() == other.allocator()); + swap(mutable_rightmost(), other.mutable_rightmost()); + swap(*mutable_key_comp(), *other.mutable_key_comp()); + } + swap(mutable_root(), other.mutable_root()); + swap(size_, other.size_); +} + +template +void btree

::verify() const { + assert(root() != nullptr); + assert(leftmost() != nullptr); + assert(rightmost() != nullptr); + assert(empty() || size() == internal_verify(root(), nullptr, nullptr)); + assert(leftmost() == (++const_iterator(root(), -1)).node_); + assert(rightmost() == (--const_iterator(root(), root()->finish())).node_); + assert(leftmost()->is_leaf()); + assert(rightmost()->is_leaf()); +} + +template +void btree

::rebalance_or_split(iterator *iter) { + node_type *&node = iter->node_; + int &insert_position = iter->position_; + assert(node->count() == node->max_count()); + assert(kNodeSlots == node->max_count()); + + // First try to make room on the node by rebalancing. + node_type *parent = node->parent(); + if (node != root()) { + if (node->position() > parent->start()) { + // Try rebalancing with our left sibling. + node_type *left = parent->child(node->position() - 1); + assert(left->max_count() == kNodeSlots); + if (left->count() < kNodeSlots) { + // We bias rebalancing based on the position being inserted. If we're + // inserting at the end of the right node then we bias rebalancing to + // fill up the left node. + field_type to_move = + (kNodeSlots - left->count()) / + (1 + (static_cast(insert_position) < kNodeSlots)); + to_move = (std::max)(field_type{1}, to_move); + + if (static_cast(insert_position) - to_move >= + node->start() || + left->count() + to_move < kNodeSlots) { + left->rebalance_right_to_left(to_move, node, mutable_allocator()); + + assert(node->max_count() - node->count() == to_move); + insert_position = static_cast( + static_cast(insert_position) - to_move); + if (insert_position < node->start()) { + insert_position = insert_position + left->count() + 1; + node = left; + } + + assert(node->count() < node->max_count()); + return; + } + } + } + + if (node->position() < parent->finish()) { + // Try rebalancing with our right sibling. + node_type *right = parent->child(node->position() + 1); + assert(right->max_count() == kNodeSlots); + if (right->count() < kNodeSlots) { + // We bias rebalancing based on the position being inserted. If we're + // inserting at the beginning of the left node then we bias rebalancing + // to fill up the right node. + field_type to_move = (kNodeSlots - right->count()) / + (1 + (insert_position > node->start())); + to_move = (std::max)(field_type{1}, to_move); + + if (static_cast(insert_position) <= + node->finish() - to_move || + right->count() + to_move < kNodeSlots) { + node->rebalance_left_to_right(to_move, right, mutable_allocator()); + + if (insert_position > node->finish()) { + insert_position = insert_position - node->count() - 1; + node = right; + } + + assert(node->count() < node->max_count()); + return; + } + } + } + + // Rebalancing failed, make sure there is room on the parent node for a new + // value. + assert(parent->max_count() == kNodeSlots); + if (parent->count() == kNodeSlots) { + iterator parent_iter(parent, node->position()); + rebalance_or_split(&parent_iter); + parent = node->parent(); + } + } else { + // Rebalancing not possible because this is the root node. + // Create a new root node and set the current root node as the child of the + // new root. + parent = new_internal_node(/*position=*/0, parent); + parent->set_generation(root()->generation()); + parent->init_child(parent->start(), node); + mutable_root() = parent; + // If the former root was a leaf node, then it's now the rightmost node. + assert(parent->start_child()->is_internal() || + parent->start_child() == rightmost()); + } + + // Split the node. + node_type *split_node; + if (node->is_leaf()) { + split_node = new_leaf_node(node->position() + 1, parent); + node->split(insert_position, split_node, mutable_allocator()); + if (rightmost() == node) mutable_rightmost() = split_node; + } else { + split_node = new_internal_node(node->position() + 1, parent); + node->split(insert_position, split_node, mutable_allocator()); + } + + if (insert_position > node->finish()) { + insert_position = insert_position - node->count() - 1; + node = split_node; + } +} + +template +void btree

::merge_nodes(node_type *left, node_type *right) { + left->merge(right, mutable_allocator()); + if (rightmost() == right) mutable_rightmost() = left; +} + +template +bool btree

::try_merge_or_rebalance(iterator *iter) { + node_type *parent = iter->node_->parent(); + if (iter->node_->position() > parent->start()) { + // Try merging with our left sibling. + node_type *left = parent->child(iter->node_->position() - 1); + assert(left->max_count() == kNodeSlots); + if (1U + left->count() + iter->node_->count() <= kNodeSlots) { + iter->position_ += 1 + left->count(); + merge_nodes(left, iter->node_); + iter->node_ = left; + return true; + } + } + if (iter->node_->position() < parent->finish()) { + // Try merging with our right sibling. + node_type *right = parent->child(iter->node_->position() + 1); + assert(right->max_count() == kNodeSlots); + if (1U + iter->node_->count() + right->count() <= kNodeSlots) { + merge_nodes(iter->node_, right); + return true; + } + // Try rebalancing with our right sibling. We don't perform rebalancing if + // we deleted the first element from iter->node_ and the node is not + // empty. This is a small optimization for the common pattern of deleting + // from the front of the tree. + if (right->count() > kMinNodeValues && + (iter->node_->count() == 0 || iter->position_ > iter->node_->start())) { + field_type to_move = (right->count() - iter->node_->count()) / 2; + to_move = + (std::min)(to_move, static_cast(right->count() - 1)); + iter->node_->rebalance_right_to_left(to_move, right, mutable_allocator()); + return false; + } + } + if (iter->node_->position() > parent->start()) { + // Try rebalancing with our left sibling. We don't perform rebalancing if + // we deleted the last element from iter->node_ and the node is not + // empty. This is a small optimization for the common pattern of deleting + // from the back of the tree. + node_type *left = parent->child(iter->node_->position() - 1); + if (left->count() > kMinNodeValues && + (iter->node_->count() == 0 || + iter->position_ < iter->node_->finish())) { + field_type to_move = (left->count() - iter->node_->count()) / 2; + to_move = (std::min)(to_move, static_cast(left->count() - 1)); + left->rebalance_left_to_right(to_move, iter->node_, mutable_allocator()); + iter->position_ += to_move; + return false; + } + } + return false; +} + +template +void btree

::try_shrink() { + node_type *orig_root = root(); + if (orig_root->count() > 0) { + return; + } + // Deleted the last item on the root node, shrink the height of the tree. + if (orig_root->is_leaf()) { + assert(size() == 0); + mutable_root() = mutable_rightmost() = EmptyNode(); + } else { + node_type *child = orig_root->start_child(); + child->make_root(); + mutable_root() = child; + } + node_type::clear_and_delete(orig_root, mutable_allocator()); +} + +template +template +inline IterType btree

::internal_last(IterType iter) { + assert(iter.node_ != nullptr); + while (iter.position_ == iter.node_->finish()) { + iter.position_ = iter.node_->position(); + iter.node_ = iter.node_->parent(); + if (iter.node_->is_leaf()) { + iter.node_ = nullptr; + break; + } + } + iter.update_generation(); + return iter; +} + +template +template +inline auto btree

::internal_emplace(iterator iter, Args &&...args) + -> iterator { + if (iter.node_->is_internal()) { + // We can't insert on an internal node. Instead, we'll insert after the + // previous value which is guaranteed to be on a leaf node. + --iter; + ++iter.position_; + } + const field_type max_count = iter.node_->max_count(); + allocator_type *alloc = mutable_allocator(); + + const auto transfer_and_delete = [&](node_type *old_node, + node_type *new_node) { + new_node->transfer_n(old_node->count(), new_node->start(), + old_node->start(), old_node, alloc); + new_node->set_finish(old_node->finish()); + old_node->set_finish(old_node->start()); + new_node->set_generation(old_node->generation()); + node_type::clear_and_delete(old_node, alloc); + }; + const auto replace_leaf_root_node = [&](field_type new_node_size) { + assert(iter.node_ == root()); + node_type *old_root = iter.node_; + node_type *new_root = iter.node_ = new_leaf_root_node(new_node_size); + transfer_and_delete(old_root, new_root); + mutable_root() = mutable_rightmost() = new_root; + }; + + bool replaced_node = false; + if (iter.node_->count() == max_count) { + // Make room in the leaf for the new item. + if (max_count < kNodeSlots) { + // Insertion into the root where the root is smaller than the full node + // size. Simply grow the size of the root node. + replace_leaf_root_node(static_cast( + (std::min)(static_cast(kNodeSlots), 2 * max_count))); + replaced_node = true; + } else { + rebalance_or_split(&iter); + } + } + (void)replaced_node; +#if defined(ABSL_HAVE_ADDRESS_SANITIZER) || \ + defined(ABSL_HAVE_HWADDRESS_SANITIZER) + if (!replaced_node) { + assert(iter.node_->is_leaf()); + if (iter.node_->is_root()) { + replace_leaf_root_node(max_count); + } else { + node_type *old_node = iter.node_; + const bool was_rightmost = rightmost() == old_node; + const bool was_leftmost = leftmost() == old_node; + node_type *parent = old_node->parent(); + const field_type position = old_node->position(); + node_type *new_node = iter.node_ = new_leaf_node(position, parent); + parent->set_child_noupdate_position(position, new_node); + transfer_and_delete(old_node, new_node); + if (was_rightmost) mutable_rightmost() = new_node; + // The leftmost node is stored as the parent of the root node. + if (was_leftmost) root()->set_parent(new_node); + } + } +#endif + iter.node_->emplace_value(static_cast(iter.position_), alloc, + std::forward(args)...); + assert( + iter.node_->is_ordered_correctly(static_cast(iter.position_), + original_key_compare(key_comp())) && + "If this assert fails, then either (1) the comparator may violate " + "transitivity, i.e. comp(a,b) && comp(b,c) -> comp(a,c) (see " + "https://en.cppreference.com/w/cpp/named_req/Compare), or (2) a " + "key may have been mutated after it was inserted into the tree."); + ++size_; + iter.update_generation(); + return iter; +} + +template +template +inline auto btree

::internal_locate(const K &key) const + -> SearchResult { + iterator iter(const_cast(root())); + for (;;) { + SearchResult res = + iter.node_->lower_bound(key, key_comp()); + iter.position_ = static_cast(res.value); + if (res.IsEq()) { + return {iter, MatchKind::kEq}; + } + // Note: in the non-key-compare-to case, we don't need to walk all the way + // down the tree if the keys are equal, but determining equality would + // require doing an extra comparison on each node on the way down, and we + // will need to go all the way to the leaf node in the expected case. + if (iter.node_->is_leaf()) { + break; + } + iter.node_ = iter.node_->child(static_cast(iter.position_)); + } + // Note: in the non-key-compare-to case, the key may actually be equivalent + // here (and the MatchKind::kNe is ignored). + return {iter, MatchKind::kNe}; +} + +template +template +auto btree

::internal_lower_bound(const K &key) const + -> SearchResult { + if (!params_type::template can_have_multiple_equivalent_keys()) { + SearchResult ret = internal_locate(key); + ret.value = internal_last(ret.value); + return ret; + } + iterator iter(const_cast(root())); + SearchResult res; + bool seen_eq = false; + for (;;) { + res = iter.node_->lower_bound(key, key_comp()); + iter.position_ = static_cast(res.value); + if (iter.node_->is_leaf()) { + break; + } + seen_eq = seen_eq || res.IsEq(); + iter.node_ = iter.node_->child(static_cast(iter.position_)); + } + if (res.IsEq()) return {iter, MatchKind::kEq}; + return {internal_last(iter), seen_eq ? MatchKind::kEq : MatchKind::kNe}; +} + +template +template +auto btree

::internal_upper_bound(const K &key) const -> iterator { + iterator iter(const_cast(root())); + for (;;) { + iter.position_ = static_cast(iter.node_->upper_bound(key, key_comp())); + if (iter.node_->is_leaf()) { + break; + } + iter.node_ = iter.node_->child(static_cast(iter.position_)); + } + return internal_last(iter); +} + +template +template +auto btree

::internal_find(const K &key) const -> iterator { + SearchResult res = internal_locate(key); + if (res.HasMatch()) { + if (res.IsEq()) { + return res.value; + } + } else { + const iterator iter = internal_last(res.value); + if (iter.node_ != nullptr && !compare_keys(key, iter.key())) { + return iter; + } + } + return {nullptr, 0}; +} + +template +typename btree

::size_type btree

::internal_verify( + const node_type *node, const key_type *lo, const key_type *hi) const { + assert(node->count() > 0); + assert(node->count() <= node->max_count()); + if (lo) { + assert(!compare_keys(node->key(node->start()), *lo)); + } + if (hi) { + assert(!compare_keys(*hi, node->key(node->finish() - 1))); + } + for (int i = node->start() + 1; i < node->finish(); ++i) { + assert(!compare_keys(node->key(i), node->key(i - 1))); + } + size_type count = node->count(); + if (node->is_internal()) { + for (field_type i = node->start(); i <= node->finish(); ++i) { + assert(node->child(i) != nullptr); + assert(node->child(i)->parent() == node); + assert(node->child(i)->position() == i); + count += internal_verify(node->child(i), + i == node->start() ? lo : &node->key(i - 1), + i == node->finish() ? hi : &node->key(i)); + } + } + return count; +} + +struct btree_access { + template + static auto erase_if(BtreeContainer &container, Pred pred) -> + typename BtreeContainer::size_type { + const auto initial_size = container.size(); + auto &tree = container.tree_; + auto *alloc = tree.mutable_allocator(); + for (auto it = container.begin(); it != container.end();) { + if (!pred(*it)) { + ++it; + continue; + } + auto *node = it.node_; + if (node->is_internal()) { + // Handle internal nodes normally. + it = container.erase(it); + continue; + } + // If this is a leaf node, then we do all the erases from this node + // at once before doing rebalancing. + + // The current position to transfer slots to. + int to_pos = it.position_; + node->value_destroy(it.position_, alloc); + while (++it.position_ < node->finish()) { + it.update_generation(); + if (pred(*it)) { + node->value_destroy(it.position_, alloc); + } else { + node->transfer(node->slot(to_pos++), node->slot(it.position_), alloc); + } + } + const int num_deleted = node->finish() - to_pos; + tree.size_ -= num_deleted; + node->set_finish(to_pos); + it.position_ = to_pos; + it = tree.rebalance_after_delete(it); + } + return initial_size - container.size(); + } +}; + +#undef ABSL_BTREE_ENABLE_GENERATIONS + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_INTERNAL_BTREE_H_ diff --git a/absl/container/internal/btree_container.h b/absl/container/internal/btree_container.h new file mode 100644 index 0000000..a68ce44 --- /dev/null +++ b/absl/container/internal/btree_container.h @@ -0,0 +1,763 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 ABSL_CONTAINER_INTERNAL_BTREE_CONTAINER_H_ +#define ABSL_CONTAINER_INTERNAL_BTREE_CONTAINER_H_ + +#include +#include +#include +#include + +#include "absl/base/attributes.h" +#include "absl/base/internal/throw_delegate.h" +#include "absl/container/internal/btree.h" // IWYU pragma: export +#include "absl/container/internal/common.h" +#include "absl/memory/memory.h" +#include "absl/meta/type_traits.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +// A common base class for btree_set, btree_map, btree_multiset, and +// btree_multimap. +template +class btree_container { + using params_type = typename Tree::params_type; + + protected: + // Alias used for heterogeneous lookup functions. + // `key_arg` evaluates to `K` when the functors are transparent and to + // `key_type` otherwise. It permits template argument deduction on `K` for the + // transparent case. + template + using key_arg = + typename KeyArg::template type< + K, typename Tree::key_type>; + + public: + using key_type = typename Tree::key_type; + using value_type = typename Tree::value_type; + using size_type = typename Tree::size_type; + using difference_type = typename Tree::difference_type; + using key_compare = typename Tree::original_key_compare; + using value_compare = typename Tree::value_compare; + using allocator_type = typename Tree::allocator_type; + using reference = typename Tree::reference; + using const_reference = typename Tree::const_reference; + using pointer = typename Tree::pointer; + using const_pointer = typename Tree::const_pointer; + using iterator = typename Tree::iterator; + using const_iterator = typename Tree::const_iterator; + using reverse_iterator = typename Tree::reverse_iterator; + using const_reverse_iterator = typename Tree::const_reverse_iterator; + using node_type = typename Tree::node_handle_type; + + struct extract_and_get_next_return_type { + node_type node; + iterator next; + }; + + // Constructors/assignments. + btree_container() : tree_(key_compare(), allocator_type()) {} + explicit btree_container(const key_compare &comp, + const allocator_type &alloc = allocator_type()) + : tree_(comp, alloc) {} + explicit btree_container(const allocator_type &alloc) + : tree_(key_compare(), alloc) {} + + btree_container(const btree_container &other) + : btree_container(other, absl::allocator_traits:: + select_on_container_copy_construction( + other.get_allocator())) {} + btree_container(const btree_container &other, const allocator_type &alloc) + : tree_(other.tree_, alloc) {} + + btree_container(btree_container &&other) noexcept( + std::is_nothrow_move_constructible::value) = default; + btree_container(btree_container &&other, const allocator_type &alloc) + : tree_(std::move(other.tree_), alloc) {} + + btree_container &operator=(const btree_container &other) = default; + btree_container &operator=(btree_container &&other) noexcept( + std::is_nothrow_move_assignable::value) = default; + + // Iterator routines. + iterator begin() ABSL_ATTRIBUTE_LIFETIME_BOUND { return tree_.begin(); } + const_iterator begin() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.begin(); + } + const_iterator cbegin() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.begin(); + } + iterator end() ABSL_ATTRIBUTE_LIFETIME_BOUND { return tree_.end(); } + const_iterator end() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.end(); + } + const_iterator cend() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.end(); + } + reverse_iterator rbegin() ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.rbegin(); + } + const_reverse_iterator rbegin() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.rbegin(); + } + const_reverse_iterator crbegin() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.rbegin(); + } + reverse_iterator rend() ABSL_ATTRIBUTE_LIFETIME_BOUND { return tree_.rend(); } + const_reverse_iterator rend() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.rend(); + } + const_reverse_iterator crend() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.rend(); + } + + // Lookup routines. + template + size_type count(const key_arg &key) const { + auto equal_range = this->equal_range(key); + return equal_range.second - equal_range.first; + } + template + iterator find(const key_arg &key) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.find(key); + } + template + const_iterator find(const key_arg &key) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.find(key); + } + template + bool contains(const key_arg &key) const { + return find(key) != end(); + } + template + iterator lower_bound(const key_arg &key) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.lower_bound(key); + } + template + const_iterator lower_bound(const key_arg &key) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.lower_bound(key); + } + template + iterator upper_bound(const key_arg &key) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.upper_bound(key); + } + template + const_iterator upper_bound(const key_arg &key) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.upper_bound(key); + } + template + std::pair equal_range(const key_arg &key) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.equal_range(key); + } + template + std::pair equal_range( + const key_arg &key) const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.equal_range(key); + } + + // Deletion routines. Note that there is also a deletion routine that is + // specific to btree_set_container/btree_multiset_container. + + // Erase the specified iterator from the btree. The iterator must be valid + // (i.e. not equal to end()). Return an iterator pointing to the node after + // the one that was erased (or end() if none exists). + iterator erase(const_iterator iter) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.erase(iterator(iter)); + } + iterator erase(iterator iter) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.erase(iter); + } + iterator erase(const_iterator first, + const_iterator last) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return tree_.erase_range(iterator(first), iterator(last)).second; + } + template + size_type erase(const key_arg &key) { + auto equal_range = this->equal_range(key); + return tree_.erase_range(equal_range.first, equal_range.second).first; + } + + // Extract routines. + extract_and_get_next_return_type extract_and_get_next(const_iterator position) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // Use Construct instead of Transfer because the rebalancing code will + // destroy the slot later. + // Note: we rely on erase() taking place after Construct(). + return {CommonAccess::Construct(get_allocator(), + iterator(position).slot()), + erase(position)}; + } + node_type extract(iterator position) { + // Use Construct instead of Transfer because the rebalancing code will + // destroy the slot later. + auto node = + CommonAccess::Construct(get_allocator(), position.slot()); + erase(position); + return node; + } + node_type extract(const_iterator position) { + return extract(iterator(position)); + } + + // Utility routines. + ABSL_ATTRIBUTE_REINITIALIZES void clear() { tree_.clear(); } + void swap(btree_container &other) { tree_.swap(other.tree_); } + void verify() const { tree_.verify(); } + + // Size routines. + size_type size() const { return tree_.size(); } + size_type max_size() const { return tree_.max_size(); } + bool empty() const { return tree_.empty(); } + + friend bool operator==(const btree_container &x, const btree_container &y) { + if (x.size() != y.size()) return false; + return std::equal(x.begin(), x.end(), y.begin()); + } + + friend bool operator!=(const btree_container &x, const btree_container &y) { + return !(x == y); + } + + friend bool operator<(const btree_container &x, const btree_container &y) { + return std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); + } + + friend bool operator>(const btree_container &x, const btree_container &y) { + return y < x; + } + + friend bool operator<=(const btree_container &x, const btree_container &y) { + return !(y < x); + } + + friend bool operator>=(const btree_container &x, const btree_container &y) { + return !(x < y); + } + + // The allocator used by the btree. + allocator_type get_allocator() const { return tree_.get_allocator(); } + + // The key comparator used by the btree. + key_compare key_comp() const { return key_compare(tree_.key_comp()); } + value_compare value_comp() const { return tree_.value_comp(); } + + // Support absl::Hash. + template + friend State AbslHashValue(State h, const btree_container &b) { + for (const auto &v : b) { + h = State::combine(std::move(h), v); + } + return State::combine(std::move(h), b.size()); + } + + protected: + friend struct btree_access; + Tree tree_; +}; + +// A common base class for btree_set and btree_map. +template +class btree_set_container : public btree_container { + using super_type = btree_container; + using params_type = typename Tree::params_type; + using init_type = typename params_type::init_type; + using is_key_compare_to = typename params_type::is_key_compare_to; + friend class BtreeNodePeer; + + protected: + template + using key_arg = typename super_type::template key_arg; + + public: + using key_type = typename Tree::key_type; + using value_type = typename Tree::value_type; + using size_type = typename Tree::size_type; + using key_compare = typename Tree::original_key_compare; + using allocator_type = typename Tree::allocator_type; + using iterator = typename Tree::iterator; + using const_iterator = typename Tree::const_iterator; + using node_type = typename super_type::node_type; + using insert_return_type = InsertReturnType; + + // Inherit constructors. + using super_type::super_type; + btree_set_container() {} + + // Range constructors. + template + btree_set_container(InputIterator b, InputIterator e, + const key_compare &comp = key_compare(), + const allocator_type &alloc = allocator_type()) + : super_type(comp, alloc) { + insert(b, e); + } + template + btree_set_container(InputIterator b, InputIterator e, + const allocator_type &alloc) + : btree_set_container(b, e, key_compare(), alloc) {} + + // Initializer list constructors. + btree_set_container(std::initializer_list init, + const key_compare &comp = key_compare(), + const allocator_type &alloc = allocator_type()) + : btree_set_container(init.begin(), init.end(), comp, alloc) {} + btree_set_container(std::initializer_list init, + const allocator_type &alloc) + : btree_set_container(init.begin(), init.end(), alloc) {} + + // Insertion routines. + std::pair insert(const value_type &v) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return this->tree_.insert_unique(params_type::key(v), v); + } + std::pair insert(value_type &&v) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return this->tree_.insert_unique(params_type::key(v), std::move(v)); + } + template + std::pair emplace(Args &&...args) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // Use a node handle to manage a temp slot. + auto node = CommonAccess::Construct(this->get_allocator(), + std::forward(args)...); + auto *slot = CommonAccess::GetSlot(node); + return this->tree_.insert_unique(params_type::key(slot), slot); + } + iterator insert(const_iterator hint, + const value_type &v) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return this->tree_ + .insert_hint_unique(iterator(hint), params_type::key(v), v) + .first; + } + iterator insert(const_iterator hint, + value_type &&v) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return this->tree_ + .insert_hint_unique(iterator(hint), params_type::key(v), std::move(v)) + .first; + } + template + iterator emplace_hint(const_iterator hint, + Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND { + // Use a node handle to manage a temp slot. + auto node = CommonAccess::Construct(this->get_allocator(), + std::forward(args)...); + auto *slot = CommonAccess::GetSlot(node); + return this->tree_ + .insert_hint_unique(iterator(hint), params_type::key(slot), slot) + .first; + } + template + void insert(InputIterator b, InputIterator e) { + this->tree_.insert_iterator_unique(b, e, 0); + } + void insert(std::initializer_list init) { + this->tree_.insert_iterator_unique(init.begin(), init.end(), 0); + } + insert_return_type insert(node_type &&node) ABSL_ATTRIBUTE_LIFETIME_BOUND { + if (!node) return {this->end(), false, node_type()}; + std::pair res = + this->tree_.insert_unique(params_type::key(CommonAccess::GetSlot(node)), + CommonAccess::GetSlot(node)); + if (res.second) { + CommonAccess::Destroy(&node); + return {res.first, true, node_type()}; + } else { + return {res.first, false, std::move(node)}; + } + } + iterator insert(const_iterator hint, + node_type &&node) ABSL_ATTRIBUTE_LIFETIME_BOUND { + if (!node) return this->end(); + std::pair res = this->tree_.insert_hint_unique( + iterator(hint), params_type::key(CommonAccess::GetSlot(node)), + CommonAccess::GetSlot(node)); + if (res.second) CommonAccess::Destroy(&node); + return res.first; + } + + // Node extraction routines. + template + node_type extract(const key_arg &key) { + const std::pair lower_and_equal = + this->tree_.lower_bound_equal(key); + return lower_and_equal.second ? extract(lower_and_equal.first) + : node_type(); + } + using super_type::extract; + + // Merge routines. + // Moves elements from `src` into `this`. If the element already exists in + // `this`, it is left unmodified in `src`. + template < + typename T, + typename absl::enable_if_t< + absl::conjunction< + std::is_same, + std::is_same, + std::is_same>::value, + int> = 0> + void merge(btree_container &src) { // NOLINT + for (auto src_it = src.begin(); src_it != src.end();) { + if (insert(std::move(params_type::element(src_it.slot()))).second) { + src_it = src.erase(src_it); + } else { + ++src_it; + } + } + } + + template < + typename T, + typename absl::enable_if_t< + absl::conjunction< + std::is_same, + std::is_same, + std::is_same>::value, + int> = 0> + void merge(btree_container &&src) { + merge(src); + } +}; + +// Base class for btree_map. +template +class btree_map_container : public btree_set_container { + using super_type = btree_set_container; + using params_type = typename Tree::params_type; + friend class BtreeNodePeer; + + private: + template + using key_arg = typename super_type::template key_arg; + + public: + using key_type = typename Tree::key_type; + using mapped_type = typename params_type::mapped_type; + using value_type = typename Tree::value_type; + using key_compare = typename Tree::original_key_compare; + using allocator_type = typename Tree::allocator_type; + using iterator = typename Tree::iterator; + using const_iterator = typename Tree::const_iterator; + + // Inherit constructors. + using super_type::super_type; + btree_map_container() {} + + // Insertion routines. + // Note: the nullptr template arguments and extra `const M&` overloads allow + // for supporting bitfield arguments. + template + std::pair insert_or_assign(const key_arg &k, const M &obj) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert_or_assign_impl(k, obj); + } + template + std::pair insert_or_assign(key_arg &&k, const M &obj) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert_or_assign_impl(std::forward(k), obj); + } + template + std::pair insert_or_assign(const key_arg &k, M &&obj) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert_or_assign_impl(k, std::forward(obj)); + } + template + std::pair insert_or_assign(key_arg &&k, M &&obj) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert_or_assign_impl(std::forward(k), std::forward(obj)); + } + template + iterator insert_or_assign(const_iterator hint, const key_arg &k, + const M &obj) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert_or_assign_hint_impl(hint, k, obj); + } + template + iterator insert_or_assign(const_iterator hint, key_arg &&k, + const M &obj) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert_or_assign_hint_impl(hint, std::forward(k), obj); + } + template + iterator insert_or_assign(const_iterator hint, const key_arg &k, + M &&obj) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert_or_assign_hint_impl(hint, k, std::forward(obj)); + } + template + iterator insert_or_assign(const_iterator hint, key_arg &&k, + M &&obj) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert_or_assign_hint_impl(hint, std::forward(k), + std::forward(obj)); + } + + template ::value, int> = 0> + std::pair try_emplace(const key_arg &k, Args &&...args) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return try_emplace_impl(k, std::forward(args)...); + } + template ::value, int> = 0> + std::pair try_emplace(key_arg &&k, Args &&...args) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return try_emplace_impl(std::forward(k), std::forward(args)...); + } + template + iterator try_emplace(const_iterator hint, const key_arg &k, + Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return try_emplace_hint_impl(hint, k, std::forward(args)...); + } + template + iterator try_emplace(const_iterator hint, key_arg &&k, + Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return try_emplace_hint_impl(hint, std::forward(k), + std::forward(args)...); + } + + template + mapped_type &operator[](const key_arg &k) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return try_emplace(k).first->second; + } + template + mapped_type &operator[](key_arg &&k) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return try_emplace(std::forward(k)).first->second; + } + + template + mapped_type &at(const key_arg &key) ABSL_ATTRIBUTE_LIFETIME_BOUND { + auto it = this->find(key); + if (it == this->end()) + base_internal::ThrowStdOutOfRange("absl::btree_map::at"); + return it->second; + } + template + const mapped_type &at(const key_arg &key) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + auto it = this->find(key); + if (it == this->end()) + base_internal::ThrowStdOutOfRange("absl::btree_map::at"); + return it->second; + } + + private: + // Note: when we call `std::forward(obj)` twice, it's safe because + // insert_unique/insert_hint_unique are guaranteed to not consume `obj` when + // `ret.second` is false. + template + std::pair insert_or_assign_impl(K &&k, M &&obj) { + const std::pair ret = + this->tree_.insert_unique(k, std::forward(k), std::forward(obj)); + if (!ret.second) ret.first->second = std::forward(obj); + return ret; + } + template + iterator insert_or_assign_hint_impl(const_iterator hint, K &&k, M &&obj) { + const std::pair ret = this->tree_.insert_hint_unique( + iterator(hint), k, std::forward(k), std::forward(obj)); + if (!ret.second) ret.first->second = std::forward(obj); + return ret.first; + } + + template + std::pair try_emplace_impl(K &&k, Args &&... args) { + return this->tree_.insert_unique( + k, std::piecewise_construct, std::forward_as_tuple(std::forward(k)), + std::forward_as_tuple(std::forward(args)...)); + } + template + iterator try_emplace_hint_impl(const_iterator hint, K &&k, Args &&... args) { + return this->tree_ + .insert_hint_unique(iterator(hint), k, std::piecewise_construct, + std::forward_as_tuple(std::forward(k)), + std::forward_as_tuple(std::forward(args)...)) + .first; + } +}; + +// A common base class for btree_multiset and btree_multimap. +template +class btree_multiset_container : public btree_container { + using super_type = btree_container; + using params_type = typename Tree::params_type; + using init_type = typename params_type::init_type; + using is_key_compare_to = typename params_type::is_key_compare_to; + friend class BtreeNodePeer; + + template + using key_arg = typename super_type::template key_arg; + + public: + using key_type = typename Tree::key_type; + using value_type = typename Tree::value_type; + using size_type = typename Tree::size_type; + using key_compare = typename Tree::original_key_compare; + using allocator_type = typename Tree::allocator_type; + using iterator = typename Tree::iterator; + using const_iterator = typename Tree::const_iterator; + using node_type = typename super_type::node_type; + + // Inherit constructors. + using super_type::super_type; + btree_multiset_container() {} + + // Range constructors. + template + btree_multiset_container(InputIterator b, InputIterator e, + const key_compare &comp = key_compare(), + const allocator_type &alloc = allocator_type()) + : super_type(comp, alloc) { + insert(b, e); + } + template + btree_multiset_container(InputIterator b, InputIterator e, + const allocator_type &alloc) + : btree_multiset_container(b, e, key_compare(), alloc) {} + + // Initializer list constructors. + btree_multiset_container(std::initializer_list init, + const key_compare &comp = key_compare(), + const allocator_type &alloc = allocator_type()) + : btree_multiset_container(init.begin(), init.end(), comp, alloc) {} + btree_multiset_container(std::initializer_list init, + const allocator_type &alloc) + : btree_multiset_container(init.begin(), init.end(), alloc) {} + + // Insertion routines. + iterator insert(const value_type &v) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return this->tree_.insert_multi(v); + } + iterator insert(value_type &&v) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return this->tree_.insert_multi(std::move(v)); + } + iterator insert(const_iterator hint, + const value_type &v) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return this->tree_.insert_hint_multi(iterator(hint), v); + } + iterator insert(const_iterator hint, + value_type &&v) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return this->tree_.insert_hint_multi(iterator(hint), std::move(v)); + } + template + void insert(InputIterator b, InputIterator e) { + this->tree_.insert_iterator_multi(b, e); + } + void insert(std::initializer_list init) { + this->tree_.insert_iterator_multi(init.begin(), init.end()); + } + template + iterator emplace(Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND { + // Use a node handle to manage a temp slot. + auto node = CommonAccess::Construct(this->get_allocator(), + std::forward(args)...); + return this->tree_.insert_multi(CommonAccess::GetSlot(node)); + } + template + iterator emplace_hint(const_iterator hint, + Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND { + // Use a node handle to manage a temp slot. + auto node = CommonAccess::Construct(this->get_allocator(), + std::forward(args)...); + return this->tree_.insert_hint_multi(iterator(hint), + CommonAccess::GetSlot(node)); + } + iterator insert(node_type &&node) ABSL_ATTRIBUTE_LIFETIME_BOUND { + if (!node) return this->end(); + iterator res = + this->tree_.insert_multi(params_type::key(CommonAccess::GetSlot(node)), + CommonAccess::GetSlot(node)); + CommonAccess::Destroy(&node); + return res; + } + iterator insert(const_iterator hint, + node_type &&node) ABSL_ATTRIBUTE_LIFETIME_BOUND { + if (!node) return this->end(); + iterator res = this->tree_.insert_hint_multi( + iterator(hint), + std::move(params_type::element(CommonAccess::GetSlot(node)))); + CommonAccess::Destroy(&node); + return res; + } + + // Node extraction routines. + template + node_type extract(const key_arg &key) { + const std::pair lower_and_equal = + this->tree_.lower_bound_equal(key); + return lower_and_equal.second ? extract(lower_and_equal.first) + : node_type(); + } + using super_type::extract; + + // Merge routines. + // Moves all elements from `src` into `this`. + template < + typename T, + typename absl::enable_if_t< + absl::conjunction< + std::is_same, + std::is_same, + std::is_same>::value, + int> = 0> + void merge(btree_container &src) { // NOLINT + for (auto src_it = src.begin(), end = src.end(); src_it != end; ++src_it) { + insert(std::move(params_type::element(src_it.slot()))); + } + src.clear(); + } + + template < + typename T, + typename absl::enable_if_t< + absl::conjunction< + std::is_same, + std::is_same, + std::is_same>::value, + int> = 0> + void merge(btree_container &&src) { + merge(src); + } +}; + +// A base class for btree_multimap. +template +class btree_multimap_container : public btree_multiset_container { + using super_type = btree_multiset_container; + using params_type = typename Tree::params_type; + friend class BtreeNodePeer; + + public: + using mapped_type = typename params_type::mapped_type; + + // Inherit constructors. + using super_type::super_type; + btree_multimap_container() {} +}; + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_INTERNAL_BTREE_CONTAINER_H_ diff --git a/absl/container/internal/common.h b/absl/container/internal/common.h new file mode 100644 index 0000000..9239bb4 --- /dev/null +++ b/absl/container/internal/common.h @@ -0,0 +1,207 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 ABSL_CONTAINER_INTERNAL_COMMON_H_ +#define ABSL_CONTAINER_INTERNAL_COMMON_H_ + +#include +#include + +#include "absl/meta/type_traits.h" +#include "absl/types/optional.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +template +struct IsTransparent : std::false_type {}; +template +struct IsTransparent> + : std::true_type {}; + +template +struct KeyArg { + // Transparent. Forward `K`. + template + using type = K; +}; + +template <> +struct KeyArg { + // Not transparent. Always use `key_type`. + template + using type = key_type; +}; + +// The node_handle concept from C++17. +// We specialize node_handle for sets and maps. node_handle_base holds the +// common API of both. +template +class node_handle_base { + protected: + using slot_type = typename PolicyTraits::slot_type; + + public: + using allocator_type = Alloc; + + constexpr node_handle_base() = default; + node_handle_base(node_handle_base&& other) noexcept { + *this = std::move(other); + } + ~node_handle_base() { destroy(); } + node_handle_base& operator=(node_handle_base&& other) noexcept { + destroy(); + if (!other.empty()) { + alloc_ = other.alloc_; + PolicyTraits::transfer(alloc(), slot(), other.slot()); + other.reset(); + } + return *this; + } + + bool empty() const noexcept { return !alloc_; } + explicit operator bool() const noexcept { return !empty(); } + allocator_type get_allocator() const { return *alloc_; } + + protected: + friend struct CommonAccess; + + struct transfer_tag_t {}; + node_handle_base(transfer_tag_t, const allocator_type& a, slot_type* s) + : alloc_(a) { + PolicyTraits::transfer(alloc(), slot(), s); + } + + struct construct_tag_t {}; + template + node_handle_base(construct_tag_t, const allocator_type& a, Args&&... args) + : alloc_(a) { + PolicyTraits::construct(alloc(), slot(), std::forward(args)...); + } + + void destroy() { + if (!empty()) { + PolicyTraits::destroy(alloc(), slot()); + reset(); + } + } + + void reset() { + assert(alloc_.has_value()); + alloc_ = absl::nullopt; + } + + slot_type* slot() const { + assert(!empty()); + return reinterpret_cast(std::addressof(slot_space_)); + } + allocator_type* alloc() { return std::addressof(*alloc_); } + + private: + absl::optional alloc_ = {}; + alignas(slot_type) mutable unsigned char slot_space_[sizeof(slot_type)] = {}; +}; + +// For sets. +template +class node_handle : public node_handle_base { + using Base = node_handle_base; + + public: + using value_type = typename PolicyTraits::value_type; + + constexpr node_handle() {} + + value_type& value() const { return PolicyTraits::element(this->slot()); } + + private: + friend struct CommonAccess; + + using Base::Base; +}; + +// For maps. +template +class node_handle> + : public node_handle_base { + using Base = node_handle_base; + using slot_type = typename PolicyTraits::slot_type; + + public: + using key_type = typename Policy::key_type; + using mapped_type = typename Policy::mapped_type; + + constexpr node_handle() {} + + // When C++17 is available, we can use std::launder to provide mutable + // access to the key. Otherwise, we provide const access. + auto key() const + -> decltype(PolicyTraits::mutable_key(std::declval())) { + return PolicyTraits::mutable_key(this->slot()); + } + + mapped_type& mapped() const { + return PolicyTraits::value(&PolicyTraits::element(this->slot())); + } + + private: + friend struct CommonAccess; + + using Base::Base; +}; + +// Provide access to non-public node-handle functions. +struct CommonAccess { + template + static auto GetSlot(const Node& node) -> decltype(node.slot()) { + return node.slot(); + } + + template + static void Destroy(Node* node) { + node->destroy(); + } + + template + static void Reset(Node* node) { + node->reset(); + } + + template + static T Transfer(Args&&... args) { + return T(typename T::transfer_tag_t{}, std::forward(args)...); + } + + template + static T Construct(Args&&... args) { + return T(typename T::construct_tag_t{}, std::forward(args)...); + } +}; + +// Implement the insert_return_type<> concept of C++17. +template +struct InsertReturnType { + Iterator position; + bool inserted; + NodeType node; +}; + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_INTERNAL_COMMON_H_ diff --git a/absl/container/internal/common_policy_traits.h b/absl/container/internal/common_policy_traits.h new file mode 100644 index 0000000..bbf5475 --- /dev/null +++ b/absl/container/internal/common_policy_traits.h @@ -0,0 +1,152 @@ +// Copyright 2022 The Abseil Authors. +// +// 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 +// +// https://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 ABSL_CONTAINER_INTERNAL_COMMON_POLICY_TRAITS_H_ +#define ABSL_CONTAINER_INTERNAL_COMMON_POLICY_TRAITS_H_ + +#include +#include +#include +#include +#include +#include + +#include "absl/meta/type_traits.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +template +struct policy_trait_element_is_owner : std::false_type {}; + +template +struct policy_trait_element_is_owner< + Policy, + std::enable_if_t::value>> + : Policy::element_is_owner {}; + +// Defines how slots are initialized/destroyed/moved. +template +struct common_policy_traits { + // The actual object stored in the container. + using slot_type = typename Policy::slot_type; + using reference = decltype(Policy::element(std::declval())); + using value_type = typename std::remove_reference::type; + + // PRECONDITION: `slot` is UNINITIALIZED + // POSTCONDITION: `slot` is INITIALIZED + template + static void construct(Alloc* alloc, slot_type* slot, Args&&... args) { + Policy::construct(alloc, slot, std::forward(args)...); + } + + // PRECONDITION: `slot` is INITIALIZED + // POSTCONDITION: `slot` is UNINITIALIZED + // Returns std::true_type in case destroy is trivial. + template + static auto destroy(Alloc* alloc, slot_type* slot) { + return Policy::destroy(alloc, slot); + } + + // Transfers the `old_slot` to `new_slot`. Any memory allocated by the + // allocator inside `old_slot` to `new_slot` can be transferred. + // + // OPTIONAL: defaults to: + // + // clone(new_slot, std::move(*old_slot)); + // destroy(old_slot); + // + // PRECONDITION: `new_slot` is UNINITIALIZED and `old_slot` is INITIALIZED + // POSTCONDITION: `new_slot` is INITIALIZED and `old_slot` is + // UNINITIALIZED + template + static void transfer(Alloc* alloc, slot_type* new_slot, slot_type* old_slot) { + transfer_impl(alloc, new_slot, old_slot, Rank2{}); + } + + // PRECONDITION: `slot` is INITIALIZED + // POSTCONDITION: `slot` is INITIALIZED + // Note: we use remove_const_t so that the two overloads have different args + // in the case of sets with explicitly const value_types. + template + static auto element(absl::remove_const_t* slot) + -> decltype(P::element(slot)) { + return P::element(slot); + } + template + static auto element(const slot_type* slot) -> decltype(P::element(slot)) { + return P::element(slot); + } + + static constexpr bool transfer_uses_memcpy() { + return std::is_same>( + nullptr, nullptr, nullptr, Rank2{})), + std::true_type>::value; + } + + // Returns true if destroy is trivial and can be omitted. + template + static constexpr bool destroy_is_trivial() { + return std::is_same(nullptr, nullptr)), + std::true_type>::value; + } + + private: + // Use go/ranked-overloads for dispatching. + struct Rank0 {}; + struct Rank1 : Rank0 {}; + struct Rank2 : Rank1 {}; + + // Use auto -> decltype as an enabler. + // P::transfer returns std::true_type if transfer uses memcpy (e.g. in + // node_slot_policy). + template + static auto transfer_impl(Alloc* alloc, slot_type* new_slot, + slot_type* old_slot, + Rank2) -> decltype(P::transfer(alloc, new_slot, + old_slot)) { + return P::transfer(alloc, new_slot, old_slot); + } +#if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606 + // This overload returns true_type for the trait below. + // The conditional_t is to make the enabler type dependent. + template >::value>> + static std::true_type transfer_impl(Alloc*, slot_type* new_slot, + slot_type* old_slot, Rank1) { + // TODO(b/247130232): remove casts after fixing warnings. + // TODO(b/251814870): remove casts after fixing warnings. + std::memcpy( + static_cast(std::launder( + const_cast*>(&element(new_slot)))), + static_cast(&element(old_slot)), sizeof(value_type)); + return {}; + } +#endif + + template + static void transfer_impl(Alloc* alloc, slot_type* new_slot, + slot_type* old_slot, Rank0) { + construct(alloc, new_slot, std::move(element(old_slot))); + destroy(alloc, old_slot); + } +}; + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_INTERNAL_COMMON_POLICY_TRAITS_H_ diff --git a/absl/container/internal/common_policy_traits_test.cc b/absl/container/internal/common_policy_traits_test.cc new file mode 100644 index 0000000..8d8f8ba --- /dev/null +++ b/absl/container/internal/common_policy_traits_test.cc @@ -0,0 +1,157 @@ +// Copyright 2022 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/internal/common_policy_traits.h" + +#include +#include +#include +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/config.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace { + +using ::testing::MockFunction; +using ::testing::AnyNumber; +using ::testing::ReturnRef; + +using Slot = int; + +struct PolicyWithoutOptionalOps { + using slot_type = Slot; + using key_type = Slot; + using init_type = Slot; + + struct PolicyFunctions { + std::function construct; + std::function destroy; + std::function element; + }; + + static PolicyFunctions* functions() { + static PolicyFunctions* functions = new PolicyFunctions(); + return functions; + } + + static void construct(void* a, Slot* b, Slot c) { + functions()->construct(a, b, c); + } + static void destroy(void* a, Slot* b) { functions()->destroy(a, b); } + static Slot& element(Slot* b) { return functions()->element(b); } +}; + +struct PolicyWithOptionalOps : PolicyWithoutOptionalOps { + struct TransferFunctions { + std::function transfer; + }; + + static TransferFunctions* transfer_fn() { + static TransferFunctions* transfer_fn = new TransferFunctions(); + return transfer_fn; + } + static void transfer(void* a, Slot* b, Slot* c) { + transfer_fn()->transfer(a, b, c); + } +}; + +struct PolicyWithMemcpyTransferAndTrivialDestroy : PolicyWithoutOptionalOps { + static std::true_type transfer(void*, Slot*, Slot*) { return {}; } + static std::true_type destroy(void*, Slot*) { return {}; } +}; + +struct Test : ::testing::Test { + Test() { + PolicyWithoutOptionalOps::functions()->construct = [&](void* a1, Slot* a2, + Slot a3) { + construct.Call(a1, a2, std::move(a3)); + }; + PolicyWithoutOptionalOps::functions()->destroy = [&](void* a1, Slot* a2) { + destroy.Call(a1, a2); + }; + + PolicyWithoutOptionalOps::functions()->element = [&](Slot* a1) -> Slot& { + return element.Call(a1); + }; + + PolicyWithOptionalOps::transfer_fn()->transfer = + [&](void* a1, Slot* a2, Slot* a3) { return transfer.Call(a1, a2, a3); }; + } + + std::allocator alloc; + int a = 53; + + MockFunction construct; + MockFunction destroy; + + MockFunction element; + + MockFunction transfer; +}; + +TEST_F(Test, construct) { + EXPECT_CALL(construct, Call(&alloc, &a, 53)); + common_policy_traits::construct(&alloc, &a, 53); +} + +TEST_F(Test, destroy) { + EXPECT_CALL(destroy, Call(&alloc, &a)); + common_policy_traits::destroy(&alloc, &a); +} + +TEST_F(Test, element) { + int b = 0; + EXPECT_CALL(element, Call(&a)).WillOnce(ReturnRef(b)); + EXPECT_EQ(&b, &common_policy_traits::element(&a)); +} + +TEST_F(Test, without_transfer) { + int b = 42; + EXPECT_CALL(element, Call(&a)).Times(AnyNumber()).WillOnce(ReturnRef(a)); + EXPECT_CALL(element, Call(&b)).WillOnce(ReturnRef(b)); + EXPECT_CALL(construct, Call(&alloc, &a, b)).Times(AnyNumber()); + EXPECT_CALL(destroy, Call(&alloc, &b)).Times(AnyNumber()); + common_policy_traits::transfer(&alloc, &a, &b); +} + +TEST_F(Test, with_transfer) { + int b = 42; + EXPECT_CALL(transfer, Call(&alloc, &a, &b)); + common_policy_traits::transfer(&alloc, &a, &b); +} + +TEST(TransferUsesMemcpy, Basic) { + EXPECT_FALSE( + common_policy_traits::transfer_uses_memcpy()); + EXPECT_TRUE( + common_policy_traits< + PolicyWithMemcpyTransferAndTrivialDestroy>::transfer_uses_memcpy()); +} + +TEST(DestroyIsTrivial, Basic) { + EXPECT_FALSE(common_policy_traits::destroy_is_trivial< + std::allocator>()); + EXPECT_TRUE(common_policy_traits:: + destroy_is_trivial>()); +} + +} // namespace +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/internal/compressed_tuple.h b/absl/container/internal/compressed_tuple.h new file mode 100644 index 0000000..6db0468 --- /dev/null +++ b/absl/container/internal/compressed_tuple.h @@ -0,0 +1,271 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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. +// +// Helper class to perform the Empty Base Optimization. +// Ts can contain classes and non-classes, empty or not. For the ones that +// are empty classes, we perform the optimization. If all types in Ts are empty +// classes, then CompressedTuple is itself an empty class. +// +// To access the members, use member get() function. +// +// Eg: +// absl::container_internal::CompressedTuple value(7, t1, t2, +// t3); +// assert(value.get<0>() == 7); +// T1& t1 = value.get<1>(); +// const T2& t2 = value.get<2>(); +// ... +// +// https://en.cppreference.com/w/cpp/language/ebo + +#ifndef ABSL_CONTAINER_INTERNAL_COMPRESSED_TUPLE_H_ +#define ABSL_CONTAINER_INTERNAL_COMPRESSED_TUPLE_H_ + +#include +#include +#include +#include + +#include "absl/utility/utility.h" + +#if defined(_MSC_VER) && !defined(__NVCC__) +// We need to mark these classes with this declspec to ensure that +// CompressedTuple happens. +#define ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC __declspec(empty_bases) +#else +#define ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC +#endif + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +template +class CompressedTuple; + +namespace internal_compressed_tuple { + +template +struct Elem; +template +struct Elem, I> + : std::tuple_element> {}; +template +using ElemT = typename Elem::type; + +// We can't use EBCO on other CompressedTuples because that would mean that we +// derive from multiple Storage<> instantiations with the same I parameter, +// and potentially from multiple identical Storage<> instantiations. So anytime +// we use type inheritance rather than encapsulation, we mark +// CompressedTupleImpl, to make this easy to detect. +struct uses_inheritance {}; + +template +constexpr bool ShouldUseBase() { + return std::is_class::value && std::is_empty::value && + !std::is_final::value && + !std::is_base_of::value; +} + +// The storage class provides two specializations: +// - For empty classes, it stores T as a base class. +// - For everything else, it stores T as a member. +template ()> +struct Storage { + T value; + constexpr Storage() = default; + template + explicit constexpr Storage(absl::in_place_t, V&& v) + : value(std::forward(v)) {} + constexpr const T& get() const& { return value; } + constexpr T& get() & { return value; } + constexpr const T&& get() const&& { return std::move(*this).value; } + constexpr T&& get() && { return std::move(*this).value; } +}; + +template +struct ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC Storage : T { + constexpr Storage() = default; + + template + explicit constexpr Storage(absl::in_place_t, V&& v) : T(std::forward(v)) {} + + constexpr const T& get() const& { return *this; } + constexpr T& get() & { return *this; } + constexpr const T&& get() const&& { return std::move(*this); } + constexpr T&& get() && { return std::move(*this); } +}; + +template +struct ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC CompressedTupleImpl; + +template +struct ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC CompressedTupleImpl< + CompressedTuple, absl::index_sequence, ShouldAnyUseBase> + // We use the dummy identity function through std::integral_constant to + // convince MSVC of accepting and expanding I in that context. Without it + // you would get: + // error C3548: 'I': parameter pack cannot be used in this context + : uses_inheritance, + Storage::value>... { + constexpr CompressedTupleImpl() = default; + template + explicit constexpr CompressedTupleImpl(absl::in_place_t, Vs&&... args) + : Storage(absl::in_place, std::forward(args))... {} + friend CompressedTuple; +}; + +template +struct ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC CompressedTupleImpl< + CompressedTuple, absl::index_sequence, false> + // We use the dummy identity function as above... + : Storage::value, false>... { + constexpr CompressedTupleImpl() = default; + template + explicit constexpr CompressedTupleImpl(absl::in_place_t, Vs&&... args) + : Storage(absl::in_place, std::forward(args))... {} + friend CompressedTuple; +}; + +std::false_type Or(std::initializer_list); +std::true_type Or(std::initializer_list); + +// MSVC requires this to be done separately rather than within the declaration +// of CompressedTuple below. +template +constexpr bool ShouldAnyUseBase() { + return decltype( + Or({std::integral_constant()>()...})){}; +} + +template +using TupleElementMoveConstructible = + typename std::conditional::value, + std::is_convertible, + std::is_constructible>::type; + +template +struct TupleMoveConstructible : std::false_type {}; + +template +struct TupleMoveConstructible, Vs...> + : std::integral_constant< + bool, absl::conjunction< + TupleElementMoveConstructible...>::value> {}; + +template +struct compressed_tuple_size; + +template +struct compressed_tuple_size> + : public std::integral_constant {}; + +template +struct TupleItemsMoveConstructible + : std::integral_constant< + bool, TupleMoveConstructible::value == + sizeof...(Vs), + T, Vs...>::value> {}; + +} // namespace internal_compressed_tuple + +// Helper class to perform the Empty Base Class Optimization. +// Ts can contain classes and non-classes, empty or not. For the ones that +// are empty classes, we perform the CompressedTuple. If all types in Ts are +// empty classes, then CompressedTuple is itself an empty class. (This +// does not apply when one or more of those empty classes is itself an empty +// CompressedTuple.) +// +// To access the members, use member .get() function. +// +// Eg: +// absl::container_internal::CompressedTuple value(7, t1, t2, +// t3); +// assert(value.get<0>() == 7); +// T1& t1 = value.get<1>(); +// const T2& t2 = value.get<2>(); +// ... +// +// https://en.cppreference.com/w/cpp/language/ebo +template +class ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC CompressedTuple + : private internal_compressed_tuple::CompressedTupleImpl< + CompressedTuple, absl::index_sequence_for, + internal_compressed_tuple::ShouldAnyUseBase()> { + private: + template + using ElemT = internal_compressed_tuple::ElemT; + + template + using StorageT = internal_compressed_tuple::Storage, I>; + + public: + // There seems to be a bug in MSVC dealing in which using '=default' here will + // cause the compiler to ignore the body of other constructors. The work- + // around is to explicitly implement the default constructor. +#if defined(_MSC_VER) + constexpr CompressedTuple() : CompressedTuple::CompressedTupleImpl() {} +#else + constexpr CompressedTuple() = default; +#endif + explicit constexpr CompressedTuple(const Ts&... base) + : CompressedTuple::CompressedTupleImpl(absl::in_place, base...) {} + + template )>>, + internal_compressed_tuple::TupleItemsMoveConstructible< + CompressedTuple, First, Vs...>>::value, + bool> = true> + explicit constexpr CompressedTuple(First&& first, Vs&&... base) + : CompressedTuple::CompressedTupleImpl(absl::in_place, + std::forward(first), + std::forward(base)...) {} + + template + constexpr ElemT& get() & { + return StorageT::get(); + } + + template + constexpr const ElemT& get() const& { + return StorageT::get(); + } + + template + constexpr ElemT&& get() && { + return std::move(*this).StorageT::get(); + } + + template + constexpr const ElemT&& get() const&& { + return std::move(*this).StorageT::get(); + } +}; + +// Explicit specialization for a zero-element tuple +// (needed to avoid ambiguous overloads for the default constructor). +template <> +class ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC CompressedTuple<> {}; + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +#undef ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC + +#endif // ABSL_CONTAINER_INTERNAL_COMPRESSED_TUPLE_H_ diff --git a/absl/container/internal/compressed_tuple_test.cc b/absl/container/internal/compressed_tuple_test.cc new file mode 100644 index 0000000..c3edf54 --- /dev/null +++ b/absl/container/internal/compressed_tuple_test.cc @@ -0,0 +1,482 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/internal/compressed_tuple.h" + +#include +#include +#include +#include +#include +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/container/internal/test_instance_tracker.h" +#include "absl/memory/memory.h" +#include "absl/types/any.h" +#include "absl/types/optional.h" +#include "absl/utility/utility.h" + +// These are declared at global scope purely so that error messages +// are smaller and easier to understand. +enum class CallType { kMutableRef, kConstRef, kMutableMove, kConstMove }; + +template +struct Empty { + constexpr CallType value() & { return CallType::kMutableRef; } + constexpr CallType value() const& { return CallType::kConstRef; } + constexpr CallType value() && { return CallType::kMutableMove; } + constexpr CallType value() const&& { return CallType::kConstMove; } +}; + +// Unconditionally return an lvalue reference to `t`. +template +constexpr T& AsLValue(T&& t) { + return t; +} + +template +struct NotEmpty { + T value; +}; + +template +struct TwoValues { + T value1; + U value2; +}; + + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace { + +using absl::test_internal::CopyableMovableInstance; +using absl::test_internal::InstanceTracker; +using ::testing::Each; + +TEST(CompressedTupleTest, Sizeof) { + EXPECT_EQ(sizeof(int), sizeof(CompressedTuple)); + EXPECT_EQ(sizeof(int), sizeof(CompressedTuple>)); + EXPECT_EQ(sizeof(int), sizeof(CompressedTuple, Empty<1>>)); + EXPECT_EQ(sizeof(int), + sizeof(CompressedTuple, Empty<1>, Empty<2>>)); + + EXPECT_EQ(sizeof(TwoValues), + sizeof(CompressedTuple>)); + EXPECT_EQ(sizeof(TwoValues), + sizeof(CompressedTuple, NotEmpty>)); + EXPECT_EQ(sizeof(TwoValues), + sizeof(CompressedTuple, NotEmpty, Empty<1>>)); +} + +TEST(CompressedTupleTest, PointerToEmpty) { + auto to_void_ptrs = [](const auto&... objs) { + return std::vector{static_cast(&objs)...}; + }; + { + using Tuple = CompressedTuple>; + EXPECT_EQ(sizeof(int), sizeof(Tuple)); + Tuple t; + EXPECT_THAT(to_void_ptrs(t.get<1>()), Each(&t)); + } + { + using Tuple = CompressedTuple, Empty<1>>; + EXPECT_EQ(sizeof(int), sizeof(Tuple)); + Tuple t; + EXPECT_THAT(to_void_ptrs(t.get<1>(), t.get<2>()), Each(&t)); + } + { + using Tuple = CompressedTuple, Empty<1>, Empty<2>>; + EXPECT_EQ(sizeof(int), sizeof(Tuple)); + Tuple t; + EXPECT_THAT(to_void_ptrs(t.get<1>(), t.get<2>(), t.get<3>()), Each(&t)); + } +} + +TEST(CompressedTupleTest, OneMoveOnRValueConstructionTemp) { + InstanceTracker tracker; + CompressedTuple x1(CopyableMovableInstance(1)); + EXPECT_EQ(tracker.instances(), 1); + EXPECT_EQ(tracker.copies(), 0); + EXPECT_LE(tracker.moves(), 1); + EXPECT_EQ(x1.get<0>().value(), 1); +} + +TEST(CompressedTupleTest, OneMoveOnRValueConstructionMove) { + InstanceTracker tracker; + + CopyableMovableInstance i1(1); + CompressedTuple x1(std::move(i1)); + EXPECT_EQ(tracker.instances(), 2); + EXPECT_EQ(tracker.copies(), 0); + EXPECT_LE(tracker.moves(), 1); + EXPECT_EQ(x1.get<0>().value(), 1); +} + +TEST(CompressedTupleTest, OneMoveOnRValueConstructionMixedTypes) { + InstanceTracker tracker; + CopyableMovableInstance i1(1); + CopyableMovableInstance i2(2); + Empty<0> empty; + CompressedTuple> + x1(std::move(i1), i2, empty); + EXPECT_EQ(x1.get<0>().value(), 1); + EXPECT_EQ(x1.get<1>().value(), 2); + EXPECT_EQ(tracker.copies(), 0); + EXPECT_EQ(tracker.moves(), 1); +} + +struct IncompleteType; +CompressedTuple> +MakeWithIncomplete(CopyableMovableInstance i1, + IncompleteType& t, // NOLINT + Empty<0> empty) { + return CompressedTuple>{ + std::move(i1), t, empty}; +} + +struct IncompleteType {}; +TEST(CompressedTupleTest, OneMoveOnRValueConstructionWithIncompleteType) { + InstanceTracker tracker; + CopyableMovableInstance i1(1); + Empty<0> empty; + struct DerivedType : IncompleteType {int value = 0;}; + DerivedType fd; + fd.value = 7; + + CompressedTuple> x1 = + MakeWithIncomplete(std::move(i1), fd, empty); + + EXPECT_EQ(x1.get<0>().value(), 1); + EXPECT_EQ(static_cast(x1.get<1>()).value, 7); + + EXPECT_EQ(tracker.copies(), 0); + EXPECT_EQ(tracker.moves(), 2); +} + +TEST(CompressedTupleTest, + OneMoveOnRValueConstructionMixedTypes_BraceInitPoisonPillExpected) { + InstanceTracker tracker; + CopyableMovableInstance i1(1); + CopyableMovableInstance i2(2); + CompressedTuple> + x1(std::move(i1), i2, {}); // NOLINT + EXPECT_EQ(x1.get<0>().value(), 1); + EXPECT_EQ(x1.get<1>().value(), 2); + EXPECT_EQ(tracker.instances(), 3); + // We are forced into the `const Ts&...` constructor (invoking copies) + // because we need it to deduce the type of `{}`. + // std::tuple also has this behavior. + // Note, this test is proof that this is expected behavior, but it is not + // _desired_ behavior. + EXPECT_EQ(tracker.copies(), 1); + EXPECT_EQ(tracker.moves(), 0); +} + +TEST(CompressedTupleTest, OneCopyOnLValueConstruction) { + InstanceTracker tracker; + CopyableMovableInstance i1(1); + + CompressedTuple x1(i1); + EXPECT_EQ(tracker.copies(), 1); + EXPECT_EQ(tracker.moves(), 0); + + tracker.ResetCopiesMovesSwaps(); + + CopyableMovableInstance i2(2); + const CopyableMovableInstance& i2_ref = i2; + CompressedTuple x2(i2_ref); + EXPECT_EQ(tracker.copies(), 1); + EXPECT_EQ(tracker.moves(), 0); +} + +TEST(CompressedTupleTest, OneMoveOnRValueAccess) { + InstanceTracker tracker; + CopyableMovableInstance i1(1); + CompressedTuple x(std::move(i1)); + tracker.ResetCopiesMovesSwaps(); + + CopyableMovableInstance i2 = std::move(x).get<0>(); + EXPECT_EQ(tracker.copies(), 0); + EXPECT_EQ(tracker.moves(), 1); +} + +TEST(CompressedTupleTest, OneCopyOnLValueAccess) { + InstanceTracker tracker; + + CompressedTuple x(CopyableMovableInstance(0)); + EXPECT_EQ(tracker.copies(), 0); + EXPECT_EQ(tracker.moves(), 1); + + CopyableMovableInstance t = x.get<0>(); + EXPECT_EQ(tracker.copies(), 1); + EXPECT_EQ(tracker.moves(), 1); +} + +TEST(CompressedTupleTest, ZeroCopyOnRefAccess) { + InstanceTracker tracker; + + CompressedTuple x(CopyableMovableInstance(0)); + EXPECT_EQ(tracker.copies(), 0); + EXPECT_EQ(tracker.moves(), 1); + + CopyableMovableInstance& t1 = x.get<0>(); + const CopyableMovableInstance& t2 = x.get<0>(); + EXPECT_EQ(tracker.copies(), 0); + EXPECT_EQ(tracker.moves(), 1); + EXPECT_EQ(t1.value(), 0); + EXPECT_EQ(t2.value(), 0); +} + +TEST(CompressedTupleTest, Access) { + struct S { + std::string x; + }; + CompressedTuple, S> x(7, {}, S{"ABC"}); + EXPECT_EQ(sizeof(x), sizeof(TwoValues)); + EXPECT_EQ(7, x.get<0>()); + EXPECT_EQ("ABC", x.get<2>().x); +} + +TEST(CompressedTupleTest, NonClasses) { + CompressedTuple x(7, "ABC"); + EXPECT_EQ(7, x.get<0>()); + EXPECT_STREQ("ABC", x.get<1>()); +} + +TEST(CompressedTupleTest, MixClassAndNonClass) { + CompressedTuple, NotEmpty> x(7, "ABC", {}, + {1.25}); + struct Mock { + int v; + const char* p; + double d; + }; + EXPECT_EQ(sizeof(x), sizeof(Mock)); + EXPECT_EQ(7, x.get<0>()); + EXPECT_STREQ("ABC", x.get<1>()); + EXPECT_EQ(1.25, x.get<3>().value); +} + +TEST(CompressedTupleTest, Nested) { + CompressedTuple, + CompressedTuple>> + x(1, CompressedTuple(2), + CompressedTuple>(3, CompressedTuple(4))); + EXPECT_EQ(1, x.get<0>()); + EXPECT_EQ(2, x.get<1>().get<0>()); + EXPECT_EQ(3, x.get<2>().get<0>()); + EXPECT_EQ(4, x.get<2>().get<1>().get<0>()); + + CompressedTuple, Empty<0>, + CompressedTuple, CompressedTuple>>> + y; + std::set*> empties{&y.get<0>(), &y.get<1>(), &y.get<2>().get<0>(), + &y.get<2>().get<1>().get<0>()}; +#ifdef _MSC_VER + // MSVC has a bug where many instances of the same base class are layed out in + // the same address when using __declspec(empty_bases). + // This will be fixed in a future version of MSVC. + int expected = 1; +#else + int expected = 4; +#endif + EXPECT_EQ(expected, sizeof(y)); + EXPECT_EQ(expected, empties.size()); + EXPECT_EQ(sizeof(y), sizeof(Empty<0>) * empties.size()); + + EXPECT_EQ(4 * sizeof(char), + sizeof(CompressedTuple, + CompressedTuple>)); + EXPECT_TRUE((std::is_empty, Empty<1>>>::value)); + + // Make sure everything still works when things are nested. + struct CT_Empty : CompressedTuple> {}; + CompressedTuple, CT_Empty> nested_empty; + auto contained = nested_empty.get<0>(); + auto nested = nested_empty.get<1>().get<0>(); + EXPECT_TRUE((std::is_same::value)); +} + +TEST(CompressedTupleTest, Reference) { + int i = 7; + std::string s = "Very long string that goes in the heap"; + CompressedTuple x(i, i, s, s); + + // Sanity check. We should have not moved from `s` + EXPECT_EQ(s, "Very long string that goes in the heap"); + + EXPECT_EQ(x.get<0>(), x.get<1>()); + EXPECT_NE(&x.get<0>(), &x.get<1>()); + EXPECT_EQ(&x.get<1>(), &i); + + EXPECT_EQ(x.get<2>(), x.get<3>()); + EXPECT_NE(&x.get<2>(), &x.get<3>()); + EXPECT_EQ(&x.get<3>(), &s); +} + +TEST(CompressedTupleTest, NoElements) { + CompressedTuple<> x; + static_cast(x); // Silence -Wunused-variable. + EXPECT_TRUE(std::is_empty>::value); +} + +TEST(CompressedTupleTest, MoveOnlyElements) { + CompressedTuple> str_tup( + absl::make_unique("str")); + + CompressedTuple>, + std::unique_ptr> + x(std::move(str_tup), absl::make_unique(5)); + + EXPECT_EQ(*x.get<0>().get<0>(), "str"); + EXPECT_EQ(*x.get<1>(), 5); + + std::unique_ptr x0 = std::move(x.get<0>()).get<0>(); + std::unique_ptr x1 = std::move(x).get<1>(); + + EXPECT_EQ(*x0, "str"); + EXPECT_EQ(*x1, 5); +} + +TEST(CompressedTupleTest, MoveConstructionMoveOnlyElements) { + CompressedTuple> base( + absl::make_unique("str")); + EXPECT_EQ(*base.get<0>(), "str"); + + CompressedTuple> copy(std::move(base)); + EXPECT_EQ(*copy.get<0>(), "str"); +} + +TEST(CompressedTupleTest, AnyElements) { + any a(std::string("str")); + CompressedTuple x(any(5), a); + EXPECT_EQ(absl::any_cast(x.get<0>()), 5); + EXPECT_EQ(absl::any_cast(x.get<1>()), "str"); + + a = 0.5f; + EXPECT_EQ(absl::any_cast(x.get<1>()), 0.5); +} + +TEST(CompressedTupleTest, Constexpr) { + struct NonTrivialStruct { + constexpr NonTrivialStruct() = default; + constexpr int value() const { return v; } + int v = 5; + }; + struct TrivialStruct { + TrivialStruct() = default; + constexpr int value() const { return v; } + int v; + }; + + using Tuple = CompressedTuple, Empty<0>>; + + constexpr int r0 = + AsLValue(Tuple(1, 0.75, CompressedTuple(9), {})).get<0>(); + constexpr double r1 = + AsLValue(Tuple(1, 0.75, CompressedTuple(9), {})).get<1>(); + constexpr int r2 = + AsLValue(Tuple(1, 0.75, CompressedTuple(9), {})).get<2>().get<0>(); + constexpr CallType r3 = + AsLValue(Tuple(1, 0.75, CompressedTuple(9), {})).get<3>().value(); + + EXPECT_EQ(r0, 1); + EXPECT_EQ(r1, 0.75); + EXPECT_EQ(r2, 9); + EXPECT_EQ(r3, CallType::kMutableRef); + + constexpr Tuple x(7, 1.25, CompressedTuple(5), {}); + constexpr int x0 = x.get<0>(); + constexpr double x1 = x.get<1>(); + constexpr int x2 = x.get<2>().get<0>(); + constexpr CallType x3 = x.get<3>().value(); + + EXPECT_EQ(x0, 7); + EXPECT_EQ(x1, 1.25); + EXPECT_EQ(x2, 5); + EXPECT_EQ(x3, CallType::kConstRef); + + constexpr int m0 = Tuple(5, 0.25, CompressedTuple(3), {}).get<0>(); + constexpr double m1 = Tuple(5, 0.25, CompressedTuple(3), {}).get<1>(); + constexpr int m2 = + Tuple(5, 0.25, CompressedTuple(3), {}).get<2>().get<0>(); + constexpr CallType m3 = + Tuple(5, 0.25, CompressedTuple(3), {}).get<3>().value(); + + EXPECT_EQ(m0, 5); + EXPECT_EQ(m1, 0.25); + EXPECT_EQ(m2, 3); + EXPECT_EQ(m3, CallType::kMutableMove); + + constexpr CompressedTuple, TrivialStruct, int> trivial = {}; + constexpr CallType trivial0 = trivial.get<0>().value(); + constexpr int trivial1 = trivial.get<1>().value(); + constexpr int trivial2 = trivial.get<2>(); + + EXPECT_EQ(trivial0, CallType::kConstRef); + EXPECT_EQ(trivial1, 0); + EXPECT_EQ(trivial2, 0); + + constexpr CompressedTuple, NonTrivialStruct, absl::optional> + non_trivial = {}; + constexpr CallType non_trivial0 = non_trivial.get<0>().value(); + constexpr int non_trivial1 = non_trivial.get<1>().value(); + constexpr absl::optional non_trivial2 = non_trivial.get<2>(); + + EXPECT_EQ(non_trivial0, CallType::kConstRef); + EXPECT_EQ(non_trivial1, 5); + EXPECT_EQ(non_trivial2, absl::nullopt); + + static constexpr char data[] = "DEF"; + constexpr CompressedTuple z(data); + constexpr const char* z1 = z.get<0>(); + EXPECT_EQ(std::string(z1), std::string(data)); + +#if defined(__clang__) + // An apparent bug in earlier versions of gcc claims these are ambiguous. + constexpr int x2m = std::move(x.get<2>()).get<0>(); + constexpr CallType x3m = std::move(x).get<3>().value(); + EXPECT_EQ(x2m, 5); + EXPECT_EQ(x3m, CallType::kConstMove); +#endif +} + +#if defined(__clang__) || defined(__GNUC__) +TEST(CompressedTupleTest, EmptyFinalClass) { + struct S final { + int f() const { return 5; } + }; + CompressedTuple x; + EXPECT_EQ(x.get<0>().f(), 5); +} +#endif + +// TODO(b/214288561): enable this test. +TEST(CompressedTupleTest, DISABLED_NestedEbo) { + struct Empty1 {}; + struct Empty2 {}; + CompressedTuple, int> x; + CompressedTuple y; + // Currently fails with sizeof(x) == 8, sizeof(y) == 4. + EXPECT_EQ(sizeof(x), sizeof(y)); +} + +} // namespace +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/internal/container_memory.h b/absl/container/internal/container_memory.h new file mode 100644 index 0000000..e703179 --- /dev/null +++ b/absl/container/internal/container_memory.h @@ -0,0 +1,492 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 ABSL_CONTAINER_INTERNAL_CONTAINER_MEMORY_H_ +#define ABSL_CONTAINER_INTERNAL_CONTAINER_MEMORY_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "absl/base/config.h" +#include "absl/memory/memory.h" +#include "absl/meta/type_traits.h" +#include "absl/utility/utility.h" + +#ifdef ABSL_HAVE_ADDRESS_SANITIZER +#include +#endif + +#ifdef ABSL_HAVE_MEMORY_SANITIZER +#include +#endif + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +template +struct alignas(Alignment) AlignedType {}; + +// Allocates at least n bytes aligned to the specified alignment. +// Alignment must be a power of 2. It must be positive. +// +// Note that many allocators don't honor alignment requirements above certain +// threshold (usually either alignof(std::max_align_t) or alignof(void*)). +// Allocate() doesn't apply alignment corrections. If the underlying allocator +// returns insufficiently alignment pointer, that's what you are going to get. +template +void* Allocate(Alloc* alloc, size_t n) { + static_assert(Alignment > 0, ""); + assert(n && "n must be positive"); + using M = AlignedType; + using A = typename absl::allocator_traits::template rebind_alloc; + using AT = typename absl::allocator_traits::template rebind_traits; + // On macOS, "mem_alloc" is a #define with one argument defined in + // rpc/types.h, so we can't name the variable "mem_alloc" and initialize it + // with the "foo(bar)" syntax. + A my_mem_alloc(*alloc); + void* p = AT::allocate(my_mem_alloc, (n + sizeof(M) - 1) / sizeof(M)); + assert(reinterpret_cast(p) % Alignment == 0 && + "allocator does not respect alignment"); + return p; +} + +// Returns true if the destruction of the value with given Allocator will be +// trivial. +template +constexpr auto IsDestructionTrivial() { + constexpr bool result = + std::is_trivially_destructible::value && + std::is_same::template rebind_alloc, + std::allocator>::value; + return std::integral_constant(); +} + +// The pointer must have been previously obtained by calling +// Allocate(alloc, n). +template +void Deallocate(Alloc* alloc, void* p, size_t n) { + static_assert(Alignment > 0, ""); + assert(n && "n must be positive"); + using M = AlignedType; + using A = typename absl::allocator_traits::template rebind_alloc; + using AT = typename absl::allocator_traits::template rebind_traits; + // On macOS, "mem_alloc" is a #define with one argument defined in + // rpc/types.h, so we can't name the variable "mem_alloc" and initialize it + // with the "foo(bar)" syntax. + A my_mem_alloc(*alloc); + AT::deallocate(my_mem_alloc, static_cast(p), + (n + sizeof(M) - 1) / sizeof(M)); +} + +namespace memory_internal { + +// Constructs T into uninitialized storage pointed by `ptr` using the args +// specified in the tuple. +template +void ConstructFromTupleImpl(Alloc* alloc, T* ptr, Tuple&& t, + absl::index_sequence) { + absl::allocator_traits::construct( + *alloc, ptr, std::get(std::forward(t))...); +} + +template +struct WithConstructedImplF { + template + decltype(std::declval()(std::declval())) operator()( + Args&&... args) const { + return std::forward(f)(T(std::forward(args)...)); + } + F&& f; +}; + +template +decltype(std::declval()(std::declval())) WithConstructedImpl( + Tuple&& t, absl::index_sequence, F&& f) { + return WithConstructedImplF{std::forward(f)}( + std::get(std::forward(t))...); +} + +template +auto TupleRefImpl(T&& t, absl::index_sequence) + -> decltype(std::forward_as_tuple(std::get(std::forward(t))...)) { + return std::forward_as_tuple(std::get(std::forward(t))...); +} + +// Returns a tuple of references to the elements of the input tuple. T must be a +// tuple. +template +auto TupleRef(T&& t) -> decltype(TupleRefImpl( + std::forward(t), + absl::make_index_sequence< + std::tuple_size::type>::value>())) { + return TupleRefImpl( + std::forward(t), + absl::make_index_sequence< + std::tuple_size::type>::value>()); +} + +template +decltype(std::declval()(std::declval(), std::piecewise_construct, + std::declval>(), std::declval())) +DecomposePairImpl(F&& f, std::pair, V> p) { + const auto& key = std::get<0>(p.first); + return std::forward(f)(key, std::piecewise_construct, std::move(p.first), + std::move(p.second)); +} + +} // namespace memory_internal + +// Constructs T into uninitialized storage pointed by `ptr` using the args +// specified in the tuple. +template +void ConstructFromTuple(Alloc* alloc, T* ptr, Tuple&& t) { + memory_internal::ConstructFromTupleImpl( + alloc, ptr, std::forward(t), + absl::make_index_sequence< + std::tuple_size::type>::value>()); +} + +// Constructs T using the args specified in the tuple and calls F with the +// constructed value. +template +decltype(std::declval()(std::declval())) WithConstructed(Tuple&& t, + F&& f) { + return memory_internal::WithConstructedImpl( + std::forward(t), + absl::make_index_sequence< + std::tuple_size::type>::value>(), + std::forward(f)); +} + +// Given arguments of an std::pair's constructor, PairArgs() returns a pair of +// tuples with references to the passed arguments. The tuples contain +// constructor arguments for the first and the second elements of the pair. +// +// The following two snippets are equivalent. +// +// 1. std::pair p(args...); +// +// 2. auto a = PairArgs(args...); +// std::pair p(std::piecewise_construct, +// std::move(a.first), std::move(a.second)); +inline std::pair, std::tuple<>> PairArgs() { return {}; } +template +std::pair, std::tuple> PairArgs(F&& f, S&& s) { + return {std::piecewise_construct, std::forward_as_tuple(std::forward(f)), + std::forward_as_tuple(std::forward(s))}; +} +template +std::pair, std::tuple> PairArgs( + const std::pair& p) { + return PairArgs(p.first, p.second); +} +template +std::pair, std::tuple> PairArgs(std::pair&& p) { + return PairArgs(std::forward(p.first), std::forward(p.second)); +} +template +auto PairArgs(std::piecewise_construct_t, F&& f, S&& s) + -> decltype(std::make_pair(memory_internal::TupleRef(std::forward(f)), + memory_internal::TupleRef(std::forward(s)))) { + return std::make_pair(memory_internal::TupleRef(std::forward(f)), + memory_internal::TupleRef(std::forward(s))); +} + +// A helper function for implementing apply() in map policies. +template +auto DecomposePair(F&& f, Args&&... args) + -> decltype(memory_internal::DecomposePairImpl( + std::forward(f), PairArgs(std::forward(args)...))) { + return memory_internal::DecomposePairImpl( + std::forward(f), PairArgs(std::forward(args)...)); +} + +// A helper function for implementing apply() in set policies. +template +decltype(std::declval()(std::declval(), std::declval())) +DecomposeValue(F&& f, Arg&& arg) { + const auto& key = arg; + return std::forward(f)(key, std::forward(arg)); +} + +// Helper functions for asan and msan. +inline void SanitizerPoisonMemoryRegion(const void* m, size_t s) { +#ifdef ABSL_HAVE_ADDRESS_SANITIZER + ASAN_POISON_MEMORY_REGION(m, s); +#endif +#ifdef ABSL_HAVE_MEMORY_SANITIZER + __msan_poison(m, s); +#endif + (void)m; + (void)s; +} + +inline void SanitizerUnpoisonMemoryRegion(const void* m, size_t s) { +#ifdef ABSL_HAVE_ADDRESS_SANITIZER + ASAN_UNPOISON_MEMORY_REGION(m, s); +#endif +#ifdef ABSL_HAVE_MEMORY_SANITIZER + __msan_unpoison(m, s); +#endif + (void)m; + (void)s; +} + +template +inline void SanitizerPoisonObject(const T* object) { + SanitizerPoisonMemoryRegion(object, sizeof(T)); +} + +template +inline void SanitizerUnpoisonObject(const T* object) { + SanitizerUnpoisonMemoryRegion(object, sizeof(T)); +} + +namespace memory_internal { + +// If Pair is a standard-layout type, OffsetOf::kFirst and +// OffsetOf::kSecond are equivalent to offsetof(Pair, first) and +// offsetof(Pair, second) respectively. Otherwise they are -1. +// +// The purpose of OffsetOf is to avoid calling offsetof() on non-standard-layout +// type, which is non-portable. +template +struct OffsetOf { + static constexpr size_t kFirst = static_cast(-1); + static constexpr size_t kSecond = static_cast(-1); +}; + +template +struct OffsetOf::type> { + static constexpr size_t kFirst = offsetof(Pair, first); + static constexpr size_t kSecond = offsetof(Pair, second); +}; + +template +struct IsLayoutCompatible { + private: + struct Pair { + K first; + V second; + }; + + // Is P layout-compatible with Pair? + template + static constexpr bool LayoutCompatible() { + return std::is_standard_layout

() && sizeof(P) == sizeof(Pair) && + alignof(P) == alignof(Pair) && + memory_internal::OffsetOf

::kFirst == + memory_internal::OffsetOf::kFirst && + memory_internal::OffsetOf

::kSecond == + memory_internal::OffsetOf::kSecond; + } + + public: + // Whether pair and pair are layout-compatible. If they are, + // then it is safe to store them in a union and read from either. + static constexpr bool value = std::is_standard_layout() && + std::is_standard_layout() && + memory_internal::OffsetOf::kFirst == 0 && + LayoutCompatible>() && + LayoutCompatible>(); +}; + +} // namespace memory_internal + +// The internal storage type for key-value containers like flat_hash_map. +// +// It is convenient for the value_type of a flat_hash_map to be +// pair; the "const K" prevents accidental modification of the key +// when dealing with the reference returned from find() and similar methods. +// However, this creates other problems; we want to be able to emplace(K, V) +// efficiently with move operations, and similarly be able to move a +// pair in insert(). +// +// The solution is this union, which aliases the const and non-const versions +// of the pair. This also allows flat_hash_map to work, even though +// that has the same efficiency issues with move in emplace() and insert() - +// but people do it anyway. +// +// If kMutableKeys is false, only the value member can be accessed. +// +// If kMutableKeys is true, key can be accessed through all slots while value +// and mutable_value must be accessed only via INITIALIZED slots. Slots are +// created and destroyed via mutable_value so that the key can be moved later. +// +// Accessing one of the union fields while the other is active is safe as +// long as they are layout-compatible, which is guaranteed by the definition of +// kMutableKeys. For C++11, the relevant section of the standard is +// https://timsong-cpp.github.io/cppwp/n3337/class.mem#19 (9.2.19) +template +union map_slot_type { + map_slot_type() {} + ~map_slot_type() = delete; + using value_type = std::pair; + using mutable_value_type = + std::pair, absl::remove_const_t>; + + value_type value; + mutable_value_type mutable_value; + absl::remove_const_t key; +}; + +template +struct map_slot_policy { + using slot_type = map_slot_type; + using value_type = std::pair; + using mutable_value_type = + std::pair, absl::remove_const_t>; + + private: + static void emplace(slot_type* slot) { + // The construction of union doesn't do anything at runtime but it allows us + // to access its members without violating aliasing rules. + new (slot) slot_type; + } + // If pair and pair are layout-compatible, we can accept one + // or the other via slot_type. We are also free to access the key via + // slot_type::key in this case. + using kMutableKeys = memory_internal::IsLayoutCompatible; + + public: + static value_type& element(slot_type* slot) { return slot->value; } + static const value_type& element(const slot_type* slot) { + return slot->value; + } + + // When C++17 is available, we can use std::launder to provide mutable + // access to the key for use in node handle. +#if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606 + static K& mutable_key(slot_type* slot) { + // Still check for kMutableKeys so that we can avoid calling std::launder + // unless necessary because it can interfere with optimizations. + return kMutableKeys::value ? slot->key + : *std::launder(const_cast( + std::addressof(slot->value.first))); + } +#else // !(defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606) + static const K& mutable_key(slot_type* slot) { return key(slot); } +#endif + + static const K& key(const slot_type* slot) { + return kMutableKeys::value ? slot->key : slot->value.first; + } + + template + static void construct(Allocator* alloc, slot_type* slot, Args&&... args) { + emplace(slot); + if (kMutableKeys::value) { + absl::allocator_traits::construct(*alloc, &slot->mutable_value, + std::forward(args)...); + } else { + absl::allocator_traits::construct(*alloc, &slot->value, + std::forward(args)...); + } + } + + // Construct this slot by moving from another slot. + template + static void construct(Allocator* alloc, slot_type* slot, slot_type* other) { + emplace(slot); + if (kMutableKeys::value) { + absl::allocator_traits::construct( + *alloc, &slot->mutable_value, std::move(other->mutable_value)); + } else { + absl::allocator_traits::construct(*alloc, &slot->value, + std::move(other->value)); + } + } + + // Construct this slot by copying from another slot. + template + static void construct(Allocator* alloc, slot_type* slot, + const slot_type* other) { + emplace(slot); + absl::allocator_traits::construct(*alloc, &slot->value, + other->value); + } + + template + static auto destroy(Allocator* alloc, slot_type* slot) { + if (kMutableKeys::value) { + absl::allocator_traits::destroy(*alloc, &slot->mutable_value); + } else { + absl::allocator_traits::destroy(*alloc, &slot->value); + } + return IsDestructionTrivial(); + } + + template + static auto transfer(Allocator* alloc, slot_type* new_slot, + slot_type* old_slot) { + auto is_relocatable = + typename absl::is_trivially_relocatable::type(); + + emplace(new_slot); +#if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606 + if (is_relocatable) { + // TODO(b/247130232,b/251814870): remove casts after fixing warnings. + std::memcpy(static_cast(std::launder(&new_slot->value)), + static_cast(&old_slot->value), + sizeof(value_type)); + return is_relocatable; + } +#endif + + if (kMutableKeys::value) { + absl::allocator_traits::construct( + *alloc, &new_slot->mutable_value, std::move(old_slot->mutable_value)); + } else { + absl::allocator_traits::construct(*alloc, &new_slot->value, + std::move(old_slot->value)); + } + destroy(alloc, old_slot); + return is_relocatable; + } +}; + +// Type erased function for computing hash of the slot. +using HashSlotFn = size_t (*)(const void* hash_fn, void* slot); + +// Type erased function to apply `Fn` to data inside of the `slot`. +// The data is expected to have type `T`. +template +size_t TypeErasedApplyToSlotFn(const void* fn, void* slot) { + const auto* f = static_cast(fn); + return (*f)(*static_cast(slot)); +} + +// Type erased function to apply `Fn` to data inside of the `*slot_ptr`. +// The data is expected to have type `T`. +template +size_t TypeErasedDerefAndApplyToSlotFn(const void* fn, void* slot_ptr) { + const auto* f = static_cast(fn); + const T* slot = *static_cast(slot_ptr); + return (*f)(*slot); +} + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_INTERNAL_CONTAINER_MEMORY_H_ diff --git a/absl/container/internal/container_memory_test.cc b/absl/container/internal/container_memory_test.cc new file mode 100644 index 0000000..7e4357d --- /dev/null +++ b/absl/container/internal/container_memory_test.cc @@ -0,0 +1,318 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/internal/container_memory.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/no_destructor.h" +#include "absl/container/internal/test_instance_tracker.h" +#include "absl/meta/type_traits.h" +#include "absl/strings/string_view.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace { + +using ::absl::test_internal::CopyableMovableInstance; +using ::absl::test_internal::InstanceTracker; +using ::testing::_; +using ::testing::ElementsAre; +using ::testing::Gt; +using ::testing::Pair; + +TEST(Memory, AlignmentLargerThanBase) { + std::allocator alloc; + void* mem = Allocate<2>(&alloc, 3); + EXPECT_EQ(0, reinterpret_cast(mem) % 2); + memcpy(mem, "abc", 3); + Deallocate<2>(&alloc, mem, 3); +} + +TEST(Memory, AlignmentSmallerThanBase) { + std::allocator alloc; + void* mem = Allocate<2>(&alloc, 3); + EXPECT_EQ(0, reinterpret_cast(mem) % 2); + memcpy(mem, "abc", 3); + Deallocate<2>(&alloc, mem, 3); +} + +std::map& AllocationMap() { + static absl::NoDestructor> map; + return *map; +} + +template +struct TypeCountingAllocator { + TypeCountingAllocator() = default; + template + TypeCountingAllocator(const TypeCountingAllocator&) {} // NOLINT + + using value_type = T; + + T* allocate(size_t n, const void* = nullptr) { + AllocationMap()[typeid(T)] += n; + return std::allocator().allocate(n); + } + void deallocate(T* p, std::size_t n) { + AllocationMap()[typeid(T)] -= n; + return std::allocator().deallocate(p, n); + } +}; + +TEST(Memory, AllocateDeallocateMatchType) { + TypeCountingAllocator alloc; + void* mem = Allocate<1>(&alloc, 1); + // Verify that it was allocated + EXPECT_THAT(AllocationMap(), ElementsAre(Pair(_, Gt(0)))); + Deallocate<1>(&alloc, mem, 1); + // Verify that the deallocation matched. + EXPECT_THAT(AllocationMap(), ElementsAre(Pair(_, 0))); +} + +class Fixture : public ::testing::Test { + using Alloc = std::allocator; + + public: + Fixture() { ptr_ = std::allocator_traits::allocate(*alloc(), 1); } + ~Fixture() override { + std::allocator_traits::destroy(*alloc(), ptr_); + std::allocator_traits::deallocate(*alloc(), ptr_, 1); + } + std::string* ptr() { return ptr_; } + Alloc* alloc() { return &alloc_; } + + private: + Alloc alloc_; + std::string* ptr_; +}; + +TEST_F(Fixture, ConstructNoArgs) { + ConstructFromTuple(alloc(), ptr(), std::forward_as_tuple()); + EXPECT_EQ(*ptr(), ""); +} + +TEST_F(Fixture, ConstructOneArg) { + ConstructFromTuple(alloc(), ptr(), std::forward_as_tuple("abcde")); + EXPECT_EQ(*ptr(), "abcde"); +} + +TEST_F(Fixture, ConstructTwoArg) { + ConstructFromTuple(alloc(), ptr(), std::forward_as_tuple(5, 'a')); + EXPECT_EQ(*ptr(), "aaaaa"); +} + +TEST(PairArgs, NoArgs) { + EXPECT_THAT(PairArgs(), + Pair(std::forward_as_tuple(), std::forward_as_tuple())); +} + +TEST(PairArgs, TwoArgs) { + EXPECT_EQ( + std::make_pair(std::forward_as_tuple(1), std::forward_as_tuple('A')), + PairArgs(1, 'A')); +} + +TEST(PairArgs, Pair) { + EXPECT_EQ( + std::make_pair(std::forward_as_tuple(1), std::forward_as_tuple('A')), + PairArgs(std::make_pair(1, 'A'))); +} + +TEST(PairArgs, Piecewise) { + EXPECT_EQ( + std::make_pair(std::forward_as_tuple(1), std::forward_as_tuple('A')), + PairArgs(std::piecewise_construct, std::forward_as_tuple(1), + std::forward_as_tuple('A'))); +} + +TEST(WithConstructed, Simple) { + EXPECT_EQ(1, WithConstructed( + std::make_tuple(std::string("a")), + [](absl::string_view str) { return str.size(); })); +} + +template +decltype(DecomposeValue(std::declval(), std::declval())) +DecomposeValueImpl(int, F&& f, Arg&& arg) { + return DecomposeValue(std::forward(f), std::forward(arg)); +} + +template +const char* DecomposeValueImpl(char, F&& f, Arg&& arg) { + return "not decomposable"; +} + +template +decltype(DecomposeValueImpl(0, std::declval(), std::declval())) +TryDecomposeValue(F&& f, Arg&& arg) { + return DecomposeValueImpl(0, std::forward(f), std::forward(arg)); +} + +TEST(DecomposeValue, Decomposable) { + auto f = [](const int& x, int&& y) { // NOLINT + EXPECT_EQ(&x, &y); + EXPECT_EQ(42, x); + return 'A'; + }; + EXPECT_EQ('A', TryDecomposeValue(f, 42)); +} + +TEST(DecomposeValue, NotDecomposable) { + auto f = [](void*) { + ADD_FAILURE() << "Must not be called"; + return 'A'; + }; + EXPECT_STREQ("not decomposable", TryDecomposeValue(f, 42)); +} + +template +decltype(DecomposePair(std::declval(), std::declval()...)) +DecomposePairImpl(int, F&& f, Args&&... args) { + return DecomposePair(std::forward(f), std::forward(args)...); +} + +template +const char* DecomposePairImpl(char, F&& f, Args&&... args) { + return "not decomposable"; +} + +template +decltype(DecomposePairImpl(0, std::declval(), std::declval()...)) +TryDecomposePair(F&& f, Args&&... args) { + return DecomposePairImpl(0, std::forward(f), std::forward(args)...); +} + +TEST(DecomposePair, Decomposable) { + auto f = [](const int& x, // NOLINT + std::piecewise_construct_t, std::tuple k, + std::tuple&& v) { + EXPECT_EQ(&x, &std::get<0>(k)); + EXPECT_EQ(42, x); + EXPECT_EQ(0.5, std::get<0>(v)); + return 'A'; + }; + EXPECT_EQ('A', TryDecomposePair(f, 42, 0.5)); + EXPECT_EQ('A', TryDecomposePair(f, std::make_pair(42, 0.5))); + EXPECT_EQ('A', TryDecomposePair(f, std::piecewise_construct, + std::make_tuple(42), std::make_tuple(0.5))); +} + +TEST(DecomposePair, NotDecomposable) { + auto f = [](...) { + ADD_FAILURE() << "Must not be called"; + return 'A'; + }; + EXPECT_STREQ("not decomposable", TryDecomposePair(f)); + EXPECT_STREQ("not decomposable", + TryDecomposePair(f, std::piecewise_construct, std::make_tuple(), + std::make_tuple(0.5))); +} + +TEST(MapSlotPolicy, ConstKeyAndValue) { + using slot_policy = map_slot_policy; + using slot_type = typename slot_policy::slot_type; + + union Slots { + Slots() {} + ~Slots() {} + slot_type slots[100]; + } slots; + + std::allocator< + std::pair> + alloc; + InstanceTracker tracker; + slot_policy::construct(&alloc, &slots.slots[0], CopyableMovableInstance(1), + CopyableMovableInstance(1)); + for (int i = 0; i < 99; ++i) { + slot_policy::transfer(&alloc, &slots.slots[i + 1], &slots.slots[i]); + } + slot_policy::destroy(&alloc, &slots.slots[99]); + + EXPECT_EQ(tracker.copies(), 0); +} + +TEST(MapSlotPolicy, TransferReturnsTrue) { + { + using slot_policy = map_slot_policy; + EXPECT_TRUE( + (std::is_same>( + nullptr, nullptr, nullptr)), + std::true_type>::value)); + } + { + struct NonRelocatable { + NonRelocatable() = default; + NonRelocatable(NonRelocatable&&) {} + NonRelocatable& operator=(NonRelocatable&&) { return *this; } + void* self = nullptr; + }; + + EXPECT_FALSE(absl::is_trivially_relocatable::value); + using slot_policy = map_slot_policy; + EXPECT_TRUE( + (std::is_same>( + nullptr, nullptr, nullptr)), + std::false_type>::value)); + } +} + +TEST(MapSlotPolicy, DestroyReturnsTrue) { + { + using slot_policy = map_slot_policy; + EXPECT_TRUE( + (std::is_same>( + nullptr, nullptr)), + std::true_type>::value)); + } + { + EXPECT_FALSE(std::is_trivially_destructible>::value); + using slot_policy = map_slot_policy>; + EXPECT_TRUE( + (std::is_same>( + nullptr, nullptr)), + std::false_type>::value)); + } +} + +TEST(ApplyTest, TypeErasedApplyToSlotFn) { + size_t x = 7; + auto fn = [](size_t v) { return v * 2; }; + EXPECT_EQ((TypeErasedApplyToSlotFn(&fn, &x)), 14); +} + +TEST(ApplyTest, TypeErasedDerefAndApplyToSlotFn) { + size_t x = 7; + auto fn = [](size_t v) { return v * 2; }; + size_t* x_ptr = &x; + EXPECT_EQ( + (TypeErasedDerefAndApplyToSlotFn(&fn, &x_ptr)), 14); +} + +} // namespace +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/internal/hash_function_defaults.h b/absl/container/internal/hash_function_defaults.h new file mode 100644 index 0000000..0f07bcf --- /dev/null +++ b/absl/container/internal/hash_function_defaults.h @@ -0,0 +1,276 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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. +// +// Define the default Hash and Eq functions for SwissTable containers. +// +// std::hash and std::equal_to are not appropriate hash and equal +// functions for SwissTable containers. There are two reasons for this. +// +// SwissTable containers are power of 2 sized containers: +// +// This means they use the lower bits of the hash value to find the slot for +// each entry. The typical hash function for integral types is the identity. +// This is a very weak hash function for SwissTable and any power of 2 sized +// hashtable implementation which will lead to excessive collisions. For +// SwissTable we use murmur3 style mixing to reduce collisions to a minimum. +// +// SwissTable containers support heterogeneous lookup: +// +// In order to make heterogeneous lookup work, hash and equal functions must be +// polymorphic. At the same time they have to satisfy the same requirements the +// C++ standard imposes on hash functions and equality operators. That is: +// +// if hash_default_eq(a, b) returns true for any a and b of type T, then +// hash_default_hash(a) must equal hash_default_hash(b) +// +// For SwissTable containers this requirement is relaxed to allow a and b of +// any and possibly different types. Note that like the standard the hash and +// equal functions are still bound to T. This is important because some type U +// can be hashed by/tested for equality differently depending on T. A notable +// example is `const char*`. `const char*` is treated as a c-style string when +// the hash function is hash but as a pointer when the hash +// function is hash. +// +#ifndef ABSL_CONTAINER_INTERNAL_HASH_FUNCTION_DEFAULTS_H_ +#define ABSL_CONTAINER_INTERNAL_HASH_FUNCTION_DEFAULTS_H_ + +#include +#include +#include +#include +#include + +#include "absl/base/config.h" +#include "absl/container/internal/common.h" +#include "absl/hash/hash.h" +#include "absl/meta/type_traits.h" +#include "absl/strings/cord.h" +#include "absl/strings/string_view.h" + +#ifdef ABSL_HAVE_STD_STRING_VIEW +#include +#endif + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +// The hash of an object of type T is computed by using absl::Hash. +template +struct HashEq { + using Hash = absl::Hash; + using Eq = std::equal_to; +}; + +struct StringHash { + using is_transparent = void; + + size_t operator()(absl::string_view v) const { + return absl::Hash{}(v); + } + size_t operator()(const absl::Cord& v) const { + return absl::Hash{}(v); + } +}; + +struct StringEq { + using is_transparent = void; + bool operator()(absl::string_view lhs, absl::string_view rhs) const { + return lhs == rhs; + } + bool operator()(const absl::Cord& lhs, const absl::Cord& rhs) const { + return lhs == rhs; + } + bool operator()(const absl::Cord& lhs, absl::string_view rhs) const { + return lhs == rhs; + } + bool operator()(absl::string_view lhs, const absl::Cord& rhs) const { + return lhs == rhs; + } +}; + +// Supports heterogeneous lookup for string-like elements. +struct StringHashEq { + using Hash = StringHash; + using Eq = StringEq; +}; + +template <> +struct HashEq : StringHashEq {}; +template <> +struct HashEq : StringHashEq {}; +template <> +struct HashEq : StringHashEq {}; + +#ifdef ABSL_HAVE_STD_STRING_VIEW + +template +struct BasicStringHash { + using is_transparent = void; + + size_t operator()(std::basic_string_view v) const { + return absl::Hash>{}(v); + } +}; + +template +struct BasicStringEq { + using is_transparent = void; + bool operator()(std::basic_string_view lhs, + std::basic_string_view rhs) const { + return lhs == rhs; + } +}; + +// Supports heterogeneous lookup for w/u16/u32 string + string_view + char*. +template +struct BasicStringHashEq { + using Hash = BasicStringHash; + using Eq = BasicStringEq; +}; + +template <> +struct HashEq : BasicStringHashEq {}; +template <> +struct HashEq : BasicStringHashEq {}; +template <> +struct HashEq : BasicStringHashEq {}; +template <> +struct HashEq : BasicStringHashEq {}; +template <> +struct HashEq : BasicStringHashEq {}; +template <> +struct HashEq : BasicStringHashEq {}; + +#endif // ABSL_HAVE_STD_STRING_VIEW + +// Supports heterogeneous lookup for pointers and smart pointers. +template +struct HashEq { + struct Hash { + using is_transparent = void; + template + size_t operator()(const U& ptr) const { + return absl::Hash{}(HashEq::ToPtr(ptr)); + } + }; + struct Eq { + using is_transparent = void; + template + bool operator()(const A& a, const B& b) const { + return HashEq::ToPtr(a) == HashEq::ToPtr(b); + } + }; + + private: + static const T* ToPtr(const T* ptr) { return ptr; } + template + static const T* ToPtr(const std::unique_ptr& ptr) { + return ptr.get(); + } + template + static const T* ToPtr(const std::shared_ptr& ptr) { + return ptr.get(); + } +}; + +template +struct HashEq> : HashEq {}; +template +struct HashEq> : HashEq {}; + +template +struct HasAbslContainerHash : std::false_type {}; + +template +struct HasAbslContainerHash> + : std::true_type {}; + +template +struct HasAbslContainerEq : std::false_type {}; + +template +struct HasAbslContainerEq> + : std::true_type {}; + +template +struct AbslContainerEq { + using type = std::equal_to<>; +}; + +template +struct AbslContainerEq< + T, typename std::enable_if_t::value>> { + using type = typename T::absl_container_eq; +}; + +template +struct AbslContainerHash { + using type = void; +}; + +template +struct AbslContainerHash< + T, typename std::enable_if_t::value>> { + using type = typename T::absl_container_hash; +}; + +// HashEq specialization for user types that provide `absl_container_hash` and +// (optionally) `absl_container_eq`. This specialization allows user types to +// provide heterogeneous lookup without requiring to explicitly specify Hash/Eq +// type arguments in unordered Abseil containers. +// +// Both `absl_container_hash` and `absl_container_eq` should be transparent +// (have inner is_transparent type). While there is no technical reason to +// restrict to transparent-only types, there is also no feasible use case when +// it shouldn't be transparent - it is easier to relax the requirement later if +// such a case arises rather than restricting it. +// +// If type provides only `absl_container_hash` then `eq` part will be +// `std::equal_to`. +// +// User types are not allowed to provide only a `Eq` part as there is no +// feasible use case for this behavior - if Hash should be a default one then Eq +// should be an equivalent to the `std::equal_to`. +template +struct HashEq::value>> { + using Hash = typename AbslContainerHash::type; + using Eq = typename AbslContainerEq::type; + static_assert(IsTransparent::value, + "absl_container_hash must be transparent. To achieve it add a " + "`using is_transparent = void;` clause to this type."); + static_assert(IsTransparent::value, + "absl_container_eq must be transparent. To achieve it add a " + "`using is_transparent = void;` clause to this type."); +}; + +// This header's visibility is restricted. If you need to access the default +// hasher please use the container's ::hasher alias instead. +// +// Example: typename Hash = typename absl::flat_hash_map::hasher +template +using hash_default_hash = typename container_internal::HashEq::Hash; + +// This header's visibility is restricted. If you need to access the default +// key equal please use the container's ::key_equal alias instead. +// +// Example: typename Eq = typename absl::flat_hash_map::key_equal +template +using hash_default_eq = typename container_internal::HashEq::Eq; + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_INTERNAL_HASH_FUNCTION_DEFAULTS_H_ diff --git a/absl/container/internal/hash_function_defaults_test.cc b/absl/container/internal/hash_function_defaults_test.cc new file mode 100644 index 0000000..912d119 --- /dev/null +++ b/absl/container/internal/hash_function_defaults_test.cc @@ -0,0 +1,684 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/internal/hash_function_defaults.h" + +#include +#include +#include +#include + +#include "gtest/gtest.h" +#include "absl/container/flat_hash_map.h" +#include "absl/container/flat_hash_set.h" +#include "absl/hash/hash.h" +#include "absl/random/random.h" +#include "absl/strings/cord.h" +#include "absl/strings/cord_test_helpers.h" +#include "absl/strings/string_view.h" + +#ifdef ABSL_HAVE_STD_STRING_VIEW +#include +#endif + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace { + +using ::testing::Types; + +TEST(Eq, Int32) { + hash_default_eq eq; + EXPECT_TRUE(eq(1, 1u)); + EXPECT_TRUE(eq(1, char{1})); + EXPECT_TRUE(eq(1, true)); + EXPECT_TRUE(eq(1, double{1.1})); + EXPECT_FALSE(eq(1, char{2})); + EXPECT_FALSE(eq(1, 2u)); + EXPECT_FALSE(eq(1, false)); + EXPECT_FALSE(eq(1, 2.)); +} + +TEST(Hash, Int32) { + hash_default_hash hash; + auto h = hash(1); + EXPECT_EQ(h, hash(1u)); + EXPECT_EQ(h, hash(char{1})); + EXPECT_EQ(h, hash(true)); + EXPECT_EQ(h, hash(double{1.1})); + EXPECT_NE(h, hash(2u)); + EXPECT_NE(h, hash(char{2})); + EXPECT_NE(h, hash(false)); + EXPECT_NE(h, hash(2.)); +} + +enum class MyEnum { A, B, C, D }; + +TEST(Eq, Enum) { + hash_default_eq eq; + EXPECT_TRUE(eq(MyEnum::A, MyEnum::A)); + EXPECT_FALSE(eq(MyEnum::A, MyEnum::B)); +} + +TEST(Hash, Enum) { + hash_default_hash hash; + + for (MyEnum e : {MyEnum::A, MyEnum::B, MyEnum::C}) { + auto h = hash(e); + EXPECT_EQ(h, hash_default_hash{}(static_cast(e))); + EXPECT_NE(h, hash(MyEnum::D)); + } +} + +using StringTypes = ::testing::Types; + +template +struct EqString : ::testing::Test { + hash_default_eq key_eq; +}; + +TYPED_TEST_SUITE(EqString, StringTypes); + +template +struct HashString : ::testing::Test { + hash_default_hash hasher; +}; + +TYPED_TEST_SUITE(HashString, StringTypes); + +TYPED_TEST(EqString, Works) { + auto eq = this->key_eq; + EXPECT_TRUE(eq("a", "a")); + EXPECT_TRUE(eq("a", absl::string_view("a"))); + EXPECT_TRUE(eq("a", std::string("a"))); + EXPECT_FALSE(eq("a", "b")); + EXPECT_FALSE(eq("a", absl::string_view("b"))); + EXPECT_FALSE(eq("a", std::string("b"))); +} + +TYPED_TEST(HashString, Works) { + auto hash = this->hasher; + auto h = hash("a"); + EXPECT_EQ(h, hash(absl::string_view("a"))); + EXPECT_EQ(h, hash(std::string("a"))); + EXPECT_NE(h, hash(absl::string_view("b"))); + EXPECT_NE(h, hash(std::string("b"))); +} + +TEST(BasicStringViewTest, WStringEqWorks) { +#ifndef ABSL_HAVE_STD_STRING_VIEW + GTEST_SKIP(); +#else + hash_default_eq eq; + EXPECT_TRUE(eq(L"a", L"a")); + EXPECT_TRUE(eq(L"a", std::wstring_view(L"a"))); + EXPECT_TRUE(eq(L"a", std::wstring(L"a"))); + EXPECT_FALSE(eq(L"a", L"b")); + EXPECT_FALSE(eq(L"a", std::wstring_view(L"b"))); + EXPECT_FALSE(eq(L"a", std::wstring(L"b"))); +#endif +} + +TEST(BasicStringViewTest, WStringViewEqWorks) { +#ifndef ABSL_HAVE_STD_STRING_VIEW + GTEST_SKIP(); +#else + hash_default_eq eq; + EXPECT_TRUE(eq(L"a", L"a")); + EXPECT_TRUE(eq(L"a", std::wstring_view(L"a"))); + EXPECT_TRUE(eq(L"a", std::wstring(L"a"))); + EXPECT_FALSE(eq(L"a", L"b")); + EXPECT_FALSE(eq(L"a", std::wstring_view(L"b"))); + EXPECT_FALSE(eq(L"a", std::wstring(L"b"))); +#endif +} + +TEST(BasicStringViewTest, U16StringEqWorks) { +#ifndef ABSL_HAVE_STD_STRING_VIEW + GTEST_SKIP(); +#else + hash_default_eq eq; + EXPECT_TRUE(eq(u"a", u"a")); + EXPECT_TRUE(eq(u"a", std::u16string_view(u"a"))); + EXPECT_TRUE(eq(u"a", std::u16string(u"a"))); + EXPECT_FALSE(eq(u"a", u"b")); + EXPECT_FALSE(eq(u"a", std::u16string_view(u"b"))); + EXPECT_FALSE(eq(u"a", std::u16string(u"b"))); +#endif +} + +TEST(BasicStringViewTest, U16StringViewEqWorks) { +#ifndef ABSL_HAVE_STD_STRING_VIEW + GTEST_SKIP(); +#else + hash_default_eq eq; + EXPECT_TRUE(eq(u"a", u"a")); + EXPECT_TRUE(eq(u"a", std::u16string_view(u"a"))); + EXPECT_TRUE(eq(u"a", std::u16string(u"a"))); + EXPECT_FALSE(eq(u"a", u"b")); + EXPECT_FALSE(eq(u"a", std::u16string_view(u"b"))); + EXPECT_FALSE(eq(u"a", std::u16string(u"b"))); +#endif +} + +TEST(BasicStringViewTest, U32StringEqWorks) { +#ifndef ABSL_HAVE_STD_STRING_VIEW + GTEST_SKIP(); +#else + hash_default_eq eq; + EXPECT_TRUE(eq(U"a", U"a")); + EXPECT_TRUE(eq(U"a", std::u32string_view(U"a"))); + EXPECT_TRUE(eq(U"a", std::u32string(U"a"))); + EXPECT_FALSE(eq(U"a", U"b")); + EXPECT_FALSE(eq(U"a", std::u32string_view(U"b"))); + EXPECT_FALSE(eq(U"a", std::u32string(U"b"))); +#endif +} + +TEST(BasicStringViewTest, U32StringViewEqWorks) { +#ifndef ABSL_HAVE_STD_STRING_VIEW + GTEST_SKIP(); +#else + hash_default_eq eq; + EXPECT_TRUE(eq(U"a", U"a")); + EXPECT_TRUE(eq(U"a", std::u32string_view(U"a"))); + EXPECT_TRUE(eq(U"a", std::u32string(U"a"))); + EXPECT_FALSE(eq(U"a", U"b")); + EXPECT_FALSE(eq(U"a", std::u32string_view(U"b"))); + EXPECT_FALSE(eq(U"a", std::u32string(U"b"))); +#endif +} + +TEST(BasicStringViewTest, WStringHashWorks) { +#ifndef ABSL_HAVE_STD_STRING_VIEW + GTEST_SKIP(); +#else + hash_default_hash hash; + auto h = hash(L"a"); + EXPECT_EQ(h, hash(std::wstring_view(L"a"))); + EXPECT_EQ(h, hash(std::wstring(L"a"))); + EXPECT_NE(h, hash(std::wstring_view(L"b"))); + EXPECT_NE(h, hash(std::wstring(L"b"))); +#endif +} + +TEST(BasicStringViewTest, WStringViewHashWorks) { +#ifndef ABSL_HAVE_STD_STRING_VIEW + GTEST_SKIP(); +#else + hash_default_hash hash; + auto h = hash(L"a"); + EXPECT_EQ(h, hash(std::wstring_view(L"a"))); + EXPECT_EQ(h, hash(std::wstring(L"a"))); + EXPECT_NE(h, hash(std::wstring_view(L"b"))); + EXPECT_NE(h, hash(std::wstring(L"b"))); +#endif +} + +TEST(BasicStringViewTest, U16StringHashWorks) { +#ifndef ABSL_HAVE_STD_STRING_VIEW + GTEST_SKIP(); +#else + hash_default_hash hash; + auto h = hash(u"a"); + EXPECT_EQ(h, hash(std::u16string_view(u"a"))); + EXPECT_EQ(h, hash(std::u16string(u"a"))); + EXPECT_NE(h, hash(std::u16string_view(u"b"))); + EXPECT_NE(h, hash(std::u16string(u"b"))); +#endif +} + +TEST(BasicStringViewTest, U16StringViewHashWorks) { +#ifndef ABSL_HAVE_STD_STRING_VIEW + GTEST_SKIP(); +#else + hash_default_hash hash; + auto h = hash(u"a"); + EXPECT_EQ(h, hash(std::u16string_view(u"a"))); + EXPECT_EQ(h, hash(std::u16string(u"a"))); + EXPECT_NE(h, hash(std::u16string_view(u"b"))); + EXPECT_NE(h, hash(std::u16string(u"b"))); +#endif +} + +TEST(BasicStringViewTest, U32StringHashWorks) { +#ifndef ABSL_HAVE_STD_STRING_VIEW + GTEST_SKIP(); +#else + hash_default_hash hash; + auto h = hash(U"a"); + EXPECT_EQ(h, hash(std::u32string_view(U"a"))); + EXPECT_EQ(h, hash(std::u32string(U"a"))); + EXPECT_NE(h, hash(std::u32string_view(U"b"))); + EXPECT_NE(h, hash(std::u32string(U"b"))); +#endif +} + +TEST(BasicStringViewTest, U32StringViewHashWorks) { +#ifndef ABSL_HAVE_STD_STRING_VIEW + GTEST_SKIP(); +#else + hash_default_hash hash; + auto h = hash(U"a"); + EXPECT_EQ(h, hash(std::u32string_view(U"a"))); + EXPECT_EQ(h, hash(std::u32string(U"a"))); + EXPECT_NE(h, hash(std::u32string_view(U"b"))); + EXPECT_NE(h, hash(std::u32string(U"b"))); +#endif +} + +struct NoDeleter { + template + void operator()(const T* ptr) const {} +}; + +using PointerTypes = + ::testing::Types, + std::unique_ptr, + std::unique_ptr, std::unique_ptr, + std::shared_ptr, std::shared_ptr>; + +template +struct EqPointer : ::testing::Test { + hash_default_eq key_eq; +}; + +TYPED_TEST_SUITE(EqPointer, PointerTypes); + +template +struct HashPointer : ::testing::Test { + hash_default_hash hasher; +}; + +TYPED_TEST_SUITE(HashPointer, PointerTypes); + +TYPED_TEST(EqPointer, Works) { + int dummy; + auto eq = this->key_eq; + auto sptr = std::make_shared(); + std::shared_ptr csptr = sptr; + int* ptr = sptr.get(); + const int* cptr = ptr; + std::unique_ptr uptr(ptr); + std::unique_ptr cuptr(ptr); + + EXPECT_TRUE(eq(ptr, cptr)); + EXPECT_TRUE(eq(ptr, sptr)); + EXPECT_TRUE(eq(ptr, uptr)); + EXPECT_TRUE(eq(ptr, csptr)); + EXPECT_TRUE(eq(ptr, cuptr)); + EXPECT_FALSE(eq(&dummy, cptr)); + EXPECT_FALSE(eq(&dummy, sptr)); + EXPECT_FALSE(eq(&dummy, uptr)); + EXPECT_FALSE(eq(&dummy, csptr)); + EXPECT_FALSE(eq(&dummy, cuptr)); +} + +TEST(Hash, DerivedAndBase) { + struct Base {}; + struct Derived : Base {}; + + hash_default_hash hasher; + + Base base; + Derived derived; + EXPECT_NE(hasher(&base), hasher(&derived)); + EXPECT_EQ(hasher(static_cast(&derived)), hasher(&derived)); + + auto dp = std::make_shared(); + EXPECT_EQ(hasher(static_cast(dp.get())), hasher(dp)); +} + +TEST(Hash, FunctionPointer) { + using Func = int (*)(); + hash_default_hash hasher; + hash_default_eq eq; + + Func p1 = [] { return 1; }, p2 = [] { return 2; }; + EXPECT_EQ(hasher(p1), hasher(p1)); + EXPECT_TRUE(eq(p1, p1)); + + EXPECT_NE(hasher(p1), hasher(p2)); + EXPECT_FALSE(eq(p1, p2)); +} + +TYPED_TEST(HashPointer, Works) { + int dummy; + auto hash = this->hasher; + auto sptr = std::make_shared(); + std::shared_ptr csptr = sptr; + int* ptr = sptr.get(); + const int* cptr = ptr; + std::unique_ptr uptr(ptr); + std::unique_ptr cuptr(ptr); + + EXPECT_EQ(hash(ptr), hash(cptr)); + EXPECT_EQ(hash(ptr), hash(sptr)); + EXPECT_EQ(hash(ptr), hash(uptr)); + EXPECT_EQ(hash(ptr), hash(csptr)); + EXPECT_EQ(hash(ptr), hash(cuptr)); + EXPECT_NE(hash(&dummy), hash(cptr)); + EXPECT_NE(hash(&dummy), hash(sptr)); + EXPECT_NE(hash(&dummy), hash(uptr)); + EXPECT_NE(hash(&dummy), hash(csptr)); + EXPECT_NE(hash(&dummy), hash(cuptr)); +} + +TEST(EqCord, Works) { + hash_default_eq eq; + const absl::string_view a_string_view = "a"; + const absl::Cord a_cord(a_string_view); + const absl::string_view b_string_view = "b"; + const absl::Cord b_cord(b_string_view); + + EXPECT_TRUE(eq(a_cord, a_cord)); + EXPECT_TRUE(eq(a_cord, a_string_view)); + EXPECT_TRUE(eq(a_string_view, a_cord)); + EXPECT_FALSE(eq(a_cord, b_cord)); + EXPECT_FALSE(eq(a_cord, b_string_view)); + EXPECT_FALSE(eq(b_string_view, a_cord)); +} + +TEST(HashCord, Works) { + hash_default_hash hash; + const absl::string_view a_string_view = "a"; + const absl::Cord a_cord(a_string_view); + const absl::string_view b_string_view = "b"; + const absl::Cord b_cord(b_string_view); + + EXPECT_EQ(hash(a_cord), hash(a_cord)); + EXPECT_EQ(hash(b_cord), hash(b_cord)); + EXPECT_EQ(hash(a_string_view), hash(a_cord)); + EXPECT_EQ(hash(b_string_view), hash(b_cord)); + EXPECT_EQ(hash(absl::Cord("")), hash("")); + EXPECT_EQ(hash(absl::Cord()), hash(absl::string_view())); + + EXPECT_NE(hash(a_cord), hash(b_cord)); + EXPECT_NE(hash(a_cord), hash(b_string_view)); + EXPECT_NE(hash(a_string_view), hash(b_cord)); + EXPECT_NE(hash(a_string_view), hash(b_string_view)); +} + +void NoOpReleaser(absl::string_view data, void* arg) {} + +TEST(HashCord, FragmentedCordWorks) { + hash_default_hash hash; + absl::Cord c = absl::MakeFragmentedCord({"a", "b", "c"}); + EXPECT_FALSE(c.TryFlat().has_value()); + EXPECT_EQ(hash(c), hash("abc")); +} + +TEST(HashCord, FragmentedLongCordWorks) { + hash_default_hash hash; + // Crete some large strings which do not fit on the stack. + std::string a(65536, 'a'); + std::string b(65536, 'b'); + absl::Cord c = absl::MakeFragmentedCord({a, b}); + EXPECT_FALSE(c.TryFlat().has_value()); + EXPECT_EQ(hash(c), hash(a + b)); +} + +TEST(HashCord, RandomCord) { + hash_default_hash hash; + auto bitgen = absl::BitGen(); + for (int i = 0; i < 1000; ++i) { + const int number_of_segments = absl::Uniform(bitgen, 0, 10); + std::vector pieces; + for (size_t s = 0; s < number_of_segments; ++s) { + std::string str; + str.resize(absl::Uniform(bitgen, 0, 4096)); + // MSVC needed the explicit return type in the lambda. + std::generate(str.begin(), str.end(), [&]() -> char { + return static_cast(absl::Uniform(bitgen)); + }); + pieces.push_back(str); + } + absl::Cord c = absl::MakeFragmentedCord(pieces); + EXPECT_EQ(hash(c), hash(std::string(c))); + } +} + +// Cartesian product of (std::string, absl::string_view) +// with (std::string, absl::string_view, const char*, absl::Cord). +using StringTypesCartesianProduct = Types< + // clang-format off + std::pair, + std::pair, + std::pair, + std::pair, + + std::pair, + std::pair, + + std::pair, + std::pair, + std::pair>; +// clang-format on + +constexpr char kFirstString[] = "abc123"; +constexpr char kSecondString[] = "ijk456"; + +template +struct StringLikeTest : public ::testing::Test { + typename T::first_type a1{kFirstString}; + typename T::second_type b1{kFirstString}; + typename T::first_type a2{kSecondString}; + typename T::second_type b2{kSecondString}; + hash_default_eq eq; + hash_default_hash hash; +}; + +TYPED_TEST_SUITE(StringLikeTest, StringTypesCartesianProduct); + +TYPED_TEST(StringLikeTest, Eq) { + EXPECT_TRUE(this->eq(this->a1, this->b1)); + EXPECT_TRUE(this->eq(this->b1, this->a1)); +} + +TYPED_TEST(StringLikeTest, NotEq) { + EXPECT_FALSE(this->eq(this->a1, this->b2)); + EXPECT_FALSE(this->eq(this->b2, this->a1)); +} + +TYPED_TEST(StringLikeTest, HashEq) { + EXPECT_EQ(this->hash(this->a1), this->hash(this->b1)); + EXPECT_EQ(this->hash(this->a2), this->hash(this->b2)); + // It would be a poor hash function which collides on these strings. + EXPECT_NE(this->hash(this->a1), this->hash(this->b2)); +} + +struct TypeWithAbslContainerHash { + struct absl_container_hash { + using is_transparent = void; + + size_t operator()(const TypeWithAbslContainerHash& foo) const { + return absl::HashOf(foo.value); + } + + // Extra overload to test that heterogeneity works for this hasher. + size_t operator()(int value) const { return absl::HashOf(value); } + }; + + friend bool operator==(const TypeWithAbslContainerHash& lhs, + const TypeWithAbslContainerHash& rhs) { + return lhs.value == rhs.value; + } + + friend bool operator==(const TypeWithAbslContainerHash& lhs, int rhs) { + return lhs.value == rhs; + } + + int value; + int noise; +}; + +struct TypeWithAbslContainerHashAndEq { + struct absl_container_hash { + using is_transparent = void; + + size_t operator()(const TypeWithAbslContainerHashAndEq& foo) const { + return absl::HashOf(foo.value); + } + + // Extra overload to test that heterogeneity works for this hasher. + size_t operator()(int value) const { return absl::HashOf(value); } + }; + + struct absl_container_eq { + using is_transparent = void; + + bool operator()(const TypeWithAbslContainerHashAndEq& lhs, + const TypeWithAbslContainerHashAndEq& rhs) const { + return lhs.value == rhs.value; + } + + // Extra overload to test that heterogeneity works for this eq. + bool operator()(const TypeWithAbslContainerHashAndEq& lhs, int rhs) const { + return lhs.value == rhs; + } + }; + + template + bool operator==(T&& other) const = delete; + + int value; + int noise; +}; + +using AbslContainerHashTypes = + Types; + +template +using AbslContainerHashTest = ::testing::Test; + +TYPED_TEST_SUITE(AbslContainerHashTest, AbslContainerHashTypes); + +TYPED_TEST(AbslContainerHashTest, HasherWorks) { + hash_default_hash hasher; + + TypeParam foo1{/*value=*/1, /*noise=*/100}; + TypeParam foo1_copy{/*value=*/1, /*noise=*/20}; + TypeParam foo2{/*value=*/2, /*noise=*/100}; + + EXPECT_EQ(hasher(foo1), absl::HashOf(1)); + EXPECT_EQ(hasher(foo2), absl::HashOf(2)); + EXPECT_EQ(hasher(foo1), hasher(foo1_copy)); + + // Heterogeneity works. + EXPECT_EQ(hasher(foo1), hasher(1)); + EXPECT_EQ(hasher(foo2), hasher(2)); +} + +TYPED_TEST(AbslContainerHashTest, EqWorks) { + hash_default_eq eq; + + TypeParam foo1{/*value=*/1, /*noise=*/100}; + TypeParam foo1_copy{/*value=*/1, /*noise=*/20}; + TypeParam foo2{/*value=*/2, /*noise=*/100}; + + EXPECT_TRUE(eq(foo1, foo1_copy)); + EXPECT_FALSE(eq(foo1, foo2)); + + // Heterogeneity works. + EXPECT_TRUE(eq(foo1, 1)); + EXPECT_FALSE(eq(foo1, 2)); +} + +TYPED_TEST(AbslContainerHashTest, HeterogeneityInMapWorks) { + absl::flat_hash_map map; + + TypeParam foo1{/*value=*/1, /*noise=*/100}; + TypeParam foo1_copy{/*value=*/1, /*noise=*/20}; + TypeParam foo2{/*value=*/2, /*noise=*/100}; + TypeParam foo3{/*value=*/3, /*noise=*/100}; + + map[foo1] = 1; + map[foo2] = 2; + + EXPECT_TRUE(map.contains(foo1_copy)); + EXPECT_EQ(map.at(foo1_copy), 1); + EXPECT_TRUE(map.contains(1)); + EXPECT_EQ(map.at(1), 1); + EXPECT_TRUE(map.contains(2)); + EXPECT_EQ(map.at(2), 2); + EXPECT_FALSE(map.contains(foo3)); + EXPECT_FALSE(map.contains(3)); +} + +TYPED_TEST(AbslContainerHashTest, HeterogeneityInSetWorks) { + absl::flat_hash_set set; + + TypeParam foo1{/*value=*/1, /*noise=*/100}; + TypeParam foo1_copy{/*value=*/1, /*noise=*/20}; + TypeParam foo2{/*value=*/2, /*noise=*/100}; + + set.insert(foo1); + + EXPECT_TRUE(set.contains(foo1_copy)); + EXPECT_TRUE(set.contains(1)); + EXPECT_FALSE(set.contains(foo2)); + EXPECT_FALSE(set.contains(2)); +} + +} // namespace +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +enum Hash : size_t { + kStd = 0x1, // std::hash +#ifdef _MSC_VER + kExtension = kStd, // In MSVC, std::hash == ::hash +#else // _MSC_VER + kExtension = 0x2, // ::hash (GCC extension) +#endif // _MSC_VER +}; + +// H is a bitmask of Hash enumerations. +// Hashable is hashable via all means specified in H. +template +struct Hashable { + static constexpr bool HashableBy(Hash h) { return h & H; } +}; + +namespace std { +template +struct hash> { + template , + class = typename std::enable_if::type> + size_t operator()(E) const { + return kStd; + } +}; +} // namespace std + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace { + +template +size_t Hash(const T& v) { + return hash_default_hash()(v); +} + +TEST(Delegate, HashDispatch) { + EXPECT_EQ(Hash(kStd), Hash(Hashable())); +} + +} // namespace +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/internal/hash_generator_testing.cc b/absl/container/internal/hash_generator_testing.cc new file mode 100644 index 0000000..e89dfdb --- /dev/null +++ b/absl/container/internal/hash_generator_testing.cc @@ -0,0 +1,78 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/internal/hash_generator_testing.h" + +#include + +#include "absl/base/no_destructor.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace hash_internal { +namespace { + +class RandomDeviceSeedSeq { + public: + using result_type = typename std::random_device::result_type; + + template + void generate(Iterator start, Iterator end) { + while (start != end) { + *start = gen_(); + ++start; + } + } + + private: + std::random_device gen_; +}; + +} // namespace + +std::mt19937_64* GetSharedRng() { + static absl::NoDestructor rng([] { + RandomDeviceSeedSeq seed_seq; + return std::mt19937_64(seed_seq); + }()); + return rng.get(); +} + +std::string Generator::operator()() const { + // NOLINTNEXTLINE(runtime/int) + std::uniform_int_distribution chars(0x20, 0x7E); + std::string res; + res.resize(32); + std::generate(res.begin(), res.end(), + [&]() { return chars(*GetSharedRng()); }); + return res; +} + +absl::string_view Generator::operator()() const { + static absl::NoDestructor> arena; + // NOLINTNEXTLINE(runtime/int) + std::uniform_int_distribution chars(0x20, 0x7E); + arena->emplace_back(); + auto& res = arena->back(); + res.resize(32); + std::generate(res.begin(), res.end(), + [&]() { return chars(*GetSharedRng()); }); + return res; +} + +} // namespace hash_internal +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/internal/hash_generator_testing.h b/absl/container/internal/hash_generator_testing.h new file mode 100644 index 0000000..f1f555a --- /dev/null +++ b/absl/container/internal/hash_generator_testing.h @@ -0,0 +1,182 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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. +// +// Generates random values for testing. Specialized only for the few types we +// care about. + +#ifndef ABSL_CONTAINER_INTERNAL_HASH_GENERATOR_TESTING_H_ +#define ABSL_CONTAINER_INTERNAL_HASH_GENERATOR_TESTING_H_ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "absl/container/internal/hash_policy_testing.h" +#include "absl/memory/memory.h" +#include "absl/meta/type_traits.h" +#include "absl/strings/string_view.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace hash_internal { +namespace generator_internal { + +template +struct IsMap : std::false_type {}; + +template +struct IsMap> : std::true_type {}; + +} // namespace generator_internal + +std::mt19937_64* GetSharedRng(); + +enum Enum { + kEnumEmpty, + kEnumDeleted, +}; + +enum class EnumClass : uint64_t { + kEmpty, + kDeleted, +}; + +inline std::ostream& operator<<(std::ostream& o, const EnumClass& ec) { + return o << static_cast(ec); +} + +template +struct Generator; + +template +struct Generator::value>::type> { + T operator()() const { + std::uniform_int_distribution dist; + return dist(*GetSharedRng()); + } +}; + +template <> +struct Generator { + Enum operator()() const { + std::uniform_int_distribution::type> + dist; + while (true) { + auto variate = dist(*GetSharedRng()); + if (variate != kEnumEmpty && variate != kEnumDeleted) + return static_cast(variate); + } + } +}; + +template <> +struct Generator { + EnumClass operator()() const { + std::uniform_int_distribution< + typename std::underlying_type::type> + dist; + while (true) { + EnumClass variate = static_cast(dist(*GetSharedRng())); + if (variate != EnumClass::kEmpty && variate != EnumClass::kDeleted) + return static_cast(variate); + } + } +}; + +template <> +struct Generator { + std::string operator()() const; +}; + +template <> +struct Generator { + absl::string_view operator()() const; +}; + +template <> +struct Generator { + NonStandardLayout operator()() const { + return NonStandardLayout(Generator()()); + } +}; + +template +struct Generator> { + std::pair operator()() const { + return std::pair(Generator::type>()(), + Generator::type>()()); + } +}; + +template +struct Generator> { + std::tuple operator()() const { + return std::tuple(Generator::type>()()...); + } +}; + +template +struct Generator> { + std::unique_ptr operator()() const { + return absl::make_unique(Generator()()); + } +}; + +template +struct Generator().key()), + decltype(std::declval().value())>> + : Generator().key())>::type, + typename std::decay().value())>::type>> {}; + +template +using GeneratedType = decltype( + std::declval::value, + typename Container::value_type, + typename Container::key_type>::type>&>()()); + +// Naive wrapper that performs a linear search of previous values. +// Beware this is O(SQR), which is reasonable for smaller kMaxValues. +template +struct UniqueGenerator { + Generator gen; + std::vector values; + + T operator()() { + assert(values.size() < kMaxValues); + for (;;) { + T value = gen(); + if (std::find(values.begin(), values.end(), value) == values.end()) { + values.push_back(value); + return value; + } + } + } +}; + +} // namespace hash_internal +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_INTERNAL_HASH_GENERATOR_TESTING_H_ diff --git a/absl/container/internal/hash_policy_testing.h b/absl/container/internal/hash_policy_testing.h new file mode 100644 index 0000000..66bb12e --- /dev/null +++ b/absl/container/internal/hash_policy_testing.h @@ -0,0 +1,183 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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. +// +// Utilities to help tests verify that hash tables properly handle stateful +// allocators and hash functions. + +#ifndef ABSL_CONTAINER_INTERNAL_HASH_POLICY_TESTING_H_ +#define ABSL_CONTAINER_INTERNAL_HASH_POLICY_TESTING_H_ + +#include +#include +#include +#include +#include +#include +#include + +#include "absl/hash/hash.h" +#include "absl/strings/string_view.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace hash_testing_internal { + +template +struct WithId { + WithId() : id_(next_id()) {} + WithId(const WithId& that) : id_(that.id_) {} + WithId(WithId&& that) : id_(that.id_) { that.id_ = 0; } + WithId& operator=(const WithId& that) { + id_ = that.id_; + return *this; + } + WithId& operator=(WithId&& that) { + id_ = that.id_; + that.id_ = 0; + return *this; + } + + size_t id() const { return id_; } + + friend bool operator==(const WithId& a, const WithId& b) { + return a.id_ == b.id_; + } + friend bool operator!=(const WithId& a, const WithId& b) { return !(a == b); } + + protected: + explicit WithId(size_t id) : id_(id) {} + + private: + size_t id_; + + template + static size_t next_id() { + // 0 is reserved for moved from state. + static size_t gId = 1; + return gId++; + } +}; + +} // namespace hash_testing_internal + +struct NonStandardLayout { + NonStandardLayout() {} + explicit NonStandardLayout(std::string s) : value(std::move(s)) {} + virtual ~NonStandardLayout() {} + + friend bool operator==(const NonStandardLayout& a, + const NonStandardLayout& b) { + return a.value == b.value; + } + friend bool operator!=(const NonStandardLayout& a, + const NonStandardLayout& b) { + return a.value != b.value; + } + + template + friend H AbslHashValue(H h, const NonStandardLayout& v) { + return H::combine(std::move(h), v.value); + } + + std::string value; +}; + +struct StatefulTestingHash + : absl::container_internal::hash_testing_internal::WithId< + StatefulTestingHash> { + template + size_t operator()(const T& t) const { + return absl::Hash{}(t); + } +}; + +struct StatefulTestingEqual + : absl::container_internal::hash_testing_internal::WithId< + StatefulTestingEqual> { + template + bool operator()(const T& t, const U& u) const { + return t == u; + } +}; + +// It is expected that Alloc() == Alloc() for all allocators so we cannot use +// WithId base. We need to explicitly assign ids. +template +struct Alloc : std::allocator { + using propagate_on_container_swap = std::true_type; + + // Using old paradigm for this to ensure compatibility. + explicit Alloc(size_t id = 0) : id_(id) {} + + Alloc(const Alloc&) = default; + Alloc& operator=(const Alloc&) = default; + + template + Alloc(const Alloc& that) : std::allocator(that), id_(that.id()) {} + + template + struct rebind { + using other = Alloc; + }; + + size_t id() const { return id_; } + + friend bool operator==(const Alloc& a, const Alloc& b) { + return a.id_ == b.id_; + } + friend bool operator!=(const Alloc& a, const Alloc& b) { return !(a == b); } + + private: + size_t id_ = (std::numeric_limits::max)(); +}; + +template +auto items(const Map& m) -> std::vector< + std::pair> { + using std::get; + std::vector> res; + res.reserve(m.size()); + for (const auto& v : m) res.emplace_back(get<0>(v), get<1>(v)); + return res; +} + +template +auto keys(const Set& s) + -> std::vector::type> { + std::vector::type> res; + res.reserve(s.size()); + for (const auto& v : s) res.emplace_back(v); + return res; +} + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +// ABSL_UNORDERED_SUPPORTS_ALLOC_CTORS is false for glibcxx versions +// where the unordered containers are missing certain constructors that +// take allocator arguments. This test is defined ad-hoc for the platforms +// we care about (notably Crosstool 17) because libstdcxx's useless +// versioning scheme precludes a more principled solution. +// From GCC-4.9 Changelog: (src: https://gcc.gnu.org/gcc-4.9/changes.html) +// "the unordered associative containers in and +// meet the allocator-aware container requirements;" +#if defined(__GLIBCXX__) && __GLIBCXX__ <= 20140425 +#define ABSL_UNORDERED_SUPPORTS_ALLOC_CTORS 0 +#else +#define ABSL_UNORDERED_SUPPORTS_ALLOC_CTORS 1 +#endif + +#endif // ABSL_CONTAINER_INTERNAL_HASH_POLICY_TESTING_H_ diff --git a/absl/container/internal/hash_policy_testing_test.cc b/absl/container/internal/hash_policy_testing_test.cc new file mode 100644 index 0000000..f0b20fe --- /dev/null +++ b/absl/container/internal/hash_policy_testing_test.cc @@ -0,0 +1,45 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/internal/hash_policy_testing.h" + +#include "gtest/gtest.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace { + +TEST(_, Hash) { + StatefulTestingHash h1; + EXPECT_EQ(1, h1.id()); + StatefulTestingHash h2; + EXPECT_EQ(2, h2.id()); + StatefulTestingHash h1c(h1); + EXPECT_EQ(1, h1c.id()); + StatefulTestingHash h2m(std::move(h2)); + EXPECT_EQ(2, h2m.id()); + EXPECT_EQ(0, h2.id()); + StatefulTestingHash h3; + EXPECT_EQ(3, h3.id()); + h3 = StatefulTestingHash(); + EXPECT_EQ(4, h3.id()); + h3 = std::move(h1); + EXPECT_EQ(1, h3.id()); +} + +} // namespace +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/internal/hash_policy_traits.h b/absl/container/internal/hash_policy_traits.h new file mode 100644 index 0000000..ad835d6 --- /dev/null +++ b/absl/container/internal/hash_policy_traits.h @@ -0,0 +1,207 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 ABSL_CONTAINER_INTERNAL_HASH_POLICY_TRAITS_H_ +#define ABSL_CONTAINER_INTERNAL_HASH_POLICY_TRAITS_H_ + +#include +#include +#include +#include +#include + +#include "absl/container/internal/common_policy_traits.h" +#include "absl/meta/type_traits.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +// Defines how slots are initialized/destroyed/moved. +template +struct hash_policy_traits : common_policy_traits { + // The type of the keys stored in the hashtable. + using key_type = typename Policy::key_type; + + private: + struct ReturnKey { + // When C++17 is available, we can use std::launder to provide mutable + // access to the key for use in node handle. +#if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606 + template ::value, int> = 0> + static key_type& Impl(Key&& k, int) { + return *std::launder( + const_cast(std::addressof(std::forward(k)))); + } +#endif + + template + static Key Impl(Key&& k, char) { + return std::forward(k); + } + + // When Key=T&, we forward the lvalue reference. + // When Key=T, we return by value to avoid a dangling reference. + // eg, for string_hash_map. + template + auto operator()(Key&& k, const Args&...) const + -> decltype(Impl(std::forward(k), 0)) { + return Impl(std::forward(k), 0); + } + }; + + template + struct ConstantIteratorsImpl : std::false_type {}; + + template + struct ConstantIteratorsImpl> + : P::constant_iterators {}; + + public: + // The actual object stored in the hash table. + using slot_type = typename Policy::slot_type; + + // The argument type for insertions into the hashtable. This is different + // from value_type for increased performance. See initializer_list constructor + // and insert() member functions for more details. + using init_type = typename Policy::init_type; + + using reference = decltype(Policy::element(std::declval())); + using pointer = typename std::remove_reference::type*; + using value_type = typename std::remove_reference::type; + + // Policies can set this variable to tell raw_hash_set that all iterators + // should be constant, even `iterator`. This is useful for set-like + // containers. + // Defaults to false if not provided by the policy. + using constant_iterators = ConstantIteratorsImpl<>; + + // Returns the amount of memory owned by `slot`, exclusive of `sizeof(*slot)`. + // + // If `slot` is nullptr, returns the constant amount of memory owned by any + // full slot or -1 if slots own variable amounts of memory. + // + // PRECONDITION: `slot` is INITIALIZED or nullptr + template + static size_t space_used(const slot_type* slot) { + return P::space_used(slot); + } + + // Provides generalized access to the key for elements, both for elements in + // the table and for elements that have not yet been inserted (or even + // constructed). We would like an API that allows us to say: `key(args...)` + // but we cannot do that for all cases, so we use this more general API that + // can be used for many things, including the following: + // + // - Given an element in a table, get its key. + // - Given an element initializer, get its key. + // - Given `emplace()` arguments, get the element key. + // + // Implementations of this must adhere to a very strict technical + // specification around aliasing and consuming arguments: + // + // Let `value_type` be the result type of `element()` without ref- and + // cv-qualifiers. The first argument is a functor, the rest are constructor + // arguments for `value_type`. Returns `std::forward(f)(k, xs...)`, where + // `k` is the element key, and `xs...` are the new constructor arguments for + // `value_type`. It's allowed for `k` to alias `xs...`, and for both to alias + // `ts...`. The key won't be touched once `xs...` are used to construct an + // element; `ts...` won't be touched at all, which allows `apply()` to consume + // any rvalues among them. + // + // If `value_type` is constructible from `Ts&&...`, `Policy::apply()` must not + // trigger a hard compile error unless it originates from `f`. In other words, + // `Policy::apply()` must be SFINAE-friendly. If `value_type` is not + // constructible from `Ts&&...`, either SFINAE or a hard compile error is OK. + // + // If `Ts...` is `[cv] value_type[&]` or `[cv] init_type[&]`, + // `Policy::apply()` must work. A compile error is not allowed, SFINAE or not. + template + static auto apply(F&& f, Ts&&... ts) + -> decltype(P::apply(std::forward(f), std::forward(ts)...)) { + return P::apply(std::forward(f), std::forward(ts)...); + } + + // Returns the "key" portion of the slot. + // Used for node handle manipulation. + template + static auto mutable_key(slot_type* slot) + -> decltype(P::apply(ReturnKey(), hash_policy_traits::element(slot))) { + return P::apply(ReturnKey(), hash_policy_traits::element(slot)); + } + + // Returns the "value" (as opposed to the "key") portion of the element. Used + // by maps to implement `operator[]`, `at()` and `insert_or_assign()`. + template + static auto value(T* elem) -> decltype(P::value(elem)) { + return P::value(elem); + } + + using HashSlotFn = size_t (*)(const void* hash_fn, void* slot); + + template + static constexpr HashSlotFn get_hash_slot_fn() { +// get_hash_slot_fn may return nullptr to signal that non type erased function +// should be used. GCC warns against comparing function address with nullptr. +#if defined(__GNUC__) && !defined(__clang__) +#pragma GCC diagnostic push +// silent error: the address of * will never be NULL [-Werror=address] +#pragma GCC diagnostic ignored "-Waddress" +#endif + return Policy::template get_hash_slot_fn() == nullptr + ? &hash_slot_fn_non_type_erased + : Policy::template get_hash_slot_fn(); +#if defined(__GNUC__) && !defined(__clang__) +#pragma GCC diagnostic pop +#endif + } + + // Whether small object optimization is enabled. True by default. + static constexpr bool soo_enabled() { return soo_enabled_impl(Rank1{}); } + + private: + template + struct HashElement { + template + size_t operator()(const K& key, Args&&...) const { + return h(key); + } + const Hash& h; + }; + + template + static size_t hash_slot_fn_non_type_erased(const void* hash_fn, void* slot) { + return Policy::apply(HashElement{*static_cast(hash_fn)}, + Policy::element(static_cast(slot))); + } + + // Use go/ranked-overloads for dispatching. Rank1 is preferred. + struct Rank0 {}; + struct Rank1 : Rank0 {}; + + // Use auto -> decltype as an enabler. + template + static constexpr auto soo_enabled_impl(Rank1) -> decltype(P::soo_enabled()) { + return P::soo_enabled(); + } + + static constexpr bool soo_enabled_impl(Rank0) { return true; } +}; + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_INTERNAL_HASH_POLICY_TRAITS_H_ diff --git a/absl/container/internal/hash_policy_traits_test.cc b/absl/container/internal/hash_policy_traits_test.cc new file mode 100644 index 0000000..2d2c7c2 --- /dev/null +++ b/absl/container/internal/hash_policy_traits_test.cc @@ -0,0 +1,144 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/internal/hash_policy_traits.h" + +#include +#include +#include +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/container/internal/container_memory.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace { + +using ::testing::MockFunction; +using ::testing::Return; +using ::testing::ReturnRef; + +using Alloc = std::allocator; +using Slot = int; + +struct PolicyWithoutOptionalOps { + using slot_type = Slot; + using key_type = Slot; + using init_type = Slot; + + static std::function element; + static int apply(int v) { return apply_impl(v); } + static std::function apply_impl; + static std::function value; + + template + static constexpr HashSlotFn get_hash_slot_fn() { + return nullptr; + } +}; + +std::function PolicyWithoutOptionalOps::apply_impl; +std::function PolicyWithoutOptionalOps::value; + +struct Test : ::testing::Test { + Test() { + PolicyWithoutOptionalOps::apply_impl = [&](int a1) -> int { + return apply.Call(a1); + }; + PolicyWithoutOptionalOps::value = [&](Slot* a1) -> Slot& { + return value.Call(a1); + }; + } + + std::allocator alloc; + int a = 53; + MockFunction apply; + MockFunction value; +}; + +TEST_F(Test, apply) { + EXPECT_CALL(apply, Call(42)).WillOnce(Return(1337)); + EXPECT_EQ(1337, (hash_policy_traits::apply(42))); +} + +TEST_F(Test, value) { + int b = 0; + EXPECT_CALL(value, Call(&a)).WillOnce(ReturnRef(b)); + EXPECT_EQ(&b, &hash_policy_traits::value(&a)); +} + +struct Hash { + size_t operator()(Slot a) const { return static_cast(a) * 5; } +}; + +struct PolicyNoHashFn { + using slot_type = Slot; + using key_type = Slot; + using init_type = Slot; + + static size_t* apply_called_count; + + static Slot& element(Slot* slot) { return *slot; } + template + static size_t apply(const Fn& fn, int v) { + ++(*apply_called_count); + return fn(v); + } + + template + static constexpr HashSlotFn get_hash_slot_fn() { + return nullptr; + } +}; + +size_t* PolicyNoHashFn::apply_called_count; + +struct PolicyCustomHashFn : PolicyNoHashFn { + template + static constexpr HashSlotFn get_hash_slot_fn() { + return &TypeErasedApplyToSlotFn; + } +}; + +TEST(HashTest, PolicyNoHashFn_get_hash_slot_fn) { + size_t apply_called_count = 0; + PolicyNoHashFn::apply_called_count = &apply_called_count; + + Hash hasher; + Slot value = 7; + auto* fn = hash_policy_traits::get_hash_slot_fn(); + EXPECT_NE(fn, nullptr); + EXPECT_EQ(fn(&hasher, &value), hasher(value)); + EXPECT_EQ(apply_called_count, 1); +} + +TEST(HashTest, PolicyCustomHashFn_get_hash_slot_fn) { + size_t apply_called_count = 0; + PolicyNoHashFn::apply_called_count = &apply_called_count; + + Hash hasher; + Slot value = 7; + auto* fn = hash_policy_traits::get_hash_slot_fn(); + EXPECT_EQ(fn, PolicyCustomHashFn::get_hash_slot_fn()); + EXPECT_EQ(fn(&hasher, &value), hasher(value)); + EXPECT_EQ(apply_called_count, 0); +} + +} // namespace +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/internal/hashtable_debug.h b/absl/container/internal/hashtable_debug.h new file mode 100644 index 0000000..c79c1a9 --- /dev/null +++ b/absl/container/internal/hashtable_debug.h @@ -0,0 +1,102 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 library provides APIs to debug the probing behavior of hash tables. +// +// In general, the probing behavior is a black box for users and only the +// side effects can be measured in the form of performance differences. +// These APIs give a glimpse on the actual behavior of the probing algorithms in +// these hashtables given a specified hash function and a set of elements. +// +// The probe count distribution can be used to assess the quality of the hash +// function for that particular hash table. Note that a hash function that +// performs well in one hash table implementation does not necessarily performs +// well in a different one. +// +// This library supports std::unordered_{set,map}, dense_hash_{set,map} and +// absl::{flat,node,string}_hash_{set,map}. + +#ifndef ABSL_CONTAINER_INTERNAL_HASHTABLE_DEBUG_H_ +#define ABSL_CONTAINER_INTERNAL_HASHTABLE_DEBUG_H_ + +#include +#include +#include +#include + +#include "absl/container/internal/hashtable_debug_hooks.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +// Returns the number of probes required to lookup `key`. Returns 0 for a +// search with no collisions. Higher values mean more hash collisions occurred; +// however, the exact meaning of this number varies according to the container +// type. +template +size_t GetHashtableDebugNumProbes( + const C& c, const typename C::key_type& key) { + return absl::container_internal::hashtable_debug_internal:: + HashtableDebugAccess::GetNumProbes(c, key); +} + +// Gets a histogram of the number of probes for each elements in the container. +// The sum of all the values in the vector is equal to container.size(). +template +std::vector GetHashtableDebugNumProbesHistogram(const C& container) { + std::vector v; + for (auto it = container.begin(); it != container.end(); ++it) { + size_t num_probes = GetHashtableDebugNumProbes( + container, + absl::container_internal::hashtable_debug_internal::GetKey(*it, 0)); + v.resize((std::max)(v.size(), num_probes + 1)); + v[num_probes]++; + } + return v; +} + +struct HashtableDebugProbeSummary { + size_t total_elements; + size_t total_num_probes; + double mean; +}; + +// Gets a summary of the probe count distribution for the elements in the +// container. +template +HashtableDebugProbeSummary GetHashtableDebugProbeSummary(const C& container) { + auto probes = GetHashtableDebugNumProbesHistogram(container); + HashtableDebugProbeSummary summary = {}; + for (size_t i = 0; i < probes.size(); ++i) { + summary.total_elements += probes[i]; + summary.total_num_probes += probes[i] * i; + } + summary.mean = 1.0 * summary.total_num_probes / summary.total_elements; + return summary; +} + +// Returns the number of bytes requested from the allocator by the container +// and not freed. +template +size_t AllocatedByteSize(const C& c) { + return absl::container_internal::hashtable_debug_internal:: + HashtableDebugAccess::AllocatedByteSize(c); +} + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_INTERNAL_HASHTABLE_DEBUG_H_ diff --git a/absl/container/internal/hashtable_debug_hooks.h b/absl/container/internal/hashtable_debug_hooks.h new file mode 100644 index 0000000..3e9ea59 --- /dev/null +++ b/absl/container/internal/hashtable_debug_hooks.h @@ -0,0 +1,85 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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. +// +// Provides the internal API for hashtable_debug.h. + +#ifndef ABSL_CONTAINER_INTERNAL_HASHTABLE_DEBUG_HOOKS_H_ +#define ABSL_CONTAINER_INTERNAL_HASHTABLE_DEBUG_HOOKS_H_ + +#include + +#include +#include +#include + +#include "absl/base/config.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace hashtable_debug_internal { + +// If it is a map, call get<0>(). +using std::get; +template +auto GetKey(const typename T::value_type& pair, int) -> decltype(get<0>(pair)) { + return get<0>(pair); +} + +// If it is not a map, return the value directly. +template +const typename T::key_type& GetKey(const typename T::key_type& key, char) { + return key; +} + +// Containers should specialize this to provide debug information for that +// container. +template +struct HashtableDebugAccess { + // Returns the number of probes required to find `key` in `c`. The "number of + // probes" is a concept that can vary by container. Implementations should + // return 0 when `key` was found in the minimum number of operations and + // should increment the result for each non-trivial operation required to find + // `key`. + // + // The default implementation uses the bucket api from the standard and thus + // works for `std::unordered_*` containers. + static size_t GetNumProbes(const Container& c, + const typename Container::key_type& key) { + if (!c.bucket_count()) return {}; + size_t num_probes = 0; + size_t bucket = c.bucket(key); + for (auto it = c.begin(bucket), e = c.end(bucket);; ++it, ++num_probes) { + if (it == e) return num_probes; + if (c.key_eq()(key, GetKey(*it, 0))) return num_probes; + } + } + + // Returns the number of bytes requested from the allocator by the container + // and not freed. + // + // static size_t AllocatedByteSize(const Container& c); + + // Returns a tight lower bound for AllocatedByteSize(c) where `c` is of type + // `Container` and `c.size()` is equal to `num_elements`. + // + // static size_t LowerBoundAllocatedByteSize(size_t num_elements); +}; + +} // namespace hashtable_debug_internal +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_INTERNAL_HASHTABLE_DEBUG_HOOKS_H_ diff --git a/absl/container/internal/hashtablez_sampler.cc b/absl/container/internal/hashtablez_sampler.cc new file mode 100644 index 0000000..fd21d96 --- /dev/null +++ b/absl/container/internal/hashtablez_sampler.cc @@ -0,0 +1,300 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/internal/hashtablez_sampler.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "absl/base/attributes.h" +#include "absl/base/config.h" +#include "absl/base/internal/per_thread_tls.h" +#include "absl/base/internal/raw_logging.h" +#include "absl/base/macros.h" +#include "absl/base/no_destructor.h" +#include "absl/base/optimization.h" +#include "absl/debugging/stacktrace.h" +#include "absl/memory/memory.h" +#include "absl/profiling/internal/exponential_biased.h" +#include "absl/profiling/internal/sample_recorder.h" +#include "absl/synchronization/mutex.h" +#include "absl/time/clock.h" +#include "absl/utility/utility.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +#ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL +constexpr int HashtablezInfo::kMaxStackDepth; +#endif + +namespace { +ABSL_CONST_INIT std::atomic g_hashtablez_enabled{ + false +}; +ABSL_CONST_INIT std::atomic g_hashtablez_sample_parameter{1 << 10}; +std::atomic g_hashtablez_config_listener{nullptr}; + +#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) +ABSL_PER_THREAD_TLS_KEYWORD absl::profiling_internal::ExponentialBiased + g_exponential_biased_generator; +#endif + +void TriggerHashtablezConfigListener() { + auto* listener = g_hashtablez_config_listener.load(std::memory_order_acquire); + if (listener != nullptr) listener(); +} + +} // namespace + +#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) +ABSL_PER_THREAD_TLS_KEYWORD SamplingState global_next_sample = {0, 0}; +#endif // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) + +HashtablezSampler& GlobalHashtablezSampler() { + static absl::NoDestructor sampler; + return *sampler; +} + +HashtablezInfo::HashtablezInfo() = default; +HashtablezInfo::~HashtablezInfo() = default; + +void HashtablezInfo::PrepareForSampling(int64_t stride, + size_t inline_element_size_value, + size_t key_size_value, + size_t value_size_value, + uint16_t soo_capacity_value) { + capacity.store(0, std::memory_order_relaxed); + size.store(0, std::memory_order_relaxed); + num_erases.store(0, std::memory_order_relaxed); + num_rehashes.store(0, std::memory_order_relaxed); + max_probe_length.store(0, std::memory_order_relaxed); + total_probe_length.store(0, std::memory_order_relaxed); + hashes_bitwise_or.store(0, std::memory_order_relaxed); + hashes_bitwise_and.store(~size_t{}, std::memory_order_relaxed); + hashes_bitwise_xor.store(0, std::memory_order_relaxed); + max_reserve.store(0, std::memory_order_relaxed); + + create_time = absl::Now(); + weight = stride; + // The inliner makes hardcoded skip_count difficult (especially when combined + // with LTO). We use the ability to exclude stacks by regex when encoding + // instead. + depth = absl::GetStackTrace(stack, HashtablezInfo::kMaxStackDepth, + /* skip_count= */ 0); + inline_element_size = inline_element_size_value; + key_size = key_size_value; + value_size = value_size_value; + soo_capacity = soo_capacity_value; +} + +static bool ShouldForceSampling() { + enum ForceState { + kDontForce, + kForce, + kUninitialized + }; + ABSL_CONST_INIT static std::atomic global_state{ + kUninitialized}; + ForceState state = global_state.load(std::memory_order_relaxed); + if (ABSL_PREDICT_TRUE(state == kDontForce)) return false; + + if (state == kUninitialized) { + state = ABSL_INTERNAL_C_SYMBOL(AbslContainerInternalSampleEverything)() + ? kForce + : kDontForce; + global_state.store(state, std::memory_order_relaxed); + } + return state == kForce; +} + +HashtablezInfo* SampleSlow(SamplingState& next_sample, + size_t inline_element_size, size_t key_size, + size_t value_size, uint16_t soo_capacity) { + if (ABSL_PREDICT_FALSE(ShouldForceSampling())) { + next_sample.next_sample = 1; + const int64_t old_stride = exchange(next_sample.sample_stride, 1); + HashtablezInfo* result = GlobalHashtablezSampler().Register( + old_stride, inline_element_size, key_size, value_size, soo_capacity); + return result; + } + +#if !defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) + next_sample = { + std::numeric_limits::max(), + std::numeric_limits::max(), + }; + return nullptr; +#else + bool first = next_sample.next_sample < 0; + + const int64_t next_stride = g_exponential_biased_generator.GetStride( + g_hashtablez_sample_parameter.load(std::memory_order_relaxed)); + + next_sample.next_sample = next_stride; + const int64_t old_stride = exchange(next_sample.sample_stride, next_stride); + // Small values of interval are equivalent to just sampling next time. + ABSL_ASSERT(next_stride >= 1); + + // g_hashtablez_enabled can be dynamically flipped, we need to set a threshold + // low enough that we will start sampling in a reasonable time, so we just use + // the default sampling rate. + if (!g_hashtablez_enabled.load(std::memory_order_relaxed)) return nullptr; + + // We will only be negative on our first count, so we should just retry in + // that case. + if (first) { + if (ABSL_PREDICT_TRUE(--next_sample.next_sample > 0)) return nullptr; + return SampleSlow(next_sample, inline_element_size, key_size, value_size, + soo_capacity); + } + + return GlobalHashtablezSampler().Register(old_stride, inline_element_size, + key_size, value_size, soo_capacity); +#endif +} + +void UnsampleSlow(HashtablezInfo* info) { + GlobalHashtablezSampler().Unregister(info); +} + +void RecordRehashSlow(HashtablezInfo* info, size_t total_probe_length) { +#ifdef ABSL_INTERNAL_HAVE_SSE2 + total_probe_length /= 16; +#else + total_probe_length /= 8; +#endif + info->total_probe_length.store(total_probe_length, std::memory_order_relaxed); + info->num_erases.store(0, std::memory_order_relaxed); + // There is only one concurrent writer, so `load` then `store` is sufficient + // instead of using `fetch_add`. + info->num_rehashes.store( + 1 + info->num_rehashes.load(std::memory_order_relaxed), + std::memory_order_relaxed); +} + +void RecordReservationSlow(HashtablezInfo* info, size_t target_capacity) { + info->max_reserve.store( + (std::max)(info->max_reserve.load(std::memory_order_relaxed), + target_capacity), + std::memory_order_relaxed); +} + +void RecordClearedReservationSlow(HashtablezInfo* info) { + info->max_reserve.store(0, std::memory_order_relaxed); +} + +void RecordStorageChangedSlow(HashtablezInfo* info, size_t size, + size_t capacity) { + info->size.store(size, std::memory_order_relaxed); + info->capacity.store(capacity, std::memory_order_relaxed); + if (size == 0) { + // This is a clear, reset the total/num_erases too. + info->total_probe_length.store(0, std::memory_order_relaxed); + info->num_erases.store(0, std::memory_order_relaxed); + } +} + +void RecordInsertSlow(HashtablezInfo* info, size_t hash, + size_t distance_from_desired) { + // SwissTables probe in groups of 16, so scale this to count items probes and + // not offset from desired. + size_t probe_length = distance_from_desired; +#ifdef ABSL_INTERNAL_HAVE_SSE2 + probe_length /= 16; +#else + probe_length /= 8; +#endif + + info->hashes_bitwise_and.fetch_and(hash, std::memory_order_relaxed); + info->hashes_bitwise_or.fetch_or(hash, std::memory_order_relaxed); + info->hashes_bitwise_xor.fetch_xor(hash, std::memory_order_relaxed); + info->max_probe_length.store( + std::max(info->max_probe_length.load(std::memory_order_relaxed), + probe_length), + std::memory_order_relaxed); + info->total_probe_length.fetch_add(probe_length, std::memory_order_relaxed); + info->size.fetch_add(1, std::memory_order_relaxed); +} + +void RecordEraseSlow(HashtablezInfo* info) { + info->size.fetch_sub(1, std::memory_order_relaxed); + // There is only one concurrent writer, so `load` then `store` is sufficient + // instead of using `fetch_add`. + info->num_erases.store(1 + info->num_erases.load(std::memory_order_relaxed), + std::memory_order_relaxed); +} + +void SetHashtablezConfigListener(HashtablezConfigListener l) { + g_hashtablez_config_listener.store(l, std::memory_order_release); +} + +bool IsHashtablezEnabled() { + return g_hashtablez_enabled.load(std::memory_order_acquire); +} + +void SetHashtablezEnabled(bool enabled) { + SetHashtablezEnabledInternal(enabled); + TriggerHashtablezConfigListener(); +} + +void SetHashtablezEnabledInternal(bool enabled) { + g_hashtablez_enabled.store(enabled, std::memory_order_release); +} + +int32_t GetHashtablezSampleParameter() { + return g_hashtablez_sample_parameter.load(std::memory_order_acquire); +} + +void SetHashtablezSampleParameter(int32_t rate) { + SetHashtablezSampleParameterInternal(rate); + TriggerHashtablezConfigListener(); +} + +void SetHashtablezSampleParameterInternal(int32_t rate) { + if (rate > 0) { + g_hashtablez_sample_parameter.store(rate, std::memory_order_release); + } else { + ABSL_RAW_LOG(ERROR, "Invalid hashtablez sample rate: %lld", + static_cast(rate)); // NOLINT(runtime/int) + } +} + +size_t GetHashtablezMaxSamples() { + return GlobalHashtablezSampler().GetMaxSamples(); +} + +void SetHashtablezMaxSamples(size_t max) { + SetHashtablezMaxSamplesInternal(max); + TriggerHashtablezConfigListener(); +} + +void SetHashtablezMaxSamplesInternal(size_t max) { + if (max > 0) { + GlobalHashtablezSampler().SetMaxSamples(max); + } else { + ABSL_RAW_LOG(ERROR, "Invalid hashtablez max samples: 0"); + } +} + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/internal/hashtablez_sampler.h b/absl/container/internal/hashtablez_sampler.h new file mode 100644 index 0000000..d74acf8 --- /dev/null +++ b/absl/container/internal/hashtablez_sampler.h @@ -0,0 +1,275 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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. +// +// ----------------------------------------------------------------------------- +// File: hashtablez_sampler.h +// ----------------------------------------------------------------------------- +// +// This header file defines the API for a low level library to sample hashtables +// and collect runtime statistics about them. +// +// `HashtablezSampler` controls the lifecycle of `HashtablezInfo` objects which +// store information about a single sample. +// +// `Record*` methods store information into samples. +// `Sample()` and `Unsample()` make use of a single global sampler with +// properties controlled by the flags hashtablez_enabled, +// hashtablez_sample_rate, and hashtablez_max_samples. +// +// WARNING +// +// Using this sampling API may cause sampled Swiss tables to use the global +// allocator (operator `new`) in addition to any custom allocator. If you +// are using a table in an unusual circumstance where allocation or calling a +// linux syscall is unacceptable, this could interfere. +// +// This utility is internal-only. Use at your own risk. + +#ifndef ABSL_CONTAINER_INTERNAL_HASHTABLEZ_SAMPLER_H_ +#define ABSL_CONTAINER_INTERNAL_HASHTABLEZ_SAMPLER_H_ + +#include +#include +#include +#include +#include +#include + +#include "absl/base/attributes.h" +#include "absl/base/config.h" +#include "absl/base/internal/per_thread_tls.h" +#include "absl/base/optimization.h" +#include "absl/base/thread_annotations.h" +#include "absl/profiling/internal/sample_recorder.h" +#include "absl/synchronization/mutex.h" +#include "absl/time/time.h" +#include "absl/utility/utility.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +// Stores information about a sampled hashtable. All mutations to this *must* +// be made through `Record*` functions below. All reads from this *must* only +// occur in the callback to `HashtablezSampler::Iterate`. +struct HashtablezInfo : public profiling_internal::Sample { + // Constructs the object but does not fill in any fields. + HashtablezInfo(); + ~HashtablezInfo(); + HashtablezInfo(const HashtablezInfo&) = delete; + HashtablezInfo& operator=(const HashtablezInfo&) = delete; + + // Puts the object into a clean state, fills in the logically `const` members, + // blocking for any readers that are currently sampling the object. + void PrepareForSampling(int64_t stride, size_t inline_element_size_value, + size_t key_size, size_t value_size, + uint16_t soo_capacity_value) + ABSL_EXCLUSIVE_LOCKS_REQUIRED(init_mu); + + // These fields are mutated by the various Record* APIs and need to be + // thread-safe. + std::atomic capacity; + std::atomic size; + std::atomic num_erases; + std::atomic num_rehashes; + std::atomic max_probe_length; + std::atomic total_probe_length; + std::atomic hashes_bitwise_or; + std::atomic hashes_bitwise_and; + std::atomic hashes_bitwise_xor; + std::atomic max_reserve; + + // All of the fields below are set by `PrepareForSampling`, they must not be + // mutated in `Record*` functions. They are logically `const` in that sense. + // These are guarded by init_mu, but that is not externalized to clients, + // which can read them only during `SampleRecorder::Iterate` which will hold + // the lock. + static constexpr int kMaxStackDepth = 64; + absl::Time create_time; + int32_t depth; + // The SOO capacity for this table in elements (not bytes). Note that sampled + // tables are never SOO because we need to store the infoz handle on the heap. + // Tables that would be SOO if not sampled should have: soo_capacity > 0 && + // size <= soo_capacity && max_reserve <= soo_capacity. + uint16_t soo_capacity; + void* stack[kMaxStackDepth]; + size_t inline_element_size; // How big is the slot in bytes? + size_t key_size; // sizeof(key_type) + size_t value_size; // sizeof(value_type) +}; + +void RecordRehashSlow(HashtablezInfo* info, size_t total_probe_length); + +void RecordReservationSlow(HashtablezInfo* info, size_t target_capacity); + +void RecordClearedReservationSlow(HashtablezInfo* info); + +void RecordStorageChangedSlow(HashtablezInfo* info, size_t size, + size_t capacity); + +void RecordInsertSlow(HashtablezInfo* info, size_t hash, + size_t distance_from_desired); + +void RecordEraseSlow(HashtablezInfo* info); + +struct SamplingState { + int64_t next_sample; + // When we make a sampling decision, we record that distance so we can weight + // each sample. + int64_t sample_stride; +}; + +HashtablezInfo* SampleSlow(SamplingState& next_sample, + size_t inline_element_size, size_t key_size, + size_t value_size, uint16_t soo_capacity); +void UnsampleSlow(HashtablezInfo* info); + +#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) +#error ABSL_INTERNAL_HASHTABLEZ_SAMPLE cannot be directly set +#endif // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) + +#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) +class HashtablezInfoHandle { + public: + explicit HashtablezInfoHandle() : info_(nullptr) {} + explicit HashtablezInfoHandle(HashtablezInfo* info) : info_(info) {} + + // We do not have a destructor. Caller is responsible for calling Unregister + // before destroying the handle. + void Unregister() { + if (ABSL_PREDICT_TRUE(info_ == nullptr)) return; + UnsampleSlow(info_); + } + + inline bool IsSampled() const { return ABSL_PREDICT_FALSE(info_ != nullptr); } + + inline void RecordStorageChanged(size_t size, size_t capacity) { + if (ABSL_PREDICT_TRUE(info_ == nullptr)) return; + RecordStorageChangedSlow(info_, size, capacity); + } + + inline void RecordRehash(size_t total_probe_length) { + if (ABSL_PREDICT_TRUE(info_ == nullptr)) return; + RecordRehashSlow(info_, total_probe_length); + } + + inline void RecordReservation(size_t target_capacity) { + if (ABSL_PREDICT_TRUE(info_ == nullptr)) return; + RecordReservationSlow(info_, target_capacity); + } + + inline void RecordClearedReservation() { + if (ABSL_PREDICT_TRUE(info_ == nullptr)) return; + RecordClearedReservationSlow(info_); + } + + inline void RecordInsert(size_t hash, size_t distance_from_desired) { + if (ABSL_PREDICT_TRUE(info_ == nullptr)) return; + RecordInsertSlow(info_, hash, distance_from_desired); + } + + inline void RecordErase() { + if (ABSL_PREDICT_TRUE(info_ == nullptr)) return; + RecordEraseSlow(info_); + } + + friend inline void swap(HashtablezInfoHandle& lhs, + HashtablezInfoHandle& rhs) { + std::swap(lhs.info_, rhs.info_); + } + + private: + friend class HashtablezInfoHandlePeer; + HashtablezInfo* info_; +}; +#else +// Ensure that when Hashtablez is turned off at compile time, HashtablezInfo can +// be removed by the linker, in order to reduce the binary size. +class HashtablezInfoHandle { + public: + explicit HashtablezInfoHandle() = default; + explicit HashtablezInfoHandle(std::nullptr_t) {} + + inline void Unregister() {} + inline bool IsSampled() const { return false; } + inline void RecordStorageChanged(size_t /*size*/, size_t /*capacity*/) {} + inline void RecordRehash(size_t /*total_probe_length*/) {} + inline void RecordReservation(size_t /*target_capacity*/) {} + inline void RecordClearedReservation() {} + inline void RecordInsert(size_t /*hash*/, size_t /*distance_from_desired*/) {} + inline void RecordErase() {} + + friend inline void swap(HashtablezInfoHandle& /*lhs*/, + HashtablezInfoHandle& /*rhs*/) {} +}; +#endif // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) + +#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) +extern ABSL_PER_THREAD_TLS_KEYWORD SamplingState global_next_sample; +#endif // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) + +// Returns a sampling handle. +inline HashtablezInfoHandle Sample( + ABSL_ATTRIBUTE_UNUSED size_t inline_element_size, + ABSL_ATTRIBUTE_UNUSED size_t key_size, + ABSL_ATTRIBUTE_UNUSED size_t value_size, + ABSL_ATTRIBUTE_UNUSED uint16_t soo_capacity) { +#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) + if (ABSL_PREDICT_TRUE(--global_next_sample.next_sample > 0)) { + return HashtablezInfoHandle(nullptr); + } + return HashtablezInfoHandle(SampleSlow(global_next_sample, + inline_element_size, key_size, + value_size, soo_capacity)); +#else + return HashtablezInfoHandle(nullptr); +#endif // !ABSL_PER_THREAD_TLS +} + +using HashtablezSampler = + ::absl::profiling_internal::SampleRecorder; + +// Returns a global Sampler. +HashtablezSampler& GlobalHashtablezSampler(); + +using HashtablezConfigListener = void (*)(); +void SetHashtablezConfigListener(HashtablezConfigListener l); + +// Enables or disables sampling for Swiss tables. +bool IsHashtablezEnabled(); +void SetHashtablezEnabled(bool enabled); +void SetHashtablezEnabledInternal(bool enabled); + +// Sets the rate at which Swiss tables will be sampled. +int32_t GetHashtablezSampleParameter(); +void SetHashtablezSampleParameter(int32_t rate); +void SetHashtablezSampleParameterInternal(int32_t rate); + +// Sets a soft max for the number of samples that will be kept. +size_t GetHashtablezMaxSamples(); +void SetHashtablezMaxSamples(size_t max); +void SetHashtablezMaxSamplesInternal(size_t max); + +// Configuration override. +// This allows process-wide sampling without depending on order of +// initialization of static storage duration objects. +// The definition of this constant is weak, which allows us to inject a +// different value for it at link time. +extern "C" bool ABSL_INTERNAL_C_SYMBOL(AbslContainerInternalSampleEverything)(); + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_INTERNAL_HASHTABLEZ_SAMPLER_H_ diff --git a/absl/container/internal/hashtablez_sampler_force_weak_definition.cc b/absl/container/internal/hashtablez_sampler_force_weak_definition.cc new file mode 100644 index 0000000..ed35a7e --- /dev/null +++ b/absl/container/internal/hashtablez_sampler_force_weak_definition.cc @@ -0,0 +1,31 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/internal/hashtablez_sampler.h" + +#include "absl/base/attributes.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +// See hashtablez_sampler.h for details. +extern "C" ABSL_ATTRIBUTE_WEAK bool ABSL_INTERNAL_C_SYMBOL( + AbslContainerInternalSampleEverything)() { + return false; +} + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/internal/hashtablez_sampler_test.cc b/absl/container/internal/hashtablez_sampler_test.cc new file mode 100644 index 0000000..24d3bc4 --- /dev/null +++ b/absl/container/internal/hashtablez_sampler_test.cc @@ -0,0 +1,518 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/internal/hashtablez_sampler.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/attributes.h" +#include "absl/base/config.h" +#include "absl/profiling/internal/sample_recorder.h" +#include "absl/synchronization/blocking_counter.h" +#include "absl/synchronization/internal/thread_pool.h" +#include "absl/synchronization/mutex.h" +#include "absl/synchronization/notification.h" +#include "absl/time/clock.h" +#include "absl/time/time.h" + +#ifdef ABSL_INTERNAL_HAVE_SSE2 +constexpr int kProbeLength = 16; +#else +constexpr int kProbeLength = 8; +#endif + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) +class HashtablezInfoHandlePeer { + public: + static HashtablezInfo* GetInfo(HashtablezInfoHandle* h) { return h->info_; } +}; +#else +class HashtablezInfoHandlePeer { + public: + static HashtablezInfo* GetInfo(HashtablezInfoHandle*) { return nullptr; } +}; +#endif // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) + +namespace { +using ::absl::synchronization_internal::ThreadPool; +using ::testing::IsEmpty; +using ::testing::UnorderedElementsAre; + +std::vector GetSizes(HashtablezSampler* s) { + std::vector res; + s->Iterate([&](const HashtablezInfo& info) { + res.push_back(info.size.load(std::memory_order_acquire)); + }); + return res; +} + +HashtablezInfo* Register(HashtablezSampler* s, size_t size) { + const int64_t test_stride = 123; + const size_t test_element_size = 17; + const size_t test_key_size = 3; + const size_t test_value_size = 5; + auto* info = + s->Register(test_stride, test_element_size, /*key_size=*/test_key_size, + /*value_size=*/test_value_size, /*soo_capacity=*/0); + assert(info != nullptr); + info->size.store(size); + return info; +} + +TEST(HashtablezInfoTest, PrepareForSampling) { + absl::Time test_start = absl::Now(); + const int64_t test_stride = 123; + const size_t test_element_size = 17; + const size_t test_key_size = 15; + const size_t test_value_size = 13; + + HashtablezInfo info; + absl::MutexLock l(&info.init_mu); + info.PrepareForSampling(test_stride, test_element_size, + /*key_size=*/test_key_size, + /*value_size=*/test_value_size, + /*soo_capacity_value=*/1); + + EXPECT_EQ(info.capacity.load(), 0); + EXPECT_EQ(info.size.load(), 0); + EXPECT_EQ(info.num_erases.load(), 0); + EXPECT_EQ(info.num_rehashes.load(), 0); + EXPECT_EQ(info.max_probe_length.load(), 0); + EXPECT_EQ(info.total_probe_length.load(), 0); + EXPECT_EQ(info.hashes_bitwise_or.load(), 0); + EXPECT_EQ(info.hashes_bitwise_and.load(), ~size_t{}); + EXPECT_EQ(info.hashes_bitwise_xor.load(), 0); + EXPECT_EQ(info.max_reserve.load(), 0); + EXPECT_GE(info.create_time, test_start); + EXPECT_EQ(info.weight, test_stride); + EXPECT_EQ(info.inline_element_size, test_element_size); + EXPECT_EQ(info.key_size, test_key_size); + EXPECT_EQ(info.value_size, test_value_size); + EXPECT_EQ(info.soo_capacity, 1); + + info.capacity.store(1, std::memory_order_relaxed); + info.size.store(1, std::memory_order_relaxed); + info.num_erases.store(1, std::memory_order_relaxed); + info.max_probe_length.store(1, std::memory_order_relaxed); + info.total_probe_length.store(1, std::memory_order_relaxed); + info.hashes_bitwise_or.store(1, std::memory_order_relaxed); + info.hashes_bitwise_and.store(1, std::memory_order_relaxed); + info.hashes_bitwise_xor.store(1, std::memory_order_relaxed); + info.max_reserve.store(1, std::memory_order_relaxed); + info.create_time = test_start - absl::Hours(20); + + info.PrepareForSampling(test_stride * 2, test_element_size, + /*key_size=*/test_key_size, + /*value_size=*/test_value_size, + /*soo_capacity_value=*/0); + EXPECT_EQ(info.capacity.load(), 0); + EXPECT_EQ(info.size.load(), 0); + EXPECT_EQ(info.num_erases.load(), 0); + EXPECT_EQ(info.num_rehashes.load(), 0); + EXPECT_EQ(info.max_probe_length.load(), 0); + EXPECT_EQ(info.total_probe_length.load(), 0); + EXPECT_EQ(info.hashes_bitwise_or.load(), 0); + EXPECT_EQ(info.hashes_bitwise_and.load(), ~size_t{}); + EXPECT_EQ(info.hashes_bitwise_xor.load(), 0); + EXPECT_EQ(info.max_reserve.load(), 0); + EXPECT_EQ(info.weight, 2 * test_stride); + EXPECT_EQ(info.inline_element_size, test_element_size); + EXPECT_EQ(info.key_size, test_key_size); + EXPECT_EQ(info.value_size, test_value_size); + EXPECT_GE(info.create_time, test_start); + EXPECT_EQ(info.soo_capacity, 0); +} + +TEST(HashtablezInfoTest, RecordStorageChanged) { + HashtablezInfo info; + absl::MutexLock l(&info.init_mu); + const int64_t test_stride = 21; + const size_t test_element_size = 19; + const size_t test_key_size = 17; + const size_t test_value_size = 15; + + info.PrepareForSampling(test_stride, test_element_size, + /*key_size=*/test_key_size, + /*value_size=*/test_value_size, + /*soo_capacity_value=*/0); + RecordStorageChangedSlow(&info, 17, 47); + EXPECT_EQ(info.size.load(), 17); + EXPECT_EQ(info.capacity.load(), 47); + RecordStorageChangedSlow(&info, 20, 20); + EXPECT_EQ(info.size.load(), 20); + EXPECT_EQ(info.capacity.load(), 20); +} + +TEST(HashtablezInfoTest, RecordInsert) { + HashtablezInfo info; + absl::MutexLock l(&info.init_mu); + const int64_t test_stride = 25; + const size_t test_element_size = 23; + const size_t test_key_size = 21; + const size_t test_value_size = 19; + + info.PrepareForSampling(test_stride, test_element_size, + /*key_size=*/test_key_size, + /*value_size=*/test_value_size, + /*soo_capacity_value=*/0); + EXPECT_EQ(info.max_probe_length.load(), 0); + RecordInsertSlow(&info, 0x0000FF00, 6 * kProbeLength); + EXPECT_EQ(info.max_probe_length.load(), 6); + EXPECT_EQ(info.hashes_bitwise_and.load(), 0x0000FF00); + EXPECT_EQ(info.hashes_bitwise_or.load(), 0x0000FF00); + EXPECT_EQ(info.hashes_bitwise_xor.load(), 0x0000FF00); + RecordInsertSlow(&info, 0x000FF000, 4 * kProbeLength); + EXPECT_EQ(info.max_probe_length.load(), 6); + EXPECT_EQ(info.hashes_bitwise_and.load(), 0x0000F000); + EXPECT_EQ(info.hashes_bitwise_or.load(), 0x000FFF00); + EXPECT_EQ(info.hashes_bitwise_xor.load(), 0x000F0F00); + RecordInsertSlow(&info, 0x00FF0000, 12 * kProbeLength); + EXPECT_EQ(info.max_probe_length.load(), 12); + EXPECT_EQ(info.hashes_bitwise_and.load(), 0x00000000); + EXPECT_EQ(info.hashes_bitwise_or.load(), 0x00FFFF00); + EXPECT_EQ(info.hashes_bitwise_xor.load(), 0x00F00F00); +} + +TEST(HashtablezInfoTest, RecordErase) { + const int64_t test_stride = 31; + const size_t test_element_size = 29; + const size_t test_key_size = 27; + const size_t test_value_size = 25; + + HashtablezInfo info; + absl::MutexLock l(&info.init_mu); + info.PrepareForSampling(test_stride, test_element_size, + /*key_size=*/test_key_size, + /*value_size=*/test_value_size, + /*soo_capacity_value=*/1); + EXPECT_EQ(info.num_erases.load(), 0); + EXPECT_EQ(info.size.load(), 0); + RecordInsertSlow(&info, 0x0000FF00, 6 * kProbeLength); + EXPECT_EQ(info.size.load(), 1); + RecordEraseSlow(&info); + EXPECT_EQ(info.size.load(), 0); + EXPECT_EQ(info.num_erases.load(), 1); + EXPECT_EQ(info.inline_element_size, test_element_size); + EXPECT_EQ(info.key_size, test_key_size); + EXPECT_EQ(info.value_size, test_value_size); + EXPECT_EQ(info.soo_capacity, 1); +} + +TEST(HashtablezInfoTest, RecordRehash) { + const int64_t test_stride = 33; + const size_t test_element_size = 31; + const size_t test_key_size = 29; + const size_t test_value_size = 27; + HashtablezInfo info; + absl::MutexLock l(&info.init_mu); + info.PrepareForSampling(test_stride, test_element_size, + /*key_size=*/test_key_size, + /*value_size=*/test_value_size, + + /*soo_capacity_value=*/0); + RecordInsertSlow(&info, 0x1, 0); + RecordInsertSlow(&info, 0x2, kProbeLength); + RecordInsertSlow(&info, 0x4, kProbeLength); + RecordInsertSlow(&info, 0x8, 2 * kProbeLength); + EXPECT_EQ(info.size.load(), 4); + EXPECT_EQ(info.total_probe_length.load(), 4); + + RecordEraseSlow(&info); + RecordEraseSlow(&info); + EXPECT_EQ(info.size.load(), 2); + EXPECT_EQ(info.total_probe_length.load(), 4); + EXPECT_EQ(info.num_erases.load(), 2); + + RecordRehashSlow(&info, 3 * kProbeLength); + EXPECT_EQ(info.size.load(), 2); + EXPECT_EQ(info.total_probe_length.load(), 3); + EXPECT_EQ(info.num_erases.load(), 0); + EXPECT_EQ(info.num_rehashes.load(), 1); + EXPECT_EQ(info.inline_element_size, test_element_size); + EXPECT_EQ(info.key_size, test_key_size); + EXPECT_EQ(info.value_size, test_value_size); + EXPECT_EQ(info.soo_capacity, 0); +} + +TEST(HashtablezInfoTest, RecordReservation) { + HashtablezInfo info; + absl::MutexLock l(&info.init_mu); + const int64_t test_stride = 35; + const size_t test_element_size = 33; + const size_t test_key_size = 31; + const size_t test_value_size = 29; + + info.PrepareForSampling(test_stride, test_element_size, + /*key_size=*/test_key_size, + /*value_size=*/test_value_size, + + /*soo_capacity_value=*/0); + RecordReservationSlow(&info, 3); + EXPECT_EQ(info.max_reserve.load(), 3); + + RecordReservationSlow(&info, 2); + // High watermark does not change + EXPECT_EQ(info.max_reserve.load(), 3); + + RecordReservationSlow(&info, 10); + // High watermark does change + EXPECT_EQ(info.max_reserve.load(), 10); +} + +#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE) +TEST(HashtablezSamplerTest, SmallSampleParameter) { + const size_t test_element_size = 31; + const size_t test_key_size = 33; + const size_t test_value_size = 35; + + SetHashtablezEnabled(true); + SetHashtablezSampleParameter(100); + + for (int i = 0; i < 1000; ++i) { + SamplingState next_sample = {0, 0}; + HashtablezInfo* sample = + SampleSlow(next_sample, test_element_size, + /*key_size=*/test_key_size, /*value_size=*/test_value_size, + + /*soo_capacity=*/0); + EXPECT_GT(next_sample.next_sample, 0); + EXPECT_EQ(next_sample.next_sample, next_sample.sample_stride); + EXPECT_NE(sample, nullptr); + UnsampleSlow(sample); + } +} + +TEST(HashtablezSamplerTest, LargeSampleParameter) { + const size_t test_element_size = 31; + const size_t test_key_size = 33; + const size_t test_value_size = 35; + SetHashtablezEnabled(true); + SetHashtablezSampleParameter(std::numeric_limits::max()); + + for (int i = 0; i < 1000; ++i) { + SamplingState next_sample = {0, 0}; + HashtablezInfo* sample = + SampleSlow(next_sample, test_element_size, + /*key_size=*/test_key_size, /*value_size=*/test_value_size, + /*soo_capacity=*/0); + EXPECT_GT(next_sample.next_sample, 0); + EXPECT_EQ(next_sample.next_sample, next_sample.sample_stride); + EXPECT_NE(sample, nullptr); + UnsampleSlow(sample); + } +} + +TEST(HashtablezSamplerTest, Sample) { + const size_t test_element_size = 31; + const size_t test_key_size = 33; + const size_t test_value_size = 35; + SetHashtablezEnabled(true); + SetHashtablezSampleParameter(100); + int64_t num_sampled = 0; + int64_t total = 0; + double sample_rate = 0.0; + for (int i = 0; i < 1000000; ++i) { + HashtablezInfoHandle h = + Sample(test_element_size, + /*key_size=*/test_key_size, /*value_size=*/test_value_size, + + /*soo_capacity=*/0); + + ++total; + if (h.IsSampled()) { + ++num_sampled; + } + sample_rate = static_cast(num_sampled) / total; + if (0.005 < sample_rate && sample_rate < 0.015) break; + } + EXPECT_NEAR(sample_rate, 0.01, 0.005); +} + +TEST(HashtablezSamplerTest, Handle) { + auto& sampler = GlobalHashtablezSampler(); + const int64_t test_stride = 41; + const size_t test_element_size = 39; + const size_t test_key_size = 37; + const size_t test_value_size = 35; + HashtablezInfoHandle h(sampler.Register(test_stride, test_element_size, + /*key_size=*/test_key_size, + /*value_size=*/test_value_size, + /*soo_capacity=*/0)); + auto* info = HashtablezInfoHandlePeer::GetInfo(&h); + info->hashes_bitwise_and.store(0x12345678, std::memory_order_relaxed); + + bool found = false; + sampler.Iterate([&](const HashtablezInfo& h) { + if (&h == info) { + EXPECT_EQ(h.weight, test_stride); + EXPECT_EQ(h.hashes_bitwise_and.load(), 0x12345678); + found = true; + } + }); + EXPECT_TRUE(found); + + h.Unregister(); + h = HashtablezInfoHandle(); + found = false; + sampler.Iterate([&](const HashtablezInfo& h) { + if (&h == info) { + // this will only happen if some other thread has resurrected the info + // the old handle was using. + if (h.hashes_bitwise_and.load() == 0x12345678) { + found = true; + } + } + }); + EXPECT_FALSE(found); +} +#endif + + +TEST(HashtablezSamplerTest, Registration) { + HashtablezSampler sampler; + auto* info1 = Register(&sampler, 1); + EXPECT_THAT(GetSizes(&sampler), UnorderedElementsAre(1)); + + auto* info2 = Register(&sampler, 2); + EXPECT_THAT(GetSizes(&sampler), UnorderedElementsAre(1, 2)); + info1->size.store(3); + EXPECT_THAT(GetSizes(&sampler), UnorderedElementsAre(3, 2)); + + sampler.Unregister(info1); + sampler.Unregister(info2); +} + +TEST(HashtablezSamplerTest, Unregistration) { + HashtablezSampler sampler; + std::vector infos; + for (size_t i = 0; i < 3; ++i) { + infos.push_back(Register(&sampler, i)); + } + EXPECT_THAT(GetSizes(&sampler), UnorderedElementsAre(0, 1, 2)); + + sampler.Unregister(infos[1]); + EXPECT_THAT(GetSizes(&sampler), UnorderedElementsAre(0, 2)); + + infos.push_back(Register(&sampler, 3)); + infos.push_back(Register(&sampler, 4)); + EXPECT_THAT(GetSizes(&sampler), UnorderedElementsAre(0, 2, 3, 4)); + sampler.Unregister(infos[3]); + EXPECT_THAT(GetSizes(&sampler), UnorderedElementsAre(0, 2, 4)); + + sampler.Unregister(infos[0]); + sampler.Unregister(infos[2]); + sampler.Unregister(infos[4]); + EXPECT_THAT(GetSizes(&sampler), IsEmpty()); +} + +TEST(HashtablezSamplerTest, MultiThreaded) { + HashtablezSampler sampler; + Notification stop; + ThreadPool pool(10); + + for (int i = 0; i < 10; ++i) { + const int64_t sampling_stride = 11 + i % 3; + const size_t elt_size = 10 + i % 2; + const size_t key_size = 12 + i % 4; + const size_t value_size = 13 + i % 5; + pool.Schedule([&sampler, &stop, sampling_stride, elt_size, key_size, + value_size]() { + std::random_device rd; + std::mt19937 gen(rd()); + + std::vector infoz; + while (!stop.HasBeenNotified()) { + if (infoz.empty()) { + infoz.push_back(sampler.Register(sampling_stride, elt_size, + /*key_size=*/key_size, + /*value_size=*/value_size, + /*soo_capacity=*/0)); + } + switch (std::uniform_int_distribution<>(0, 2)(gen)) { + case 0: { + infoz.push_back(sampler.Register(sampling_stride, elt_size, + /*key_size=*/key_size, + /*value_size=*/value_size, + + /*soo_capacity=*/0)); + break; + } + case 1: { + size_t p = + std::uniform_int_distribution<>(0, infoz.size() - 1)(gen); + HashtablezInfo* info = infoz[p]; + infoz[p] = infoz.back(); + infoz.pop_back(); + EXPECT_EQ(info->weight, sampling_stride); + sampler.Unregister(info); + break; + } + case 2: { + absl::Duration oldest = absl::ZeroDuration(); + sampler.Iterate([&](const HashtablezInfo& info) { + oldest = std::max(oldest, absl::Now() - info.create_time); + }); + ASSERT_GE(oldest, absl::ZeroDuration()); + break; + } + } + } + }); + } + // The threads will hammer away. Give it a little bit of time for tsan to + // spot errors. + absl::SleepFor(absl::Seconds(3)); + stop.Notify(); +} + +TEST(HashtablezSamplerTest, Callback) { + HashtablezSampler sampler; + + auto* info1 = Register(&sampler, 1); + auto* info2 = Register(&sampler, 2); + + static const HashtablezInfo* expected; + + auto callback = [](const HashtablezInfo& info) { + // We can't use `info` outside of this callback because the object will be + // disposed as soon as we return from here. + EXPECT_EQ(&info, expected); + }; + + // Set the callback. + EXPECT_EQ(sampler.SetDisposeCallback(callback), nullptr); + expected = info1; + sampler.Unregister(info1); + + // Unset the callback. + EXPECT_EQ(callback, sampler.SetDisposeCallback(nullptr)); + expected = nullptr; // no more calls. + sampler.Unregister(info2); +} + +} // namespace +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/internal/inlined_vector.h b/absl/container/internal/inlined_vector.h new file mode 100644 index 0000000..0bd0a1c --- /dev/null +++ b/absl/container/internal/inlined_vector.h @@ -0,0 +1,1107 @@ +// Copyright 2019 The Abseil Authors. +// +// 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 +// +// https://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 ABSL_CONTAINER_INTERNAL_INLINED_VECTOR_H_ +#define ABSL_CONTAINER_INTERNAL_INLINED_VECTOR_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "absl/base/attributes.h" +#include "absl/base/config.h" +#include "absl/base/internal/identity.h" +#include "absl/base/macros.h" +#include "absl/container/internal/compressed_tuple.h" +#include "absl/memory/memory.h" +#include "absl/meta/type_traits.h" +#include "absl/types/span.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace inlined_vector_internal { + +// GCC does not deal very well with the below code +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Warray-bounds" +#endif + +template +using AllocatorTraits = std::allocator_traits; +template +using ValueType = typename AllocatorTraits::value_type; +template +using SizeType = typename AllocatorTraits::size_type; +template +using Pointer = typename AllocatorTraits::pointer; +template +using ConstPointer = typename AllocatorTraits::const_pointer; +template +using SizeType = typename AllocatorTraits::size_type; +template +using DifferenceType = typename AllocatorTraits::difference_type; +template +using Reference = ValueType&; +template +using ConstReference = const ValueType&; +template +using Iterator = Pointer; +template +using ConstIterator = ConstPointer; +template +using ReverseIterator = typename std::reverse_iterator>; +template +using ConstReverseIterator = typename std::reverse_iterator>; +template +using MoveIterator = typename std::move_iterator>; + +template +using IsAtLeastForwardIterator = std::is_convertible< + typename std::iterator_traits::iterator_category, + std::forward_iterator_tag>; + +template +using IsMoveAssignOk = std::is_move_assignable>; +template +using IsSwapOk = absl::type_traits_internal::IsSwappable>; + +template >::value && + std::is_same>>::value> +struct DestroyAdapter; + +template +struct DestroyAdapter { + static void DestroyElements(A& allocator, Pointer destroy_first, + SizeType destroy_size) { + for (SizeType i = destroy_size; i != 0;) { + --i; + AllocatorTraits::destroy(allocator, destroy_first + i); + } + } +}; + +template +struct DestroyAdapter { + static void DestroyElements(A& allocator, Pointer destroy_first, + SizeType destroy_size) { + static_cast(allocator); + static_cast(destroy_first); + static_cast(destroy_size); + } +}; + +template +struct Allocation { + Pointer data = nullptr; + SizeType capacity = 0; +}; + +template ) > ABSL_INTERNAL_DEFAULT_NEW_ALIGNMENT)> +struct MallocAdapter { + static Allocation Allocate(A& allocator, SizeType requested_capacity) { + return {AllocatorTraits::allocate(allocator, requested_capacity), + requested_capacity}; + } + + static void Deallocate(A& allocator, Pointer pointer, + SizeType capacity) { + AllocatorTraits::deallocate(allocator, pointer, capacity); + } +}; + +template +void ConstructElements(absl::internal::type_identity_t& allocator, + Pointer construct_first, ValueAdapter& values, + SizeType construct_size) { + for (SizeType i = 0; i < construct_size; ++i) { + ABSL_INTERNAL_TRY { values.ConstructNext(allocator, construct_first + i); } + ABSL_INTERNAL_CATCH_ANY { + DestroyAdapter::DestroyElements(allocator, construct_first, i); + ABSL_INTERNAL_RETHROW; + } + } +} + +template +void AssignElements(Pointer assign_first, ValueAdapter& values, + SizeType assign_size) { + for (SizeType i = 0; i < assign_size; ++i) { + values.AssignNext(assign_first + i); + } +} + +template +struct StorageView { + Pointer data; + SizeType size; + SizeType capacity; +}; + +template +class IteratorValueAdapter { + public: + explicit IteratorValueAdapter(const Iterator& it) : it_(it) {} + + void ConstructNext(A& allocator, Pointer construct_at) { + AllocatorTraits::construct(allocator, construct_at, *it_); + ++it_; + } + + void AssignNext(Pointer assign_at) { + *assign_at = *it_; + ++it_; + } + + private: + Iterator it_; +}; + +template +class CopyValueAdapter { + public: + explicit CopyValueAdapter(ConstPointer p) : ptr_(p) {} + + void ConstructNext(A& allocator, Pointer construct_at) { + AllocatorTraits::construct(allocator, construct_at, *ptr_); + } + + void AssignNext(Pointer assign_at) { *assign_at = *ptr_; } + + private: + ConstPointer ptr_; +}; + +template +class DefaultValueAdapter { + public: + explicit DefaultValueAdapter() {} + + void ConstructNext(A& allocator, Pointer construct_at) { + AllocatorTraits::construct(allocator, construct_at); + } + + void AssignNext(Pointer assign_at) { *assign_at = ValueType(); } +}; + +template +class AllocationTransaction { + public: + explicit AllocationTransaction(A& allocator) + : allocator_data_(allocator, nullptr), capacity_(0) {} + + ~AllocationTransaction() { + if (DidAllocate()) { + MallocAdapter::Deallocate(GetAllocator(), GetData(), GetCapacity()); + } + } + + AllocationTransaction(const AllocationTransaction&) = delete; + void operator=(const AllocationTransaction&) = delete; + + A& GetAllocator() { return allocator_data_.template get<0>(); } + Pointer& GetData() { return allocator_data_.template get<1>(); } + SizeType& GetCapacity() { return capacity_; } + + bool DidAllocate() { return GetData() != nullptr; } + + Pointer Allocate(SizeType requested_capacity) { + Allocation result = + MallocAdapter::Allocate(GetAllocator(), requested_capacity); + GetData() = result.data; + GetCapacity() = result.capacity; + return result.data; + } + + ABSL_MUST_USE_RESULT Allocation Release() && { + Allocation result = {GetData(), GetCapacity()}; + Reset(); + return result; + } + + private: + void Reset() { + GetData() = nullptr; + GetCapacity() = 0; + } + + container_internal::CompressedTuple> allocator_data_; + SizeType capacity_; +}; + +template +class ConstructionTransaction { + public: + explicit ConstructionTransaction(A& allocator) + : allocator_data_(allocator, nullptr), size_(0) {} + + ~ConstructionTransaction() { + if (DidConstruct()) { + DestroyAdapter::DestroyElements(GetAllocator(), GetData(), GetSize()); + } + } + + ConstructionTransaction(const ConstructionTransaction&) = delete; + void operator=(const ConstructionTransaction&) = delete; + + A& GetAllocator() { return allocator_data_.template get<0>(); } + Pointer& GetData() { return allocator_data_.template get<1>(); } + SizeType& GetSize() { return size_; } + + bool DidConstruct() { return GetData() != nullptr; } + template + void Construct(Pointer data, ValueAdapter& values, SizeType size) { + ConstructElements(GetAllocator(), data, values, size); + GetData() = data; + GetSize() = size; + } + void Commit() && { + GetData() = nullptr; + GetSize() = 0; + } + + private: + container_internal::CompressedTuple> allocator_data_; + SizeType size_; +}; + +template +class Storage { + public: + struct MemcpyPolicy {}; + struct ElementwiseAssignPolicy {}; + struct ElementwiseSwapPolicy {}; + struct ElementwiseConstructPolicy {}; + + using MoveAssignmentPolicy = absl::conditional_t< + // Fast path: if the value type can be trivially move assigned and + // destroyed, and we know the allocator doesn't do anything fancy, then + // it's safe for us to simply adopt the contents of the storage for + // `other` and remove its own reference to them. It's as if we had + // individually move-assigned each value and then destroyed the original. + absl::conjunction>, + absl::is_trivially_destructible>, + std::is_same>>>::value, + MemcpyPolicy, + // Otherwise we use move assignment if possible. If not, we simulate + // move assignment using move construction. + // + // Note that this is in contrast to e.g. std::vector and std::optional, + // which are themselves not move-assignable when their contained type is + // not. + absl::conditional_t::value, ElementwiseAssignPolicy, + ElementwiseConstructPolicy>>; + + // The policy to be used specifically when swapping inlined elements. + using SwapInlinedElementsPolicy = absl::conditional_t< + // Fast path: if the value type can be trivially relocated, and we + // know the allocator doesn't do anything fancy, then it's safe for us + // to simply swap the bytes in the inline storage. It's as if we had + // relocated the first vector's elements into temporary storage, + // relocated the second's elements into the (now-empty) first's, + // and then relocated from temporary storage into the second. + absl::conjunction>, + std::is_same>>>::value, + MemcpyPolicy, + absl::conditional_t::value, ElementwiseSwapPolicy, + ElementwiseConstructPolicy>>; + + static SizeType NextCapacity(SizeType current_capacity) { + return current_capacity * 2; + } + + static SizeType ComputeCapacity(SizeType current_capacity, + SizeType requested_capacity) { + return (std::max)(NextCapacity(current_capacity), requested_capacity); + } + + // --------------------------------------------------------------------------- + // Storage Constructors and Destructor + // --------------------------------------------------------------------------- + + Storage() : metadata_(A(), /* size and is_allocated */ 0u) {} + + explicit Storage(const A& allocator) + : metadata_(allocator, /* size and is_allocated */ 0u) {} + + ~Storage() { + // Fast path: if we are empty and not allocated, there's nothing to do. + if (GetSizeAndIsAllocated() == 0) { + return; + } + + // Fast path: if no destructors need to be run and we know the allocator + // doesn't do anything fancy, then all we need to do is deallocate (and + // maybe not even that). + if (absl::is_trivially_destructible>::value && + std::is_same>>::value) { + DeallocateIfAllocated(); + return; + } + + DestroyContents(); + } + + // --------------------------------------------------------------------------- + // Storage Member Accessors + // --------------------------------------------------------------------------- + + SizeType& GetSizeAndIsAllocated() { return metadata_.template get<1>(); } + + const SizeType& GetSizeAndIsAllocated() const { + return metadata_.template get<1>(); + } + + SizeType GetSize() const { return GetSizeAndIsAllocated() >> 1; } + + bool GetIsAllocated() const { return GetSizeAndIsAllocated() & 1; } + + Pointer GetAllocatedData() { + // GCC 12 has a false-positive -Wmaybe-uninitialized warning here. +#if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(12, 0) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + return data_.allocated.allocated_data; +#if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(12, 0) +#pragma GCC diagnostic pop +#endif + } + + ConstPointer GetAllocatedData() const { + return data_.allocated.allocated_data; + } + + // ABSL_ATTRIBUTE_NO_SANITIZE_CFI is used because the memory pointed to may be + // uninitialized, a common pattern in allocate()+construct() APIs. + // https://clang.llvm.org/docs/ControlFlowIntegrity.html#bad-cast-checking + // NOTE: When this was written, LLVM documentation did not explicitly + // mention that casting `char*` and using `reinterpret_cast` qualifies + // as a bad cast. + ABSL_ATTRIBUTE_NO_SANITIZE_CFI Pointer GetInlinedData() { + return reinterpret_cast>(data_.inlined.inlined_data); + } + + ABSL_ATTRIBUTE_NO_SANITIZE_CFI ConstPointer GetInlinedData() const { + return reinterpret_cast>(data_.inlined.inlined_data); + } + + SizeType GetAllocatedCapacity() const { + return data_.allocated.allocated_capacity; + } + + SizeType GetInlinedCapacity() const { + return static_cast>(kOptimalInlinedSize); + } + + StorageView MakeStorageView() { + return GetIsAllocated() ? StorageView{GetAllocatedData(), GetSize(), + GetAllocatedCapacity()} + : StorageView{GetInlinedData(), GetSize(), + GetInlinedCapacity()}; + } + + A& GetAllocator() { return metadata_.template get<0>(); } + + const A& GetAllocator() const { return metadata_.template get<0>(); } + + // --------------------------------------------------------------------------- + // Storage Member Mutators + // --------------------------------------------------------------------------- + + ABSL_ATTRIBUTE_NOINLINE void InitFrom(const Storage& other); + + template + void Initialize(ValueAdapter values, SizeType new_size); + + template + void Assign(ValueAdapter values, SizeType new_size); + + template + void Resize(ValueAdapter values, SizeType new_size); + + template + Iterator Insert(ConstIterator pos, ValueAdapter values, + SizeType insert_count); + + template + Reference EmplaceBack(Args&&... args); + + Iterator Erase(ConstIterator from, ConstIterator to); + + void Reserve(SizeType requested_capacity); + + void ShrinkToFit(); + + void Swap(Storage* other_storage_ptr); + + void SetIsAllocated() { + GetSizeAndIsAllocated() |= static_cast>(1); + } + + void UnsetIsAllocated() { + GetSizeAndIsAllocated() &= ((std::numeric_limits>::max)() - 1); + } + + void SetSize(SizeType size) { + GetSizeAndIsAllocated() = + (size << 1) | static_cast>(GetIsAllocated()); + } + + void SetAllocatedSize(SizeType size) { + GetSizeAndIsAllocated() = (size << 1) | static_cast>(1); + } + + void SetInlinedSize(SizeType size) { + GetSizeAndIsAllocated() = size << static_cast>(1); + } + + void AddSize(SizeType count) { + GetSizeAndIsAllocated() += count << static_cast>(1); + } + + void SubtractSize(SizeType count) { + ABSL_HARDENING_ASSERT(count <= GetSize()); + + GetSizeAndIsAllocated() -= count << static_cast>(1); + } + + void SetAllocation(Allocation allocation) { + data_.allocated.allocated_data = allocation.data; + data_.allocated.allocated_capacity = allocation.capacity; + } + + void MemcpyFrom(const Storage& other_storage) { + // Assumption check: it doesn't make sense to memcpy inlined elements unless + // we know the allocator doesn't do anything fancy, and one of the following + // holds: + // + // * The elements are trivially relocatable. + // + // * It's possible to trivially assign the elements and then destroy the + // source. + // + // * It's possible to trivially copy construct/assign the elements. + // + { + using V = ValueType; + ABSL_HARDENING_ASSERT( + other_storage.GetIsAllocated() || + (std::is_same>::value && + ( + // First case above + absl::is_trivially_relocatable::value || + // Second case above + (absl::is_trivially_move_assignable::value && + absl::is_trivially_destructible::value) || + // Third case above + (absl::is_trivially_copy_constructible::value || + absl::is_trivially_copy_assignable::value)))); + } + + GetSizeAndIsAllocated() = other_storage.GetSizeAndIsAllocated(); + data_ = other_storage.data_; + } + + void DeallocateIfAllocated() { + if (GetIsAllocated()) { + MallocAdapter::Deallocate(GetAllocator(), GetAllocatedData(), + GetAllocatedCapacity()); + } + } + + private: + ABSL_ATTRIBUTE_NOINLINE void DestroyContents(); + + using Metadata = container_internal::CompressedTuple>; + + struct Allocated { + Pointer allocated_data; + SizeType allocated_capacity; + }; + + // `kOptimalInlinedSize` is an automatically adjusted inlined capacity of the + // `InlinedVector`. Sometimes, it is possible to increase the capacity (from + // the user requested `N`) without increasing the size of the `InlinedVector`. + static constexpr size_t kOptimalInlinedSize = + (std::max)(N, sizeof(Allocated) / sizeof(ValueType)); + + struct Inlined { + alignas(ValueType) char inlined_data[sizeof( + ValueType[kOptimalInlinedSize])]; + }; + + union Data { + Allocated allocated; + Inlined inlined; + }; + + void SwapN(ElementwiseSwapPolicy, Storage* other, SizeType n); + void SwapN(ElementwiseConstructPolicy, Storage* other, SizeType n); + + void SwapInlinedElements(MemcpyPolicy, Storage* other); + template + void SwapInlinedElements(NotMemcpyPolicy, Storage* other); + + template + ABSL_ATTRIBUTE_NOINLINE Reference EmplaceBackSlow(Args&&... args); + + Metadata metadata_; + Data data_; +}; + +template +void Storage::DestroyContents() { + Pointer data = GetIsAllocated() ? GetAllocatedData() : GetInlinedData(); + DestroyAdapter::DestroyElements(GetAllocator(), data, GetSize()); + DeallocateIfAllocated(); +} + +template +void Storage::InitFrom(const Storage& other) { + const SizeType n = other.GetSize(); + ABSL_HARDENING_ASSERT(n > 0); // Empty sources handled handled in caller. + ConstPointer src; + Pointer dst; + if (!other.GetIsAllocated()) { + dst = GetInlinedData(); + src = other.GetInlinedData(); + } else { + // Because this is only called from the `InlinedVector` constructors, it's + // safe to take on the allocation with size `0`. If `ConstructElements(...)` + // throws, deallocation will be automatically handled by `~Storage()`. + SizeType requested_capacity = ComputeCapacity(GetInlinedCapacity(), n); + Allocation allocation = + MallocAdapter::Allocate(GetAllocator(), requested_capacity); + SetAllocation(allocation); + dst = allocation.data; + src = other.GetAllocatedData(); + } + + // Fast path: if the value type is trivially copy constructible and we know + // the allocator doesn't do anything fancy, then we know it is legal for us to + // simply memcpy the other vector's elements. + if (absl::is_trivially_copy_constructible>::value && + std::is_same>>::value) { + std::memcpy(reinterpret_cast(dst), + reinterpret_cast(src), n * sizeof(ValueType)); + } else { + auto values = IteratorValueAdapter>(src); + ConstructElements(GetAllocator(), dst, values, n); + } + + GetSizeAndIsAllocated() = other.GetSizeAndIsAllocated(); +} + +template +template +auto Storage::Initialize(ValueAdapter values, + SizeType new_size) -> void { + // Only callable from constructors! + ABSL_HARDENING_ASSERT(!GetIsAllocated()); + ABSL_HARDENING_ASSERT(GetSize() == 0); + + Pointer construct_data; + if (new_size > GetInlinedCapacity()) { + // Because this is only called from the `InlinedVector` constructors, it's + // safe to take on the allocation with size `0`. If `ConstructElements(...)` + // throws, deallocation will be automatically handled by `~Storage()`. + SizeType requested_capacity = + ComputeCapacity(GetInlinedCapacity(), new_size); + Allocation allocation = + MallocAdapter::Allocate(GetAllocator(), requested_capacity); + construct_data = allocation.data; + SetAllocation(allocation); + SetIsAllocated(); + } else { + construct_data = GetInlinedData(); + } + + ConstructElements(GetAllocator(), construct_data, values, new_size); + + // Since the initial size was guaranteed to be `0` and the allocated bit is + // already correct for either case, *adding* `new_size` gives us the correct + // result faster than setting it directly. + AddSize(new_size); +} + +template +template +auto Storage::Assign(ValueAdapter values, + SizeType new_size) -> void { + StorageView storage_view = MakeStorageView(); + + AllocationTransaction allocation_tx(GetAllocator()); + + absl::Span> assign_loop; + absl::Span> construct_loop; + absl::Span> destroy_loop; + + if (new_size > storage_view.capacity) { + SizeType requested_capacity = + ComputeCapacity(storage_view.capacity, new_size); + construct_loop = {allocation_tx.Allocate(requested_capacity), new_size}; + destroy_loop = {storage_view.data, storage_view.size}; + } else if (new_size > storage_view.size) { + assign_loop = {storage_view.data, storage_view.size}; + construct_loop = {storage_view.data + storage_view.size, + new_size - storage_view.size}; + } else { + assign_loop = {storage_view.data, new_size}; + destroy_loop = {storage_view.data + new_size, storage_view.size - new_size}; + } + + AssignElements(assign_loop.data(), values, assign_loop.size()); + + ConstructElements(GetAllocator(), construct_loop.data(), values, + construct_loop.size()); + + DestroyAdapter::DestroyElements(GetAllocator(), destroy_loop.data(), + destroy_loop.size()); + + if (allocation_tx.DidAllocate()) { + DeallocateIfAllocated(); + SetAllocation(std::move(allocation_tx).Release()); + SetIsAllocated(); + } + + SetSize(new_size); +} + +template +template +auto Storage::Resize(ValueAdapter values, + SizeType new_size) -> void { + StorageView storage_view = MakeStorageView(); + Pointer const base = storage_view.data; + const SizeType size = storage_view.size; + A& alloc = GetAllocator(); + if (new_size <= size) { + // Destroy extra old elements. + DestroyAdapter::DestroyElements(alloc, base + new_size, size - new_size); + } else if (new_size <= storage_view.capacity) { + // Construct new elements in place. + ConstructElements(alloc, base + size, values, new_size - size); + } else { + // Steps: + // a. Allocate new backing store. + // b. Construct new elements in new backing store. + // c. Move existing elements from old backing store to new backing store. + // d. Destroy all elements in old backing store. + // Use transactional wrappers for the first two steps so we can roll + // back if necessary due to exceptions. + AllocationTransaction allocation_tx(alloc); + SizeType requested_capacity = + ComputeCapacity(storage_view.capacity, new_size); + Pointer new_data = allocation_tx.Allocate(requested_capacity); + + ConstructionTransaction construction_tx(alloc); + construction_tx.Construct(new_data + size, values, new_size - size); + + IteratorValueAdapter> move_values( + (MoveIterator(base))); + ConstructElements(alloc, new_data, move_values, size); + + DestroyAdapter::DestroyElements(alloc, base, size); + std::move(construction_tx).Commit(); + DeallocateIfAllocated(); + SetAllocation(std::move(allocation_tx).Release()); + SetIsAllocated(); + } + SetSize(new_size); +} + +template +template +auto Storage::Insert(ConstIterator pos, ValueAdapter values, + SizeType insert_count) -> Iterator { + StorageView storage_view = MakeStorageView(); + + auto insert_index = static_cast>( + std::distance(ConstIterator(storage_view.data), pos)); + SizeType insert_end_index = insert_index + insert_count; + SizeType new_size = storage_view.size + insert_count; + + if (new_size > storage_view.capacity) { + AllocationTransaction allocation_tx(GetAllocator()); + ConstructionTransaction construction_tx(GetAllocator()); + ConstructionTransaction move_construction_tx(GetAllocator()); + + IteratorValueAdapter> move_values( + MoveIterator(storage_view.data)); + + SizeType requested_capacity = + ComputeCapacity(storage_view.capacity, new_size); + Pointer new_data = allocation_tx.Allocate(requested_capacity); + + construction_tx.Construct(new_data + insert_index, values, insert_count); + + move_construction_tx.Construct(new_data, move_values, insert_index); + + ConstructElements(GetAllocator(), new_data + insert_end_index, + move_values, storage_view.size - insert_index); + + DestroyAdapter::DestroyElements(GetAllocator(), storage_view.data, + storage_view.size); + + std::move(construction_tx).Commit(); + std::move(move_construction_tx).Commit(); + DeallocateIfAllocated(); + SetAllocation(std::move(allocation_tx).Release()); + + SetAllocatedSize(new_size); + return Iterator(new_data + insert_index); + } else { + SizeType move_construction_destination_index = + (std::max)(insert_end_index, storage_view.size); + + ConstructionTransaction move_construction_tx(GetAllocator()); + + IteratorValueAdapter> move_construction_values( + MoveIterator(storage_view.data + + (move_construction_destination_index - insert_count))); + absl::Span> move_construction = { + storage_view.data + move_construction_destination_index, + new_size - move_construction_destination_index}; + + Pointer move_assignment_values = storage_view.data + insert_index; + absl::Span> move_assignment = { + storage_view.data + insert_end_index, + move_construction_destination_index - insert_end_index}; + + absl::Span> insert_assignment = {move_assignment_values, + move_construction.size()}; + + absl::Span> insert_construction = { + insert_assignment.data() + insert_assignment.size(), + insert_count - insert_assignment.size()}; + + move_construction_tx.Construct(move_construction.data(), + move_construction_values, + move_construction.size()); + + for (Pointer + destination = move_assignment.data() + move_assignment.size(), + last_destination = move_assignment.data(), + source = move_assignment_values + move_assignment.size(); + ;) { + --destination; + --source; + if (destination < last_destination) break; + *destination = std::move(*source); + } + + AssignElements(insert_assignment.data(), values, + insert_assignment.size()); + + ConstructElements(GetAllocator(), insert_construction.data(), values, + insert_construction.size()); + + std::move(move_construction_tx).Commit(); + + AddSize(insert_count); + return Iterator(storage_view.data + insert_index); + } +} + +template +template +auto Storage::EmplaceBack(Args&&... args) -> Reference { + StorageView storage_view = MakeStorageView(); + const SizeType n = storage_view.size; + if (ABSL_PREDICT_TRUE(n != storage_view.capacity)) { + // Fast path; new element fits. + Pointer last_ptr = storage_view.data + n; + AllocatorTraits::construct(GetAllocator(), last_ptr, + std::forward(args)...); + AddSize(1); + return *last_ptr; + } + // TODO(b/173712035): Annotate with musttail attribute to prevent regression. + return EmplaceBackSlow(std::forward(args)...); +} + +template +template +auto Storage::EmplaceBackSlow(Args&&... args) -> Reference { + StorageView storage_view = MakeStorageView(); + AllocationTransaction allocation_tx(GetAllocator()); + IteratorValueAdapter> move_values( + MoveIterator(storage_view.data)); + SizeType requested_capacity = NextCapacity(storage_view.capacity); + Pointer construct_data = allocation_tx.Allocate(requested_capacity); + Pointer last_ptr = construct_data + storage_view.size; + + // Construct new element. + AllocatorTraits::construct(GetAllocator(), last_ptr, + std::forward(args)...); + // Move elements from old backing store to new backing store. + ABSL_INTERNAL_TRY { + ConstructElements(GetAllocator(), allocation_tx.GetData(), move_values, + storage_view.size); + } + ABSL_INTERNAL_CATCH_ANY { + AllocatorTraits::destroy(GetAllocator(), last_ptr); + ABSL_INTERNAL_RETHROW; + } + // Destroy elements in old backing store. + DestroyAdapter::DestroyElements(GetAllocator(), storage_view.data, + storage_view.size); + + DeallocateIfAllocated(); + SetAllocation(std::move(allocation_tx).Release()); + SetIsAllocated(); + AddSize(1); + return *last_ptr; +} + +template +auto Storage::Erase(ConstIterator from, + ConstIterator to) -> Iterator { + StorageView storage_view = MakeStorageView(); + + auto erase_size = static_cast>(std::distance(from, to)); + auto erase_index = static_cast>( + std::distance(ConstIterator(storage_view.data), from)); + SizeType erase_end_index = erase_index + erase_size; + + // Fast path: if the value type is trivially relocatable and we know + // the allocator doesn't do anything fancy, then we know it is legal for us to + // simply destroy the elements in the "erasure window" (which cannot throw) + // and then memcpy downward to close the window. + if (absl::is_trivially_relocatable>::value && + std::is_nothrow_destructible>::value && + std::is_same>>::value) { + DestroyAdapter::DestroyElements( + GetAllocator(), storage_view.data + erase_index, erase_size); + std::memmove( + reinterpret_cast(storage_view.data + erase_index), + reinterpret_cast(storage_view.data + erase_end_index), + (storage_view.size - erase_end_index) * sizeof(ValueType)); + } else { + IteratorValueAdapter> move_values( + MoveIterator(storage_view.data + erase_end_index)); + + AssignElements(storage_view.data + erase_index, move_values, + storage_view.size - erase_end_index); + + DestroyAdapter::DestroyElements( + GetAllocator(), storage_view.data + (storage_view.size - erase_size), + erase_size); + } + SubtractSize(erase_size); + return Iterator(storage_view.data + erase_index); +} + +template +auto Storage::Reserve(SizeType requested_capacity) -> void { + StorageView storage_view = MakeStorageView(); + + if (ABSL_PREDICT_FALSE(requested_capacity <= storage_view.capacity)) return; + + AllocationTransaction allocation_tx(GetAllocator()); + + IteratorValueAdapter> move_values( + MoveIterator(storage_view.data)); + + SizeType new_requested_capacity = + ComputeCapacity(storage_view.capacity, requested_capacity); + Pointer new_data = allocation_tx.Allocate(new_requested_capacity); + + ConstructElements(GetAllocator(), new_data, move_values, + storage_view.size); + + DestroyAdapter::DestroyElements(GetAllocator(), storage_view.data, + storage_view.size); + + DeallocateIfAllocated(); + SetAllocation(std::move(allocation_tx).Release()); + SetIsAllocated(); +} + +template +auto Storage::ShrinkToFit() -> void { + // May only be called on allocated instances! + ABSL_HARDENING_ASSERT(GetIsAllocated()); + + StorageView storage_view{GetAllocatedData(), GetSize(), + GetAllocatedCapacity()}; + + if (ABSL_PREDICT_FALSE(storage_view.size == storage_view.capacity)) return; + + AllocationTransaction allocation_tx(GetAllocator()); + + IteratorValueAdapter> move_values( + MoveIterator(storage_view.data)); + + Pointer construct_data; + if (storage_view.size > GetInlinedCapacity()) { + SizeType requested_capacity = storage_view.size; + construct_data = allocation_tx.Allocate(requested_capacity); + if (allocation_tx.GetCapacity() >= storage_view.capacity) { + // Already using the smallest available heap allocation. + return; + } + } else { + construct_data = GetInlinedData(); + } + + ABSL_INTERNAL_TRY { + ConstructElements(GetAllocator(), construct_data, move_values, + storage_view.size); + } + ABSL_INTERNAL_CATCH_ANY { + SetAllocation({storage_view.data, storage_view.capacity}); + ABSL_INTERNAL_RETHROW; + } + + DestroyAdapter::DestroyElements(GetAllocator(), storage_view.data, + storage_view.size); + + MallocAdapter::Deallocate(GetAllocator(), storage_view.data, + storage_view.capacity); + + if (allocation_tx.DidAllocate()) { + SetAllocation(std::move(allocation_tx).Release()); + } else { + UnsetIsAllocated(); + } +} + +template +auto Storage::Swap(Storage* other_storage_ptr) -> void { + using std::swap; + ABSL_HARDENING_ASSERT(this != other_storage_ptr); + + if (GetIsAllocated() && other_storage_ptr->GetIsAllocated()) { + swap(data_.allocated, other_storage_ptr->data_.allocated); + } else if (!GetIsAllocated() && !other_storage_ptr->GetIsAllocated()) { + SwapInlinedElements(SwapInlinedElementsPolicy{}, other_storage_ptr); + } else { + Storage* allocated_ptr = this; + Storage* inlined_ptr = other_storage_ptr; + if (!allocated_ptr->GetIsAllocated()) swap(allocated_ptr, inlined_ptr); + + StorageView allocated_storage_view{ + allocated_ptr->GetAllocatedData(), allocated_ptr->GetSize(), + allocated_ptr->GetAllocatedCapacity()}; + + IteratorValueAdapter> move_values( + MoveIterator(inlined_ptr->GetInlinedData())); + + ABSL_INTERNAL_TRY { + ConstructElements(inlined_ptr->GetAllocator(), + allocated_ptr->GetInlinedData(), move_values, + inlined_ptr->GetSize()); + } + ABSL_INTERNAL_CATCH_ANY { + allocated_ptr->SetAllocation(Allocation{ + allocated_storage_view.data, allocated_storage_view.capacity}); + ABSL_INTERNAL_RETHROW; + } + + DestroyAdapter::DestroyElements(inlined_ptr->GetAllocator(), + inlined_ptr->GetInlinedData(), + inlined_ptr->GetSize()); + + inlined_ptr->SetAllocation(Allocation{allocated_storage_view.data, + allocated_storage_view.capacity}); + } + + swap(GetSizeAndIsAllocated(), other_storage_ptr->GetSizeAndIsAllocated()); + swap(GetAllocator(), other_storage_ptr->GetAllocator()); +} + +template +void Storage::SwapN(ElementwiseSwapPolicy, Storage* other, + SizeType n) { + std::swap_ranges(GetInlinedData(), GetInlinedData() + n, + other->GetInlinedData()); +} + +template +void Storage::SwapN(ElementwiseConstructPolicy, Storage* other, + SizeType n) { + Pointer a = GetInlinedData(); + Pointer b = other->GetInlinedData(); + // see note on allocators in `SwapInlinedElements`. + A& allocator_a = GetAllocator(); + A& allocator_b = other->GetAllocator(); + for (SizeType i = 0; i < n; ++i, ++a, ++b) { + ValueType tmp(std::move(*a)); + + AllocatorTraits::destroy(allocator_a, a); + AllocatorTraits::construct(allocator_b, a, std::move(*b)); + + AllocatorTraits::destroy(allocator_b, b); + AllocatorTraits::construct(allocator_a, b, std::move(tmp)); + } +} + +template +void Storage::SwapInlinedElements(MemcpyPolicy, Storage* other) { + Data tmp = data_; + data_ = other->data_; + other->data_ = tmp; +} + +template +template +void Storage::SwapInlinedElements(NotMemcpyPolicy policy, + Storage* other) { + // Note: `destroy` needs to use pre-swap allocator while `construct` - + // post-swap allocator. Allocators will be swapped later on outside of + // `SwapInlinedElements`. + Storage* small_ptr = this; + Storage* large_ptr = other; + if (small_ptr->GetSize() > large_ptr->GetSize()) { + std::swap(small_ptr, large_ptr); + } + + auto small_size = small_ptr->GetSize(); + auto diff = large_ptr->GetSize() - small_size; + SwapN(policy, other, small_size); + + IteratorValueAdapter> move_values( + MoveIterator(large_ptr->GetInlinedData() + small_size)); + + ConstructElements(large_ptr->GetAllocator(), + small_ptr->GetInlinedData() + small_size, move_values, + diff); + + DestroyAdapter::DestroyElements(large_ptr->GetAllocator(), + large_ptr->GetInlinedData() + small_size, + diff); +} + +// End ignore "array-bounds" +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + +} // namespace inlined_vector_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_INTERNAL_INLINED_VECTOR_H_ diff --git a/absl/container/internal/layout.h b/absl/container/internal/layout.h new file mode 100644 index 0000000..f8b425c --- /dev/null +++ b/absl/container/internal/layout.h @@ -0,0 +1,844 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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. +// +// MOTIVATION AND TUTORIAL +// +// If you want to put in a single heap allocation N doubles followed by M ints, +// it's easy if N and M are known at compile time. +// +// struct S { +// double a[N]; +// int b[M]; +// }; +// +// S* p = new S; +// +// But what if N and M are known only in run time? Class template Layout to the +// rescue! It's a portable generalization of the technique known as struct hack. +// +// // This object will tell us everything we need to know about the memory +// // layout of double[N] followed by int[M]. It's structurally identical to +// // size_t[2] that stores N and M. It's very cheap to create. +// const Layout layout(N, M); +// +// // Allocate enough memory for both arrays. `AllocSize()` tells us how much +// // memory is needed. We are free to use any allocation function we want as +// // long as it returns aligned memory. +// std::unique_ptr p(new unsigned char[layout.AllocSize()]); +// +// // Obtain the pointer to the array of doubles. +// // Equivalent to `reinterpret_cast(p.get())`. +// // +// // We could have written layout.Pointer<0>(p) instead. If all the types are +// // unique you can use either form, but if some types are repeated you must +// // use the index form. +// double* a = layout.Pointer(p.get()); +// +// // Obtain the pointer to the array of ints. +// // Equivalent to `reinterpret_cast(p.get() + N * 8)`. +// int* b = layout.Pointer(p); +// +// If we are unable to specify sizes of all fields, we can pass as many sizes as +// we can to `Partial()`. In return, it'll allow us to access the fields whose +// locations and sizes can be computed from the provided information. +// `Partial()` comes in handy when the array sizes are embedded into the +// allocation. +// +// // size_t[0] containing N, size_t[1] containing M, double[N], int[M]. +// using L = Layout; +// +// unsigned char* Allocate(size_t n, size_t m) { +// const L layout(1, 1, n, m); +// unsigned char* p = new unsigned char[layout.AllocSize()]; +// *layout.Pointer<0>(p) = n; +// *layout.Pointer<1>(p) = m; +// return p; +// } +// +// void Use(unsigned char* p) { +// // First, extract N and M. +// // Specify that the first array has only one element. Using `prefix` we +// // can access the first two arrays but not more. +// constexpr auto prefix = L::Partial(1); +// size_t n = *prefix.Pointer<0>(p); +// size_t m = *prefix.Pointer<1>(p); +// +// // Now we can get pointers to the payload. +// const L layout(1, 1, n, m); +// double* a = layout.Pointer(p); +// int* b = layout.Pointer(p); +// } +// +// The layout we used above combines fixed-size with dynamically-sized fields. +// This is quite common. Layout is optimized for this use case and attempts to +// generate optimal code. To help the compiler do that in more cases, you can +// specify the fixed sizes using `WithStaticSizes`. This ensures that all +// computations that can be performed at compile time are indeed performed at +// compile time. Note that sometimes the `template` keyword is needed. E.g.: +// +// using SL = L::template WithStaticSizes<1, 1>; +// +// void Use(unsigned char* p) { +// // First, extract N and M. +// // Using `prefix` we can access the first three arrays but not more. +// // +// // More details: The first element always has offset 0. `SL` +// // has offsets for the second and third array based on sizes of +// // the first and second array, specified via `WithStaticSizes`. +// constexpr auto prefix = SL::Partial(); +// size_t n = *prefix.Pointer<0>(p); +// size_t m = *prefix.Pointer<1>(p); +// +// // Now we can get a pointer to the final payload. +// const SL layout(n, m); +// double* a = layout.Pointer(p); +// int* b = layout.Pointer(p); +// } +// +// Efficiency tip: The order of fields matters. In `Layout` try to +// ensure that `alignof(T1) >= ... >= alignof(TN)`. This way you'll have no +// padding in between arrays. +// +// You can manually override the alignment of an array by wrapping the type in +// `Aligned`. `Layout<..., Aligned, ...>` has exactly the same API +// and behavior as `Layout<..., T, ...>` except that the first element of the +// array of `T` is aligned to `N` (the rest of the elements follow without +// padding). `N` cannot be less than `alignof(T)`. +// +// `AllocSize()` and `Pointer()` are the most basic methods for dealing with +// memory layouts. Check out the reference or code below to discover more. +// +// EXAMPLE +// +// // Immutable move-only string with sizeof equal to sizeof(void*). The +// // string size and the characters are kept in the same heap allocation. +// class CompactString { +// public: +// CompactString(const char* s = "") { +// const size_t size = strlen(s); +// // size_t[1] followed by char[size + 1]. +// const L layout(size + 1); +// p_.reset(new unsigned char[layout.AllocSize()]); +// // If running under ASAN, mark the padding bytes, if any, to catch +// // memory errors. +// layout.PoisonPadding(p_.get()); +// // Store the size in the allocation. +// *layout.Pointer(p_.get()) = size; +// // Store the characters in the allocation. +// memcpy(layout.Pointer(p_.get()), s, size + 1); +// } +// +// size_t size() const { +// // Equivalent to reinterpret_cast(*p). +// return *L::Partial().Pointer(p_.get()); +// } +// +// const char* c_str() const { +// // Equivalent to reinterpret_cast(p.get() + sizeof(size_t)). +// return L::Partial().Pointer(p_.get()); +// } +// +// private: +// // Our heap allocation contains a single size_t followed by an array of +// // chars. +// using L = Layout::WithStaticSizes<1>; +// std::unique_ptr p_; +// }; +// +// int main() { +// CompactString s = "hello"; +// assert(s.size() == 5); +// assert(strcmp(s.c_str(), "hello") == 0); +// } +// +// DOCUMENTATION +// +// The interface exported by this file consists of: +// - class `Layout<>` and its public members. +// - The public members of classes `internal_layout::LayoutWithStaticSizes<>` +// and `internal_layout::LayoutImpl<>`. Those classes aren't intended to be +// used directly, and their name and template parameter list are internal +// implementation details, but the classes themselves provide most of the +// functionality in this file. See comments on their members for detailed +// documentation. +// +// `Layout::Partial(count1,..., countm)` (where `m` <= `n`) returns a +// `LayoutImpl<>` object. `Layout layout(count1,..., countn)` +// creates a `Layout` object, which exposes the same functionality by inheriting +// from `LayoutImpl<>`. + +#ifndef ABSL_CONTAINER_INTERNAL_LAYOUT_H_ +#define ABSL_CONTAINER_INTERNAL_LAYOUT_H_ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "absl/base/attributes.h" +#include "absl/base/config.h" +#include "absl/debugging/internal/demangle.h" +#include "absl/meta/type_traits.h" +#include "absl/strings/str_cat.h" +#include "absl/types/span.h" +#include "absl/utility/utility.h" + +#ifdef ABSL_HAVE_ADDRESS_SANITIZER +#include +#endif + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +// A type wrapper that instructs `Layout` to use the specific alignment for the +// array. `Layout<..., Aligned, ...>` has exactly the same API +// and behavior as `Layout<..., T, ...>` except that the first element of the +// array of `T` is aligned to `N` (the rest of the elements follow without +// padding). +// +// Requires: `N >= alignof(T)` and `N` is a power of 2. +template +struct Aligned; + +namespace internal_layout { + +template +struct NotAligned {}; + +template +struct NotAligned> { + static_assert(sizeof(T) == 0, "Aligned cannot be const-qualified"); +}; + +template +using IntToSize = size_t; + +template +struct Type : NotAligned { + using type = T; +}; + +template +struct Type> { + using type = T; +}; + +template +struct SizeOf : NotAligned, std::integral_constant {}; + +template +struct SizeOf> : std::integral_constant {}; + +// Note: workaround for https://gcc.gnu.org/PR88115 +template +struct AlignOf : NotAligned { + static constexpr size_t value = alignof(T); +}; + +template +struct AlignOf> { + static_assert(N % alignof(T) == 0, + "Custom alignment can't be lower than the type's alignment"); + static constexpr size_t value = N; +}; + +// Does `Ts...` contain `T`? +template +using Contains = absl::disjunction...>; + +template +using CopyConst = + typename std::conditional::value, const To, To>::type; + +// Note: We're not qualifying this with absl:: because it doesn't compile under +// MSVC. +template +using SliceType = Span; + +// This namespace contains no types. It prevents functions defined in it from +// being found by ADL. +namespace adl_barrier { + +template +constexpr size_t Find(Needle, Needle, Ts...) { + static_assert(!Contains(), "Duplicate element type"); + return 0; +} + +template +constexpr size_t Find(Needle, T, Ts...) { + return adl_barrier::Find(Needle(), Ts()...) + 1; +} + +constexpr bool IsPow2(size_t n) { return !(n & (n - 1)); } + +// Returns `q * m` for the smallest `q` such that `q * m >= n`. +// Requires: `m` is a power of two. It's enforced by IsLegalElementType below. +constexpr size_t Align(size_t n, size_t m) { return (n + m - 1) & ~(m - 1); } + +constexpr size_t Min(size_t a, size_t b) { return b < a ? b : a; } + +constexpr size_t Max(size_t a) { return a; } + +template +constexpr size_t Max(size_t a, size_t b, Ts... rest) { + return adl_barrier::Max(b < a ? a : b, rest...); +} + +template +std::string TypeName() { + std::string out; +#ifdef ABSL_INTERNAL_HAS_RTTI + absl::StrAppend(&out, "<", + absl::debugging_internal::DemangleString(typeid(T).name()), + ">"); +#endif + return out; +} + +} // namespace adl_barrier + +template +using EnableIf = typename std::enable_if::type; + +// Can `T` be a template argument of `Layout`? +template +using IsLegalElementType = std::integral_constant< + bool, !std::is_reference::value && !std::is_volatile::value && + !std::is_reference::type>::value && + !std::is_volatile::type>::value && + adl_barrier::IsPow2(AlignOf::value)>; + +template +class LayoutImpl; + +// Public base class of `Layout` and the result type of `Layout::Partial()`. +// +// `Elements...` contains all template arguments of `Layout` that created this +// instance. +// +// `StaticSizeSeq...` is an index_sequence containing the sizes specified at +// compile-time. +// +// `RuntimeSizeSeq...` is `[0, NumRuntimeSizes)`, where `NumRuntimeSizes` is the +// number of arguments passed to `Layout::Partial()` or `Layout::Layout()`. +// +// `SizeSeq...` is `[0, NumSizes)` where `NumSizes` is `NumRuntimeSizes` plus +// the number of sizes in `StaticSizeSeq`. +// +// `OffsetSeq...` is `[0, NumOffsets)` where `NumOffsets` is +// `Min(sizeof...(Elements), NumSizes + 1)` (the number of arrays for which we +// can compute offsets). +template +class LayoutImpl< + std::tuple, absl::index_sequence, + absl::index_sequence, absl::index_sequence, + absl::index_sequence> { + private: + static_assert(sizeof...(Elements) > 0, "At least one field is required"); + static_assert(absl::conjunction...>::value, + "Invalid element type (see IsLegalElementType)"); + static_assert(sizeof...(StaticSizeSeq) <= sizeof...(Elements), + "Too many static sizes specified"); + + enum { + NumTypes = sizeof...(Elements), + NumStaticSizes = sizeof...(StaticSizeSeq), + NumRuntimeSizes = sizeof...(RuntimeSizeSeq), + NumSizes = sizeof...(SizeSeq), + NumOffsets = sizeof...(OffsetSeq), + }; + + // These are guaranteed by `Layout`. + static_assert(NumStaticSizes + NumRuntimeSizes == NumSizes, "Internal error"); + static_assert(NumSizes <= NumTypes, "Internal error"); + static_assert(NumOffsets == adl_barrier::Min(NumTypes, NumSizes + 1), + "Internal error"); + static_assert(NumTypes > 0, "Internal error"); + + static constexpr std::array kStaticSizes = { + StaticSizeSeq...}; + + // Returns the index of `T` in `Elements...`. Results in a compilation error + // if `Elements...` doesn't contain exactly one instance of `T`. + template + static constexpr size_t ElementIndex() { + static_assert(Contains, Type::type>...>(), + "Type not found"); + return adl_barrier::Find(Type(), + Type::type>()...); + } + + template + using ElementAlignment = + AlignOf>::type>; + + public: + // Element types of all arrays packed in a tuple. + using ElementTypes = std::tuple::type...>; + + // Element type of the Nth array. + template + using ElementType = typename std::tuple_element::type; + + constexpr explicit LayoutImpl(IntToSize... sizes) + : size_{sizes...} {} + + // Alignment of the layout, equal to the strictest alignment of all elements. + // All pointers passed to the methods of layout must be aligned to this value. + static constexpr size_t Alignment() { + return adl_barrier::Max(AlignOf::value...); + } + + // Offset in bytes of the Nth array. + // + // // int[3], 4 bytes of padding, double[4]. + // Layout x(3, 4); + // assert(x.Offset<0>() == 0); // The ints starts from 0. + // assert(x.Offset<1>() == 16); // The doubles starts from 16. + // + // Requires: `N <= NumSizes && N < sizeof...(Ts)`. + template = 0> + constexpr size_t Offset() const { + return 0; + } + + template = 0> + constexpr size_t Offset() const { + static_assert(N < NumOffsets, "Index out of bounds"); + return adl_barrier::Align( + Offset() + SizeOf>::value * Size(), + ElementAlignment::value); + } + + // Offset in bytes of the array with the specified element type. There must + // be exactly one such array and its zero-based index must be at most + // `NumSizes`. + // + // // int[3], 4 bytes of padding, double[4]. + // Layout x(3, 4); + // assert(x.Offset() == 0); // The ints starts from 0. + // assert(x.Offset() == 16); // The doubles starts from 16. + template + constexpr size_t Offset() const { + return Offset()>(); + } + + // Offsets in bytes of all arrays for which the offsets are known. + constexpr std::array Offsets() const { + return {{Offset()...}}; + } + + // The number of elements in the Nth array (zero-based). + // + // // int[3], 4 bytes of padding, double[4]. + // Layout x(3, 4); + // assert(x.Size<0>() == 3); + // assert(x.Size<1>() == 4); + // + // Requires: `N < NumSizes`. + template = 0> + constexpr size_t Size() const { + return kStaticSizes[N]; + } + + template = NumStaticSizes)> = 0> + constexpr size_t Size() const { + static_assert(N < NumSizes, "Index out of bounds"); + return size_[N - NumStaticSizes]; + } + + // The number of elements in the array with the specified element type. + // There must be exactly one such array and its zero-based index must be + // at most `NumSizes`. + // + // // int[3], 4 bytes of padding, double[4]. + // Layout x(3, 4); + // assert(x.Size() == 3); + // assert(x.Size() == 4); + template + constexpr size_t Size() const { + return Size()>(); + } + + // The number of elements of all arrays for which they are known. + constexpr std::array Sizes() const { + return {{Size()...}}; + } + + // Pointer to the beginning of the Nth array. + // + // `Char` must be `[const] [signed|unsigned] char`. + // + // // int[3], 4 bytes of padding, double[4]. + // Layout x(3, 4); + // unsigned char* p = new unsigned char[x.AllocSize()]; + // int* ints = x.Pointer<0>(p); + // double* doubles = x.Pointer<1>(p); + // + // Requires: `N <= NumSizes && N < sizeof...(Ts)`. + // Requires: `p` is aligned to `Alignment()`. + template + CopyConst>* Pointer(Char* p) const { + using C = typename std::remove_const::type; + static_assert( + std::is_same() || std::is_same() || + std::is_same(), + "The argument must be a pointer to [const] [signed|unsigned] char"); + constexpr size_t alignment = Alignment(); + (void)alignment; + assert(reinterpret_cast(p) % alignment == 0); + return reinterpret_cast>*>(p + Offset()); + } + + // Pointer to the beginning of the array with the specified element type. + // There must be exactly one such array and its zero-based index must be at + // most `NumSizes`. + // + // `Char` must be `[const] [signed|unsigned] char`. + // + // // int[3], 4 bytes of padding, double[4]. + // Layout x(3, 4); + // unsigned char* p = new unsigned char[x.AllocSize()]; + // int* ints = x.Pointer(p); + // double* doubles = x.Pointer(p); + // + // Requires: `p` is aligned to `Alignment()`. + template + CopyConst* Pointer(Char* p) const { + return Pointer()>(p); + } + + // Pointers to all arrays for which pointers are known. + // + // `Char` must be `[const] [signed|unsigned] char`. + // + // // int[3], 4 bytes of padding, double[4]. + // Layout x(3, 4); + // unsigned char* p = new unsigned char[x.AllocSize()]; + // + // int* ints; + // double* doubles; + // std::tie(ints, doubles) = x.Pointers(p); + // + // Requires: `p` is aligned to `Alignment()`. + template + auto Pointers(Char* p) const { + return std::tuple>*...>( + Pointer(p)...); + } + + // The Nth array. + // + // `Char` must be `[const] [signed|unsigned] char`. + // + // // int[3], 4 bytes of padding, double[4]. + // Layout x(3, 4); + // unsigned char* p = new unsigned char[x.AllocSize()]; + // Span ints = x.Slice<0>(p); + // Span doubles = x.Slice<1>(p); + // + // Requires: `N < NumSizes`. + // Requires: `p` is aligned to `Alignment()`. + template + SliceType>> Slice(Char* p) const { + return SliceType>>(Pointer(p), Size()); + } + + // The array with the specified element type. There must be exactly one + // such array and its zero-based index must be less than `NumSizes`. + // + // `Char` must be `[const] [signed|unsigned] char`. + // + // // int[3], 4 bytes of padding, double[4]. + // Layout x(3, 4); + // unsigned char* p = new unsigned char[x.AllocSize()]; + // Span ints = x.Slice(p); + // Span doubles = x.Slice(p); + // + // Requires: `p` is aligned to `Alignment()`. + template + SliceType> Slice(Char* p) const { + return Slice()>(p); + } + + // All arrays with known sizes. + // + // `Char` must be `[const] [signed|unsigned] char`. + // + // // int[3], 4 bytes of padding, double[4]. + // Layout x(3, 4); + // unsigned char* p = new unsigned char[x.AllocSize()]; + // + // Span ints; + // Span doubles; + // std::tie(ints, doubles) = x.Slices(p); + // + // Requires: `p` is aligned to `Alignment()`. + // + // Note: We mark the parameter as unused because GCC detects it is not used + // when `SizeSeq` is empty [-Werror=unused-but-set-parameter]. + template + auto Slices(ABSL_ATTRIBUTE_UNUSED Char* p) const { + return std::tuple>>...>( + Slice(p)...); + } + + // The size of the allocation that fits all arrays. + // + // // int[3], 4 bytes of padding, double[4]. + // Layout x(3, 4); + // unsigned char* p = new unsigned char[x.AllocSize()]; // 48 bytes + // + // Requires: `NumSizes == sizeof...(Ts)`. + constexpr size_t AllocSize() const { + static_assert(NumTypes == NumSizes, "You must specify sizes of all fields"); + return Offset() + + SizeOf>::value * Size(); + } + + // If built with --config=asan, poisons padding bytes (if any) in the + // allocation. The pointer must point to a memory block at least + // `AllocSize()` bytes in length. + // + // `Char` must be `[const] [signed|unsigned] char`. + // + // Requires: `p` is aligned to `Alignment()`. + template = 0> + void PoisonPadding(const Char* p) const { + Pointer<0>(p); // verify the requirements on `Char` and `p` + } + + template = 0> + void PoisonPadding(const Char* p) const { + static_assert(N < NumOffsets, "Index out of bounds"); + (void)p; +#ifdef ABSL_HAVE_ADDRESS_SANITIZER + PoisonPadding(p); + // The `if` is an optimization. It doesn't affect the observable behaviour. + if (ElementAlignment::value % ElementAlignment::value) { + size_t start = + Offset() + SizeOf>::value * Size(); + ASAN_POISON_MEMORY_REGION(p + start, Offset() - start); + } +#endif + } + + // Human-readable description of the memory layout. Useful for debugging. + // Slow. + // + // // char[5], 3 bytes of padding, int[3], 4 bytes of padding, followed + // // by an unknown number of doubles. + // auto x = Layout::Partial(5, 3); + // assert(x.DebugString() == + // "@0(1)[5]; @8(4)[3]; @24(8)"); + // + // Each field is in the following format: @offset(sizeof)[size] ( + // may be missing depending on the target platform). For example, + // @8(4)[3] means that at offset 8 we have an array of ints, where each + // int is 4 bytes, and we have 3 of those ints. The size of the last field may + // be missing (as in the example above). Only fields with known offsets are + // described. Type names may differ across platforms: one compiler might + // produce "unsigned*" where another produces "unsigned int *". + std::string DebugString() const { + const auto offsets = Offsets(); + const size_t sizes[] = {SizeOf>::value...}; + const std::string types[] = { + adl_barrier::TypeName>()...}; + std::string res = absl::StrCat("@0", types[0], "(", sizes[0], ")"); + for (size_t i = 0; i != NumOffsets - 1; ++i) { + absl::StrAppend(&res, "[", DebugSize(i), "]; @", offsets[i + 1], + types[i + 1], "(", sizes[i + 1], ")"); + } + // NumSizes is a constant that may be zero. Some compilers cannot see that + // inside the if statement "size_[NumSizes - 1]" must be valid. + int last = static_cast(NumSizes) - 1; + if (NumTypes == NumSizes && last >= 0) { + absl::StrAppend(&res, "[", DebugSize(static_cast(last)), "]"); + } + return res; + } + + private: + size_t DebugSize(size_t n) const { + if (n < NumStaticSizes) { + return kStaticSizes[n]; + } else { + return size_[n - NumStaticSizes]; + } + } + + // Arguments of `Layout::Partial()` or `Layout::Layout()`. + size_t size_[NumRuntimeSizes > 0 ? NumRuntimeSizes : 1]; +}; + +// Defining a constexpr static class member variable is redundant and deprecated +// in C++17, but required in C++14. +template +constexpr std::array LayoutImpl< + std::tuple, absl::index_sequence, + absl::index_sequence, absl::index_sequence, + absl::index_sequence>::kStaticSizes; + +template +using LayoutType = LayoutImpl< + std::tuple, StaticSizeSeq, + absl::make_index_sequence, + absl::make_index_sequence, + absl::make_index_sequence>; + +template +class LayoutWithStaticSizes + : public LayoutType { + private: + using Super = + LayoutType; + + public: + // The result type of `Partial()` with `NumSizes` arguments. + template + using PartialType = + internal_layout::LayoutType; + + // `Layout` knows the element types of the arrays we want to lay out in + // memory but not the number of elements in each array. + // `Partial(size1, ..., sizeN)` allows us to specify the latter. The + // resulting immutable object can be used to obtain pointers to the + // individual arrays. + // + // It's allowed to pass fewer array sizes than the number of arrays. E.g., + // if all you need is to the offset of the second array, you only need to + // pass one argument -- the number of elements in the first array. + // + // // int[3] followed by 4 bytes of padding and an unknown number of + // // doubles. + // auto x = Layout::Partial(3); + // // doubles start at byte 16. + // assert(x.Offset<1>() == 16); + // + // If you know the number of elements in all arrays, you can still call + // `Partial()` but it's more convenient to use the constructor of `Layout`. + // + // Layout x(3, 5); + // + // Note: The sizes of the arrays must be specified in number of elements, + // not in bytes. + // + // Requires: `sizeof...(Sizes) + NumStaticSizes <= sizeof...(Ts)`. + // Requires: all arguments are convertible to `size_t`. + template + static constexpr PartialType Partial(Sizes&&... sizes) { + static_assert(sizeof...(Sizes) + StaticSizeSeq::size() <= sizeof...(Ts), + ""); + return PartialType( + static_cast(std::forward(sizes))...); + } + + // Inherit LayoutType's constructor. + // + // Creates a layout with the sizes of all arrays specified. If you know + // only the sizes of the first N arrays (where N can be zero), you can use + // `Partial()` defined above. The constructor is essentially equivalent to + // calling `Partial()` and passing in all array sizes; the constructor is + // provided as a convenient abbreviation. + // + // Note: The sizes of the arrays must be specified in number of elements, + // not in bytes. + // + // Implementation note: we do this via a `using` declaration instead of + // defining our own explicit constructor because the signature of LayoutType's + // constructor depends on RuntimeSizeSeq, which we don't have access to here. + // If we defined our own constructor here, it would have to use a parameter + // pack and then cast the arguments to size_t when calling the superclass + // constructor, similar to what Partial() does. But that would suffer from the + // same problem that Partial() has, which is that the parameter types are + // inferred from the arguments, which may be signed types, which must then be + // cast to size_t. This can lead to negative values being silently (i.e. with + // no compiler warnings) cast to an unsigned type. Having a constructor with + // size_t parameters helps the compiler generate better warnings about + // potential bad casts, while avoiding false warnings when positive literal + // arguments are used. If an argument is a positive literal integer (e.g. + // `1`), the compiler will understand that it can be safely converted to + // size_t, and hence not generate a warning. But if a negative literal (e.g. + // `-1`) or a variable with signed type is used, then it can generate a + // warning about a potentially unsafe implicit cast. It would be great if we + // could do this for Partial() too, but unfortunately as of C++23 there seems + // to be no way to define a function with a variable number of parameters of a + // certain type, a.k.a. homogeneous function parameter packs. So we're forced + // to choose between explicitly casting the arguments to size_t, which + // suppresses all warnings, even potentially valid ones, or implicitly casting + // them to size_t, which generates bogus warnings whenever literal arguments + // are used, even if they're positive. + using Super::Super; +}; + +} // namespace internal_layout + +// Descriptor of arrays of various types and sizes laid out in memory one after +// another. See the top of the file for documentation. +// +// Check out the public API of internal_layout::LayoutWithStaticSizes and +// internal_layout::LayoutImpl above. Those types are internal to the library +// but their methods are public, and they are inherited by `Layout`. +template +class Layout : public internal_layout::LayoutWithStaticSizes< + absl::make_index_sequence<0>, Ts...> { + private: + using Super = + internal_layout::LayoutWithStaticSizes, + Ts...>; + + public: + // If you know the sizes of some or all of the arrays at compile time, you can + // use `WithStaticSizes` or `WithStaticSizeSequence` to create a `Layout` type + // with those sizes baked in. This can help the compiler generate optimal code + // for calculating array offsets and AllocSize(). + // + // Like `Partial()`, the N sizes you specify are for the first N arrays, and + // they specify the number of elements in each array, not the number of bytes. + template + using WithStaticSizeSequence = + internal_layout::LayoutWithStaticSizes; + + template + using WithStaticSizes = + WithStaticSizeSequence>; + + // Inherit LayoutWithStaticSizes's constructor, which requires you to specify + // all the array sizes. + using Super::Super; +}; + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_INTERNAL_LAYOUT_H_ diff --git a/absl/container/internal/layout_benchmark.cc b/absl/container/internal/layout_benchmark.cc new file mode 100644 index 0000000..d6f2669 --- /dev/null +++ b/absl/container/internal/layout_benchmark.cc @@ -0,0 +1,295 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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. +// +// Every benchmark should have the same performance as the corresponding +// headroom benchmark. + +#include +#include + +#include "absl/base/internal/raw_logging.h" +#include "absl/container/internal/layout.h" +#include "benchmark/benchmark.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace { + +using ::benchmark::DoNotOptimize; + +using Int128 = int64_t[2]; + +constexpr size_t MyAlign(size_t n, size_t m) { return (n + m - 1) & ~(m - 1); } + +// This benchmark provides the upper bound on performance for BM_OffsetConstant. +template +void BM_OffsetConstantHeadroom(benchmark::State& state) { + for (auto _ : state) { + DoNotOptimize(Offset); + } +} + +template +void BM_OffsetConstantStatic(benchmark::State& state) { + using L = typename Layout::template WithStaticSizes<3, 5, 7>; + ABSL_RAW_CHECK(L::Partial().template Offset<3>() == Offset, "Invalid offset"); + for (auto _ : state) { + DoNotOptimize(L::Partial().template Offset<3>()); + } +} + +template +void BM_OffsetConstant(benchmark::State& state) { + using L = Layout; + ABSL_RAW_CHECK(L::Partial(3, 5, 7).template Offset<3>() == Offset, + "Invalid offset"); + for (auto _ : state) { + DoNotOptimize(L::Partial(3, 5, 7).template Offset<3>()); + } +} + +template +void BM_OffsetConstantIndirect(benchmark::State& state) { + using L = Layout; + auto p = L::Partial(3, 5, 7); + ABSL_RAW_CHECK(p.template Offset<3>() == Offset, "Invalid offset"); + for (auto _ : state) { + DoNotOptimize(p); + DoNotOptimize(p.template Offset<3>()); + } +} + +template +size_t PartialOffset(size_t k); + +template <> +size_t PartialOffset(size_t k) { + constexpr size_t o = MyAlign(MyAlign(3 * 1, 2) + 5 * 2, 4); + return MyAlign(o + k * 4, 8); +} + +template <> +size_t PartialOffset(size_t k) { + // No alignment is necessary. + return 3 * 16 + 5 * 4 + k * 2; +} + +// This benchmark provides the upper bound on performance for BM_OffsetVariable. +template +void BM_OffsetPartialHeadroom(benchmark::State& state) { + size_t k = 7; + ABSL_RAW_CHECK(PartialOffset(k) == Offset, "Invalid offset"); + for (auto _ : state) { + DoNotOptimize(k); + DoNotOptimize(PartialOffset(k)); + } +} + +template +void BM_OffsetPartialStatic(benchmark::State& state) { + using L = typename Layout::template WithStaticSizes<3, 5>; + size_t k = 7; + ABSL_RAW_CHECK(L::Partial(k).template Offset<3>() == Offset, + "Invalid offset"); + for (auto _ : state) { + DoNotOptimize(k); + DoNotOptimize(L::Partial(k).template Offset<3>()); + } +} + +template +void BM_OffsetPartial(benchmark::State& state) { + using L = Layout; + size_t k = 7; + ABSL_RAW_CHECK(L::Partial(3, 5, k).template Offset<3>() == Offset, + "Invalid offset"); + for (auto _ : state) { + DoNotOptimize(k); + DoNotOptimize(L::Partial(3, 5, k).template Offset<3>()); + } +} + +template +size_t VariableOffset(size_t n, size_t m, size_t k); + +template <> +size_t VariableOffset(size_t n, size_t m, + size_t k) { + return MyAlign(MyAlign(MyAlign(n * 1, 2) + m * 2, 4) + k * 4, 8); +} + +template <> +size_t VariableOffset(size_t n, size_t m, + size_t k) { + // No alignment is necessary. + return n * 16 + m * 4 + k * 2; +} + +// This benchmark provides the upper bound on performance for BM_OffsetVariable. +template +void BM_OffsetVariableHeadroom(benchmark::State& state) { + size_t n = 3; + size_t m = 5; + size_t k = 7; + ABSL_RAW_CHECK(VariableOffset(n, m, k) == Offset, "Invalid offset"); + for (auto _ : state) { + DoNotOptimize(n); + DoNotOptimize(m); + DoNotOptimize(k); + DoNotOptimize(VariableOffset(n, m, k)); + } +} + +template +void BM_OffsetVariable(benchmark::State& state) { + using L = Layout; + size_t n = 3; + size_t m = 5; + size_t k = 7; + ABSL_RAW_CHECK(L::Partial(n, m, k).template Offset<3>() == Offset, + "Invalid offset"); + for (auto _ : state) { + DoNotOptimize(n); + DoNotOptimize(m); + DoNotOptimize(k); + DoNotOptimize(L::Partial(n, m, k).template Offset<3>()); + } +} + +template +size_t AllocSize(size_t x); + +template <> +size_t AllocSize(size_t x) { + constexpr size_t o = + Layout::Partial(3, 5, 7) + .template Offset(); + return o + sizeof(Int128) * x; +} + +template <> +size_t AllocSize(size_t x) { + constexpr size_t o = + Layout::Partial(3, 5, 7) + .template Offset(); + return o + sizeof(int8_t) * x; +} + +// This benchmark provides the upper bound on performance for BM_AllocSize +template +void BM_AllocSizeHeadroom(benchmark::State& state) { + size_t x = 9; + ABSL_RAW_CHECK(AllocSize(x) == Size, "Invalid size"); + for (auto _ : state) { + DoNotOptimize(x); + DoNotOptimize(AllocSize(x)); + } +} + +template +void BM_AllocSizeStatic(benchmark::State& state) { + using L = typename Layout::template WithStaticSizes<3, 5, 7>; + size_t x = 9; + ABSL_RAW_CHECK(L(x).AllocSize() == Size, "Invalid offset"); + for (auto _ : state) { + DoNotOptimize(x); + DoNotOptimize(L(x).AllocSize()); + } +} + +template +void BM_AllocSize(benchmark::State& state) { + using L = Layout; + size_t n = 3; + size_t m = 5; + size_t k = 7; + size_t x = 9; + ABSL_RAW_CHECK(L(n, m, k, x).AllocSize() == Size, "Invalid offset"); + for (auto _ : state) { + DoNotOptimize(n); + DoNotOptimize(m); + DoNotOptimize(k); + DoNotOptimize(x); + DoNotOptimize(L(n, m, k, x).AllocSize()); + } +} + +template +void BM_AllocSizeIndirect(benchmark::State& state) { + using L = Layout; + auto l = L(3, 5, 7, 9); + ABSL_RAW_CHECK(l.AllocSize() == Size, "Invalid offset"); + for (auto _ : state) { + DoNotOptimize(l); + DoNotOptimize(l.AllocSize()); + } +} + +// Run all benchmarks in two modes: +// +// Layout with padding: int8_t[3], int16_t[5], int32_t[7], Int128[?]. +// Layout without padding: Int128[3], int32_t[5], int16_t[7], int8_t[?]. + +#define OFFSET_BENCHMARK(NAME, OFFSET, T1, T2, T3, T4) \ + auto& NAME##_##OFFSET##_##T1##_##T2##_##T3##_##T4 = \ + NAME; \ + BENCHMARK(NAME##_##OFFSET##_##T1##_##T2##_##T3##_##T4) + +OFFSET_BENCHMARK(BM_OffsetConstantHeadroom, 48, int8_t, int16_t, int32_t, + Int128); +OFFSET_BENCHMARK(BM_OffsetConstantStatic, 48, int8_t, int16_t, int32_t, Int128); +OFFSET_BENCHMARK(BM_OffsetConstant, 48, int8_t, int16_t, int32_t, Int128); +OFFSET_BENCHMARK(BM_OffsetConstantIndirect, 48, int8_t, int16_t, int32_t, + Int128); + +OFFSET_BENCHMARK(BM_OffsetConstantHeadroom, 82, Int128, int32_t, int16_t, + int8_t); +OFFSET_BENCHMARK(BM_OffsetConstantStatic, 82, Int128, int32_t, int16_t, int8_t); +OFFSET_BENCHMARK(BM_OffsetConstant, 82, Int128, int32_t, int16_t, int8_t); +OFFSET_BENCHMARK(BM_OffsetConstantIndirect, 82, Int128, int32_t, int16_t, + int8_t); + +OFFSET_BENCHMARK(BM_OffsetPartialHeadroom, 48, int8_t, int16_t, int32_t, + Int128); +OFFSET_BENCHMARK(BM_OffsetPartialStatic, 48, int8_t, int16_t, int32_t, Int128); +OFFSET_BENCHMARK(BM_OffsetPartial, 48, int8_t, int16_t, int32_t, Int128); + +OFFSET_BENCHMARK(BM_OffsetPartialHeadroom, 82, Int128, int32_t, int16_t, + int8_t); +OFFSET_BENCHMARK(BM_OffsetPartialStatic, 82, Int128, int32_t, int16_t, int8_t); +OFFSET_BENCHMARK(BM_OffsetPartial, 82, Int128, int32_t, int16_t, int8_t); + +OFFSET_BENCHMARK(BM_OffsetVariableHeadroom, 48, int8_t, int16_t, int32_t, + Int128); +OFFSET_BENCHMARK(BM_OffsetVariable, 48, int8_t, int16_t, int32_t, Int128); + +OFFSET_BENCHMARK(BM_OffsetVariableHeadroom, 82, Int128, int32_t, int16_t, + int8_t); +OFFSET_BENCHMARK(BM_OffsetVariable, 82, Int128, int32_t, int16_t, int8_t); + +OFFSET_BENCHMARK(BM_AllocSizeHeadroom, 192, int8_t, int16_t, int32_t, Int128); +OFFSET_BENCHMARK(BM_AllocSizeStatic, 192, int8_t, int16_t, int32_t, Int128); +OFFSET_BENCHMARK(BM_AllocSize, 192, int8_t, int16_t, int32_t, Int128); +OFFSET_BENCHMARK(BM_AllocSizeIndirect, 192, int8_t, int16_t, int32_t, Int128); + +OFFSET_BENCHMARK(BM_AllocSizeHeadroom, 91, Int128, int32_t, int16_t, int8_t); +OFFSET_BENCHMARK(BM_AllocSizeStatic, 91, Int128, int32_t, int16_t, int8_t); +OFFSET_BENCHMARK(BM_AllocSize, 91, Int128, int32_t, int16_t, int8_t); +OFFSET_BENCHMARK(BM_AllocSizeIndirect, 91, Int128, int32_t, int16_t, int8_t); + +} // namespace +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/internal/layout_test.cc b/absl/container/internal/layout_test.cc new file mode 100644 index 0000000..47fc9f3 --- /dev/null +++ b/absl/container/internal/layout_test.cc @@ -0,0 +1,2034 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/internal/layout.h" + +// We need ::max_align_t because some libstdc++ versions don't provide +// std::max_align_t +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/config.h" +#include "absl/log/check.h" +#include "absl/types/span.h" +#include "absl/utility/utility.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace { + +using ::absl::Span; +using ::testing::ElementsAre; + +size_t Distance(const void* from, const void* to) { + CHECK_LE(from, to) << "Distance must be non-negative"; + return static_cast(to) - static_cast(from); +} + +template +Expected Type(Actual val) { + static_assert(std::is_same(), ""); + return val; +} + +// Helper classes to test different size and alignments. +struct alignas(8) Int128 { + uint64_t a, b; + friend bool operator==(Int128 lhs, Int128 rhs) { + return std::tie(lhs.a, lhs.b) == std::tie(rhs.a, rhs.b); + } + + static std::string Name() { + return internal_layout::adl_barrier::TypeName(); + } +}; + +// int64_t is *not* 8-byte aligned on all platforms! +struct alignas(8) Int64 { + int64_t a; + friend bool operator==(Int64 lhs, Int64 rhs) { return lhs.a == rhs.a; } +}; + +// Properties of types that this test relies on. +static_assert(sizeof(int8_t) == 1, ""); +static_assert(alignof(int8_t) == 1, ""); +static_assert(sizeof(int16_t) == 2, ""); +static_assert(alignof(int16_t) == 2, ""); +static_assert(sizeof(int32_t) == 4, ""); +static_assert(alignof(int32_t) == 4, ""); +static_assert(sizeof(Int64) == 8, ""); +static_assert(alignof(Int64) == 8, ""); +static_assert(sizeof(Int128) == 16, ""); +static_assert(alignof(Int128) == 8, ""); + +template +void SameType() { + static_assert(std::is_same(), ""); +} + +TEST(Layout, ElementType) { + { + using L = Layout; + SameType>(); + SameType>(); + SameType>(); + } + { + using L = Layout; + SameType>(); + SameType>(); + SameType>(); + SameType>(); + SameType>(); + SameType>(); + } + { + using L = Layout; + SameType>(); + SameType>(); + SameType>(); + SameType>(); + SameType>(); + SameType>(); + SameType>(); + SameType>(); + SameType>(); + SameType>(); + SameType>(); + SameType>(); + } +} + +TEST(Layout, ElementTypes) { + { + using L = Layout; + SameType, L::ElementTypes>(); + SameType, decltype(L::Partial())::ElementTypes>(); + SameType, decltype(L::Partial(0))::ElementTypes>(); + } + { + using L = Layout; + SameType, L::ElementTypes>(); + SameType, + decltype(L::Partial())::ElementTypes>(); + SameType, + decltype(L::Partial(0))::ElementTypes>(); + } + { + using L = Layout; + SameType, L::ElementTypes>(); + SameType, + decltype(L::Partial())::ElementTypes>(); + SameType, + decltype(L::Partial(0))::ElementTypes>(); + SameType, + decltype(L::Partial(0, 0))::ElementTypes>(); + SameType, + decltype(L::Partial(0, 0, 0))::ElementTypes>(); + } +} + +TEST(Layout, OffsetByIndex) { + { + using L = Layout; + EXPECT_EQ(0, L::Partial().Offset<0>()); + EXPECT_EQ(0, L::Partial(3).Offset<0>()); + EXPECT_EQ(0, L(3).Offset<0>()); + } + { + using L = Layout; + EXPECT_EQ(0, L::Partial().Offset<0>()); + EXPECT_EQ(0, L::Partial(3).Offset<0>()); + EXPECT_EQ(12, L::Partial(3).Offset<1>()); + EXPECT_EQ(0, L::Partial(3, 5).Offset<0>()); + EXPECT_EQ(12, L::Partial(3, 5).Offset<1>()); + EXPECT_EQ(0, L(3, 5).Offset<0>()); + EXPECT_EQ(12, L(3, 5).Offset<1>()); + } + { + using L = Layout; + EXPECT_EQ(0, L::Partial().Offset<0>()); + EXPECT_EQ(0, L::Partial(0).Offset<0>()); + EXPECT_EQ(0, L::Partial(0).Offset<1>()); + EXPECT_EQ(0, L::Partial(1).Offset<0>()); + EXPECT_EQ(4, L::Partial(1).Offset<1>()); + EXPECT_EQ(0, L::Partial(5).Offset<0>()); + EXPECT_EQ(8, L::Partial(5).Offset<1>()); + EXPECT_EQ(0, L::Partial(0, 0).Offset<0>()); + EXPECT_EQ(0, L::Partial(0, 0).Offset<1>()); + EXPECT_EQ(0, L::Partial(0, 0).Offset<2>()); + EXPECT_EQ(0, L::Partial(1, 0).Offset<0>()); + EXPECT_EQ(4, L::Partial(1, 0).Offset<1>()); + EXPECT_EQ(8, L::Partial(1, 0).Offset<2>()); + EXPECT_EQ(0, L::Partial(5, 3).Offset<0>()); + EXPECT_EQ(8, L::Partial(5, 3).Offset<1>()); + EXPECT_EQ(24, L::Partial(5, 3).Offset<2>()); + EXPECT_EQ(0, L::Partial(0, 0, 0).Offset<0>()); + EXPECT_EQ(0, L::Partial(0, 0, 0).Offset<1>()); + EXPECT_EQ(0, L::Partial(0, 0, 0).Offset<2>()); + EXPECT_EQ(0, L::Partial(1, 0, 0).Offset<0>()); + EXPECT_EQ(4, L::Partial(1, 0, 0).Offset<1>()); + EXPECT_EQ(8, L::Partial(1, 0, 0).Offset<2>()); + EXPECT_EQ(0, L::Partial(5, 3, 1).Offset<0>()); + EXPECT_EQ(24, L::Partial(5, 3, 1).Offset<2>()); + EXPECT_EQ(8, L::Partial(5, 3, 1).Offset<1>()); + EXPECT_EQ(0, L(5, 3, 1).Offset<0>()); + EXPECT_EQ(24, L(5, 3, 1).Offset<2>()); + EXPECT_EQ(8, L(5, 3, 1).Offset<1>()); + } +} + +TEST(Layout, OffsetByType) { + { + using L = Layout; + EXPECT_EQ(0, L::Partial().Offset()); + EXPECT_EQ(0, L::Partial(3).Offset()); + EXPECT_EQ(0, L(3).Offset()); + } + { + using L = Layout; + EXPECT_EQ(0, L::Partial().Offset()); + EXPECT_EQ(0, L::Partial(0).Offset()); + EXPECT_EQ(0, L::Partial(0).Offset()); + EXPECT_EQ(0, L::Partial(1).Offset()); + EXPECT_EQ(4, L::Partial(1).Offset()); + EXPECT_EQ(0, L::Partial(5).Offset()); + EXPECT_EQ(8, L::Partial(5).Offset()); + EXPECT_EQ(0, L::Partial(0, 0).Offset()); + EXPECT_EQ(0, L::Partial(0, 0).Offset()); + EXPECT_EQ(0, L::Partial(0, 0).Offset()); + EXPECT_EQ(0, L::Partial(1, 0).Offset()); + EXPECT_EQ(4, L::Partial(1, 0).Offset()); + EXPECT_EQ(8, L::Partial(1, 0).Offset()); + EXPECT_EQ(0, L::Partial(5, 3).Offset()); + EXPECT_EQ(8, L::Partial(5, 3).Offset()); + EXPECT_EQ(24, L::Partial(5, 3).Offset()); + EXPECT_EQ(0, L::Partial(0, 0, 0).Offset()); + EXPECT_EQ(0, L::Partial(0, 0, 0).Offset()); + EXPECT_EQ(0, L::Partial(0, 0, 0).Offset()); + EXPECT_EQ(0, L::Partial(1, 0, 0).Offset()); + EXPECT_EQ(4, L::Partial(1, 0, 0).Offset()); + EXPECT_EQ(8, L::Partial(1, 0, 0).Offset()); + EXPECT_EQ(0, L::Partial(5, 3, 1).Offset()); + EXPECT_EQ(24, L::Partial(5, 3, 1).Offset()); + EXPECT_EQ(8, L::Partial(5, 3, 1).Offset()); + EXPECT_EQ(0, L(5, 3, 1).Offset()); + EXPECT_EQ(24, L(5, 3, 1).Offset()); + EXPECT_EQ(8, L(5, 3, 1).Offset()); + } +} + +TEST(Layout, Offsets) { + { + using L = Layout; + EXPECT_THAT(L::Partial().Offsets(), ElementsAre(0)); + EXPECT_THAT(L::Partial(3).Offsets(), ElementsAre(0)); + EXPECT_THAT(L(3).Offsets(), ElementsAre(0)); + } + { + using L = Layout; + EXPECT_THAT(L::Partial().Offsets(), ElementsAre(0)); + EXPECT_THAT(L::Partial(3).Offsets(), ElementsAre(0, 12)); + EXPECT_THAT(L::Partial(3, 5).Offsets(), ElementsAre(0, 12)); + EXPECT_THAT(L(3, 5).Offsets(), ElementsAre(0, 12)); + } + { + using L = Layout; + EXPECT_THAT(L::Partial().Offsets(), ElementsAre(0)); + EXPECT_THAT(L::Partial(1).Offsets(), ElementsAre(0, 4)); + EXPECT_THAT(L::Partial(5).Offsets(), ElementsAre(0, 8)); + EXPECT_THAT(L::Partial(0, 0).Offsets(), ElementsAre(0, 0, 0)); + EXPECT_THAT(L::Partial(1, 0).Offsets(), ElementsAre(0, 4, 8)); + EXPECT_THAT(L::Partial(5, 3).Offsets(), ElementsAre(0, 8, 24)); + EXPECT_THAT(L::Partial(0, 0, 0).Offsets(), ElementsAre(0, 0, 0)); + EXPECT_THAT(L::Partial(1, 0, 0).Offsets(), ElementsAre(0, 4, 8)); + EXPECT_THAT(L::Partial(5, 3, 1).Offsets(), ElementsAre(0, 8, 24)); + EXPECT_THAT(L(5, 3, 1).Offsets(), ElementsAre(0, 8, 24)); + } +} + +TEST(Layout, StaticOffsets) { + using L = Layout; + { + using SL = L::WithStaticSizes<>; + EXPECT_THAT(SL::Partial().Offsets(), ElementsAre(0)); + EXPECT_THAT(SL::Partial(5).Offsets(), ElementsAre(0, 8)); + EXPECT_THAT(SL::Partial(5, 3, 1).Offsets(), ElementsAre(0, 8, 24)); + EXPECT_THAT(SL(5, 3, 1).Offsets(), ElementsAre(0, 8, 24)); + } + { + using SL = L::WithStaticSizes<5>; + EXPECT_THAT(SL::Partial().Offsets(), ElementsAre(0, 8)); + EXPECT_THAT(SL::Partial(3).Offsets(), ElementsAre(0, 8, 24)); + EXPECT_THAT(SL::Partial(3, 1).Offsets(), ElementsAre(0, 8, 24)); + EXPECT_THAT(SL(3, 1).Offsets(), ElementsAre(0, 8, 24)); + } + { + using SL = L::WithStaticSizes<5, 3>; + EXPECT_THAT(SL::Partial().Offsets(), ElementsAre(0, 8, 24)); + EXPECT_THAT(SL::Partial(1).Offsets(), ElementsAre(0, 8, 24)); + EXPECT_THAT(SL(1).Offsets(), ElementsAre(0, 8, 24)); + } + { + using SL = L::WithStaticSizes<5, 3, 1>; + EXPECT_THAT(SL::Partial().Offsets(), ElementsAre(0, 8, 24)); + EXPECT_THAT(SL().Offsets(), ElementsAre(0, 8, 24)); + } +} + +TEST(Layout, AllocSize) { + { + using L = Layout; + EXPECT_EQ(0, L::Partial(0).AllocSize()); + EXPECT_EQ(12, L::Partial(3).AllocSize()); + EXPECT_EQ(12, L(3).AllocSize()); + } + { + using L = Layout; + EXPECT_EQ(32, L::Partial(3, 5).AllocSize()); + EXPECT_EQ(32, L(3, 5).AllocSize()); + } + { + using L = Layout; + EXPECT_EQ(0, L::Partial(0, 0, 0).AllocSize()); + EXPECT_EQ(8, L::Partial(1, 0, 0).AllocSize()); + EXPECT_EQ(8, L::Partial(0, 1, 0).AllocSize()); + EXPECT_EQ(16, L::Partial(0, 0, 1).AllocSize()); + EXPECT_EQ(24, L::Partial(1, 1, 1).AllocSize()); + EXPECT_EQ(136, L::Partial(3, 5, 7).AllocSize()); + EXPECT_EQ(136, L(3, 5, 7).AllocSize()); + } +} + +TEST(Layout, StaticAllocSize) { + using L = Layout; + { + using SL = L::WithStaticSizes<>; + EXPECT_EQ(136, SL::Partial(3, 5, 7).AllocSize()); + EXPECT_EQ(136, SL(3, 5, 7).AllocSize()); + } + { + using SL = L::WithStaticSizes<3>; + EXPECT_EQ(136, SL::Partial(5, 7).AllocSize()); + EXPECT_EQ(136, SL(5, 7).AllocSize()); + } + { + using SL = L::WithStaticSizes<3, 5>; + EXPECT_EQ(136, SL::Partial(7).AllocSize()); + EXPECT_EQ(136, SL(7).AllocSize()); + } + { + using SL = L::WithStaticSizes<3, 5, 7>; + EXPECT_EQ(136, SL::Partial().AllocSize()); + EXPECT_EQ(136, SL().AllocSize()); + } +} + +TEST(Layout, SizeByIndex) { + { + using L = Layout; + EXPECT_EQ(0, L::Partial(0).Size<0>()); + EXPECT_EQ(3, L::Partial(3).Size<0>()); + EXPECT_EQ(3, L(3).Size<0>()); + } + { + using L = Layout; + EXPECT_EQ(0, L::Partial(0).Size<0>()); + EXPECT_EQ(3, L::Partial(3).Size<0>()); + EXPECT_EQ(3, L::Partial(3, 5).Size<0>()); + EXPECT_EQ(5, L::Partial(3, 5).Size<1>()); + EXPECT_EQ(3, L(3, 5).Size<0>()); + EXPECT_EQ(5, L(3, 5).Size<1>()); + } + { + using L = Layout; + EXPECT_EQ(3, L::Partial(3).Size<0>()); + EXPECT_EQ(3, L::Partial(3, 5).Size<0>()); + EXPECT_EQ(5, L::Partial(3, 5).Size<1>()); + EXPECT_EQ(3, L::Partial(3, 5, 7).Size<0>()); + EXPECT_EQ(5, L::Partial(3, 5, 7).Size<1>()); + EXPECT_EQ(7, L::Partial(3, 5, 7).Size<2>()); + EXPECT_EQ(3, L(3, 5, 7).Size<0>()); + EXPECT_EQ(5, L(3, 5, 7).Size<1>()); + EXPECT_EQ(7, L(3, 5, 7).Size<2>()); + } +} + +TEST(Layout, SizeByType) { + { + using L = Layout; + EXPECT_EQ(0, L::Partial(0).Size()); + EXPECT_EQ(3, L::Partial(3).Size()); + EXPECT_EQ(3, L(3).Size()); + } + { + using L = Layout; + EXPECT_EQ(3, L::Partial(3).Size()); + EXPECT_EQ(3, L::Partial(3, 5).Size()); + EXPECT_EQ(5, L::Partial(3, 5).Size()); + EXPECT_EQ(3, L::Partial(3, 5, 7).Size()); + EXPECT_EQ(5, L::Partial(3, 5, 7).Size()); + EXPECT_EQ(7, L::Partial(3, 5, 7).Size()); + EXPECT_EQ(3, L(3, 5, 7).Size()); + EXPECT_EQ(5, L(3, 5, 7).Size()); + EXPECT_EQ(7, L(3, 5, 7).Size()); + } +} + +TEST(Layout, Sizes) { + { + using L = Layout; + EXPECT_THAT(L::Partial().Sizes(), ElementsAre()); + EXPECT_THAT(L::Partial(3).Sizes(), ElementsAre(3)); + EXPECT_THAT(L(3).Sizes(), ElementsAre(3)); + } + { + using L = Layout; + EXPECT_THAT(L::Partial().Sizes(), ElementsAre()); + EXPECT_THAT(L::Partial(3).Sizes(), ElementsAre(3)); + EXPECT_THAT(L::Partial(3, 5).Sizes(), ElementsAre(3, 5)); + EXPECT_THAT(L(3, 5).Sizes(), ElementsAre(3, 5)); + } + { + using L = Layout; + EXPECT_THAT(L::Partial().Sizes(), ElementsAre()); + EXPECT_THAT(L::Partial(3).Sizes(), ElementsAre(3)); + EXPECT_THAT(L::Partial(3, 5).Sizes(), ElementsAre(3, 5)); + EXPECT_THAT(L::Partial(3, 5, 7).Sizes(), ElementsAre(3, 5, 7)); + EXPECT_THAT(L(3, 5, 7).Sizes(), ElementsAre(3, 5, 7)); + } +} + +TEST(Layout, StaticSize) { + using L = Layout; + { + using SL = L::WithStaticSizes<>; + EXPECT_THAT(SL::Partial().Sizes(), ElementsAre()); + EXPECT_THAT(SL::Partial(3).Size<0>(), 3); + EXPECT_THAT(SL::Partial(3).Size(), 3); + EXPECT_THAT(SL::Partial(3).Sizes(), ElementsAre(3)); + EXPECT_THAT(SL::Partial(3, 5, 7).Size<0>(), 3); + EXPECT_THAT(SL::Partial(3, 5, 7).Size(), 3); + EXPECT_THAT(SL::Partial(3, 5, 7).Size<2>(), 7); + EXPECT_THAT(SL::Partial(3, 5, 7).Size(), 7); + EXPECT_THAT(SL::Partial(3, 5, 7).Sizes(), ElementsAre(3, 5, 7)); + EXPECT_THAT(SL(3, 5, 7).Size<0>(), 3); + EXPECT_THAT(SL(3, 5, 7).Size(), 3); + EXPECT_THAT(SL(3, 5, 7).Size<2>(), 7); + EXPECT_THAT(SL(3, 5, 7).Size(), 7); + EXPECT_THAT(SL(3, 5, 7).Sizes(), ElementsAre(3, 5, 7)); + } +} + +TEST(Layout, PointerByIndex) { + alignas(max_align_t) const unsigned char p[100] = {0}; + { + using L = Layout; + EXPECT_EQ(0, Distance(p, Type(L::Partial().Pointer<0>(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(3).Pointer<0>(p)))); + EXPECT_EQ(0, Distance(p, Type(L(3).Pointer<0>(p)))); + } + { + using L = Layout; + EXPECT_EQ(0, Distance(p, Type(L::Partial().Pointer<0>(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(3).Pointer<0>(p)))); + EXPECT_EQ(12, + Distance(p, Type(L::Partial(3).Pointer<1>(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(3, 5).Pointer<0>(p)))); + EXPECT_EQ( + 12, Distance(p, Type(L::Partial(3, 5).Pointer<1>(p)))); + EXPECT_EQ(0, Distance(p, Type(L(3, 5).Pointer<0>(p)))); + EXPECT_EQ(12, Distance(p, Type(L(3, 5).Pointer<1>(p)))); + } + { + using L = Layout; + EXPECT_EQ(0, Distance(p, Type(L::Partial().Pointer<0>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(0).Pointer<0>(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(0).Pointer<1>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(1).Pointer<0>(p)))); + EXPECT_EQ(4, + Distance(p, Type(L::Partial(1).Pointer<1>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(5).Pointer<0>(p)))); + EXPECT_EQ(8, + Distance(p, Type(L::Partial(5).Pointer<1>(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(0, 0).Pointer<0>(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(0, 0).Pointer<1>(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(0, 0).Pointer<2>(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(1, 0).Pointer<0>(p)))); + EXPECT_EQ( + 4, Distance(p, Type(L::Partial(1, 0).Pointer<1>(p)))); + EXPECT_EQ(8, + Distance(p, Type(L::Partial(1, 0).Pointer<2>(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(5, 3).Pointer<0>(p)))); + EXPECT_EQ( + 8, Distance(p, Type(L::Partial(5, 3).Pointer<1>(p)))); + EXPECT_EQ(24, + Distance(p, Type(L::Partial(5, 3).Pointer<2>(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(0, 0, 0).Pointer<0>(p)))); + EXPECT_EQ( + 0, + Distance(p, Type(L::Partial(0, 0, 0).Pointer<1>(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(0, 0, 0).Pointer<2>(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(1, 0, 0).Pointer<0>(p)))); + EXPECT_EQ( + 4, + Distance(p, Type(L::Partial(1, 0, 0).Pointer<1>(p)))); + EXPECT_EQ( + 8, Distance(p, Type(L::Partial(1, 0, 0).Pointer<2>(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(5, 3, 1).Pointer<0>(p)))); + EXPECT_EQ( + 24, + Distance(p, Type(L::Partial(5, 3, 1).Pointer<2>(p)))); + EXPECT_EQ( + 8, + Distance(p, Type(L::Partial(5, 3, 1).Pointer<1>(p)))); + EXPECT_EQ(0, Distance(p, Type(L(5, 3, 1).Pointer<0>(p)))); + EXPECT_EQ(24, Distance(p, Type(L(5, 3, 1).Pointer<2>(p)))); + EXPECT_EQ(8, Distance(p, Type(L(5, 3, 1).Pointer<1>(p)))); + } +} + +TEST(Layout, PointerByType) { + alignas(max_align_t) const unsigned char p[100] = {0}; + { + using L = Layout; + EXPECT_EQ( + 0, Distance(p, Type(L::Partial().Pointer(p)))); + EXPECT_EQ( + 0, + Distance(p, Type(L::Partial(3).Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type(L(3).Pointer(p)))); + } + { + using L = Layout; + EXPECT_EQ( + 0, Distance(p, Type(L::Partial().Pointer(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(0).Pointer(p)))); + EXPECT_EQ( + 0, + Distance(p, Type(L::Partial(0).Pointer(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(1).Pointer(p)))); + EXPECT_EQ( + 4, + Distance(p, Type(L::Partial(1).Pointer(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(5).Pointer(p)))); + EXPECT_EQ( + 8, + Distance(p, Type(L::Partial(5).Pointer(p)))); + EXPECT_EQ( + 0, + Distance(p, Type(L::Partial(0, 0).Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type( + L::Partial(0, 0).Pointer(p)))); + EXPECT_EQ( + 0, + Distance(p, Type(L::Partial(0, 0).Pointer(p)))); + EXPECT_EQ( + 0, + Distance(p, Type(L::Partial(1, 0).Pointer(p)))); + EXPECT_EQ(4, Distance(p, Type( + L::Partial(1, 0).Pointer(p)))); + EXPECT_EQ( + 8, + Distance(p, Type(L::Partial(1, 0).Pointer(p)))); + EXPECT_EQ( + 0, + Distance(p, Type(L::Partial(5, 3).Pointer(p)))); + EXPECT_EQ(8, Distance(p, Type( + L::Partial(5, 3).Pointer(p)))); + EXPECT_EQ( + 24, + Distance(p, Type(L::Partial(5, 3).Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type( + L::Partial(0, 0, 0).Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type( + L::Partial(0, 0, 0).Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type( + L::Partial(0, 0, 0).Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type( + L::Partial(1, 0, 0).Pointer(p)))); + EXPECT_EQ(4, Distance(p, Type( + L::Partial(1, 0, 0).Pointer(p)))); + EXPECT_EQ(8, Distance(p, Type( + L::Partial(1, 0, 0).Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type( + L::Partial(5, 3, 1).Pointer(p)))); + EXPECT_EQ(24, Distance(p, Type( + L::Partial(5, 3, 1).Pointer(p)))); + EXPECT_EQ(8, Distance(p, Type( + L::Partial(5, 3, 1).Pointer(p)))); + EXPECT_EQ(24, + Distance(p, Type(L(5, 3, 1).Pointer(p)))); + EXPECT_EQ( + 8, Distance(p, Type(L(5, 3, 1).Pointer(p)))); + } +} + +TEST(Layout, MutablePointerByIndex) { + alignas(max_align_t) unsigned char p[100] = {0}; + { + using L = Layout; + EXPECT_EQ(0, Distance(p, Type(L::Partial().Pointer<0>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(3).Pointer<0>(p)))); + EXPECT_EQ(0, Distance(p, Type(L(3).Pointer<0>(p)))); + } + { + using L = Layout; + EXPECT_EQ(0, Distance(p, Type(L::Partial().Pointer<0>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(3).Pointer<0>(p)))); + EXPECT_EQ(12, Distance(p, Type(L::Partial(3).Pointer<1>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(3, 5).Pointer<0>(p)))); + EXPECT_EQ(12, Distance(p, Type(L::Partial(3, 5).Pointer<1>(p)))); + EXPECT_EQ(0, Distance(p, Type(L(3, 5).Pointer<0>(p)))); + EXPECT_EQ(12, Distance(p, Type(L(3, 5).Pointer<1>(p)))); + } + { + using L = Layout; + EXPECT_EQ(0, Distance(p, Type(L::Partial().Pointer<0>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(0).Pointer<0>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(0).Pointer<1>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(1).Pointer<0>(p)))); + EXPECT_EQ(4, Distance(p, Type(L::Partial(1).Pointer<1>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(5).Pointer<0>(p)))); + EXPECT_EQ(8, Distance(p, Type(L::Partial(5).Pointer<1>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(0, 0).Pointer<0>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(0, 0).Pointer<1>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(0, 0).Pointer<2>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(1, 0).Pointer<0>(p)))); + EXPECT_EQ(4, Distance(p, Type(L::Partial(1, 0).Pointer<1>(p)))); + EXPECT_EQ(8, Distance(p, Type(L::Partial(1, 0).Pointer<2>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(5, 3).Pointer<0>(p)))); + EXPECT_EQ(8, Distance(p, Type(L::Partial(5, 3).Pointer<1>(p)))); + EXPECT_EQ(24, Distance(p, Type(L::Partial(5, 3).Pointer<2>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(0, 0, 0).Pointer<0>(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(0, 0, 0).Pointer<1>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(0, 0, 0).Pointer<2>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(1, 0, 0).Pointer<0>(p)))); + EXPECT_EQ(4, + Distance(p, Type(L::Partial(1, 0, 0).Pointer<1>(p)))); + EXPECT_EQ(8, Distance(p, Type(L::Partial(1, 0, 0).Pointer<2>(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(5, 3, 1).Pointer<0>(p)))); + EXPECT_EQ(24, + Distance(p, Type(L::Partial(5, 3, 1).Pointer<2>(p)))); + EXPECT_EQ(8, + Distance(p, Type(L::Partial(5, 3, 1).Pointer<1>(p)))); + EXPECT_EQ(0, Distance(p, Type(L(5, 3, 1).Pointer<0>(p)))); + EXPECT_EQ(24, Distance(p, Type(L(5, 3, 1).Pointer<2>(p)))); + EXPECT_EQ(8, Distance(p, Type(L(5, 3, 1).Pointer<1>(p)))); + } +} + +TEST(Layout, MutablePointerByType) { + alignas(max_align_t) unsigned char p[100] = {0}; + { + using L = Layout; + EXPECT_EQ(0, Distance(p, Type(L::Partial().Pointer(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(3).Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type(L(3).Pointer(p)))); + } + { + using L = Layout; + EXPECT_EQ(0, Distance(p, Type(L::Partial().Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(0).Pointer(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(0).Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(1).Pointer(p)))); + EXPECT_EQ(4, + Distance(p, Type(L::Partial(1).Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type(L::Partial(5).Pointer(p)))); + EXPECT_EQ(8, + Distance(p, Type(L::Partial(5).Pointer(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(0, 0).Pointer(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(0, 0).Pointer(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(0, 0).Pointer(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(1, 0).Pointer(p)))); + EXPECT_EQ( + 4, Distance(p, Type(L::Partial(1, 0).Pointer(p)))); + EXPECT_EQ(8, + Distance(p, Type(L::Partial(1, 0).Pointer(p)))); + EXPECT_EQ(0, + Distance(p, Type(L::Partial(5, 3).Pointer(p)))); + EXPECT_EQ( + 8, Distance(p, Type(L::Partial(5, 3).Pointer(p)))); + EXPECT_EQ(24, + Distance(p, Type(L::Partial(5, 3).Pointer(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(0, 0, 0).Pointer(p)))); + EXPECT_EQ( + 0, + Distance(p, Type(L::Partial(0, 0, 0).Pointer(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(0, 0, 0).Pointer(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(1, 0, 0).Pointer(p)))); + EXPECT_EQ( + 4, + Distance(p, Type(L::Partial(1, 0, 0).Pointer(p)))); + EXPECT_EQ( + 8, Distance(p, Type(L::Partial(1, 0, 0).Pointer(p)))); + EXPECT_EQ( + 0, Distance(p, Type(L::Partial(5, 3, 1).Pointer(p)))); + EXPECT_EQ( + 24, Distance(p, Type(L::Partial(5, 3, 1).Pointer(p)))); + EXPECT_EQ( + 8, + Distance(p, Type(L::Partial(5, 3, 1).Pointer(p)))); + EXPECT_EQ(0, Distance(p, Type(L(5, 3, 1).Pointer(p)))); + EXPECT_EQ(24, Distance(p, Type(L(5, 3, 1).Pointer(p)))); + EXPECT_EQ(8, Distance(p, Type(L(5, 3, 1).Pointer(p)))); + } +} + +TEST(Layout, Pointers) { + alignas(max_align_t) const unsigned char p[100] = {0}; + using L = Layout; + { + const auto x = L::Partial(); + EXPECT_EQ(std::make_tuple(x.Pointer<0>(p)), + Type>(x.Pointers(p))); + } + { + const auto x = L::Partial(1); + EXPECT_EQ(std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p)), + (Type>(x.Pointers(p)))); + } + { + const auto x = L::Partial(1, 2); + EXPECT_EQ( + std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)), + (Type>( + x.Pointers(p)))); + } + { + const auto x = L::Partial(1, 2, 3); + EXPECT_EQ( + std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)), + (Type>( + x.Pointers(p)))); + } + { + const L x(1, 2, 3); + EXPECT_EQ( + std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)), + (Type>( + x.Pointers(p)))); + } +} + +TEST(Layout, MutablePointers) { + alignas(max_align_t) unsigned char p[100] = {0}; + using L = Layout; + { + const auto x = L::Partial(); + EXPECT_EQ(std::make_tuple(x.Pointer<0>(p)), + Type>(x.Pointers(p))); + } + { + const auto x = L::Partial(1); + EXPECT_EQ(std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p)), + (Type>(x.Pointers(p)))); + } + { + const auto x = L::Partial(1, 2); + EXPECT_EQ( + std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)), + (Type>(x.Pointers(p)))); + } + { + const auto x = L::Partial(1, 2, 3); + EXPECT_EQ( + std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)), + (Type>(x.Pointers(p)))); + } + { + const L x(1, 2, 3); + EXPECT_EQ( + std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)), + (Type>(x.Pointers(p)))); + } +} + +TEST(Layout, StaticPointers) { + alignas(max_align_t) const unsigned char p[100] = {0}; + using L = Layout; + { + const auto x = L::WithStaticSizes<>::Partial(); + EXPECT_EQ(std::make_tuple(x.Pointer<0>(p)), + Type>(x.Pointers(p))); + } + { + const auto x = L::WithStaticSizes<>::Partial(1); + EXPECT_EQ(std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p)), + (Type>(x.Pointers(p)))); + } + { + const auto x = L::WithStaticSizes<1>::Partial(); + EXPECT_EQ(std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p)), + (Type>(x.Pointers(p)))); + } + { + const auto x = L::WithStaticSizes<>::Partial(1, 2, 3); + EXPECT_EQ( + std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)), + (Type>( + x.Pointers(p)))); + } + { + const auto x = L::WithStaticSizes<1>::Partial(2, 3); + EXPECT_EQ( + std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)), + (Type>( + x.Pointers(p)))); + } + { + const auto x = L::WithStaticSizes<1, 2>::Partial(3); + EXPECT_EQ( + std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)), + (Type>( + x.Pointers(p)))); + } + { + const auto x = L::WithStaticSizes<1, 2, 3>::Partial(); + EXPECT_EQ( + std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)), + (Type>( + x.Pointers(p)))); + } + { + const L::WithStaticSizes<1, 2, 3> x; + EXPECT_EQ( + std::make_tuple(x.Pointer<0>(p), x.Pointer<1>(p), x.Pointer<2>(p)), + (Type>( + x.Pointers(p)))); + } +} + +TEST(Layout, SliceByIndexSize) { + alignas(max_align_t) const unsigned char p[100] = {0}; + { + using L = Layout; + EXPECT_EQ(0, L::Partial(0).Slice<0>(p).size()); + EXPECT_EQ(3, L::Partial(3).Slice<0>(p).size()); + EXPECT_EQ(3, L(3).Slice<0>(p).size()); + } + { + using L = Layout; + EXPECT_EQ(3, L::Partial(3).Slice<0>(p).size()); + EXPECT_EQ(5, L::Partial(3, 5).Slice<1>(p).size()); + EXPECT_EQ(5, L(3, 5).Slice<1>(p).size()); + } + { + using L = Layout; + EXPECT_EQ(3, L::Partial(3).Slice<0>(p).size()); + EXPECT_EQ(3, L::Partial(3, 5).Slice<0>(p).size()); + EXPECT_EQ(5, L::Partial(3, 5).Slice<1>(p).size()); + EXPECT_EQ(3, L::Partial(3, 5, 7).Slice<0>(p).size()); + EXPECT_EQ(5, L::Partial(3, 5, 7).Slice<1>(p).size()); + EXPECT_EQ(7, L::Partial(3, 5, 7).Slice<2>(p).size()); + EXPECT_EQ(3, L(3, 5, 7).Slice<0>(p).size()); + EXPECT_EQ(5, L(3, 5, 7).Slice<1>(p).size()); + EXPECT_EQ(7, L(3, 5, 7).Slice<2>(p).size()); + } +} + +TEST(Layout, SliceByTypeSize) { + alignas(max_align_t) const unsigned char p[100] = {0}; + { + using L = Layout; + EXPECT_EQ(0, L::Partial(0).Slice(p).size()); + EXPECT_EQ(3, L::Partial(3).Slice(p).size()); + EXPECT_EQ(3, L(3).Slice(p).size()); + } + { + using L = Layout; + EXPECT_EQ(3, L::Partial(3).Slice(p).size()); + EXPECT_EQ(3, L::Partial(3, 5).Slice(p).size()); + EXPECT_EQ(5, L::Partial(3, 5).Slice(p).size()); + EXPECT_EQ(3, L::Partial(3, 5, 7).Slice(p).size()); + EXPECT_EQ(5, L::Partial(3, 5, 7).Slice(p).size()); + EXPECT_EQ(7, L::Partial(3, 5, 7).Slice(p).size()); + EXPECT_EQ(3, L(3, 5, 7).Slice(p).size()); + EXPECT_EQ(5, L(3, 5, 7).Slice(p).size()); + EXPECT_EQ(7, L(3, 5, 7).Slice(p).size()); + } +} +TEST(Layout, MutableSliceByIndexSize) { + alignas(max_align_t) unsigned char p[100] = {0}; + { + using L = Layout; + EXPECT_EQ(0, L::Partial(0).Slice<0>(p).size()); + EXPECT_EQ(3, L::Partial(3).Slice<0>(p).size()); + EXPECT_EQ(3, L(3).Slice<0>(p).size()); + } + { + using L = Layout; + EXPECT_EQ(3, L::Partial(3).Slice<0>(p).size()); + EXPECT_EQ(5, L::Partial(3, 5).Slice<1>(p).size()); + EXPECT_EQ(5, L(3, 5).Slice<1>(p).size()); + } + { + using L = Layout; + EXPECT_EQ(3, L::Partial(3).Slice<0>(p).size()); + EXPECT_EQ(3, L::Partial(3, 5).Slice<0>(p).size()); + EXPECT_EQ(5, L::Partial(3, 5).Slice<1>(p).size()); + EXPECT_EQ(3, L::Partial(3, 5, 7).Slice<0>(p).size()); + EXPECT_EQ(5, L::Partial(3, 5, 7).Slice<1>(p).size()); + EXPECT_EQ(7, L::Partial(3, 5, 7).Slice<2>(p).size()); + EXPECT_EQ(3, L(3, 5, 7).Slice<0>(p).size()); + EXPECT_EQ(5, L(3, 5, 7).Slice<1>(p).size()); + EXPECT_EQ(7, L(3, 5, 7).Slice<2>(p).size()); + } +} + +TEST(Layout, MutableSliceByTypeSize) { + alignas(max_align_t) unsigned char p[100] = {0}; + { + using L = Layout; + EXPECT_EQ(0, L::Partial(0).Slice(p).size()); + EXPECT_EQ(3, L::Partial(3).Slice(p).size()); + EXPECT_EQ(3, L(3).Slice(p).size()); + } + { + using L = Layout; + EXPECT_EQ(3, L::Partial(3).Slice(p).size()); + EXPECT_EQ(3, L::Partial(3, 5).Slice(p).size()); + EXPECT_EQ(5, L::Partial(3, 5).Slice(p).size()); + EXPECT_EQ(3, L::Partial(3, 5, 7).Slice(p).size()); + EXPECT_EQ(5, L::Partial(3, 5, 7).Slice(p).size()); + EXPECT_EQ(7, L::Partial(3, 5, 7).Slice(p).size()); + EXPECT_EQ(3, L(3, 5, 7).Slice(p).size()); + EXPECT_EQ(5, L(3, 5, 7).Slice(p).size()); + EXPECT_EQ(7, L(3, 5, 7).Slice(p).size()); + } +} + +TEST(Layout, StaticSliceSize) { + alignas(max_align_t) const unsigned char cp[100] = {0}; + alignas(max_align_t) unsigned char p[100] = {0}; + using L = Layout; + using SL = L::WithStaticSizes<3, 5>; + + EXPECT_EQ(3, SL::Partial().Slice<0>(cp).size()); + EXPECT_EQ(3, SL::Partial().Slice(cp).size()); + EXPECT_EQ(3, SL::Partial(7).Slice<0>(cp).size()); + EXPECT_EQ(3, SL::Partial(7).Slice(cp).size()); + + EXPECT_EQ(5, SL::Partial().Slice<1>(cp).size()); + EXPECT_EQ(5, SL::Partial().Slice(cp).size()); + EXPECT_EQ(5, SL::Partial(7).Slice<1>(cp).size()); + EXPECT_EQ(5, SL::Partial(7).Slice(cp).size()); + + EXPECT_EQ(7, SL::Partial(7).Slice<2>(cp).size()); + EXPECT_EQ(7, SL::Partial(7).Slice(cp).size()); + + EXPECT_EQ(3, SL::Partial().Slice<0>(p).size()); + EXPECT_EQ(3, SL::Partial().Slice(p).size()); + EXPECT_EQ(3, SL::Partial(7).Slice<0>(p).size()); + EXPECT_EQ(3, SL::Partial(7).Slice(p).size()); + + EXPECT_EQ(5, SL::Partial().Slice<1>(p).size()); + EXPECT_EQ(5, SL::Partial().Slice(p).size()); + EXPECT_EQ(5, SL::Partial(7).Slice<1>(p).size()); + EXPECT_EQ(5, SL::Partial(7).Slice(p).size()); + + EXPECT_EQ(7, SL::Partial(7).Slice<2>(p).size()); + EXPECT_EQ(7, SL::Partial(7).Slice(p).size()); +} + +TEST(Layout, SliceByIndexData) { + alignas(max_align_t) const unsigned char p[100] = {0}; + { + using L = Layout; + EXPECT_EQ( + 0, Distance( + p, Type>(L::Partial(0).Slice<0>(p)).data())); + EXPECT_EQ( + 0, Distance( + p, Type>(L::Partial(3).Slice<0>(p)).data())); + EXPECT_EQ(0, + Distance(p, Type>(L(3).Slice<0>(p)).data())); + } + { + using L = Layout; + EXPECT_EQ( + 0, Distance( + p, Type>(L::Partial(3).Slice<0>(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, Type>(L::Partial(3, 5).Slice<0>(p)).data())); + EXPECT_EQ( + 12, + Distance( + p, Type>(L::Partial(3, 5).Slice<1>(p)).data())); + EXPECT_EQ( + 0, Distance(p, Type>(L(3, 5).Slice<0>(p)).data())); + EXPECT_EQ( + 12, Distance(p, Type>(L(3, 5).Slice<1>(p)).data())); + } + { + using L = Layout; + EXPECT_EQ( + 0, Distance( + p, Type>(L::Partial(0).Slice<0>(p)).data())); + EXPECT_EQ( + 0, Distance( + p, Type>(L::Partial(1).Slice<0>(p)).data())); + EXPECT_EQ( + 0, Distance( + p, Type>(L::Partial(5).Slice<0>(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, Type>(L::Partial(0, 0).Slice<0>(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, Type>(L::Partial(0, 0).Slice<1>(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, Type>(L::Partial(1, 0).Slice<0>(p)).data())); + EXPECT_EQ( + 4, + Distance( + p, Type>(L::Partial(1, 0).Slice<1>(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, Type>(L::Partial(5, 3).Slice<0>(p)).data())); + EXPECT_EQ( + 8, + Distance( + p, Type>(L::Partial(5, 3).Slice<1>(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(0, 0, 0).Slice<0>(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(0, 0, 0).Slice<1>(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(0, 0, 0).Slice<2>(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(1, 0, 0).Slice<0>(p)).data())); + EXPECT_EQ( + 4, + Distance( + p, + Type>(L::Partial(1, 0, 0).Slice<1>(p)).data())); + EXPECT_EQ( + 8, + Distance( + p, + Type>(L::Partial(1, 0, 0).Slice<2>(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(5, 3, 1).Slice<0>(p)).data())); + EXPECT_EQ( + 24, + Distance( + p, + Type>(L::Partial(5, 3, 1).Slice<2>(p)).data())); + EXPECT_EQ( + 8, + Distance( + p, + Type>(L::Partial(5, 3, 1).Slice<1>(p)).data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L(5, 3, 1).Slice<0>(p)).data())); + EXPECT_EQ( + 24, + Distance(p, Type>(L(5, 3, 1).Slice<2>(p)).data())); + EXPECT_EQ( + 8, + Distance(p, Type>(L(5, 3, 1).Slice<1>(p)).data())); + } +} + +TEST(Layout, SliceByTypeData) { + alignas(max_align_t) const unsigned char p[100] = {0}; + { + using L = Layout; + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(0).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(3).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L(3).Slice(p)).data())); + } + { + using L = Layout; + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(0).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(1).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(5).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L::Partial(0, 0).Slice(p)) + .data())); + EXPECT_EQ(0, Distance(p, Type>( + L::Partial(0, 0).Slice(p)) + .data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L::Partial(1, 0).Slice(p)) + .data())); + EXPECT_EQ(4, Distance(p, Type>( + L::Partial(1, 0).Slice(p)) + .data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L::Partial(5, 3).Slice(p)) + .data())); + EXPECT_EQ(8, Distance(p, Type>( + L::Partial(5, 3).Slice(p)) + .data())); + EXPECT_EQ(0, Distance(p, Type>( + L::Partial(0, 0, 0).Slice(p)) + .data())); + EXPECT_EQ(0, Distance(p, Type>( + L::Partial(0, 0, 0).Slice(p)) + .data())); + EXPECT_EQ(0, Distance(p, Type>( + L::Partial(0, 0, 0).Slice(p)) + .data())); + EXPECT_EQ(0, Distance(p, Type>( + L::Partial(1, 0, 0).Slice(p)) + .data())); + EXPECT_EQ(4, Distance(p, Type>( + L::Partial(1, 0, 0).Slice(p)) + .data())); + EXPECT_EQ(8, Distance(p, Type>( + L::Partial(1, 0, 0).Slice(p)) + .data())); + EXPECT_EQ(0, Distance(p, Type>( + L::Partial(5, 3, 1).Slice(p)) + .data())); + EXPECT_EQ(24, Distance(p, Type>( + L::Partial(5, 3, 1).Slice(p)) + .data())); + EXPECT_EQ(8, Distance(p, Type>( + L::Partial(5, 3, 1).Slice(p)) + .data())); + EXPECT_EQ( + 0, + Distance(p, + Type>(L(5, 3, 1).Slice(p)).data())); + EXPECT_EQ( + 24, + Distance(p, + Type>(L(5, 3, 1).Slice(p)).data())); + EXPECT_EQ( + 8, + Distance( + p, Type>(L(5, 3, 1).Slice(p)).data())); + } +} + +TEST(Layout, MutableSliceByIndexData) { + alignas(max_align_t) unsigned char p[100] = {0}; + { + using L = Layout; + EXPECT_EQ( + 0, Distance(p, Type>(L::Partial(0).Slice<0>(p)).data())); + EXPECT_EQ( + 0, Distance(p, Type>(L::Partial(3).Slice<0>(p)).data())); + EXPECT_EQ(0, Distance(p, Type>(L(3).Slice<0>(p)).data())); + } + { + using L = Layout; + EXPECT_EQ( + 0, Distance(p, Type>(L::Partial(3).Slice<0>(p)).data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L::Partial(3, 5).Slice<0>(p)).data())); + EXPECT_EQ( + 12, + Distance(p, Type>(L::Partial(3, 5).Slice<1>(p)).data())); + EXPECT_EQ(0, Distance(p, Type>(L(3, 5).Slice<0>(p)).data())); + EXPECT_EQ(12, Distance(p, Type>(L(3, 5).Slice<1>(p)).data())); + } + { + using L = Layout; + EXPECT_EQ( + 0, Distance(p, Type>(L::Partial(0).Slice<0>(p)).data())); + EXPECT_EQ( + 0, Distance(p, Type>(L::Partial(1).Slice<0>(p)).data())); + EXPECT_EQ( + 0, Distance(p, Type>(L::Partial(5).Slice<0>(p)).data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L::Partial(0, 0).Slice<0>(p)).data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L::Partial(0, 0).Slice<1>(p)).data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L::Partial(1, 0).Slice<0>(p)).data())); + EXPECT_EQ( + 4, + Distance(p, Type>(L::Partial(1, 0).Slice<1>(p)).data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L::Partial(5, 3).Slice<0>(p)).data())); + EXPECT_EQ( + 8, + Distance(p, Type>(L::Partial(5, 3).Slice<1>(p)).data())); + EXPECT_EQ( + 0, Distance( + p, Type>(L::Partial(0, 0, 0).Slice<0>(p)).data())); + EXPECT_EQ( + 0, Distance( + p, Type>(L::Partial(0, 0, 0).Slice<1>(p)).data())); + EXPECT_EQ( + 0, Distance( + p, Type>(L::Partial(0, 0, 0).Slice<2>(p)).data())); + EXPECT_EQ( + 0, Distance( + p, Type>(L::Partial(1, 0, 0).Slice<0>(p)).data())); + EXPECT_EQ( + 4, Distance( + p, Type>(L::Partial(1, 0, 0).Slice<1>(p)).data())); + EXPECT_EQ( + 8, Distance( + p, Type>(L::Partial(1, 0, 0).Slice<2>(p)).data())); + EXPECT_EQ( + 0, Distance( + p, Type>(L::Partial(5, 3, 1).Slice<0>(p)).data())); + EXPECT_EQ( + 24, Distance( + p, Type>(L::Partial(5, 3, 1).Slice<2>(p)).data())); + EXPECT_EQ( + 8, Distance( + p, Type>(L::Partial(5, 3, 1).Slice<1>(p)).data())); + EXPECT_EQ(0, + Distance(p, Type>(L(5, 3, 1).Slice<0>(p)).data())); + EXPECT_EQ(24, + Distance(p, Type>(L(5, 3, 1).Slice<2>(p)).data())); + EXPECT_EQ(8, + Distance(p, Type>(L(5, 3, 1).Slice<1>(p)).data())); + } +} + +TEST(Layout, MutableSliceByTypeData) { + alignas(max_align_t) unsigned char p[100] = {0}; + { + using L = Layout; + EXPECT_EQ( + 0, Distance( + p, Type>(L::Partial(0).Slice(p)).data())); + EXPECT_EQ( + 0, Distance( + p, Type>(L::Partial(3).Slice(p)).data())); + EXPECT_EQ(0, + Distance(p, Type>(L(3).Slice(p)).data())); + } + { + using L = Layout; + EXPECT_EQ( + 0, + Distance(p, Type>(L::Partial(0).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L::Partial(1).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance(p, Type>(L::Partial(5).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance(p, + Type>(L::Partial(0, 0).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, Type>(L::Partial(0, 0).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance(p, + Type>(L::Partial(1, 0).Slice(p)).data())); + EXPECT_EQ( + 4, + Distance( + p, Type>(L::Partial(1, 0).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance(p, + Type>(L::Partial(5, 3).Slice(p)).data())); + EXPECT_EQ( + 8, + Distance( + p, Type>(L::Partial(5, 3).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(0, 0, 0).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(0, 0, 0).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(0, 0, 0).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(1, 0, 0).Slice(p)).data())); + EXPECT_EQ( + 4, + Distance( + p, + Type>(L::Partial(1, 0, 0).Slice(p)).data())); + EXPECT_EQ( + 8, + Distance( + p, + Type>(L::Partial(1, 0, 0).Slice(p)).data())); + EXPECT_EQ( + 0, + Distance( + p, + Type>(L::Partial(5, 3, 1).Slice(p)).data())); + EXPECT_EQ( + 24, + Distance( + p, + Type>(L::Partial(5, 3, 1).Slice(p)).data())); + EXPECT_EQ( + 8, + Distance( + p, + Type>(L::Partial(5, 3, 1).Slice(p)).data())); + EXPECT_EQ( + 0, Distance(p, Type>(L(5, 3, 1).Slice(p)).data())); + EXPECT_EQ( + 24, + Distance(p, Type>(L(5, 3, 1).Slice(p)).data())); + EXPECT_EQ( + 8, + Distance(p, Type>(L(5, 3, 1).Slice(p)).data())); + } +} + +TEST(Layout, StaticSliceData) { + alignas(max_align_t) const unsigned char cp[100] = {0}; + alignas(max_align_t) unsigned char p[100] = {0}; + using L = Layout; + using SL = L::WithStaticSizes<3, 5>; + + EXPECT_EQ(0, Distance(cp, SL::Partial().Slice<0>(cp).data())); + EXPECT_EQ(0, Distance(cp, SL::Partial().Slice(cp).data())); + EXPECT_EQ(0, Distance(cp, SL::Partial(7).Slice<0>(cp).data())); + EXPECT_EQ(0, Distance(cp, SL::Partial(7).Slice(cp).data())); + + EXPECT_EQ(4, Distance(cp, SL::Partial().Slice<1>(cp).data())); + EXPECT_EQ(4, Distance(cp, SL::Partial().Slice(cp).data())); + EXPECT_EQ(4, Distance(cp, SL::Partial(7).Slice<1>(cp).data())); + EXPECT_EQ(4, Distance(cp, SL::Partial(7).Slice(cp).data())); + + EXPECT_EQ(24, Distance(cp, SL::Partial(7).Slice<2>(cp).data())); + EXPECT_EQ(24, Distance(cp, SL::Partial(7).Slice(cp).data())); + + EXPECT_EQ(0, Distance(p, SL::Partial().Slice<0>(p).data())); + EXPECT_EQ(0, Distance(p, SL::Partial().Slice(p).data())); + EXPECT_EQ(0, Distance(p, SL::Partial(7).Slice<0>(p).data())); + EXPECT_EQ(0, Distance(p, SL::Partial(7).Slice(p).data())); + + EXPECT_EQ(4, Distance(p, SL::Partial().Slice<1>(p).data())); + EXPECT_EQ(4, Distance(p, SL::Partial().Slice(p).data())); + EXPECT_EQ(4, Distance(p, SL::Partial(7).Slice<1>(p).data())); + EXPECT_EQ(4, Distance(p, SL::Partial(7).Slice(p).data())); + + EXPECT_EQ(24, Distance(p, SL::Partial(7).Slice<2>(p).data())); + EXPECT_EQ(24, Distance(p, SL::Partial(7).Slice(p).data())); +} + +MATCHER_P(IsSameSlice, slice, "") { + return arg.size() == slice.size() && arg.data() == slice.data(); +} + +template +class TupleMatcher { + public: + explicit TupleMatcher(M... matchers) : matchers_(std::move(matchers)...) {} + + template + bool MatchAndExplain(const Tuple& p, + testing::MatchResultListener* /* listener */) const { + static_assert(std::tuple_size::value == sizeof...(M), ""); + return MatchAndExplainImpl( + p, absl::make_index_sequence::value>{}); + } + + // For the matcher concept. Left empty as we don't really need the diagnostics + // right now. + void DescribeTo(::std::ostream* os) const {} + void DescribeNegationTo(::std::ostream* os) const {} + + private: + template + bool MatchAndExplainImpl(const Tuple& p, absl::index_sequence) const { + // Using std::min as a simple variadic "and". + return std::min( + {true, testing::SafeMatcherCast< + const typename std::tuple_element::type&>( + std::get(matchers_)) + .Matches(std::get(p))...}); + } + + std::tuple matchers_; +}; + +template +testing::PolymorphicMatcher> Tuple(M... matchers) { + return testing::MakePolymorphicMatcher( + TupleMatcher(std::move(matchers)...)); +} + +TEST(Layout, Slices) { + alignas(max_align_t) const unsigned char p[100] = {0}; + using L = Layout; + { + const auto x = L::Partial(); + EXPECT_THAT(Type>(x.Slices(p)), Tuple()); + } + { + const auto x = L::Partial(1); + EXPECT_THAT(Type>>(x.Slices(p)), + Tuple(IsSameSlice(x.Slice<0>(p)))); + } + { + const auto x = L::Partial(1, 2); + EXPECT_THAT( + (Type, Span>>(x.Slices(p))), + Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)))); + } + { + const auto x = L::Partial(1, 2, 3); + EXPECT_THAT((Type, Span, + Span>>(x.Slices(p))), + Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)), + IsSameSlice(x.Slice<2>(p)))); + } + { + const L x(1, 2, 3); + EXPECT_THAT((Type, Span, + Span>>(x.Slices(p))), + Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)), + IsSameSlice(x.Slice<2>(p)))); + } +} + +TEST(Layout, MutableSlices) { + alignas(max_align_t) unsigned char p[100] = {0}; + using L = Layout; + { + const auto x = L::Partial(); + EXPECT_THAT(Type>(x.Slices(p)), Tuple()); + } + { + const auto x = L::Partial(1); + EXPECT_THAT(Type>>(x.Slices(p)), + Tuple(IsSameSlice(x.Slice<0>(p)))); + } + { + const auto x = L::Partial(1, 2); + EXPECT_THAT((Type, Span>>(x.Slices(p))), + Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)))); + } + { + const auto x = L::Partial(1, 2, 3); + EXPECT_THAT((Type, Span, Span>>( + x.Slices(p))), + Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)), + IsSameSlice(x.Slice<2>(p)))); + } + { + const L x(1, 2, 3); + EXPECT_THAT((Type, Span, Span>>( + x.Slices(p))), + Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)), + IsSameSlice(x.Slice<2>(p)))); + } +} + +TEST(Layout, StaticSlices) { + alignas(max_align_t) const unsigned char cp[100] = {0}; + alignas(max_align_t) unsigned char p[100] = {0}; + using SL = Layout::WithStaticSizes<1, 2>; + { + const auto x = SL::Partial(); + EXPECT_THAT( + (Type, Span>>( + x.Slices(cp))), + Tuple(IsSameSlice(x.Slice<0>(cp)), IsSameSlice(x.Slice<1>(cp)))); + EXPECT_THAT((Type, Span>>(x.Slices(p))), + Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)))); + } + { + const auto x = SL::Partial(3); + EXPECT_THAT((Type, Span, + Span>>(x.Slices(cp))), + Tuple(IsSameSlice(x.Slice<0>(cp)), IsSameSlice(x.Slice<1>(cp)), + IsSameSlice(x.Slice<2>(cp)))); + EXPECT_THAT((Type, Span, Span>>( + x.Slices(p))), + Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)), + IsSameSlice(x.Slice<2>(p)))); + } + { + const SL x(3); + EXPECT_THAT((Type, Span, + Span>>(x.Slices(cp))), + Tuple(IsSameSlice(x.Slice<0>(cp)), IsSameSlice(x.Slice<1>(cp)), + IsSameSlice(x.Slice<2>(cp)))); + EXPECT_THAT((Type, Span, Span>>( + x.Slices(p))), + Tuple(IsSameSlice(x.Slice<0>(p)), IsSameSlice(x.Slice<1>(p)), + IsSameSlice(x.Slice<2>(p)))); + } +} + +TEST(Layout, UnalignedTypes) { + constexpr Layout x(1, 2, 3); + alignas(max_align_t) unsigned char p[x.AllocSize() + 1]; + EXPECT_THAT(x.Pointers(p + 1), Tuple(p + 1, p + 2, p + 4)); +} + +TEST(Layout, CustomAlignment) { + constexpr Layout> x(1, 2); + alignas(max_align_t) unsigned char p[x.AllocSize()]; + EXPECT_EQ(10, x.AllocSize()); + EXPECT_THAT(x.Pointers(p), Tuple(p + 0, p + 8)); +} + +TEST(Layout, OverAligned) { + constexpr size_t M = alignof(max_align_t); + constexpr Layout> x(1, 3); +#ifdef __GNUC__ + // Using __attribute__ ((aligned ())) instead of alignas to bypass a gcc bug: + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89357 + __attribute__((aligned(2 * M))) unsigned char p[x.AllocSize()]; +#else + alignas(2 * M) unsigned char p[x.AllocSize()]; +#endif + EXPECT_EQ(2 * M + 3, x.AllocSize()); + EXPECT_THAT(x.Pointers(p), Tuple(p + 0, p + 2 * M)); +} + +TEST(Layout, Alignment) { + static_assert(Layout::Alignment() == 1, ""); + static_assert(Layout::Alignment() == 4, ""); + static_assert(Layout::Alignment() == 8, ""); + static_assert(Layout>::Alignment() == 64, ""); + static_assert(Layout::Alignment() == 8, ""); + static_assert(Layout::Alignment() == 8, ""); + static_assert(Layout::Alignment() == 8, ""); + static_assert(Layout::Alignment() == 8, ""); + static_assert(Layout::Alignment() == 8, ""); + static_assert(Layout::Alignment() == 8, ""); + static_assert(Layout::Alignment() == 8, ""); + static_assert( + Layout>::WithStaticSizes<>::Alignment() == 64, ""); + static_assert( + Layout>::WithStaticSizes<2>::Alignment() == 64, ""); +} + +TEST(Layout, StaticAlignment) { + static_assert(Layout::WithStaticSizes<>::Alignment() == 1, ""); + static_assert(Layout::WithStaticSizes<0>::Alignment() == 1, ""); + static_assert(Layout::WithStaticSizes<7>::Alignment() == 1, ""); + static_assert(Layout::WithStaticSizes<>::Alignment() == 4, ""); + static_assert(Layout::WithStaticSizes<0>::Alignment() == 4, ""); + static_assert(Layout::WithStaticSizes<3>::Alignment() == 4, ""); + static_assert( + Layout>::WithStaticSizes<>::Alignment() == 64, ""); + static_assert( + Layout>::WithStaticSizes<0>::Alignment() == 64, ""); + static_assert( + Layout>::WithStaticSizes<2>::Alignment() == 64, ""); + static_assert( + Layout::WithStaticSizes<>::Alignment() == 8, ""); + static_assert( + Layout::WithStaticSizes<0, 0, 0>::Alignment() == + 8, + ""); + static_assert( + Layout::WithStaticSizes<1, 1, 1>::Alignment() == + 8, + ""); +} + +TEST(Layout, ConstexprPartial) { + constexpr size_t M = alignof(max_align_t); + constexpr Layout> x(1, 3); + static_assert(x.Partial(1).template Offset<1>() == 2 * M, ""); +} + +TEST(Layout, StaticConstexpr) { + constexpr size_t M = alignof(max_align_t); + using L = Layout>; + using SL = L::WithStaticSizes<1, 3>; + constexpr SL x; + static_assert(x.Offset<1>() == 2 * M, ""); +} + +// [from, to) +struct Region { + size_t from; + size_t to; +}; + +void ExpectRegionPoisoned(const unsigned char* p, size_t n, bool poisoned) { +#ifdef ABSL_HAVE_ADDRESS_SANITIZER + for (size_t i = 0; i != n; ++i) { + EXPECT_EQ(poisoned, __asan_address_is_poisoned(p + i)); + } +#endif +} + +template +void ExpectPoisoned(const unsigned char (&buf)[N], + std::initializer_list reg) { + size_t prev = 0; + for (const Region& r : reg) { + ExpectRegionPoisoned(buf + prev, r.from - prev, false); + ExpectRegionPoisoned(buf + r.from, r.to - r.from, true); + prev = r.to; + } + ExpectRegionPoisoned(buf + prev, N - prev, false); +} + +TEST(Layout, PoisonPadding) { + using L = Layout; + + constexpr size_t n = L::Partial(1, 2, 3, 4).AllocSize(); + { + constexpr auto x = L::Partial(); + alignas(max_align_t) const unsigned char c[n] = {}; + x.PoisonPadding(c); + EXPECT_EQ(x.Slices(c), x.Slices(c)); + ExpectPoisoned(c, {}); + } + { + constexpr auto x = L::Partial(1); + alignas(max_align_t) const unsigned char c[n] = {}; + x.PoisonPadding(c); + EXPECT_EQ(x.Slices(c), x.Slices(c)); + ExpectPoisoned(c, {{1, 8}}); + } + { + constexpr auto x = L::Partial(1, 2); + alignas(max_align_t) const unsigned char c[n] = {}; + x.PoisonPadding(c); + EXPECT_EQ(x.Slices(c), x.Slices(c)); + ExpectPoisoned(c, {{1, 8}}); + } + { + constexpr auto x = L::Partial(1, 2, 3); + alignas(max_align_t) const unsigned char c[n] = {}; + x.PoisonPadding(c); + EXPECT_EQ(x.Slices(c), x.Slices(c)); + ExpectPoisoned(c, {{1, 8}, {36, 40}}); + } + { + constexpr auto x = L::Partial(1, 2, 3, 4); + alignas(max_align_t) const unsigned char c[n] = {}; + x.PoisonPadding(c); + EXPECT_EQ(x.Slices(c), x.Slices(c)); + ExpectPoisoned(c, {{1, 8}, {36, 40}}); + } + { + constexpr L x(1, 2, 3, 4); + alignas(max_align_t) const unsigned char c[n] = {}; + x.PoisonPadding(c); + EXPECT_EQ(x.Slices(c), x.Slices(c)); + ExpectPoisoned(c, {{1, 8}, {36, 40}}); + } +} + +TEST(Layout, StaticPoisonPadding) { + using L = Layout; + using SL = L::WithStaticSizes<1, 2>; + + constexpr size_t n = L::Partial(1, 2, 3, 4).AllocSize(); + { + constexpr auto x = SL::Partial(); + alignas(max_align_t) const unsigned char c[n] = {}; + x.PoisonPadding(c); + EXPECT_EQ(x.Slices(c), x.Slices(c)); + ExpectPoisoned(c, {{1, 8}}); + } + { + constexpr auto x = SL::Partial(3); + alignas(max_align_t) const unsigned char c[n] = {}; + x.PoisonPadding(c); + EXPECT_EQ(x.Slices(c), x.Slices(c)); + ExpectPoisoned(c, {{1, 8}, {36, 40}}); + } + { + constexpr auto x = SL::Partial(3, 4); + alignas(max_align_t) const unsigned char c[n] = {}; + x.PoisonPadding(c); + EXPECT_EQ(x.Slices(c), x.Slices(c)); + ExpectPoisoned(c, {{1, 8}, {36, 40}}); + } + { + constexpr SL x(3, 4); + alignas(max_align_t) const unsigned char c[n] = {}; + x.PoisonPadding(c); + EXPECT_EQ(x.Slices(c), x.Slices(c)); + ExpectPoisoned(c, {{1, 8}, {36, 40}}); + } +} + +TEST(Layout, DebugString) { + { + constexpr auto x = Layout::Partial(); + EXPECT_EQ("@0(1)", x.DebugString()); + } + { + constexpr auto x = Layout::Partial(1); + EXPECT_EQ("@0(1)[1]; @4(4)", x.DebugString()); + } + { + constexpr auto x = Layout::Partial(1, 2); + EXPECT_EQ("@0(1)[1]; @4(4)[2]; @12(1)", + x.DebugString()); + } + { + constexpr auto x = + Layout::Partial(1, 2, 3); + EXPECT_EQ( + "@0(1)[1]; @4(4)[2]; @12(1)[3]; " + "@16" + + Int128::Name() + "(16)", + x.DebugString()); + } + { + constexpr auto x = + Layout::Partial(1, 2, 3, 4); + EXPECT_EQ( + "@0(1)[1]; @4(4)[2]; @12(1)[3]; " + "@16" + + Int128::Name() + "(16)[4]", + x.DebugString()); + } + { + constexpr Layout x(1, 2, 3, 4); + EXPECT_EQ( + "@0(1)[1]; @4(4)[2]; @12(1)[3]; " + "@16" + + Int128::Name() + "(16)[4]", + x.DebugString()); + } +} + +TEST(Layout, StaticDebugString) { + { + constexpr auto x = + Layout::WithStaticSizes<>::Partial(); + EXPECT_EQ("@0(1)", x.DebugString()); + } + { + constexpr auto x = + Layout::WithStaticSizes<>::Partial(1); + EXPECT_EQ("@0(1)[1]; @4(4)", x.DebugString()); + } + { + constexpr auto x = + Layout::WithStaticSizes<1>::Partial(); + EXPECT_EQ("@0(1)[1]; @4(4)", x.DebugString()); + } + { + constexpr auto x = + Layout::WithStaticSizes<>::Partial(1, + 2); + EXPECT_EQ("@0(1)[1]; @4(4)[2]; @12(1)", + x.DebugString()); + } + { + constexpr auto x = + Layout::WithStaticSizes<1>::Partial(2); + EXPECT_EQ("@0(1)[1]; @4(4)[2]; @12(1)", + x.DebugString()); + } + { + constexpr auto x = Layout::WithStaticSizes<1, 2>::Partial(); + EXPECT_EQ("@0(1)[1]; @4(4)[2]; @12(1)", + x.DebugString()); + } + { + constexpr auto x = Layout::WithStaticSizes<1, 2, 3, 4>::Partial(); + EXPECT_EQ( + "@0(1)[1]; @4(4)[2]; @12(1)[3]; " + "@16" + + Int128::Name() + "(16)[4]", + x.DebugString()); + } + { + constexpr Layout::WithStaticSizes<1, 2, 3, + 4> + x; + EXPECT_EQ( + "@0(1)[1]; @4(4)[2]; @12(1)[3]; " + "@16" + + Int128::Name() + "(16)[4]", + x.DebugString()); + } +} + +TEST(Layout, CharTypes) { + constexpr Layout x(1); + alignas(max_align_t) char c[x.AllocSize()] = {}; + alignas(max_align_t) unsigned char uc[x.AllocSize()] = {}; + alignas(max_align_t) signed char sc[x.AllocSize()] = {}; + alignas(max_align_t) const char cc[x.AllocSize()] = {}; + alignas(max_align_t) const unsigned char cuc[x.AllocSize()] = {}; + alignas(max_align_t) const signed char csc[x.AllocSize()] = {}; + + Type(x.Pointer<0>(c)); + Type(x.Pointer<0>(uc)); + Type(x.Pointer<0>(sc)); + Type(x.Pointer<0>(cc)); + Type(x.Pointer<0>(cuc)); + Type(x.Pointer<0>(csc)); + + Type(x.Pointer(c)); + Type(x.Pointer(uc)); + Type(x.Pointer(sc)); + Type(x.Pointer(cc)); + Type(x.Pointer(cuc)); + Type(x.Pointer(csc)); + + Type>(x.Pointers(c)); + Type>(x.Pointers(uc)); + Type>(x.Pointers(sc)); + Type>(x.Pointers(cc)); + Type>(x.Pointers(cuc)); + Type>(x.Pointers(csc)); + + Type>(x.Slice<0>(c)); + Type>(x.Slice<0>(uc)); + Type>(x.Slice<0>(sc)); + Type>(x.Slice<0>(cc)); + Type>(x.Slice<0>(cuc)); + Type>(x.Slice<0>(csc)); + + Type>>(x.Slices(c)); + Type>>(x.Slices(uc)); + Type>>(x.Slices(sc)); + Type>>(x.Slices(cc)); + Type>>(x.Slices(cuc)); + Type>>(x.Slices(csc)); +} + +TEST(Layout, ConstElementType) { + constexpr Layout x(1); + alignas(int32_t) char c[x.AllocSize()] = {}; + const char* cc = c; + const int32_t* p = reinterpret_cast(cc); + + EXPECT_EQ(alignof(int32_t), x.Alignment()); + + EXPECT_EQ(0, x.Offset<0>()); + EXPECT_EQ(0, x.Offset()); + + EXPECT_THAT(x.Offsets(), ElementsAre(0)); + + EXPECT_EQ(1, x.Size<0>()); + EXPECT_EQ(1, x.Size()); + + EXPECT_THAT(x.Sizes(), ElementsAre(1)); + + EXPECT_EQ(sizeof(int32_t), x.AllocSize()); + + EXPECT_EQ(p, Type(x.Pointer<0>(c))); + EXPECT_EQ(p, Type(x.Pointer<0>(cc))); + + EXPECT_EQ(p, Type(x.Pointer(c))); + EXPECT_EQ(p, Type(x.Pointer(cc))); + + EXPECT_THAT(Type>(x.Pointers(c)), Tuple(p)); + EXPECT_THAT(Type>(x.Pointers(cc)), Tuple(p)); + + EXPECT_THAT(Type>(x.Slice<0>(c)), + IsSameSlice(Span(p, 1))); + EXPECT_THAT(Type>(x.Slice<0>(cc)), + IsSameSlice(Span(p, 1))); + + EXPECT_THAT(Type>(x.Slice(c)), + IsSameSlice(Span(p, 1))); + EXPECT_THAT(Type>(x.Slice(cc)), + IsSameSlice(Span(p, 1))); + + EXPECT_THAT(Type>>(x.Slices(c)), + Tuple(IsSameSlice(Span(p, 1)))); + EXPECT_THAT(Type>>(x.Slices(cc)), + Tuple(IsSameSlice(Span(p, 1)))); +} + +namespace example { + +// Immutable move-only string with sizeof equal to sizeof(void*). The string +// size and the characters are kept in the same heap allocation. +class CompactString { + public: + CompactString(const char* s = "") { // NOLINT + const size_t size = strlen(s); + // size_t[1], followed by char[size + 1]. + // This statement doesn't allocate memory. + const L layout(1, size + 1); + // AllocSize() tells us how much memory we need to allocate for all our + // data. + p_.reset(new unsigned char[layout.AllocSize()]); + // If running under ASAN, mark the padding bytes, if any, to catch memory + // errors. + layout.PoisonPadding(p_.get()); + // Store the size in the allocation. + // Pointer() is a synonym for Pointer<0>(). + *layout.Pointer(p_.get()) = size; + // Store the characters in the allocation. + memcpy(layout.Pointer(p_.get()), s, size + 1); + } + + size_t size() const { + // Equivalent to reinterpret_cast(*p). + return *L::Partial().Pointer(p_.get()); + } + + const char* c_str() const { + // Equivalent to reinterpret_cast(p.get() + sizeof(size_t)). + // The argument in Partial(1) specifies that we have size_t[1] in front of + // the characters. + return L::Partial(1).Pointer(p_.get()); + } + + private: + // Our heap allocation contains a size_t followed by an array of chars. + using L = Layout; + std::unique_ptr p_; +}; + +TEST(CompactString, Works) { + CompactString s = "hello"; + EXPECT_EQ(5, s.size()); + EXPECT_STREQ("hello", s.c_str()); +} + +// Same as the previous CompactString example, except we set the first array +// size to 1 statically, since we know it is always 1. This allows us to compute +// the offset of the character array at compile time. +class StaticCompactString { + public: + StaticCompactString(const char* s = "") { // NOLINT + const size_t size = strlen(s); + const SL layout(size + 1); + p_.reset(new unsigned char[layout.AllocSize()]); + layout.PoisonPadding(p_.get()); + *layout.Pointer(p_.get()) = size; + memcpy(layout.Pointer(p_.get()), s, size + 1); + } + + size_t size() const { return *SL::Partial().Pointer(p_.get()); } + + const char* c_str() const { return SL::Partial().Pointer(p_.get()); } + + private: + using SL = Layout::WithStaticSizes<1>; + std::unique_ptr p_; +}; + +TEST(StaticCompactString, Works) { + StaticCompactString s = "hello"; + EXPECT_EQ(5, s.size()); + EXPECT_STREQ("hello", s.c_str()); +} + +} // namespace example + +} // namespace +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/internal/node_slot_policy.h b/absl/container/internal/node_slot_policy.h new file mode 100644 index 0000000..3f1874d --- /dev/null +++ b/absl/container/internal/node_slot_policy.h @@ -0,0 +1,95 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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. +// +// Adapts a policy for nodes. +// +// The node policy should model: +// +// struct Policy { +// // Returns a new node allocated and constructed using the allocator, using +// // the specified arguments. +// template +// value_type* new_element(Alloc* alloc, Args&&... args) const; +// +// // Destroys and deallocates node using the allocator. +// template +// void delete_element(Alloc* alloc, value_type* node) const; +// }; +// +// It may also optionally define `value()` and `apply()`. For documentation on +// these, see hash_policy_traits.h. + +#ifndef ABSL_CONTAINER_INTERNAL_NODE_SLOT_POLICY_H_ +#define ABSL_CONTAINER_INTERNAL_NODE_SLOT_POLICY_H_ + +#include +#include +#include +#include +#include + +#include "absl/base/config.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +template +struct node_slot_policy { + static_assert(std::is_lvalue_reference::value, ""); + + using slot_type = typename std::remove_cv< + typename std::remove_reference::type>::type*; + + template + static void construct(Alloc* alloc, slot_type* slot, Args&&... args) { + *slot = Policy::new_element(alloc, std::forward(args)...); + } + + template + static void destroy(Alloc* alloc, slot_type* slot) { + Policy::delete_element(alloc, *slot); + } + + // Returns true_type to indicate that transfer can use memcpy. + template + static std::true_type transfer(Alloc*, slot_type* new_slot, + slot_type* old_slot) { + *new_slot = *old_slot; + return {}; + } + + static size_t space_used(const slot_type* slot) { + if (slot == nullptr) return Policy::element_space_used(nullptr); + return Policy::element_space_used(*slot); + } + + static Reference element(slot_type* slot) { return **slot; } + + template + static auto value(T* elem) -> decltype(P::value(elem)) { + return P::value(elem); + } + + template + static auto apply(Ts&&... ts) -> decltype(P::apply(std::forward(ts)...)) { + return P::apply(std::forward(ts)...); + } +}; + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_INTERNAL_NODE_SLOT_POLICY_H_ diff --git a/absl/container/internal/node_slot_policy_test.cc b/absl/container/internal/node_slot_policy_test.cc new file mode 100644 index 0000000..d4ea919 --- /dev/null +++ b/absl/container/internal/node_slot_policy_test.cc @@ -0,0 +1,71 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/internal/node_slot_policy.h" + +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/config.h" +#include "absl/container/internal/hash_policy_traits.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace { + +using ::testing::Pointee; + +struct Policy : node_slot_policy { + using key_type = int; + using init_type = int; + + template + static int* new_element(Alloc* alloc, int value) { + return new int(value); + } + + template + static void delete_element(Alloc* alloc, int* elem) { + delete elem; + } +}; + +using NodePolicy = hash_policy_traits; + +struct NodeTest : ::testing::Test { + std::allocator alloc; + int n = 53; + int* a = &n; +}; + +TEST_F(NodeTest, ConstructDestroy) { + NodePolicy::construct(&alloc, &a, 42); + EXPECT_THAT(a, Pointee(42)); + NodePolicy::destroy(&alloc, &a); +} + +TEST_F(NodeTest, transfer) { + int s = 42; + int* b = &s; + NodePolicy::transfer(&alloc, &a, &b); + EXPECT_EQ(&s, a); + EXPECT_TRUE(NodePolicy::transfer_uses_memcpy()); +} + +} // namespace +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/internal/raw_hash_map.h b/absl/container/internal/raw_hash_map.h new file mode 100644 index 0000000..464bf23 --- /dev/null +++ b/absl/container/internal/raw_hash_map.h @@ -0,0 +1,226 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 ABSL_CONTAINER_INTERNAL_RAW_HASH_MAP_H_ +#define ABSL_CONTAINER_INTERNAL_RAW_HASH_MAP_H_ + +#include +#include +#include + +#include "absl/base/attributes.h" +#include "absl/base/config.h" +#include "absl/base/internal/throw_delegate.h" +#include "absl/container/internal/container_memory.h" +#include "absl/container/internal/raw_hash_set.h" // IWYU pragma: export + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +template +class raw_hash_map : public raw_hash_set { + // P is Policy. It's passed as a template argument to support maps that have + // incomplete types as values, as in unordered_map. + // MappedReference<> may be a non-reference type. + template + using MappedReference = decltype(P::value( + std::addressof(std::declval()))); + + // MappedConstReference<> may be a non-reference type. + template + using MappedConstReference = decltype(P::value( + std::addressof(std::declval()))); + + using KeyArgImpl = + KeyArg::value && IsTransparent::value>; + + public: + using key_type = typename Policy::key_type; + using mapped_type = typename Policy::mapped_type; + template + using key_arg = typename KeyArgImpl::template type; + + static_assert(!std::is_reference::value, ""); + + // TODO(b/187807849): Evaluate whether to support reference mapped_type and + // remove this assertion if/when it is supported. + static_assert(!std::is_reference::value, ""); + + using iterator = typename raw_hash_map::raw_hash_set::iterator; + using const_iterator = typename raw_hash_map::raw_hash_set::const_iterator; + + raw_hash_map() {} + using raw_hash_map::raw_hash_set::raw_hash_set; + + // The last two template parameters ensure that both arguments are rvalues + // (lvalue arguments are handled by the overloads below). This is necessary + // for supporting bitfield arguments. + // + // union { int n : 1; }; + // flat_hash_map m; + // m.insert_or_assign(n, n); + template + std::pair insert_or_assign(key_arg&& k, V&& v) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert_or_assign_impl(std::forward(k), std::forward(v)); + } + + template + std::pair insert_or_assign(key_arg&& k, const V& v) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert_or_assign_impl(std::forward(k), v); + } + + template + std::pair insert_or_assign(const key_arg& k, V&& v) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert_or_assign_impl(k, std::forward(v)); + } + + template + std::pair insert_or_assign(const key_arg& k, const V& v) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert_or_assign_impl(k, v); + } + + template + iterator insert_or_assign(const_iterator, key_arg&& k, + V&& v) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert_or_assign(std::forward(k), std::forward(v)).first; + } + + template + iterator insert_or_assign(const_iterator, key_arg&& k, + const V& v) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert_or_assign(std::forward(k), v).first; + } + + template + iterator insert_or_assign(const_iterator, const key_arg& k, + V&& v) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert_or_assign(k, std::forward(v)).first; + } + + template + iterator insert_or_assign(const_iterator, const key_arg& k, + const V& v) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert_or_assign(k, v).first; + } + + // All `try_emplace()` overloads make the same guarantees regarding rvalue + // arguments as `std::unordered_map::try_emplace()`, namely that these + // functions will not move from rvalue arguments if insertions do not happen. + template ::value, int>::type = 0, + K* = nullptr> + std::pair try_emplace(key_arg&& k, Args&&... args) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return try_emplace_impl(std::forward(k), std::forward(args)...); + } + + template ::value, int>::type = 0> + std::pair try_emplace(const key_arg& k, Args&&... args) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return try_emplace_impl(k, std::forward(args)...); + } + + template + iterator try_emplace(const_iterator, key_arg&& k, + Args&&... args) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return try_emplace(std::forward(k), std::forward(args)...).first; + } + + template + iterator try_emplace(const_iterator, const key_arg& k, + Args&&... args) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return try_emplace(k, std::forward(args)...).first; + } + + template + MappedReference

at(const key_arg& key) ABSL_ATTRIBUTE_LIFETIME_BOUND { + auto it = this->find(key); + if (it == this->end()) { + base_internal::ThrowStdOutOfRange( + "absl::container_internal::raw_hash_map<>::at"); + } + return Policy::value(&*it); + } + + template + MappedConstReference

at(const key_arg& key) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + auto it = this->find(key); + if (it == this->end()) { + base_internal::ThrowStdOutOfRange( + "absl::container_internal::raw_hash_map<>::at"); + } + return Policy::value(&*it); + } + + template + MappedReference

operator[](key_arg&& key) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // It is safe to use unchecked_deref here because try_emplace + // will always return an iterator pointing to a valid item in the table, + // since it inserts if nothing is found for the given key. + return Policy::value( + &this->unchecked_deref(try_emplace(std::forward(key)).first)); + } + + template + MappedReference

operator[](const key_arg& key) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + // It is safe to use unchecked_deref here because try_emplace + // will always return an iterator pointing to a valid item in the table, + // since it inserts if nothing is found for the given key. + return Policy::value(&this->unchecked_deref(try_emplace(key).first)); + } + + private: + template + std::pair insert_or_assign_impl(K&& k, V&& v) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + auto res = this->find_or_prepare_insert(k); + if (res.second) { + this->emplace_at(res.first, std::forward(k), std::forward(v)); + } else { + Policy::value(&*res.first) = std::forward(v); + } + return res; + } + + template + std::pair try_emplace_impl(K&& k, Args&&... args) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + auto res = this->find_or_prepare_insert(k); + if (res.second) { + this->emplace_at(res.first, std::piecewise_construct, + std::forward_as_tuple(std::forward(k)), + std::forward_as_tuple(std::forward(args)...)); + } + return res; + } +}; + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_CONTAINER_INTERNAL_RAW_HASH_MAP_H_ diff --git a/absl/container/internal/raw_hash_set.cc b/absl/container/internal/raw_hash_set.cc new file mode 100644 index 0000000..8911aa3 --- /dev/null +++ b/absl/container/internal/raw_hash_set.cc @@ -0,0 +1,671 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/internal/raw_hash_set.h" + +#include +#include +#include +#include +#include + +#include "absl/base/attributes.h" +#include "absl/base/config.h" +#include "absl/base/dynamic_annotations.h" +#include "absl/base/internal/endian.h" +#include "absl/base/internal/raw_logging.h" +#include "absl/base/optimization.h" +#include "absl/container/internal/container_memory.h" +#include "absl/container/internal/hashtablez_sampler.h" +#include "absl/hash/hash.h" +#include "absl/numeric/bits.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +// Represents a control byte corresponding to a full slot with arbitrary hash. +constexpr ctrl_t ZeroCtrlT() { return static_cast(0); } + +// We have space for `growth_info` before a single block of control bytes. A +// single block of empty control bytes for tables without any slots allocated. +// This enables removing a branch in the hot path of find(). In order to ensure +// that the control bytes are aligned to 16, we have 16 bytes before the control +// bytes even though growth_info only needs 8. +alignas(16) ABSL_CONST_INIT ABSL_DLL const ctrl_t kEmptyGroup[32] = { + ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(), + ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(), + ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(), + ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(), + ctrl_t::kSentinel, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, + ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, + ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, + ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty}; + +// We need one full byte followed by a sentinel byte for iterator::operator++ to +// work. We have a full group after kSentinel to be safe (in case operator++ is +// changed to read a full group). +ABSL_CONST_INIT ABSL_DLL const ctrl_t kSooControl[17] = { + ZeroCtrlT(), ctrl_t::kSentinel, ZeroCtrlT(), ctrl_t::kEmpty, + ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, + ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, + ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, + ctrl_t::kEmpty}; +static_assert(NumControlBytes(SooCapacity()) <= 17, + "kSooControl capacity too small"); + +#ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL +constexpr size_t Group::kWidth; +#endif + +namespace { + +// Returns "random" seed. +inline size_t RandomSeed() { +#ifdef ABSL_HAVE_THREAD_LOCAL + static thread_local size_t counter = 0; + // On Linux kernels >= 5.4 the MSAN runtime has a false-positive when + // accessing thread local storage data from loaded libraries + // (https://github.com/google/sanitizers/issues/1265), for this reason counter + // needs to be annotated as initialized. + ABSL_ANNOTATE_MEMORY_IS_INITIALIZED(&counter, sizeof(size_t)); + size_t value = ++counter; +#else // ABSL_HAVE_THREAD_LOCAL + static std::atomic counter(0); + size_t value = counter.fetch_add(1, std::memory_order_relaxed); +#endif // ABSL_HAVE_THREAD_LOCAL + return value ^ static_cast(reinterpret_cast(&counter)); +} + +bool ShouldRehashForBugDetection(const ctrl_t* ctrl, size_t capacity) { + // Note: we can't use the abseil-random library because abseil-random + // depends on swisstable. We want to return true with probability + // `min(1, RehashProbabilityConstant() / capacity())`. In order to do this, + // we probe based on a random hash and see if the offset is less than + // RehashProbabilityConstant(). + return probe(ctrl, capacity, absl::HashOf(RandomSeed())).offset() < + RehashProbabilityConstant(); +} + +// Find a non-deterministic hash for single group table. +// Last two bits are used to find a position for a newly inserted element after +// resize. +// This function is mixing all bits of hash and control pointer to maximize +// entropy. +size_t SingleGroupTableH1(size_t hash, ctrl_t* control) { + return static_cast(absl::popcount( + hash ^ static_cast(reinterpret_cast(control)))); +} + +} // namespace + +GenerationType* EmptyGeneration() { + if (SwisstableGenerationsEnabled()) { + constexpr size_t kNumEmptyGenerations = 1024; + static constexpr GenerationType kEmptyGenerations[kNumEmptyGenerations]{}; + return const_cast( + &kEmptyGenerations[RandomSeed() % kNumEmptyGenerations]); + } + return nullptr; +} + +bool CommonFieldsGenerationInfoEnabled:: + should_rehash_for_bug_detection_on_insert(const ctrl_t* ctrl, + size_t capacity) const { + if (reserved_growth_ == kReservedGrowthJustRanOut) return true; + if (reserved_growth_ > 0) return false; + return ShouldRehashForBugDetection(ctrl, capacity); +} + +bool CommonFieldsGenerationInfoEnabled::should_rehash_for_bug_detection_on_move( + const ctrl_t* ctrl, size_t capacity) const { + return ShouldRehashForBugDetection(ctrl, capacity); +} + +bool ShouldInsertBackwardsForDebug(size_t capacity, size_t hash, + const ctrl_t* ctrl) { + // To avoid problems with weak hashes and single bit tests, we use % 13. + // TODO(kfm,sbenza): revisit after we do unconditional mixing + return !is_small(capacity) && (H1(hash, ctrl) ^ RandomSeed()) % 13 > 6; +} + +size_t PrepareInsertAfterSoo(size_t hash, size_t slot_size, + CommonFields& common) { + assert(common.capacity() == NextCapacity(SooCapacity())); + // After resize from capacity 1 to 3, we always have exactly the slot with + // index 1 occupied, so we need to insert either at index 0 or index 2. + assert(HashSetResizeHelper::SooSlotIndex() == 1); + PrepareInsertCommon(common); + const size_t offset = SingleGroupTableH1(hash, common.control()) & 2; + common.growth_info().OverwriteEmptyAsFull(); + SetCtrlInSingleGroupTable(common, offset, H2(hash), slot_size); + common.infoz().RecordInsert(hash, /*distance_from_desired=*/0); + return offset; +} + +void ConvertDeletedToEmptyAndFullToDeleted(ctrl_t* ctrl, size_t capacity) { + assert(ctrl[capacity] == ctrl_t::kSentinel); + assert(IsValidCapacity(capacity)); + for (ctrl_t* pos = ctrl; pos < ctrl + capacity; pos += Group::kWidth) { + Group{pos}.ConvertSpecialToEmptyAndFullToDeleted(pos); + } + // Copy the cloned ctrl bytes. + std::memcpy(ctrl + capacity + 1, ctrl, NumClonedBytes()); + ctrl[capacity] = ctrl_t::kSentinel; +} +// Extern template instantiation for inline function. +template FindInfo find_first_non_full(const CommonFields&, size_t); + +FindInfo find_first_non_full_outofline(const CommonFields& common, + size_t hash) { + return find_first_non_full(common, hash); +} + +namespace { + +// Returns the address of the slot just after slot assuming each slot has the +// specified size. +static inline void* NextSlot(void* slot, size_t slot_size) { + return reinterpret_cast(reinterpret_cast(slot) + slot_size); +} + +// Returns the address of the slot just before slot assuming each slot has the +// specified size. +static inline void* PrevSlot(void* slot, size_t slot_size) { + return reinterpret_cast(reinterpret_cast(slot) - slot_size); +} + +// Finds guaranteed to exists empty slot from the given position. +// NOTE: this function is almost never triggered inside of the +// DropDeletesWithoutResize, so we keep it simple. +// The table is rather sparse, so empty slot will be found very quickly. +size_t FindEmptySlot(size_t start, size_t end, const ctrl_t* ctrl) { + for (size_t i = start; i < end; ++i) { + if (IsEmpty(ctrl[i])) { + return i; + } + } + assert(false && "no empty slot"); + return ~size_t{}; +} + +void DropDeletesWithoutResize(CommonFields& common, + const PolicyFunctions& policy) { + void* set = &common; + void* slot_array = common.slot_array(); + const size_t capacity = common.capacity(); + assert(IsValidCapacity(capacity)); + assert(!is_small(capacity)); + // Algorithm: + // - mark all DELETED slots as EMPTY + // - mark all FULL slots as DELETED + // - for each slot marked as DELETED + // hash = Hash(element) + // target = find_first_non_full(hash) + // if target is in the same group + // mark slot as FULL + // else if target is EMPTY + // transfer element to target + // mark slot as EMPTY + // mark target as FULL + // else if target is DELETED + // swap current element with target element + // mark target as FULL + // repeat procedure for current slot with moved from element (target) + ctrl_t* ctrl = common.control(); + ConvertDeletedToEmptyAndFullToDeleted(ctrl, capacity); + const void* hash_fn = policy.hash_fn(common); + auto hasher = policy.hash_slot; + auto transfer = policy.transfer; + const size_t slot_size = policy.slot_size; + + size_t total_probe_length = 0; + void* slot_ptr = SlotAddress(slot_array, 0, slot_size); + + // The index of an empty slot that can be used as temporary memory for + // the swap operation. + constexpr size_t kUnknownId = ~size_t{}; + size_t tmp_space_id = kUnknownId; + + for (size_t i = 0; i != capacity; + ++i, slot_ptr = NextSlot(slot_ptr, slot_size)) { + assert(slot_ptr == SlotAddress(slot_array, i, slot_size)); + if (IsEmpty(ctrl[i])) { + tmp_space_id = i; + continue; + } + if (!IsDeleted(ctrl[i])) continue; + const size_t hash = (*hasher)(hash_fn, slot_ptr); + const FindInfo target = find_first_non_full(common, hash); + const size_t new_i = target.offset; + total_probe_length += target.probe_length; + + // Verify if the old and new i fall within the same group wrt the hash. + // If they do, we don't need to move the object as it falls already in the + // best probe we can. + const size_t probe_offset = probe(common, hash).offset(); + const auto probe_index = [probe_offset, capacity](size_t pos) { + return ((pos - probe_offset) & capacity) / Group::kWidth; + }; + + // Element doesn't move. + if (ABSL_PREDICT_TRUE(probe_index(new_i) == probe_index(i))) { + SetCtrl(common, i, H2(hash), slot_size); + continue; + } + + void* new_slot_ptr = SlotAddress(slot_array, new_i, slot_size); + if (IsEmpty(ctrl[new_i])) { + // Transfer element to the empty spot. + // SetCtrl poisons/unpoisons the slots so we have to call it at the + // right time. + SetCtrl(common, new_i, H2(hash), slot_size); + (*transfer)(set, new_slot_ptr, slot_ptr); + SetCtrl(common, i, ctrl_t::kEmpty, slot_size); + // Initialize or change empty space id. + tmp_space_id = i; + } else { + assert(IsDeleted(ctrl[new_i])); + SetCtrl(common, new_i, H2(hash), slot_size); + // Until we are done rehashing, DELETED marks previously FULL slots. + + if (tmp_space_id == kUnknownId) { + tmp_space_id = FindEmptySlot(i + 1, capacity, ctrl); + } + void* tmp_space = SlotAddress(slot_array, tmp_space_id, slot_size); + SanitizerUnpoisonMemoryRegion(tmp_space, slot_size); + + // Swap i and new_i elements. + (*transfer)(set, tmp_space, new_slot_ptr); + (*transfer)(set, new_slot_ptr, slot_ptr); + (*transfer)(set, slot_ptr, tmp_space); + + SanitizerPoisonMemoryRegion(tmp_space, slot_size); + + // repeat the processing of the ith slot + --i; + slot_ptr = PrevSlot(slot_ptr, slot_size); + } + } + ResetGrowthLeft(common); + common.infoz().RecordRehash(total_probe_length); +} + +static bool WasNeverFull(CommonFields& c, size_t index) { + if (is_single_group(c.capacity())) { + return true; + } + const size_t index_before = (index - Group::kWidth) & c.capacity(); + const auto empty_after = Group(c.control() + index).MaskEmpty(); + const auto empty_before = Group(c.control() + index_before).MaskEmpty(); + + // We count how many consecutive non empties we have to the right and to the + // left of `it`. If the sum is >= kWidth then there is at least one probe + // window that might have seen a full group. + return empty_before && empty_after && + static_cast(empty_after.TrailingZeros()) + + empty_before.LeadingZeros() < + Group::kWidth; +} + +} // namespace + +void EraseMetaOnly(CommonFields& c, size_t index, size_t slot_size) { + assert(IsFull(c.control()[index]) && "erasing a dangling iterator"); + c.decrement_size(); + c.infoz().RecordErase(); + + if (WasNeverFull(c, index)) { + SetCtrl(c, index, ctrl_t::kEmpty, slot_size); + c.growth_info().OverwriteFullAsEmpty(); + return; + } + + c.growth_info().OverwriteFullAsDeleted(); + SetCtrl(c, index, ctrl_t::kDeleted, slot_size); +} + +void ClearBackingArray(CommonFields& c, const PolicyFunctions& policy, + bool reuse, bool soo_enabled) { + c.set_size(0); + if (reuse) { + assert(!soo_enabled || c.capacity() > SooCapacity()); + ResetCtrl(c, policy.slot_size); + ResetGrowthLeft(c); + c.infoz().RecordStorageChanged(0, c.capacity()); + } else { + // We need to record infoz before calling dealloc, which will unregister + // infoz. + c.infoz().RecordClearedReservation(); + c.infoz().RecordStorageChanged(0, soo_enabled ? SooCapacity() : 0); + (*policy.dealloc)(c, policy); + c = soo_enabled ? CommonFields{soo_tag_t{}} : CommonFields{non_soo_tag_t{}}; + } +} + +void HashSetResizeHelper::GrowIntoSingleGroupShuffleControlBytes( + ctrl_t* __restrict new_ctrl, size_t new_capacity) const { + assert(is_single_group(new_capacity)); + constexpr size_t kHalfWidth = Group::kWidth / 2; + ABSL_ASSUME(old_capacity_ < kHalfWidth); + ABSL_ASSUME(old_capacity_ > 0); + static_assert(Group::kWidth == 8 || Group::kWidth == 16, + "Group size is not supported."); + + // NOTE: operations are done with compile time known size = 8. + // Compiler optimizes that into single ASM operation. + + // Load the bytes from old_capacity. This contains + // - the sentinel byte + // - all the old control bytes + // - the rest is filled with kEmpty bytes + // Example: + // old_ctrl = 012S012EEEEEEEEE... + // copied_bytes = S012EEEE + uint64_t copied_bytes = + absl::little_endian::Load64(old_ctrl() + old_capacity_); + + // We change the sentinel byte to kEmpty before storing to both the start of + // the new_ctrl, and past the end of the new_ctrl later for the new cloned + // bytes. Note that this is faster than setting the sentinel byte to kEmpty + // after the copy directly in new_ctrl because we are limited on store + // bandwidth. + static constexpr uint64_t kEmptyXorSentinel = + static_cast(ctrl_t::kEmpty) ^ + static_cast(ctrl_t::kSentinel); + + // Replace the first byte kSentinel with kEmpty. + // Resulting bytes will be shifted by one byte old control blocks. + // Example: + // old_ctrl = 012S012EEEEEEEEE... + // before = S012EEEE + // after = E012EEEE + copied_bytes ^= kEmptyXorSentinel; + + if (Group::kWidth == 8) { + // With group size 8, we can grow with two write operations. + assert(old_capacity_ < 8 && "old_capacity_ is too large for group size 8"); + absl::little_endian::Store64(new_ctrl, copied_bytes); + + static constexpr uint64_t kSentinal64 = + static_cast(ctrl_t::kSentinel); + + // Prepend kSentinel byte to the beginning of copied_bytes. + // We have maximum 3 non-empty bytes at the beginning of copied_bytes for + // group size 8. + // Example: + // old_ctrl = 012S012EEEE + // before = E012EEEE + // after = SE012EEE + copied_bytes = (copied_bytes << 8) ^ kSentinal64; + absl::little_endian::Store64(new_ctrl + new_capacity, copied_bytes); + // Example for capacity 3: + // old_ctrl = 012S012EEEE + // After the first store: + // >! + // new_ctrl = E012EEEE??????? + // After the second store: + // >! + // new_ctrl = E012EEESE012EEE + return; + } + + assert(Group::kWidth == 16); + + // Fill the second half of the main control bytes with kEmpty. + // For small capacity that may write into mirrored control bytes. + // It is fine as we will overwrite all the bytes later. + std::memset(new_ctrl + kHalfWidth, static_cast(ctrl_t::kEmpty), + kHalfWidth); + // Fill the second half of the mirrored control bytes with kEmpty. + std::memset(new_ctrl + new_capacity + kHalfWidth, + static_cast(ctrl_t::kEmpty), kHalfWidth); + // Copy the first half of the non-mirrored control bytes. + absl::little_endian::Store64(new_ctrl, copied_bytes); + new_ctrl[new_capacity] = ctrl_t::kSentinel; + // Copy the first half of the mirrored control bytes. + absl::little_endian::Store64(new_ctrl + new_capacity + 1, copied_bytes); + + // Example for growth capacity 1->3: + // old_ctrl = 0S0EEEEEEEEEEEEEE + // new_ctrl at the end = E0ESE0EEEEEEEEEEEEE + // >! + // new_ctrl after 1st memset = ????????EEEEEEEE??? + // >! + // new_ctrl after 2nd memset = ????????EEEEEEEEEEE + // >! + // new_ctrl after 1st store = E0EEEEEEEEEEEEEEEEE + // new_ctrl after kSentinel = E0ESEEEEEEEEEEEEEEE + // >! + // new_ctrl after 2nd store = E0ESE0EEEEEEEEEEEEE + + // Example for growth capacity 3->7: + // old_ctrl = 012S012EEEEEEEEEEEE + // new_ctrl at the end = E012EEESE012EEEEEEEEEEE + // >! + // new_ctrl after 1st memset = ????????EEEEEEEE??????? + // >! + // new_ctrl after 2nd memset = ????????EEEEEEEEEEEEEEE + // >! + // new_ctrl after 1st store = E012EEEEEEEEEEEEEEEEEEE + // new_ctrl after kSentinel = E012EEESEEEEEEEEEEEEEEE + // >! + // new_ctrl after 2nd store = E012EEESE012EEEEEEEEEEE + + + // Example for growth capacity 7->15: + // old_ctrl = 0123456S0123456EEEEEEEE + // new_ctrl at the end = E0123456EEEEEEESE0123456EEEEEEE + // >! + // new_ctrl after 1st memset = ????????EEEEEEEE??????????????? + // >! + // new_ctrl after 2nd memset = ????????EEEEEEEE???????EEEEEEEE + // >! + // new_ctrl after 1st store = E0123456EEEEEEEE???????EEEEEEEE + // new_ctrl after kSentinel = E0123456EEEEEEES???????EEEEEEEE + // >! + // new_ctrl after 2nd store = E0123456EEEEEEESE0123456EEEEEEE +} + +void HashSetResizeHelper::InitControlBytesAfterSoo(ctrl_t* new_ctrl, ctrl_t h2, + size_t new_capacity) { + assert(is_single_group(new_capacity)); + std::memset(new_ctrl, static_cast(ctrl_t::kEmpty), + NumControlBytes(new_capacity)); + assert(HashSetResizeHelper::SooSlotIndex() == 1); + // This allows us to avoid branching on had_soo_slot_. + assert(had_soo_slot_ || h2 == ctrl_t::kEmpty); + new_ctrl[1] = new_ctrl[new_capacity + 2] = h2; + new_ctrl[new_capacity] = ctrl_t::kSentinel; +} + +void HashSetResizeHelper::GrowIntoSingleGroupShuffleTransferableSlots( + void* new_slots, size_t slot_size) const { + ABSL_ASSUME(old_capacity_ > 0); + SanitizerUnpoisonMemoryRegion(old_slots(), slot_size * old_capacity_); + std::memcpy(SlotAddress(new_slots, 1, slot_size), old_slots(), + slot_size * old_capacity_); +} + +void HashSetResizeHelper::GrowSizeIntoSingleGroupTransferable( + CommonFields& c, size_t slot_size) { + assert(old_capacity_ < Group::kWidth / 2); + assert(is_single_group(c.capacity())); + assert(IsGrowingIntoSingleGroupApplicable(old_capacity_, c.capacity())); + + GrowIntoSingleGroupShuffleControlBytes(c.control(), c.capacity()); + GrowIntoSingleGroupShuffleTransferableSlots(c.slot_array(), slot_size); + + // We poison since GrowIntoSingleGroupShuffleTransferableSlots + // may leave empty slots unpoisoned. + PoisonSingleGroupEmptySlots(c, slot_size); +} + +void HashSetResizeHelper::TransferSlotAfterSoo(CommonFields& c, + size_t slot_size) { + assert(was_soo_); + assert(had_soo_slot_); + assert(is_single_group(c.capacity())); + std::memcpy(SlotAddress(c.slot_array(), SooSlotIndex(), slot_size), + old_soo_data(), slot_size); + PoisonSingleGroupEmptySlots(c, slot_size); +} + +namespace { + +// Called whenever the table needs to vacate empty slots either by removing +// tombstones via rehash or growth. +ABSL_ATTRIBUTE_NOINLINE +FindInfo FindInsertPositionWithGrowthOrRehash(CommonFields& common, size_t hash, + const PolicyFunctions& policy) { + const size_t cap = common.capacity(); + if (cap > Group::kWidth && + // Do these calculations in 64-bit to avoid overflow. + common.size() * uint64_t{32} <= cap * uint64_t{25}) { + // Squash DELETED without growing if there is enough capacity. + // + // Rehash in place if the current size is <= 25/32 of capacity. + // Rationale for such a high factor: 1) DropDeletesWithoutResize() is + // faster than resize, and 2) it takes quite a bit of work to add + // tombstones. In the worst case, seems to take approximately 4 + // insert/erase pairs to create a single tombstone and so if we are + // rehashing because of tombstones, we can afford to rehash-in-place as + // long as we are reclaiming at least 1/8 the capacity without doing more + // than 2X the work. (Where "work" is defined to be size() for rehashing + // or rehashing in place, and 1 for an insert or erase.) But rehashing in + // place is faster per operation than inserting or even doubling the size + // of the table, so we actually afford to reclaim even less space from a + // resize-in-place. The decision is to rehash in place if we can reclaim + // at about 1/8th of the usable capacity (specifically 3/28 of the + // capacity) which means that the total cost of rehashing will be a small + // fraction of the total work. + // + // Here is output of an experiment using the BM_CacheInSteadyState + // benchmark running the old case (where we rehash-in-place only if we can + // reclaim at least 7/16*capacity) vs. this code (which rehashes in place + // if we can recover 3/32*capacity). + // + // Note that although in the worst-case number of rehashes jumped up from + // 15 to 190, but the number of operations per second is almost the same. + // + // Abridged output of running BM_CacheInSteadyState benchmark from + // raw_hash_set_benchmark. N is the number of insert/erase operations. + // + // | OLD (recover >= 7/16 | NEW (recover >= 3/32) + // size | N/s LoadFactor NRehashes | N/s LoadFactor NRehashes + // 448 | 145284 0.44 18 | 140118 0.44 19 + // 493 | 152546 0.24 11 | 151417 0.48 28 + // 538 | 151439 0.26 11 | 151152 0.53 38 + // 583 | 151765 0.28 11 | 150572 0.57 50 + // 628 | 150241 0.31 11 | 150853 0.61 66 + // 672 | 149602 0.33 12 | 150110 0.66 90 + // 717 | 149998 0.35 12 | 149531 0.70 129 + // 762 | 149836 0.37 13 | 148559 0.74 190 + // 807 | 149736 0.39 14 | 151107 0.39 14 + // 852 | 150204 0.42 15 | 151019 0.42 15 + DropDeletesWithoutResize(common, policy); + } else { + // Otherwise grow the container. + policy.resize(common, NextCapacity(cap), HashtablezInfoHandle{}); + } + // This function is typically called with tables containing deleted slots. + // The table will be big and `FindFirstNonFullAfterResize` will always + // fallback to `find_first_non_full`. So using `find_first_non_full` directly. + return find_first_non_full(common, hash); +} + +} // namespace + +const void* GetHashRefForEmptyHasher(const CommonFields& common) { + // Empty base optimization typically make the empty base class address to be + // the same as the first address of the derived class object. + // But we generally assume that for empty hasher we can return any valid + // pointer. + return &common; +} + +FindInfo HashSetResizeHelper::FindFirstNonFullAfterResize(const CommonFields& c, + size_t old_capacity, + size_t hash) { + size_t new_capacity = c.capacity(); + if (!IsGrowingIntoSingleGroupApplicable(old_capacity, new_capacity)) { + return find_first_non_full(c, hash); + } + + // We put the new element either at the beginning or at the end of the table + // with approximately equal probability. + size_t offset = + SingleGroupTableH1(hash, c.control()) & 1 ? 0 : new_capacity - 1; + + assert(IsEmpty(c.control()[offset])); + return FindInfo{offset, 0}; +} + +size_t PrepareInsertNonSoo(CommonFields& common, size_t hash, FindInfo target, + const PolicyFunctions& policy) { + // When there are no deleted slots in the table + // and growth_left is positive, we can insert at the first + // empty slot in the probe sequence (target). + const bool use_target_hint = + // Optimization is disabled when generations are enabled. + // We have to rehash even sparse tables randomly in such mode. + !SwisstableGenerationsEnabled() && + common.growth_info().HasNoDeletedAndGrowthLeft(); + if (ABSL_PREDICT_FALSE(!use_target_hint)) { + // Notes about optimized mode when generations are disabled: + // We do not enter this branch if table has no deleted slots + // and growth_left is positive. + // We enter this branch in the following cases listed in decreasing + // frequency: + // 1. Table without deleted slots (>95% cases) that needs to be resized. + // 2. Table with deleted slots that has space for the inserting element. + // 3. Table with deleted slots that needs to be rehashed or resized. + if (ABSL_PREDICT_TRUE(common.growth_info().HasNoGrowthLeftAndNoDeleted())) { + const size_t old_capacity = common.capacity(); + policy.resize(common, NextCapacity(old_capacity), HashtablezInfoHandle{}); + target = HashSetResizeHelper::FindFirstNonFullAfterResize( + common, old_capacity, hash); + } else { + // Note: the table may have no deleted slots here when generations + // are enabled. + const bool rehash_for_bug_detection = + common.should_rehash_for_bug_detection_on_insert(); + if (rehash_for_bug_detection) { + // Move to a different heap allocation in order to detect bugs. + const size_t cap = common.capacity(); + policy.resize(common, + common.growth_left() > 0 ? cap : NextCapacity(cap), + HashtablezInfoHandle{}); + } + if (ABSL_PREDICT_TRUE(common.growth_left() > 0)) { + target = find_first_non_full(common, hash); + } else { + target = FindInsertPositionWithGrowthOrRehash(common, hash, policy); + } + } + } + PrepareInsertCommon(common); + common.growth_info().OverwriteControlAsFull(common.control()[target.offset]); + SetCtrl(common, target.offset, H2(hash), policy.slot_size); + common.infoz().RecordInsert(hash, target.probe_length); + return target.offset; +} + +void HashTableSizeOverflow() { + ABSL_RAW_LOG(FATAL, "Hash table size overflow"); +} + +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/internal/raw_hash_set.h b/absl/container/internal/raw_hash_set.h new file mode 100644 index 0000000..79ccb59 --- /dev/null +++ b/absl/container/internal/raw_hash_set.h @@ -0,0 +1,4332 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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. +// +// An open-addressing +// hashtable with quadratic probing. +// +// This is a low level hashtable on top of which different interfaces can be +// implemented, like flat_hash_set, node_hash_set, string_hash_set, etc. +// +// The table interface is similar to that of std::unordered_set. Notable +// differences are that most member functions support heterogeneous keys when +// BOTH the hash and eq functions are marked as transparent. They do so by +// providing a typedef called `is_transparent`. +// +// When heterogeneous lookup is enabled, functions that take key_type act as if +// they have an overload set like: +// +// iterator find(const key_type& key); +// template +// iterator find(const K& key); +// +// size_type erase(const key_type& key); +// template +// size_type erase(const K& key); +// +// std::pair equal_range(const key_type& key); +// template +// std::pair equal_range(const K& key); +// +// When heterogeneous lookup is disabled, only the explicit `key_type` overloads +// exist. +// +// In addition the pointer to element and iterator stability guarantees are +// weaker: all iterators and pointers are invalidated after a new element is +// inserted. +// +// IMPLEMENTATION DETAILS +// +// # Table Layout +// +// A raw_hash_set's backing array consists of control bytes followed by slots +// that may or may not contain objects. +// +// The layout of the backing array, for `capacity` slots, is thus, as a +// pseudo-struct: +// +// struct BackingArray { +// // Sampling handler. This field isn't present when the sampling is +// // disabled or this allocation hasn't been selected for sampling. +// HashtablezInfoHandle infoz_; +// // The number of elements we can insert before growing the capacity. +// size_t growth_left; +// // Control bytes for the "real" slots. +// ctrl_t ctrl[capacity]; +// // Always `ctrl_t::kSentinel`. This is used by iterators to find when to +// // stop and serves no other purpose. +// ctrl_t sentinel; +// // A copy of the first `kWidth - 1` elements of `ctrl`. This is used so +// // that if a probe sequence picks a value near the end of `ctrl`, +// // `Group` will have valid control bytes to look at. +// ctrl_t clones[kWidth - 1]; +// // The actual slot data. +// slot_type slots[capacity]; +// }; +// +// The length of this array is computed by `RawHashSetLayout::alloc_size` below. +// +// Control bytes (`ctrl_t`) are bytes (collected into groups of a +// platform-specific size) that define the state of the corresponding slot in +// the slot array. Group manipulation is tightly optimized to be as efficient +// as possible: SSE and friends on x86, clever bit operations on other arches. +// +// Group 1 Group 2 Group 3 +// +---------------+---------------+---------------+ +// | | | | | | | | | | | | | | | | | | | | | | | | | +// +---------------+---------------+---------------+ +// +// Each control byte is either a special value for empty slots, deleted slots +// (sometimes called *tombstones*), and a special end-of-table marker used by +// iterators, or, if occupied, seven bits (H2) from the hash of the value in the +// corresponding slot. +// +// Storing control bytes in a separate array also has beneficial cache effects, +// since more logical slots will fit into a cache line. +// +// # Small Object Optimization (SOO) +// +// When the size/alignment of the value_type and the capacity of the table are +// small, we enable small object optimization and store the values inline in +// the raw_hash_set object. This optimization allows us to avoid +// allocation/deallocation as well as cache/dTLB misses. +// +// # Hashing +// +// We compute two separate hashes, `H1` and `H2`, from the hash of an object. +// `H1(hash(x))` is an index into `slots`, and essentially the starting point +// for the probe sequence. `H2(hash(x))` is a 7-bit value used to filter out +// objects that cannot possibly be the one we are looking for. +// +// # Table operations. +// +// The key operations are `insert`, `find`, and `erase`. +// +// Since `insert` and `erase` are implemented in terms of `find`, we describe +// `find` first. To `find` a value `x`, we compute `hash(x)`. From +// `H1(hash(x))` and the capacity, we construct a `probe_seq` that visits every +// group of slots in some interesting order. +// +// We now walk through these indices. At each index, we select the entire group +// starting with that index and extract potential candidates: occupied slots +// with a control byte equal to `H2(hash(x))`. If we find an empty slot in the +// group, we stop and return an error. Each candidate slot `y` is compared with +// `x`; if `x == y`, we are done and return `&y`; otherwise we continue to the +// next probe index. Tombstones effectively behave like full slots that never +// match the value we're looking for. +// +// The `H2` bits ensure when we compare a slot to an object with `==`, we are +// likely to have actually found the object. That is, the chance is low that +// `==` is called and returns `false`. Thus, when we search for an object, we +// are unlikely to call `==` many times. This likelyhood can be analyzed as +// follows (assuming that H2 is a random enough hash function). +// +// Let's assume that there are `k` "wrong" objects that must be examined in a +// probe sequence. For example, when doing a `find` on an object that is in the +// table, `k` is the number of objects between the start of the probe sequence +// and the final found object (not including the final found object). The +// expected number of objects with an H2 match is then `k/128`. Measurements +// and analysis indicate that even at high load factors, `k` is less than 32, +// meaning that the number of "false positive" comparisons we must perform is +// less than 1/8 per `find`. + +// `insert` is implemented in terms of `unchecked_insert`, which inserts a +// value presumed to not be in the table (violating this requirement will cause +// the table to behave erratically). Given `x` and its hash `hash(x)`, to insert +// it, we construct a `probe_seq` once again, and use it to find the first +// group with an unoccupied (empty *or* deleted) slot. We place `x` into the +// first such slot in the group and mark it as full with `x`'s H2. +// +// To `insert`, we compose `unchecked_insert` with `find`. We compute `h(x)` and +// perform a `find` to see if it's already present; if it is, we're done. If +// it's not, we may decide the table is getting overcrowded (i.e. the load +// factor is greater than 7/8 for big tables; `is_small()` tables use a max load +// factor of 1); in this case, we allocate a bigger array, `unchecked_insert` +// each element of the table into the new array (we know that no insertion here +// will insert an already-present value), and discard the old backing array. At +// this point, we may `unchecked_insert` the value `x`. +// +// Below, `unchecked_insert` is partly implemented by `prepare_insert`, which +// presents a viable, initialized slot pointee to the caller. +// +// `erase` is implemented in terms of `erase_at`, which takes an index to a +// slot. Given an offset, we simply create a tombstone and destroy its contents. +// If we can prove that the slot would not appear in a probe sequence, we can +// make the slot as empty, instead. We can prove this by observing that if a +// group has any empty slots, it has never been full (assuming we never create +// an empty slot in a group with no empties, which this heuristic guarantees we +// never do) and find would stop at this group anyways (since it does not probe +// beyond groups with empties). +// +// `erase` is `erase_at` composed with `find`: if we +// have a value `x`, we can perform a `find`, and then `erase_at` the resulting +// slot. +// +// To iterate, we simply traverse the array, skipping empty and deleted slots +// and stopping when we hit a `kSentinel`. + +#ifndef ABSL_CONTAINER_INTERNAL_RAW_HASH_SET_H_ +#define ABSL_CONTAINER_INTERNAL_RAW_HASH_SET_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "absl/base/attributes.h" +#include "absl/base/config.h" +#include "absl/base/internal/endian.h" +#include "absl/base/internal/raw_logging.h" +#include "absl/base/macros.h" +#include "absl/base/optimization.h" +#include "absl/base/options.h" +#include "absl/base/port.h" +#include "absl/base/prefetch.h" +#include "absl/container/internal/common.h" // IWYU pragma: export // for node_handle +#include "absl/container/internal/common_policy_traits.h" +#include "absl/container/internal/compressed_tuple.h" +#include "absl/container/internal/container_memory.h" +#include "absl/container/internal/hash_function_defaults.h" +#include "absl/container/internal/hash_policy_traits.h" +#include "absl/container/internal/hashtable_debug_hooks.h" +#include "absl/container/internal/hashtablez_sampler.h" +#include "absl/hash/hash.h" +#include "absl/memory/memory.h" +#include "absl/meta/type_traits.h" +#include "absl/numeric/bits.h" +#include "absl/utility/utility.h" + +#ifdef ABSL_INTERNAL_HAVE_SSE2 +#include +#endif + +#ifdef ABSL_INTERNAL_HAVE_SSSE3 +#include +#endif + +#ifdef _MSC_VER +#include +#endif + +#ifdef ABSL_INTERNAL_HAVE_ARM_NEON +#include +#endif + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +#ifdef ABSL_SWISSTABLE_ENABLE_GENERATIONS +#error ABSL_SWISSTABLE_ENABLE_GENERATIONS cannot be directly set +#elif (defined(ABSL_HAVE_ADDRESS_SANITIZER) || \ + defined(ABSL_HAVE_HWADDRESS_SANITIZER) || \ + defined(ABSL_HAVE_MEMORY_SANITIZER)) && \ + !defined(NDEBUG_SANITIZER) // If defined, performance is important. +// When compiled in sanitizer mode, we add generation integers to the backing +// array and iterators. In the backing array, we store the generation between +// the control bytes and the slots. When iterators are dereferenced, we assert +// that the container has not been mutated in a way that could cause iterator +// invalidation since the iterator was initialized. +#define ABSL_SWISSTABLE_ENABLE_GENERATIONS +#endif + +#ifdef ABSL_SWISSTABLE_ASSERT +#error ABSL_SWISSTABLE_ASSERT cannot be directly set +#else +// We use this macro for assertions that users may see when the table is in an +// invalid state that sanitizers may help diagnose. +#define ABSL_SWISSTABLE_ASSERT(CONDITION) \ + assert((CONDITION) && "Try enabling sanitizers.") +#endif + +// We use uint8_t so we don't need to worry about padding. +using GenerationType = uint8_t; + +// A sentinel value for empty generations. Using 0 makes it easy to constexpr +// initialize an array of this value. +constexpr GenerationType SentinelEmptyGeneration() { return 0; } + +constexpr GenerationType NextGeneration(GenerationType generation) { + return ++generation == SentinelEmptyGeneration() ? ++generation : generation; +} + +#ifdef ABSL_SWISSTABLE_ENABLE_GENERATIONS +constexpr bool SwisstableGenerationsEnabled() { return true; } +constexpr size_t NumGenerationBytes() { return sizeof(GenerationType); } +#else +constexpr bool SwisstableGenerationsEnabled() { return false; } +constexpr size_t NumGenerationBytes() { return 0; } +#endif + +template +void SwapAlloc(AllocType& lhs, AllocType& rhs, + std::true_type /* propagate_on_container_swap */) { + using std::swap; + swap(lhs, rhs); +} +template +void SwapAlloc(AllocType& lhs, AllocType& rhs, + std::false_type /* propagate_on_container_swap */) { + (void)lhs; + (void)rhs; + assert(lhs == rhs && + "It's UB to call swap with unequal non-propagating allocators."); +} + +template +void CopyAlloc(AllocType& lhs, AllocType& rhs, + std::true_type /* propagate_alloc */) { + lhs = rhs; +} +template +void CopyAlloc(AllocType&, AllocType&, std::false_type /* propagate_alloc */) {} + +// The state for a probe sequence. +// +// Currently, the sequence is a triangular progression of the form +// +// p(i) := Width * (i^2 + i)/2 + hash (mod mask + 1) +// +// The use of `Width` ensures that each probe step does not overlap groups; +// the sequence effectively outputs the addresses of *groups* (although not +// necessarily aligned to any boundary). The `Group` machinery allows us +// to check an entire group with minimal branching. +// +// Wrapping around at `mask + 1` is important, but not for the obvious reason. +// As described above, the first few entries of the control byte array +// are mirrored at the end of the array, which `Group` will find and use +// for selecting candidates. However, when those candidates' slots are +// actually inspected, there are no corresponding slots for the cloned bytes, +// so we need to make sure we've treated those offsets as "wrapping around". +// +// It turns out that this probe sequence visits every group exactly once if the +// number of groups is a power of two, since (i^2+i)/2 is a bijection in +// Z/(2^m). See https://en.wikipedia.org/wiki/Quadratic_probing +template +class probe_seq { + public: + // Creates a new probe sequence using `hash` as the initial value of the + // sequence and `mask` (usually the capacity of the table) as the mask to + // apply to each value in the progression. + probe_seq(size_t hash, size_t mask) { + ABSL_SWISSTABLE_ASSERT(((mask + 1) & mask) == 0 && "not a mask"); + mask_ = mask; + offset_ = hash & mask_; + } + + // The offset within the table, i.e., the value `p(i)` above. + size_t offset() const { return offset_; } + size_t offset(size_t i) const { return (offset_ + i) & mask_; } + + void next() { + index_ += Width; + offset_ += index_; + offset_ &= mask_; + } + // 0-based probe index, a multiple of `Width`. + size_t index() const { return index_; } + + private: + size_t mask_; + size_t offset_; + size_t index_ = 0; +}; + +template +struct RequireUsableKey { + template + std::pair< + decltype(std::declval()(std::declval())), + decltype(std::declval()(std::declval(), + std::declval()))>* + operator()(const PassedKey&, const Args&...) const; +}; + +template +struct IsDecomposable : std::false_type {}; + +template +struct IsDecomposable< + absl::void_t(), + std::declval()...))>, + Policy, Hash, Eq, Ts...> : std::true_type {}; + +// TODO(alkis): Switch to std::is_nothrow_swappable when gcc/clang supports it. +template +constexpr bool IsNoThrowSwappable(std::true_type = {} /* is_swappable */) { + using std::swap; + return noexcept(swap(std::declval(), std::declval())); +} +template +constexpr bool IsNoThrowSwappable(std::false_type /* is_swappable */) { + return false; +} + +template +uint32_t TrailingZeros(T x) { + ABSL_ASSUME(x != 0); + return static_cast(countr_zero(x)); +} + +// 8 bytes bitmask with most significant bit set for every byte. +constexpr uint64_t kMsbs8Bytes = 0x8080808080808080ULL; + +// An abstract bitmask, such as that emitted by a SIMD instruction. +// +// Specifically, this type implements a simple bitset whose representation is +// controlled by `SignificantBits` and `Shift`. `SignificantBits` is the number +// of abstract bits in the bitset, while `Shift` is the log-base-two of the +// width of an abstract bit in the representation. +// This mask provides operations for any number of real bits set in an abstract +// bit. To add iteration on top of that, implementation must guarantee no more +// than the most significant real bit is set in a set abstract bit. +template +class NonIterableBitMask { + public: + explicit NonIterableBitMask(T mask) : mask_(mask) {} + + explicit operator bool() const { return this->mask_ != 0; } + + // Returns the index of the lowest *abstract* bit set in `self`. + uint32_t LowestBitSet() const { + return container_internal::TrailingZeros(mask_) >> Shift; + } + + // Returns the index of the highest *abstract* bit set in `self`. + uint32_t HighestBitSet() const { + return static_cast((bit_width(mask_) - 1) >> Shift); + } + + // Returns the number of trailing zero *abstract* bits. + uint32_t TrailingZeros() const { + return container_internal::TrailingZeros(mask_) >> Shift; + } + + // Returns the number of leading zero *abstract* bits. + uint32_t LeadingZeros() const { + constexpr int total_significant_bits = SignificantBits << Shift; + constexpr int extra_bits = sizeof(T) * 8 - total_significant_bits; + return static_cast( + countl_zero(static_cast(mask_ << extra_bits))) >> + Shift; + } + + T mask_; +}; + +// Mask that can be iterable +// +// For example, when `SignificantBits` is 16 and `Shift` is zero, this is just +// an ordinary 16-bit bitset occupying the low 16 bits of `mask`. When +// `SignificantBits` is 8 and `Shift` is 3, abstract bits are represented as +// the bytes `0x00` and `0x80`, and it occupies all 64 bits of the bitmask. +// If NullifyBitsOnIteration is true (only allowed for Shift == 3), +// non zero abstract bit is allowed to have additional bits +// (e.g., `0xff`, `0x83` and `0x9c` are ok, but `0x6f` is not). +// +// For example: +// for (int i : BitMask(0b101)) -> yields 0, 2 +// for (int i : BitMask(0x0000000080800000)) -> yields 2, 3 +template +class BitMask : public NonIterableBitMask { + using Base = NonIterableBitMask; + static_assert(std::is_unsigned::value, ""); + static_assert(Shift == 0 || Shift == 3, ""); + static_assert(!NullifyBitsOnIteration || Shift == 3, ""); + + public: + explicit BitMask(T mask) : Base(mask) { + if (Shift == 3 && !NullifyBitsOnIteration) { + ABSL_SWISSTABLE_ASSERT(this->mask_ == (this->mask_ & kMsbs8Bytes)); + } + } + // BitMask is an iterator over the indices of its abstract bits. + using value_type = int; + using iterator = BitMask; + using const_iterator = BitMask; + + BitMask& operator++() { + if (Shift == 3 && NullifyBitsOnIteration) { + this->mask_ &= kMsbs8Bytes; + } + this->mask_ &= (this->mask_ - 1); + return *this; + } + + uint32_t operator*() const { return Base::LowestBitSet(); } + + BitMask begin() const { return *this; } + BitMask end() const { return BitMask(0); } + + private: + friend bool operator==(const BitMask& a, const BitMask& b) { + return a.mask_ == b.mask_; + } + friend bool operator!=(const BitMask& a, const BitMask& b) { + return a.mask_ != b.mask_; + } +}; + +using h2_t = uint8_t; + +// The values here are selected for maximum performance. See the static asserts +// below for details. + +// A `ctrl_t` is a single control byte, which can have one of four +// states: empty, deleted, full (which has an associated seven-bit h2_t value) +// and the sentinel. They have the following bit patterns: +// +// empty: 1 0 0 0 0 0 0 0 +// deleted: 1 1 1 1 1 1 1 0 +// full: 0 h h h h h h h // h represents the hash bits. +// sentinel: 1 1 1 1 1 1 1 1 +// +// These values are specifically tuned for SSE-flavored SIMD. +// The static_asserts below detail the source of these choices. +// +// We use an enum class so that when strict aliasing is enabled, the compiler +// knows ctrl_t doesn't alias other types. +enum class ctrl_t : int8_t { + kEmpty = -128, // 0b10000000 + kDeleted = -2, // 0b11111110 + kSentinel = -1, // 0b11111111 +}; +static_assert( + (static_cast(ctrl_t::kEmpty) & + static_cast(ctrl_t::kDeleted) & + static_cast(ctrl_t::kSentinel) & 0x80) != 0, + "Special markers need to have the MSB to make checking for them efficient"); +static_assert( + ctrl_t::kEmpty < ctrl_t::kSentinel && ctrl_t::kDeleted < ctrl_t::kSentinel, + "ctrl_t::kEmpty and ctrl_t::kDeleted must be smaller than " + "ctrl_t::kSentinel to make the SIMD test of IsEmptyOrDeleted() efficient"); +static_assert( + ctrl_t::kSentinel == static_cast(-1), + "ctrl_t::kSentinel must be -1 to elide loading it from memory into SIMD " + "registers (pcmpeqd xmm, xmm)"); +static_assert(ctrl_t::kEmpty == static_cast(-128), + "ctrl_t::kEmpty must be -128 to make the SIMD check for its " + "existence efficient (psignb xmm, xmm)"); +static_assert( + (~static_cast(ctrl_t::kEmpty) & + ~static_cast(ctrl_t::kDeleted) & + static_cast(ctrl_t::kSentinel) & 0x7F) != 0, + "ctrl_t::kEmpty and ctrl_t::kDeleted must share an unset bit that is not " + "shared by ctrl_t::kSentinel to make the scalar test for " + "MaskEmptyOrDeleted() efficient"); +static_assert(ctrl_t::kDeleted == static_cast(-2), + "ctrl_t::kDeleted must be -2 to make the implementation of " + "ConvertSpecialToEmptyAndFullToDeleted efficient"); + +// See definition comment for why this is size 32. +ABSL_DLL extern const ctrl_t kEmptyGroup[32]; + +// We use these sentinel capacity values in debug mode to indicate different +// classes of bugs. +enum InvalidCapacity : size_t { + kAboveMaxValidCapacity = ~size_t{} - 100, + kReentrance, + kDestroyed, + + // These two must be last because we use `>= kMovedFrom` to mean moved-from. + kMovedFrom, + kSelfMovedFrom, +}; + +// Returns a pointer to a control byte group that can be used by empty tables. +inline ctrl_t* EmptyGroup() { + // Const must be cast away here; no uses of this function will actually write + // to it because it is only used for empty tables. + return const_cast(kEmptyGroup + 16); +} + +// For use in SOO iterators. +// TODO(b/289225379): we could potentially get rid of this by adding an is_soo +// bit in iterators. This would add branches but reduce cache misses. +ABSL_DLL extern const ctrl_t kSooControl[17]; + +// Returns a pointer to a full byte followed by a sentinel byte. +inline ctrl_t* SooControl() { + // Const must be cast away here; no uses of this function will actually write + // to it because it is only used for SOO iterators. + return const_cast(kSooControl); +} +// Whether ctrl is from the SooControl array. +inline bool IsSooControl(const ctrl_t* ctrl) { return ctrl == SooControl(); } + +// Returns a pointer to a generation to use for an empty hashtable. +GenerationType* EmptyGeneration(); + +// Returns whether `generation` is a generation for an empty hashtable that +// could be returned by EmptyGeneration(). +inline bool IsEmptyGeneration(const GenerationType* generation) { + return *generation == SentinelEmptyGeneration(); +} + +// Mixes a randomly generated per-process seed with `hash` and `ctrl` to +// randomize insertion order within groups. +bool ShouldInsertBackwardsForDebug(size_t capacity, size_t hash, + const ctrl_t* ctrl); + +ABSL_ATTRIBUTE_ALWAYS_INLINE inline bool ShouldInsertBackwards( + ABSL_ATTRIBUTE_UNUSED size_t capacity, ABSL_ATTRIBUTE_UNUSED size_t hash, + ABSL_ATTRIBUTE_UNUSED const ctrl_t* ctrl) { +#if defined(NDEBUG) + return false; +#else + return ShouldInsertBackwardsForDebug(capacity, hash, ctrl); +#endif +} + +// Returns insert position for the given mask. +// We want to add entropy even when ASLR is not enabled. +// In debug build we will randomly insert in either the front or back of +// the group. +// TODO(kfm,sbenza): revisit after we do unconditional mixing +template +ABSL_ATTRIBUTE_ALWAYS_INLINE inline auto GetInsertionOffset( + Mask mask, ABSL_ATTRIBUTE_UNUSED size_t capacity, + ABSL_ATTRIBUTE_UNUSED size_t hash, + ABSL_ATTRIBUTE_UNUSED const ctrl_t* ctrl) { +#if defined(NDEBUG) + return mask.LowestBitSet(); +#else + return ShouldInsertBackwardsForDebug(capacity, hash, ctrl) + ? mask.HighestBitSet() + : mask.LowestBitSet(); +#endif +} + +// Returns a per-table, hash salt, which changes on resize. This gets mixed into +// H1 to randomize iteration order per-table. +// +// The seed consists of the ctrl_ pointer, which adds enough entropy to ensure +// non-determinism of iteration order in most cases. +inline size_t PerTableSalt(const ctrl_t* ctrl) { + // The low bits of the pointer have little or no entropy because of + // alignment. We shift the pointer to try to use higher entropy bits. A + // good number seems to be 12 bits, because that aligns with page size. + return reinterpret_cast(ctrl) >> 12; +} +// Extracts the H1 portion of a hash: 57 bits mixed with a per-table salt. +inline size_t H1(size_t hash, const ctrl_t* ctrl) { + return (hash >> 7) ^ PerTableSalt(ctrl); +} + +// Extracts the H2 portion of a hash: the 7 bits not used for H1. +// +// These are used as an occupied control byte. +inline h2_t H2(size_t hash) { return hash & 0x7F; } + +// Helpers for checking the state of a control byte. +inline bool IsEmpty(ctrl_t c) { return c == ctrl_t::kEmpty; } +inline bool IsFull(ctrl_t c) { + // Cast `c` to the underlying type instead of casting `0` to `ctrl_t` as `0` + // is not a value in the enum. Both ways are equivalent, but this way makes + // linters happier. + return static_cast>(c) >= 0; +} +inline bool IsDeleted(ctrl_t c) { return c == ctrl_t::kDeleted; } +inline bool IsEmptyOrDeleted(ctrl_t c) { return c < ctrl_t::kSentinel; } + +#ifdef ABSL_INTERNAL_HAVE_SSE2 +// Quick reference guide for intrinsics used below: +// +// * __m128i: An XMM (128-bit) word. +// +// * _mm_setzero_si128: Returns a zero vector. +// * _mm_set1_epi8: Returns a vector with the same i8 in each lane. +// +// * _mm_subs_epi8: Saturating-subtracts two i8 vectors. +// * _mm_and_si128: Ands two i128s together. +// * _mm_or_si128: Ors two i128s together. +// * _mm_andnot_si128: And-nots two i128s together. +// +// * _mm_cmpeq_epi8: Component-wise compares two i8 vectors for equality, +// filling each lane with 0x00 or 0xff. +// * _mm_cmpgt_epi8: Same as above, but using > rather than ==. +// +// * _mm_loadu_si128: Performs an unaligned load of an i128. +// * _mm_storeu_si128: Performs an unaligned store of an i128. +// +// * _mm_sign_epi8: Retains, negates, or zeroes each i8 lane of the first +// argument if the corresponding lane of the second +// argument is positive, negative, or zero, respectively. +// * _mm_movemask_epi8: Selects the sign bit out of each i8 lane and produces a +// bitmask consisting of those bits. +// * _mm_shuffle_epi8: Selects i8s from the first argument, using the low +// four bits of each i8 lane in the second argument as +// indices. + +// https://github.com/abseil/abseil-cpp/issues/209 +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87853 +// _mm_cmpgt_epi8 is broken under GCC with -funsigned-char +// Work around this by using the portable implementation of Group +// when using -funsigned-char under GCC. +inline __m128i _mm_cmpgt_epi8_fixed(__m128i a, __m128i b) { +#if defined(__GNUC__) && !defined(__clang__) + if (std::is_unsigned::value) { + const __m128i mask = _mm_set1_epi8(0x80); + const __m128i diff = _mm_subs_epi8(b, a); + return _mm_cmpeq_epi8(_mm_and_si128(diff, mask), mask); + } +#endif + return _mm_cmpgt_epi8(a, b); +} + +struct GroupSse2Impl { + static constexpr size_t kWidth = 16; // the number of slots per group + + explicit GroupSse2Impl(const ctrl_t* pos) { + ctrl = _mm_loadu_si128(reinterpret_cast(pos)); + } + + // Returns a bitmask representing the positions of slots that match hash. + BitMask Match(h2_t hash) const { + auto match = _mm_set1_epi8(static_cast(hash)); + return BitMask( + static_cast(_mm_movemask_epi8(_mm_cmpeq_epi8(match, ctrl)))); + } + + // Returns a bitmask representing the positions of empty slots. + NonIterableBitMask MaskEmpty() const { +#ifdef ABSL_INTERNAL_HAVE_SSSE3 + // This only works because ctrl_t::kEmpty is -128. + return NonIterableBitMask( + static_cast(_mm_movemask_epi8(_mm_sign_epi8(ctrl, ctrl)))); +#else + auto match = _mm_set1_epi8(static_cast(ctrl_t::kEmpty)); + return NonIterableBitMask( + static_cast(_mm_movemask_epi8(_mm_cmpeq_epi8(match, ctrl)))); +#endif + } + + // Returns a bitmask representing the positions of full slots. + // Note: for `is_small()` tables group may contain the "same" slot twice: + // original and mirrored. + BitMask MaskFull() const { + return BitMask( + static_cast(_mm_movemask_epi8(ctrl) ^ 0xffff)); + } + + // Returns a bitmask representing the positions of non full slots. + // Note: this includes: kEmpty, kDeleted, kSentinel. + // It is useful in contexts when kSentinel is not present. + auto MaskNonFull() const { + return BitMask( + static_cast(_mm_movemask_epi8(ctrl))); + } + + // Returns a bitmask representing the positions of empty or deleted slots. + NonIterableBitMask MaskEmptyOrDeleted() const { + auto special = _mm_set1_epi8(static_cast(ctrl_t::kSentinel)); + return NonIterableBitMask(static_cast( + _mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl)))); + } + + // Returns the number of trailing empty or deleted elements in the group. + uint32_t CountLeadingEmptyOrDeleted() const { + auto special = _mm_set1_epi8(static_cast(ctrl_t::kSentinel)); + return TrailingZeros(static_cast( + _mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl)) + 1)); + } + + void ConvertSpecialToEmptyAndFullToDeleted(ctrl_t* dst) const { + auto msbs = _mm_set1_epi8(static_cast(-128)); + auto x126 = _mm_set1_epi8(126); +#ifdef ABSL_INTERNAL_HAVE_SSSE3 + auto res = _mm_or_si128(_mm_shuffle_epi8(x126, ctrl), msbs); +#else + auto zero = _mm_setzero_si128(); + auto special_mask = _mm_cmpgt_epi8_fixed(zero, ctrl); + auto res = _mm_or_si128(msbs, _mm_andnot_si128(special_mask, x126)); +#endif + _mm_storeu_si128(reinterpret_cast<__m128i*>(dst), res); + } + + __m128i ctrl; +}; +#endif // ABSL_INTERNAL_RAW_HASH_SET_HAVE_SSE2 + +#if defined(ABSL_INTERNAL_HAVE_ARM_NEON) && defined(ABSL_IS_LITTLE_ENDIAN) +struct GroupAArch64Impl { + static constexpr size_t kWidth = 8; + + explicit GroupAArch64Impl(const ctrl_t* pos) { + ctrl = vld1_u8(reinterpret_cast(pos)); + } + + auto Match(h2_t hash) const { + uint8x8_t dup = vdup_n_u8(hash); + auto mask = vceq_u8(ctrl, dup); + return BitMask( + vget_lane_u64(vreinterpret_u64_u8(mask), 0)); + } + + NonIterableBitMask MaskEmpty() const { + uint64_t mask = + vget_lane_u64(vreinterpret_u64_u8(vceq_s8( + vdup_n_s8(static_cast(ctrl_t::kEmpty)), + vreinterpret_s8_u8(ctrl))), + 0); + return NonIterableBitMask(mask); + } + + // Returns a bitmask representing the positions of full slots. + // Note: for `is_small()` tables group may contain the "same" slot twice: + // original and mirrored. + auto MaskFull() const { + uint64_t mask = vget_lane_u64( + vreinterpret_u64_u8(vcge_s8(vreinterpret_s8_u8(ctrl), + vdup_n_s8(static_cast(0)))), + 0); + return BitMask(mask); + } + + // Returns a bitmask representing the positions of non full slots. + // Note: this includes: kEmpty, kDeleted, kSentinel. + // It is useful in contexts when kSentinel is not present. + auto MaskNonFull() const { + uint64_t mask = vget_lane_u64( + vreinterpret_u64_u8(vclt_s8(vreinterpret_s8_u8(ctrl), + vdup_n_s8(static_cast(0)))), + 0); + return BitMask(mask); + } + + NonIterableBitMask MaskEmptyOrDeleted() const { + uint64_t mask = + vget_lane_u64(vreinterpret_u64_u8(vcgt_s8( + vdup_n_s8(static_cast(ctrl_t::kSentinel)), + vreinterpret_s8_u8(ctrl))), + 0); + return NonIterableBitMask(mask); + } + + uint32_t CountLeadingEmptyOrDeleted() const { + uint64_t mask = + vget_lane_u64(vreinterpret_u64_u8(vcle_s8( + vdup_n_s8(static_cast(ctrl_t::kSentinel)), + vreinterpret_s8_u8(ctrl))), + 0); + // Similar to MaskEmptyorDeleted() but we invert the logic to invert the + // produced bitfield. We then count number of trailing zeros. + // Clang and GCC optimize countr_zero to rbit+clz without any check for 0, + // so we should be fine. + return static_cast(countr_zero(mask)) >> 3; + } + + void ConvertSpecialToEmptyAndFullToDeleted(ctrl_t* dst) const { + uint64_t mask = vget_lane_u64(vreinterpret_u64_u8(ctrl), 0); + constexpr uint64_t slsbs = 0x0202020202020202ULL; + constexpr uint64_t midbs = 0x7e7e7e7e7e7e7e7eULL; + auto x = slsbs & (mask >> 6); + auto res = (x + midbs) | kMsbs8Bytes; + little_endian::Store64(dst, res); + } + + uint8x8_t ctrl; +}; +#endif // ABSL_INTERNAL_HAVE_ARM_NEON && ABSL_IS_LITTLE_ENDIAN + +struct GroupPortableImpl { + static constexpr size_t kWidth = 8; + + explicit GroupPortableImpl(const ctrl_t* pos) + : ctrl(little_endian::Load64(pos)) {} + + BitMask Match(h2_t hash) const { + // For the technique, see: + // http://graphics.stanford.edu/~seander/bithacks.html##ValueInWord + // (Determine if a word has a byte equal to n). + // + // Caveat: there are false positives but: + // - they only occur if there is a real match + // - they never occur on ctrl_t::kEmpty, ctrl_t::kDeleted, ctrl_t::kSentinel + // - they will be handled gracefully by subsequent checks in code + // + // Example: + // v = 0x1716151413121110 + // hash = 0x12 + // retval = (v - lsbs) & ~v & msbs = 0x0000000080800000 + constexpr uint64_t lsbs = 0x0101010101010101ULL; + auto x = ctrl ^ (lsbs * hash); + return BitMask((x - lsbs) & ~x & kMsbs8Bytes); + } + + NonIterableBitMask MaskEmpty() const { + return NonIterableBitMask((ctrl & ~(ctrl << 6)) & + kMsbs8Bytes); + } + + // Returns a bitmask representing the positions of full slots. + // Note: for `is_small()` tables group may contain the "same" slot twice: + // original and mirrored. + BitMask MaskFull() const { + return BitMask((ctrl ^ kMsbs8Bytes) & kMsbs8Bytes); + } + + // Returns a bitmask representing the positions of non full slots. + // Note: this includes: kEmpty, kDeleted, kSentinel. + // It is useful in contexts when kSentinel is not present. + auto MaskNonFull() const { + return BitMask(ctrl & kMsbs8Bytes); + } + + NonIterableBitMask MaskEmptyOrDeleted() const { + return NonIterableBitMask((ctrl & ~(ctrl << 7)) & + kMsbs8Bytes); + } + + uint32_t CountLeadingEmptyOrDeleted() const { + // ctrl | ~(ctrl >> 7) will have the lowest bit set to zero for kEmpty and + // kDeleted. We lower all other bits and count number of trailing zeros. + constexpr uint64_t bits = 0x0101010101010101ULL; + return static_cast(countr_zero((ctrl | ~(ctrl >> 7)) & bits) >> + 3); + } + + void ConvertSpecialToEmptyAndFullToDeleted(ctrl_t* dst) const { + constexpr uint64_t lsbs = 0x0101010101010101ULL; + auto x = ctrl & kMsbs8Bytes; + auto res = (~x + (x >> 7)) & ~lsbs; + little_endian::Store64(dst, res); + } + + uint64_t ctrl; +}; + +#ifdef ABSL_INTERNAL_HAVE_SSE2 +using Group = GroupSse2Impl; +using GroupFullEmptyOrDeleted = GroupSse2Impl; +#elif defined(ABSL_INTERNAL_HAVE_ARM_NEON) && defined(ABSL_IS_LITTLE_ENDIAN) +using Group = GroupAArch64Impl; +// For Aarch64, we use the portable implementation for counting and masking +// full, empty or deleted group elements. This is to avoid the latency of moving +// between data GPRs and Neon registers when it does not provide a benefit. +// Using Neon is profitable when we call Match(), but is not when we don't, +// which is the case when we do *EmptyOrDeleted and MaskFull operations. +// It is difficult to make a similar approach beneficial on other architectures +// such as x86 since they have much lower GPR <-> vector register transfer +// latency and 16-wide Groups. +using GroupFullEmptyOrDeleted = GroupPortableImpl; +#else +using Group = GroupPortableImpl; +using GroupFullEmptyOrDeleted = GroupPortableImpl; +#endif + +// When there is an insertion with no reserved growth, we rehash with +// probability `min(1, RehashProbabilityConstant() / capacity())`. Using a +// constant divided by capacity ensures that inserting N elements is still O(N) +// in the average case. Using the constant 16 means that we expect to rehash ~8 +// times more often than when generations are disabled. We are adding expected +// rehash_probability * #insertions/capacity_growth = 16/capacity * ((7/8 - +// 7/16) * capacity)/capacity_growth = ~7 extra rehashes per capacity growth. +inline size_t RehashProbabilityConstant() { return 16; } + +class CommonFieldsGenerationInfoEnabled { + // A sentinel value for reserved_growth_ indicating that we just ran out of + // reserved growth on the last insertion. When reserve is called and then + // insertions take place, reserved_growth_'s state machine is N, ..., 1, + // kReservedGrowthJustRanOut, 0. + static constexpr size_t kReservedGrowthJustRanOut = + (std::numeric_limits::max)(); + + public: + CommonFieldsGenerationInfoEnabled() = default; + CommonFieldsGenerationInfoEnabled(CommonFieldsGenerationInfoEnabled&& that) + : reserved_growth_(that.reserved_growth_), + reservation_size_(that.reservation_size_), + generation_(that.generation_) { + that.reserved_growth_ = 0; + that.reservation_size_ = 0; + that.generation_ = EmptyGeneration(); + } + CommonFieldsGenerationInfoEnabled& operator=( + CommonFieldsGenerationInfoEnabled&&) = default; + + // Whether we should rehash on insert in order to detect bugs of using invalid + // references. We rehash on the first insertion after reserved_growth_ reaches + // 0 after a call to reserve. We also do a rehash with low probability + // whenever reserved_growth_ is zero. + bool should_rehash_for_bug_detection_on_insert(const ctrl_t* ctrl, + size_t capacity) const; + // Similar to above, except that we don't depend on reserved_growth_. + bool should_rehash_for_bug_detection_on_move(const ctrl_t* ctrl, + size_t capacity) const; + void maybe_increment_generation_on_insert() { + if (reserved_growth_ == kReservedGrowthJustRanOut) reserved_growth_ = 0; + + if (reserved_growth_ > 0) { + if (--reserved_growth_ == 0) reserved_growth_ = kReservedGrowthJustRanOut; + } else { + increment_generation(); + } + } + void increment_generation() { *generation_ = NextGeneration(*generation_); } + void reset_reserved_growth(size_t reservation, size_t size) { + reserved_growth_ = reservation - size; + } + size_t reserved_growth() const { return reserved_growth_; } + void set_reserved_growth(size_t r) { reserved_growth_ = r; } + size_t reservation_size() const { return reservation_size_; } + void set_reservation_size(size_t r) { reservation_size_ = r; } + GenerationType generation() const { return *generation_; } + void set_generation(GenerationType g) { *generation_ = g; } + GenerationType* generation_ptr() const { return generation_; } + void set_generation_ptr(GenerationType* g) { generation_ = g; } + + private: + // The number of insertions remaining that are guaranteed to not rehash due to + // a prior call to reserve. Note: we store reserved growth in addition to + // reservation size because calls to erase() decrease size_ but don't decrease + // reserved growth. + size_t reserved_growth_ = 0; + // The maximum argument to reserve() since the container was cleared. We need + // to keep track of this, in addition to reserved growth, because we reset + // reserved growth to this when erase(begin(), end()) is called. + size_t reservation_size_ = 0; + // Pointer to the generation counter, which is used to validate iterators and + // is stored in the backing array between the control bytes and the slots. + // Note that we can't store the generation inside the container itself and + // keep a pointer to the container in the iterators because iterators must + // remain valid when the container is moved. + // Note: we could derive this pointer from the control pointer, but it makes + // the code more complicated, and there's a benefit in having the sizes of + // raw_hash_set in sanitizer mode and non-sanitizer mode a bit more different, + // which is that tests are less likely to rely on the size remaining the same. + GenerationType* generation_ = EmptyGeneration(); +}; + +class CommonFieldsGenerationInfoDisabled { + public: + CommonFieldsGenerationInfoDisabled() = default; + CommonFieldsGenerationInfoDisabled(CommonFieldsGenerationInfoDisabled&&) = + default; + CommonFieldsGenerationInfoDisabled& operator=( + CommonFieldsGenerationInfoDisabled&&) = default; + + bool should_rehash_for_bug_detection_on_insert(const ctrl_t*, size_t) const { + return false; + } + bool should_rehash_for_bug_detection_on_move(const ctrl_t*, size_t) const { + return false; + } + void maybe_increment_generation_on_insert() {} + void increment_generation() {} + void reset_reserved_growth(size_t, size_t) {} + size_t reserved_growth() const { return 0; } + void set_reserved_growth(size_t) {} + size_t reservation_size() const { return 0; } + void set_reservation_size(size_t) {} + GenerationType generation() const { return 0; } + void set_generation(GenerationType) {} + GenerationType* generation_ptr() const { return nullptr; } + void set_generation_ptr(GenerationType*) {} +}; + +class HashSetIteratorGenerationInfoEnabled { + public: + HashSetIteratorGenerationInfoEnabled() = default; + explicit HashSetIteratorGenerationInfoEnabled( + const GenerationType* generation_ptr) + : generation_ptr_(generation_ptr), generation_(*generation_ptr) {} + + GenerationType generation() const { return generation_; } + void reset_generation() { generation_ = *generation_ptr_; } + const GenerationType* generation_ptr() const { return generation_ptr_; } + void set_generation_ptr(const GenerationType* ptr) { generation_ptr_ = ptr; } + + private: + const GenerationType* generation_ptr_ = EmptyGeneration(); + GenerationType generation_ = *generation_ptr_; +}; + +class HashSetIteratorGenerationInfoDisabled { + public: + HashSetIteratorGenerationInfoDisabled() = default; + explicit HashSetIteratorGenerationInfoDisabled(const GenerationType*) {} + + GenerationType generation() const { return 0; } + void reset_generation() {} + const GenerationType* generation_ptr() const { return nullptr; } + void set_generation_ptr(const GenerationType*) {} +}; + +#ifdef ABSL_SWISSTABLE_ENABLE_GENERATIONS +using CommonFieldsGenerationInfo = CommonFieldsGenerationInfoEnabled; +using HashSetIteratorGenerationInfo = HashSetIteratorGenerationInfoEnabled; +#else +using CommonFieldsGenerationInfo = CommonFieldsGenerationInfoDisabled; +using HashSetIteratorGenerationInfo = HashSetIteratorGenerationInfoDisabled; +#endif + +// Stored the information regarding number of slots we can still fill +// without needing to rehash. +// +// We want to ensure sufficient number of empty slots in the table in order +// to keep probe sequences relatively short. Empty slot in the probe group +// is required to stop probing. +// +// Tombstones (kDeleted slots) are not included in the growth capacity, +// because we'd like to rehash when the table is filled with tombstones and/or +// full slots. +// +// GrowthInfo also stores a bit that encodes whether table may have any +// deleted slots. +// Most of the tables (>95%) have no deleted slots, so some functions can +// be more efficient with this information. +// +// Callers can also force a rehash via the standard `rehash(0)`, +// which will recompute this value as a side-effect. +// +// See also `CapacityToGrowth()`. +class GrowthInfo { + public: + // Leaves data member uninitialized. + GrowthInfo() = default; + + // Initializes the GrowthInfo assuming we can grow `growth_left` elements + // and there are no kDeleted slots in the table. + void InitGrowthLeftNoDeleted(size_t growth_left) { + growth_left_info_ = growth_left; + } + + // Overwrites single full slot with an empty slot. + void OverwriteFullAsEmpty() { ++growth_left_info_; } + + // Overwrites single empty slot with a full slot. + void OverwriteEmptyAsFull() { + ABSL_SWISSTABLE_ASSERT(GetGrowthLeft() > 0); + --growth_left_info_; + } + + // Overwrites several empty slots with full slots. + void OverwriteManyEmptyAsFull(size_t cnt) { + ABSL_SWISSTABLE_ASSERT(GetGrowthLeft() >= cnt); + growth_left_info_ -= cnt; + } + + // Overwrites specified control element with full slot. + void OverwriteControlAsFull(ctrl_t ctrl) { + ABSL_SWISSTABLE_ASSERT(GetGrowthLeft() >= + static_cast(IsEmpty(ctrl))); + growth_left_info_ -= static_cast(IsEmpty(ctrl)); + } + + // Overwrites single full slot with a deleted slot. + void OverwriteFullAsDeleted() { growth_left_info_ |= kDeletedBit; } + + // Returns true if table satisfies two properties: + // 1. Guaranteed to have no kDeleted slots. + // 2. There is a place for at least one element to grow. + bool HasNoDeletedAndGrowthLeft() const { + return static_cast>(growth_left_info_) > 0; + } + + // Returns true if the table satisfies two properties: + // 1. Guaranteed to have no kDeleted slots. + // 2. There is no growth left. + bool HasNoGrowthLeftAndNoDeleted() const { return growth_left_info_ == 0; } + + // Returns true if table guaranteed to have no k + bool HasNoDeleted() const { + return static_cast>(growth_left_info_) >= 0; + } + + // Returns the number of elements left to grow. + size_t GetGrowthLeft() const { return growth_left_info_ & kGrowthLeftMask; } + + private: + static constexpr size_t kGrowthLeftMask = ((~size_t{}) >> 1); + static constexpr size_t kDeletedBit = ~kGrowthLeftMask; + // Topmost bit signal whenever there are deleted slots. + size_t growth_left_info_; +}; + +static_assert(sizeof(GrowthInfo) == sizeof(size_t), ""); +static_assert(alignof(GrowthInfo) == alignof(size_t), ""); + +// Returns whether `n` is a valid capacity (i.e., number of slots). +// +// A valid capacity is a non-zero integer `2^m - 1`. +inline bool IsValidCapacity(size_t n) { return ((n + 1) & n) == 0 && n > 0; } + +// Returns the number of "cloned control bytes". +// +// This is the number of control bytes that are present both at the beginning +// of the control byte array and at the end, such that we can create a +// `Group::kWidth`-width probe window starting from any control byte. +constexpr size_t NumClonedBytes() { return Group::kWidth - 1; } + +// Returns the number of control bytes including cloned. +constexpr size_t NumControlBytes(size_t capacity) { + return capacity + 1 + NumClonedBytes(); +} + +// Computes the offset from the start of the backing allocation of control. +// infoz and growth_info are stored at the beginning of the backing array. +inline static size_t ControlOffset(bool has_infoz) { + return (has_infoz ? sizeof(HashtablezInfoHandle) : 0) + sizeof(GrowthInfo); +} + +// Helper class for computing offsets and allocation size of hash set fields. +class RawHashSetLayout { + public: + explicit RawHashSetLayout(size_t capacity, size_t slot_align, bool has_infoz) + : capacity_(capacity), + control_offset_(ControlOffset(has_infoz)), + generation_offset_(control_offset_ + NumControlBytes(capacity)), + slot_offset_( + (generation_offset_ + NumGenerationBytes() + slot_align - 1) & + (~slot_align + 1)) { + ABSL_SWISSTABLE_ASSERT(IsValidCapacity(capacity)); + } + + // Returns the capacity of a table. + size_t capacity() const { return capacity_; } + + // Returns precomputed offset from the start of the backing allocation of + // control. + size_t control_offset() const { return control_offset_; } + + // Given the capacity of a table, computes the offset (from the start of the + // backing allocation) of the generation counter (if it exists). + size_t generation_offset() const { return generation_offset_; } + + // Given the capacity of a table, computes the offset (from the start of the + // backing allocation) at which the slots begin. + size_t slot_offset() const { return slot_offset_; } + + // Given the capacity of a table, computes the total size of the backing + // array. + size_t alloc_size(size_t slot_size) const { + ABSL_SWISSTABLE_ASSERT( + slot_size <= + ((std::numeric_limits::max)() - slot_offset_) / capacity_); + return slot_offset_ + capacity_ * slot_size; + } + + private: + size_t capacity_; + size_t control_offset_; + size_t generation_offset_; + size_t slot_offset_; +}; + +struct HashtableFreeFunctionsAccess; + +// We only allow a maximum of 1 SOO element, which makes the implementation +// much simpler. Complications with multiple SOO elements include: +// - Satisfying the guarantee that erasing one element doesn't invalidate +// iterators to other elements means we would probably need actual SOO +// control bytes. +// - In order to prevent user code from depending on iteration order for small +// tables, we would need to randomize the iteration order somehow. +constexpr size_t SooCapacity() { return 1; } +// Sentinel type to indicate SOO CommonFields construction. +struct soo_tag_t {}; +// Sentinel type to indicate SOO CommonFields construction with full size. +struct full_soo_tag_t {}; +// Sentinel type to indicate non-SOO CommonFields construction. +struct non_soo_tag_t {}; +// Sentinel value to indicate an uninitialized CommonFields for use in swapping. +struct uninitialized_tag_t {}; + +// Suppress erroneous uninitialized memory errors on GCC. For example, GCC +// thinks that the call to slot_array() in find_or_prepare_insert() is reading +// uninitialized memory, but slot_array is only called there when the table is +// non-empty and this memory is initialized when the table is non-empty. +#if !defined(__clang__) && defined(__GNUC__) +#define ABSL_SWISSTABLE_IGNORE_UNINITIALIZED(x) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") \ + _Pragma("GCC diagnostic ignored \"-Wuninitialized\"") x; \ + _Pragma("GCC diagnostic pop") +#define ABSL_SWISSTABLE_IGNORE_UNINITIALIZED_RETURN(x) \ + ABSL_SWISSTABLE_IGNORE_UNINITIALIZED(return x) +#else +#define ABSL_SWISSTABLE_IGNORE_UNINITIALIZED(x) x +#define ABSL_SWISSTABLE_IGNORE_UNINITIALIZED_RETURN(x) return x +#endif + +// This allows us to work around an uninitialized memory warning when +// constructing begin() iterators in empty hashtables. +union MaybeInitializedPtr { + void* get() const { ABSL_SWISSTABLE_IGNORE_UNINITIALIZED_RETURN(p); } + void set(void* ptr) { p = ptr; } + + void* p; +}; + +struct HeapPtrs { + HeapPtrs() = default; + explicit HeapPtrs(ctrl_t* c) : control(c) {} + + // The control bytes (and, also, a pointer near to the base of the backing + // array). + // + // This contains `capacity + 1 + NumClonedBytes()` entries, even + // when the table is empty (hence EmptyGroup). + // + // Note that growth_info is stored immediately before this pointer. + // May be uninitialized for SOO tables. + ctrl_t* control; + + // The beginning of the slots, located at `SlotOffset()` bytes after + // `control`. May be uninitialized for empty tables. + // Note: we can't use `slots` because Qt defines "slots" as a macro. + MaybeInitializedPtr slot_array; +}; + +// Manages the backing array pointers or the SOO slot. When raw_hash_set::is_soo +// is true, the SOO slot is stored in `soo_data`. Otherwise, we use `heap`. +union HeapOrSoo { + HeapOrSoo() = default; + explicit HeapOrSoo(ctrl_t* c) : heap(c) {} + + ctrl_t*& control() { + ABSL_SWISSTABLE_IGNORE_UNINITIALIZED_RETURN(heap.control); + } + ctrl_t* control() const { + ABSL_SWISSTABLE_IGNORE_UNINITIALIZED_RETURN(heap.control); + } + MaybeInitializedPtr& slot_array() { + ABSL_SWISSTABLE_IGNORE_UNINITIALIZED_RETURN(heap.slot_array); + } + MaybeInitializedPtr slot_array() const { + ABSL_SWISSTABLE_IGNORE_UNINITIALIZED_RETURN(heap.slot_array); + } + void* get_soo_data() { + ABSL_SWISSTABLE_IGNORE_UNINITIALIZED_RETURN(soo_data); + } + const void* get_soo_data() const { + ABSL_SWISSTABLE_IGNORE_UNINITIALIZED_RETURN(soo_data); + } + + HeapPtrs heap; + unsigned char soo_data[sizeof(HeapPtrs)]; +}; + +// CommonFields hold the fields in raw_hash_set that do not depend +// on template parameters. This allows us to conveniently pass all +// of this state to helper functions as a single argument. +class CommonFields : public CommonFieldsGenerationInfo { + public: + explicit CommonFields(soo_tag_t) : capacity_(SooCapacity()), size_(0) {} + explicit CommonFields(full_soo_tag_t) + : capacity_(SooCapacity()), size_(size_t{1} << HasInfozShift()) {} + explicit CommonFields(non_soo_tag_t) + : capacity_(0), size_(0), heap_or_soo_(EmptyGroup()) {} + // For use in swapping. + explicit CommonFields(uninitialized_tag_t) {} + + // Not copyable + CommonFields(const CommonFields&) = delete; + CommonFields& operator=(const CommonFields&) = delete; + + // Movable + CommonFields(CommonFields&& that) = default; + CommonFields& operator=(CommonFields&&) = default; + + template + static CommonFields CreateDefault() { + return kSooEnabled ? CommonFields{soo_tag_t{}} + : CommonFields{non_soo_tag_t{}}; + } + + // The inline data for SOO is written on top of control_/slots_. + const void* soo_data() const { return heap_or_soo_.get_soo_data(); } + void* soo_data() { return heap_or_soo_.get_soo_data(); } + + HeapOrSoo heap_or_soo() const { return heap_or_soo_; } + const HeapOrSoo& heap_or_soo_ref() const { return heap_or_soo_; } + + ctrl_t* control() const { return heap_or_soo_.control(); } + void set_control(ctrl_t* c) { heap_or_soo_.control() = c; } + void* backing_array_start() const { + // growth_info (and maybe infoz) is stored before control bytes. + ABSL_SWISSTABLE_ASSERT( + reinterpret_cast(control()) % alignof(size_t) == 0); + return control() - ControlOffset(has_infoz()); + } + + // Note: we can't use slots() because Qt defines "slots" as a macro. + void* slot_array() const { return heap_or_soo_.slot_array().get(); } + MaybeInitializedPtr slots_union() const { return heap_or_soo_.slot_array(); } + void set_slots(void* s) { heap_or_soo_.slot_array().set(s); } + + // The number of filled slots. + size_t size() const { return size_ >> HasInfozShift(); } + void set_size(size_t s) { + size_ = (s << HasInfozShift()) | (size_ & HasInfozMask()); + } + void set_empty_soo() { + AssertInSooMode(); + size_ = 0; + } + void set_full_soo() { + AssertInSooMode(); + size_ = size_t{1} << HasInfozShift(); + } + void increment_size() { + ABSL_SWISSTABLE_ASSERT(size() < capacity()); + size_ += size_t{1} << HasInfozShift(); + } + void decrement_size() { + ABSL_SWISSTABLE_ASSERT(size() > 0); + size_ -= size_t{1} << HasInfozShift(); + } + + // The total number of available slots. + size_t capacity() const { return capacity_; } + void set_capacity(size_t c) { + // We allow setting above the max valid capacity for debugging purposes. + ABSL_SWISSTABLE_ASSERT(c == 0 || IsValidCapacity(c) || + c > kAboveMaxValidCapacity); + capacity_ = c; + } + + // The number of slots we can still fill without needing to rehash. + // This is stored in the heap allocation before the control bytes. + // TODO(b/289225379): experiment with moving growth_info back inline to + // increase room for SOO. + size_t growth_left() const { return growth_info().GetGrowthLeft(); } + + GrowthInfo& growth_info() { + auto* gl_ptr = reinterpret_cast(control()) - 1; + ABSL_SWISSTABLE_ASSERT( + reinterpret_cast(gl_ptr) % alignof(GrowthInfo) == 0); + return *gl_ptr; + } + GrowthInfo growth_info() const { + return const_cast(this)->growth_info(); + } + + bool has_infoz() const { + return ABSL_PREDICT_FALSE((size_ & HasInfozMask()) != 0); + } + void set_has_infoz(bool has_infoz) { + size_ = (size() << HasInfozShift()) | static_cast(has_infoz); + } + + HashtablezInfoHandle infoz() { + return has_infoz() + ? *reinterpret_cast(backing_array_start()) + : HashtablezInfoHandle(); + } + void set_infoz(HashtablezInfoHandle infoz) { + ABSL_SWISSTABLE_ASSERT(has_infoz()); + *reinterpret_cast(backing_array_start()) = infoz; + } + + bool should_rehash_for_bug_detection_on_insert() const { + return CommonFieldsGenerationInfo:: + should_rehash_for_bug_detection_on_insert(control(), capacity()); + } + bool should_rehash_for_bug_detection_on_move() const { + return CommonFieldsGenerationInfo::should_rehash_for_bug_detection_on_move( + control(), capacity()); + } + void reset_reserved_growth(size_t reservation) { + CommonFieldsGenerationInfo::reset_reserved_growth(reservation, size()); + } + + // The size of the backing array allocation. + size_t alloc_size(size_t slot_size, size_t slot_align) const { + return RawHashSetLayout(capacity(), slot_align, has_infoz()) + .alloc_size(slot_size); + } + + // Move fields other than heap_or_soo_. + void move_non_heap_or_soo_fields(CommonFields& that) { + static_cast(*this) = + std::move(static_cast(that)); + capacity_ = that.capacity_; + size_ = that.size_; + } + + // Returns the number of control bytes set to kDeleted. For testing only. + size_t TombstonesCount() const { + return static_cast( + std::count(control(), control() + capacity(), ctrl_t::kDeleted)); + } + + // Helper to enable sanitizer mode validation to protect against reentrant + // calls during element constructor/destructor. + template + void RunWithReentrancyGuard(F f) { +#ifdef NDEBUG + f(); + return; +#endif + const size_t cap = capacity(); + set_capacity(InvalidCapacity::kReentrance); + f(); + set_capacity(cap); + } + + private: + // We store the has_infoz bit in the lowest bit of size_. + static constexpr size_t HasInfozShift() { return 1; } + static constexpr size_t HasInfozMask() { + return (size_t{1} << HasInfozShift()) - 1; + } + + // We can't assert that SOO is enabled because we don't have SooEnabled(), but + // we assert what we can. + void AssertInSooMode() const { + ABSL_SWISSTABLE_ASSERT(capacity() == SooCapacity()); + ABSL_SWISSTABLE_ASSERT(!has_infoz()); + } + + // The number of slots in the backing array. This is always 2^N-1 for an + // integer N. NOTE: we tried experimenting with compressing the capacity and + // storing it together with size_: (a) using 6 bits to store the corresponding + // power (N in 2^N-1), and (b) storing 2^N as the most significant bit of + // size_ and storing size in the low bits. Both of these experiments were + // regressions, presumably because we need capacity to do find operations. + size_t capacity_; + + // The size and also has one bit that stores whether we have infoz. + // TODO(b/289225379): we could put size_ into HeapOrSoo and make capacity_ + // encode the size in SOO case. We would be making size()/capacity() more + // expensive in order to have more SOO space. + size_t size_; + + // Either the control/slots pointers or the SOO slot. + HeapOrSoo heap_or_soo_; +}; + +template +class raw_hash_set; + +// Returns the next valid capacity after `n`. +inline size_t NextCapacity(size_t n) { + ABSL_SWISSTABLE_ASSERT(IsValidCapacity(n) || n == 0); + return n * 2 + 1; +} + +// Applies the following mapping to every byte in the control array: +// * kDeleted -> kEmpty +// * kEmpty -> kEmpty +// * _ -> kDeleted +// PRECONDITION: +// IsValidCapacity(capacity) +// ctrl[capacity] == ctrl_t::kSentinel +// ctrl[i] != ctrl_t::kSentinel for all i < capacity +void ConvertDeletedToEmptyAndFullToDeleted(ctrl_t* ctrl, size_t capacity); + +// Converts `n` into the next valid capacity, per `IsValidCapacity`. +inline size_t NormalizeCapacity(size_t n) { + return n ? ~size_t{} >> countl_zero(n) : 1; +} + +template +size_t MaxValidCapacity() { + return NormalizeCapacity((std::numeric_limits::max)() / 4 / + kSlotSize); +} + +// Use a non-inlined function to avoid code bloat. +[[noreturn]] void HashTableSizeOverflow(); + +// General notes on capacity/growth methods below: +// - We use 7/8th as maximum load factor. For 16-wide groups, that gives an +// average of two empty slots per group. +// - For (capacity+1) >= Group::kWidth, growth is 7/8*capacity. +// - For (capacity+1) < Group::kWidth, growth == capacity. In this case, we +// never need to probe (the whole table fits in one group) so we don't need a +// load factor less than 1. + +// Given `capacity`, applies the load factor; i.e., it returns the maximum +// number of values we should put into the table before a resizing rehash. +inline size_t CapacityToGrowth(size_t capacity) { + ABSL_SWISSTABLE_ASSERT(IsValidCapacity(capacity)); + // `capacity*7/8` + if (Group::kWidth == 8 && capacity == 7) { + // x-x/8 does not work when x==7. + return 6; + } + return capacity - capacity / 8; +} + +// Given `growth`, "unapplies" the load factor to find how large the capacity +// should be to stay within the load factor. +// +// This might not be a valid capacity and `NormalizeCapacity()` should be +// called on this. +inline size_t GrowthToLowerboundCapacity(size_t growth) { + // `growth*8/7` + if (Group::kWidth == 8 && growth == 7) { + // x+(x-1)/7 does not work when x==7. + return 8; + } + return growth + static_cast((static_cast(growth) - 1) / 7); +} + +template +size_t SelectBucketCountForIterRange(InputIter first, InputIter last, + size_t bucket_count) { + if (bucket_count != 0) { + return bucket_count; + } + using InputIterCategory = + typename std::iterator_traits::iterator_category; + if (std::is_base_of::value) { + return GrowthToLowerboundCapacity( + static_cast(std::distance(first, last))); + } + return 0; +} + +constexpr bool SwisstableDebugEnabled() { +#if defined(ABSL_SWISSTABLE_ENABLE_GENERATIONS) || \ + ABSL_OPTION_HARDENED == 1 || !defined(NDEBUG) + return true; +#else + return false; +#endif +} + +inline void AssertIsFull(const ctrl_t* ctrl, GenerationType generation, + const GenerationType* generation_ptr, + const char* operation) { + if (!SwisstableDebugEnabled()) return; + // `SwisstableDebugEnabled()` is also true for release builds with hardening + // enabled. To minimize their impact in those builds: + // - use `ABSL_PREDICT_FALSE()` to provide a compiler hint for code layout + // - use `ABSL_RAW_LOG()` with a format string to reduce code size and improve + // the chances that the hot paths will be inlined. + if (ABSL_PREDICT_FALSE(ctrl == nullptr)) { + ABSL_RAW_LOG(FATAL, "%s called on end() iterator.", operation); + } + if (ABSL_PREDICT_FALSE(ctrl == EmptyGroup())) { + ABSL_RAW_LOG(FATAL, "%s called on default-constructed iterator.", + operation); + } + if (SwisstableGenerationsEnabled()) { + if (ABSL_PREDICT_FALSE(generation != *generation_ptr)) { + ABSL_RAW_LOG(FATAL, + "%s called on invalid iterator. The table could have " + "rehashed or moved since this iterator was initialized.", + operation); + } + if (ABSL_PREDICT_FALSE(!IsFull(*ctrl))) { + ABSL_RAW_LOG( + FATAL, + "%s called on invalid iterator. The element was likely erased.", + operation); + } + } else { + if (ABSL_PREDICT_FALSE(!IsFull(*ctrl))) { + ABSL_RAW_LOG( + FATAL, + "%s called on invalid iterator. The element might have been erased " + "or the table might have rehashed. Consider running with " + "--config=asan to diagnose rehashing issues.", + operation); + } + } +} + +// Note that for comparisons, null/end iterators are valid. +inline void AssertIsValidForComparison(const ctrl_t* ctrl, + GenerationType generation, + const GenerationType* generation_ptr) { + if (!SwisstableDebugEnabled()) return; + const bool ctrl_is_valid_for_comparison = + ctrl == nullptr || ctrl == EmptyGroup() || IsFull(*ctrl); + if (SwisstableGenerationsEnabled()) { + if (ABSL_PREDICT_FALSE(generation != *generation_ptr)) { + ABSL_RAW_LOG(FATAL, + "Invalid iterator comparison. The table could have rehashed " + "or moved since this iterator was initialized."); + } + if (ABSL_PREDICT_FALSE(!ctrl_is_valid_for_comparison)) { + ABSL_RAW_LOG( + FATAL, "Invalid iterator comparison. The element was likely erased."); + } + } else { + ABSL_HARDENING_ASSERT( + ctrl_is_valid_for_comparison && + "Invalid iterator comparison. The element might have been erased or " + "the table might have rehashed. Consider running with --config=asan to " + "diagnose rehashing issues."); + } +} + +// If the two iterators come from the same container, then their pointers will +// interleave such that ctrl_a <= ctrl_b < slot_a <= slot_b or vice/versa. +// Note: we take slots by reference so that it's not UB if they're uninitialized +// as long as we don't read them (when ctrl is null). +inline bool AreItersFromSameContainer(const ctrl_t* ctrl_a, + const ctrl_t* ctrl_b, + const void* const& slot_a, + const void* const& slot_b) { + // If either control byte is null, then we can't tell. + if (ctrl_a == nullptr || ctrl_b == nullptr) return true; + const bool a_is_soo = IsSooControl(ctrl_a); + if (a_is_soo != IsSooControl(ctrl_b)) return false; + if (a_is_soo) return slot_a == slot_b; + + const void* low_slot = slot_a; + const void* hi_slot = slot_b; + if (ctrl_a > ctrl_b) { + std::swap(ctrl_a, ctrl_b); + std::swap(low_slot, hi_slot); + } + return ctrl_b < low_slot && low_slot <= hi_slot; +} + +// Asserts that two iterators come from the same container. +// Note: we take slots by reference so that it's not UB if they're uninitialized +// as long as we don't read them (when ctrl is null). +inline void AssertSameContainer(const ctrl_t* ctrl_a, const ctrl_t* ctrl_b, + const void* const& slot_a, + const void* const& slot_b, + const GenerationType* generation_ptr_a, + const GenerationType* generation_ptr_b) { + if (!SwisstableDebugEnabled()) return; + // `SwisstableDebugEnabled()` is also true for release builds with hardening + // enabled. To minimize their impact in those builds: + // - use `ABSL_PREDICT_FALSE()` to provide a compiler hint for code layout + // - use `ABSL_RAW_LOG()` with a format string to reduce code size and improve + // the chances that the hot paths will be inlined. + + // fail_if(is_invalid, message) crashes when is_invalid is true and provides + // an error message based on `message`. + const auto fail_if = [](bool is_invalid, const char* message) { + if (ABSL_PREDICT_FALSE(is_invalid)) { + ABSL_RAW_LOG(FATAL, "Invalid iterator comparison. %s", message); + } + }; + + const bool a_is_default = ctrl_a == EmptyGroup(); + const bool b_is_default = ctrl_b == EmptyGroup(); + if (a_is_default && b_is_default) return; + fail_if(a_is_default != b_is_default, + "Comparing default-constructed hashtable iterator with a " + "non-default-constructed hashtable iterator."); + + if (SwisstableGenerationsEnabled()) { + if (ABSL_PREDICT_TRUE(generation_ptr_a == generation_ptr_b)) return; + // Users don't need to know whether the tables are SOO so don't mention SOO + // in the debug message. + const bool a_is_soo = IsSooControl(ctrl_a); + const bool b_is_soo = IsSooControl(ctrl_b); + fail_if(a_is_soo != b_is_soo || (a_is_soo && b_is_soo), + "Comparing iterators from different hashtables."); + + const bool a_is_empty = IsEmptyGeneration(generation_ptr_a); + const bool b_is_empty = IsEmptyGeneration(generation_ptr_b); + fail_if(a_is_empty != b_is_empty, + "Comparing an iterator from an empty hashtable with an iterator " + "from a non-empty hashtable."); + fail_if(a_is_empty && b_is_empty, + "Comparing iterators from different empty hashtables."); + + const bool a_is_end = ctrl_a == nullptr; + const bool b_is_end = ctrl_b == nullptr; + fail_if(a_is_end || b_is_end, + "Comparing iterator with an end() iterator from a different " + "hashtable."); + fail_if(true, "Comparing non-end() iterators from different hashtables."); + } else { + ABSL_HARDENING_ASSERT_SLOW( + AreItersFromSameContainer(ctrl_a, ctrl_b, slot_a, slot_b) && + "Invalid iterator comparison. The iterators may be from different " + "containers or the container might have rehashed or moved. Consider " + "running with --config=asan to diagnose issues."); + } +} + +struct FindInfo { + size_t offset; + size_t probe_length; +}; + +// Whether a table is "small". A small table fits entirely into a probing +// group, i.e., has a capacity < `Group::kWidth`. +// +// In small mode we are able to use the whole capacity. The extra control +// bytes give us at least one "empty" control byte to stop the iteration. +// This is important to make 1 a valid capacity. +// +// In small mode only the first `capacity` control bytes after the sentinel +// are valid. The rest contain dummy ctrl_t::kEmpty values that do not +// represent a real slot. This is important to take into account on +// `find_first_non_full()`, where we never try +// `ShouldInsertBackwards()` for small tables. +inline bool is_small(size_t capacity) { return capacity < Group::kWidth - 1; } + +// Whether a table fits entirely into a probing group. +// Arbitrary order of elements in such tables is correct. +inline bool is_single_group(size_t capacity) { + return capacity <= Group::kWidth; +} + +// Begins a probing operation on `common.control`, using `hash`. +inline probe_seq probe(const ctrl_t* ctrl, const size_t capacity, + size_t hash) { + return probe_seq(H1(hash, ctrl), capacity); +} +inline probe_seq probe(const CommonFields& common, size_t hash) { + return probe(common.control(), common.capacity(), hash); +} + +// Probes an array of control bits using a probe sequence derived from `hash`, +// and returns the offset corresponding to the first deleted or empty slot. +// +// Behavior when the entire table is full is undefined. +// +// NOTE: this function must work with tables having both empty and deleted +// slots in the same group. Such tables appear during `erase()`. +template +inline FindInfo find_first_non_full(const CommonFields& common, size_t hash) { + auto seq = probe(common, hash); + const ctrl_t* ctrl = common.control(); + if (IsEmptyOrDeleted(ctrl[seq.offset()]) && + !ShouldInsertBackwards(common.capacity(), hash, ctrl)) { + return {seq.offset(), /*probe_length=*/0}; + } + while (true) { + GroupFullEmptyOrDeleted g{ctrl + seq.offset()}; + auto mask = g.MaskEmptyOrDeleted(); + if (mask) { + return { + seq.offset(GetInsertionOffset(mask, common.capacity(), hash, ctrl)), + seq.index()}; + } + seq.next(); + ABSL_SWISSTABLE_ASSERT(seq.index() <= common.capacity() && "full table!"); + } +} + +// Extern template for inline function keep possibility of inlining. +// When compiler decided to not inline, no symbols will be added to the +// corresponding translation unit. +extern template FindInfo find_first_non_full(const CommonFields&, size_t); + +// Non-inlined version of find_first_non_full for use in less +// performance critical routines. +FindInfo find_first_non_full_outofline(const CommonFields&, size_t); + +inline void ResetGrowthLeft(CommonFields& common) { + common.growth_info().InitGrowthLeftNoDeleted( + CapacityToGrowth(common.capacity()) - common.size()); +} + +// Sets `ctrl` to `{kEmpty, kSentinel, ..., kEmpty}`, marking the entire +// array as marked as empty. +inline void ResetCtrl(CommonFields& common, size_t slot_size) { + const size_t capacity = common.capacity(); + ctrl_t* ctrl = common.control(); + std::memset(ctrl, static_cast(ctrl_t::kEmpty), + capacity + 1 + NumClonedBytes()); + ctrl[capacity] = ctrl_t::kSentinel; + SanitizerPoisonMemoryRegion(common.slot_array(), slot_size * capacity); +} + +// Sets sanitizer poisoning for slot corresponding to control byte being set. +inline void DoSanitizeOnSetCtrl(const CommonFields& c, size_t i, ctrl_t h, + size_t slot_size) { + ABSL_SWISSTABLE_ASSERT(i < c.capacity()); + auto* slot_i = static_cast(c.slot_array()) + i * slot_size; + if (IsFull(h)) { + SanitizerUnpoisonMemoryRegion(slot_i, slot_size); + } else { + SanitizerPoisonMemoryRegion(slot_i, slot_size); + } +} + +// Sets `ctrl[i]` to `h`. +// +// Unlike setting it directly, this function will perform bounds checks and +// mirror the value to the cloned tail if necessary. +inline void SetCtrl(const CommonFields& c, size_t i, ctrl_t h, + size_t slot_size) { + DoSanitizeOnSetCtrl(c, i, h, slot_size); + ctrl_t* ctrl = c.control(); + ctrl[i] = h; + ctrl[((i - NumClonedBytes()) & c.capacity()) + + (NumClonedBytes() & c.capacity())] = h; +} +// Overload for setting to an occupied `h2_t` rather than a special `ctrl_t`. +inline void SetCtrl(const CommonFields& c, size_t i, h2_t h, size_t slot_size) { + SetCtrl(c, i, static_cast(h), slot_size); +} + +// Like SetCtrl, but in a single group table, we can save some operations when +// setting the cloned control byte. +inline void SetCtrlInSingleGroupTable(const CommonFields& c, size_t i, ctrl_t h, + size_t slot_size) { + ABSL_SWISSTABLE_ASSERT(is_single_group(c.capacity())); + DoSanitizeOnSetCtrl(c, i, h, slot_size); + ctrl_t* ctrl = c.control(); + ctrl[i] = h; + ctrl[i + c.capacity() + 1] = h; +} +// Overload for setting to an occupied `h2_t` rather than a special `ctrl_t`. +inline void SetCtrlInSingleGroupTable(const CommonFields& c, size_t i, h2_t h, + size_t slot_size) { + SetCtrlInSingleGroupTable(c, i, static_cast(h), slot_size); +} + +// growth_info (which is a size_t) is stored with the backing array. +constexpr size_t BackingArrayAlignment(size_t align_of_slot) { + return (std::max)(align_of_slot, alignof(GrowthInfo)); +} + +// Returns the address of the ith slot in slots where each slot occupies +// slot_size. +inline void* SlotAddress(void* slot_array, size_t slot, size_t slot_size) { + return static_cast(static_cast(slot_array) + + (slot * slot_size)); +} + +// Iterates over all full slots and calls `cb(const ctrl_t*, SlotType*)`. +// No insertion to the table allowed during Callback call. +// Erasure is allowed only for the element passed to the callback. +template +ABSL_ATTRIBUTE_ALWAYS_INLINE inline void IterateOverFullSlots( + const CommonFields& c, SlotType* slot, Callback cb) { + const size_t cap = c.capacity(); + const ctrl_t* ctrl = c.control(); + if (is_small(cap)) { + // Mirrored/cloned control bytes in small table are also located in the + // first group (starting from position 0). We are taking group from position + // `capacity` in order to avoid duplicates. + + // Small tables capacity fits into portable group, where + // GroupPortableImpl::MaskFull is more efficient for the + // capacity <= GroupPortableImpl::kWidth. + ABSL_SWISSTABLE_ASSERT(cap <= GroupPortableImpl::kWidth && + "unexpectedly large small capacity"); + static_assert(Group::kWidth >= GroupPortableImpl::kWidth, + "unexpected group width"); + // Group starts from kSentinel slot, so indices in the mask will + // be increased by 1. + const auto mask = GroupPortableImpl(ctrl + cap).MaskFull(); + --ctrl; + --slot; + for (uint32_t i : mask) { + cb(ctrl + i, slot + i); + } + return; + } + size_t remaining = c.size(); + ABSL_ATTRIBUTE_UNUSED const size_t original_size_for_assert = remaining; + while (remaining != 0) { + for (uint32_t i : GroupFullEmptyOrDeleted(ctrl).MaskFull()) { + ABSL_SWISSTABLE_ASSERT(IsFull(ctrl[i]) && + "hash table was modified unexpectedly"); + cb(ctrl + i, slot + i); + --remaining; + } + ctrl += Group::kWidth; + slot += Group::kWidth; + ABSL_SWISSTABLE_ASSERT( + (remaining == 0 || *(ctrl - 1) != ctrl_t::kSentinel) && + "hash table was modified unexpectedly"); + } + // NOTE: erasure of the current element is allowed in callback for + // absl::erase_if specialization. So we use `>=`. + ABSL_SWISSTABLE_ASSERT(original_size_for_assert >= c.size() && + "hash table was modified unexpectedly"); +} + +template +constexpr bool ShouldSampleHashtablezInfo() { + // Folks with custom allocators often make unwarranted assumptions about the + // behavior of their classes vis-a-vis trivial destructability and what + // calls they will or won't make. Avoid sampling for people with custom + // allocators to get us out of this mess. This is not a hard guarantee but + // a workaround while we plan the exact guarantee we want to provide. + return std::is_same>::value; +} + +template +HashtablezInfoHandle SampleHashtablezInfo(size_t sizeof_slot, size_t sizeof_key, + size_t sizeof_value, + size_t old_capacity, bool was_soo, + HashtablezInfoHandle forced_infoz, + CommonFields& c) { + if (forced_infoz.IsSampled()) return forced_infoz; + // In SOO, we sample on the first insertion so if this is an empty SOO case + // (e.g. when reserve is called), then we still need to sample. + if (kSooEnabled && was_soo && c.size() == 0) { + return Sample(sizeof_slot, sizeof_key, sizeof_value, SooCapacity()); + } + // For non-SOO cases, we sample whenever the capacity is increasing from zero + // to non-zero. + if (!kSooEnabled && old_capacity == 0) { + return Sample(sizeof_slot, sizeof_key, sizeof_value, 0); + } + return c.infoz(); +} + +// Helper class to perform resize of the hash set. +// +// It contains special optimizations for small group resizes. +// See GrowIntoSingleGroupShuffleControlBytes for details. +class HashSetResizeHelper { + public: + explicit HashSetResizeHelper(CommonFields& c, bool was_soo, bool had_soo_slot, + HashtablezInfoHandle forced_infoz) + : old_capacity_(c.capacity()), + had_infoz_(c.has_infoz()), + was_soo_(was_soo), + had_soo_slot_(had_soo_slot), + forced_infoz_(forced_infoz) {} + + // Optimized for small groups version of `find_first_non_full`. + // Beneficial only right after calling `raw_hash_set::resize`. + // It is safe to call in case capacity is big or was not changed, but there + // will be no performance benefit. + // It has implicit assumption that `resize` will call + // `GrowSizeIntoSingleGroup*` in case `IsGrowingIntoSingleGroupApplicable`. + // Falls back to `find_first_non_full` in case of big groups. + static FindInfo FindFirstNonFullAfterResize(const CommonFields& c, + size_t old_capacity, size_t hash); + + HeapOrSoo& old_heap_or_soo() { return old_heap_or_soo_; } + void* old_soo_data() { return old_heap_or_soo_.get_soo_data(); } + ctrl_t* old_ctrl() const { + ABSL_SWISSTABLE_ASSERT(!was_soo_); + return old_heap_or_soo_.control(); + } + void* old_slots() const { + ABSL_SWISSTABLE_ASSERT(!was_soo_); + return old_heap_or_soo_.slot_array().get(); + } + size_t old_capacity() const { return old_capacity_; } + + // Returns the index of the SOO slot when growing from SOO to non-SOO in a + // single group. See also InitControlBytesAfterSoo(). It's important to use + // index 1 so that when resizing from capacity 1 to 3, we can still have + // random iteration order between the first two inserted elements. + // I.e. it allows inserting the second element at either index 0 or 2. + static size_t SooSlotIndex() { return 1; } + + // Allocates a backing array for the hashtable. + // Reads `capacity` and updates all other fields based on the result of + // the allocation. + // + // It also may do the following actions: + // 1. initialize control bytes + // 2. initialize slots + // 3. deallocate old slots. + // + // We are bundling a lot of functionality + // in one ABSL_ATTRIBUTE_NOINLINE function in order to minimize binary code + // duplication in raw_hash_set<>::resize. + // + // `c.capacity()` must be nonzero. + // POSTCONDITIONS: + // 1. CommonFields is initialized. + // + // if IsGrowingIntoSingleGroupApplicable && TransferUsesMemcpy + // Both control bytes and slots are fully initialized. + // old_slots are deallocated. + // infoz.RecordRehash is called. + // + // if IsGrowingIntoSingleGroupApplicable && !TransferUsesMemcpy + // Control bytes are fully initialized. + // infoz.RecordRehash is called. + // GrowSizeIntoSingleGroup must be called to finish slots initialization. + // + // if !IsGrowingIntoSingleGroupApplicable + // Control bytes are initialized to empty table via ResetCtrl. + // raw_hash_set<>::resize must insert elements regularly. + // infoz.RecordRehash is called if old_capacity == 0. + // + // Returns IsGrowingIntoSingleGroupApplicable result to avoid recomputation. + template + ABSL_ATTRIBUTE_NOINLINE bool InitializeSlots(CommonFields& c, Alloc alloc, + ctrl_t soo_slot_h2, + size_t key_size, + size_t value_size) { + ABSL_SWISSTABLE_ASSERT(c.capacity()); + HashtablezInfoHandle infoz = + ShouldSampleHashtablezInfo() + ? SampleHashtablezInfo(SizeOfSlot, key_size, value_size, + old_capacity_, was_soo_, + forced_infoz_, c) + : HashtablezInfoHandle{}; + + const bool has_infoz = infoz.IsSampled(); + RawHashSetLayout layout(c.capacity(), AlignOfSlot, has_infoz); + char* mem = static_cast(Allocate( + &alloc, layout.alloc_size(SizeOfSlot))); + const GenerationType old_generation = c.generation(); + c.set_generation_ptr( + reinterpret_cast(mem + layout.generation_offset())); + c.set_generation(NextGeneration(old_generation)); + c.set_control(reinterpret_cast(mem + layout.control_offset())); + c.set_slots(mem + layout.slot_offset()); + ResetGrowthLeft(c); + + const bool grow_single_group = + IsGrowingIntoSingleGroupApplicable(old_capacity_, layout.capacity()); + if (SooEnabled && was_soo_ && grow_single_group) { + InitControlBytesAfterSoo(c.control(), soo_slot_h2, layout.capacity()); + if (TransferUsesMemcpy && had_soo_slot_) { + TransferSlotAfterSoo(c, SizeOfSlot); + } + // SooEnabled implies that old_capacity_ != 0. + } else if ((SooEnabled || old_capacity_ != 0) && grow_single_group) { + if (TransferUsesMemcpy) { + GrowSizeIntoSingleGroupTransferable(c, SizeOfSlot); + DeallocateOld(alloc, SizeOfSlot); + } else { + GrowIntoSingleGroupShuffleControlBytes(c.control(), layout.capacity()); + } + } else { + ResetCtrl(c, SizeOfSlot); + } + + c.set_has_infoz(has_infoz); + if (has_infoz) { + infoz.RecordStorageChanged(c.size(), layout.capacity()); + if ((SooEnabled && was_soo_) || grow_single_group || old_capacity_ == 0) { + infoz.RecordRehash(0); + } + c.set_infoz(infoz); + } + return grow_single_group; + } + + // Relocates slots into new single group consistent with + // GrowIntoSingleGroupShuffleControlBytes. + // + // PRECONDITIONS: + // 1. GrowIntoSingleGroupShuffleControlBytes was already called. + template + void GrowSizeIntoSingleGroup(CommonFields& c, Alloc& alloc_ref) { + ABSL_SWISSTABLE_ASSERT(old_capacity_ < Group::kWidth / 2); + ABSL_SWISSTABLE_ASSERT( + IsGrowingIntoSingleGroupApplicable(old_capacity_, c.capacity())); + using slot_type = typename PolicyTraits::slot_type; + ABSL_SWISSTABLE_ASSERT(is_single_group(c.capacity())); + + auto* new_slots = static_cast(c.slot_array()) + 1; + auto* old_slots_ptr = static_cast(old_slots()); + auto* old_ctrl_ptr = old_ctrl(); + + for (size_t i = 0; i < old_capacity_; ++i, ++new_slots) { + if (IsFull(old_ctrl_ptr[i])) { + SanitizerUnpoisonMemoryRegion(new_slots, sizeof(slot_type)); + PolicyTraits::transfer(&alloc_ref, new_slots, old_slots_ptr + i); + } + } + PoisonSingleGroupEmptySlots(c, sizeof(slot_type)); + } + + // Deallocates old backing array. + template + void DeallocateOld(CharAlloc alloc_ref, size_t slot_size) { + SanitizerUnpoisonMemoryRegion(old_slots(), slot_size * old_capacity_); + auto layout = RawHashSetLayout(old_capacity_, AlignOfSlot, had_infoz_); + Deallocate( + &alloc_ref, old_ctrl() - layout.control_offset(), + layout.alloc_size(slot_size)); + } + + private: + // Returns true if `GrowSizeIntoSingleGroup` can be used for resizing. + static bool IsGrowingIntoSingleGroupApplicable(size_t old_capacity, + size_t new_capacity) { + // NOTE that `old_capacity < new_capacity` in order to have + // `old_capacity < Group::kWidth / 2` to make faster copies of 8 bytes. + return is_single_group(new_capacity) && old_capacity < new_capacity; + } + + // Relocates control bytes and slots into new single group for + // transferable objects. + // Must be called only if IsGrowingIntoSingleGroupApplicable returned true. + void GrowSizeIntoSingleGroupTransferable(CommonFields& c, size_t slot_size); + + // If there was an SOO slot and slots are transferable, transfers the SOO slot + // into the new heap allocation. Must be called only if + // IsGrowingIntoSingleGroupApplicable returned true. + void TransferSlotAfterSoo(CommonFields& c, size_t slot_size); + + // Shuffle control bits deterministically to the next capacity. + // Returns offset for newly added element with given hash. + // + // PRECONDITIONs: + // 1. new_ctrl is allocated for new_capacity, + // but not initialized. + // 2. new_capacity is a single group. + // 3. old_capacity > 0. + // + // All elements are transferred into the first `old_capacity + 1` positions + // of the new_ctrl. Elements are shifted by 1 in order to keep a space at the + // beginning for the new element. + // Position of the new added element will be based on `H1` and is not + // deterministic. + // + // Examples: + // S = kSentinel, E = kEmpty + // + // old_ctrl = 0SEEEEEEE... + // new_ctrl = E0ESE0EEE... + // + // old_ctrl = 012S012EEEEEEEEE... + // new_ctrl = E012EEESE012EEE... + // + // old_ctrl = 0123456S0123456EEEEEEEEEEE... + // new_ctrl = E0123456EEEEEESE0123456EEE... + void GrowIntoSingleGroupShuffleControlBytes(ctrl_t* new_ctrl, + size_t new_capacity) const; + + // If the table was SOO, initializes new control bytes. `h2` is the control + // byte corresponding to the full slot. Must be called only if + // IsGrowingIntoSingleGroupApplicable returned true. + // Requires: `had_soo_slot_ || h2 == ctrl_t::kEmpty`. + void InitControlBytesAfterSoo(ctrl_t* new_ctrl, ctrl_t h2, + size_t new_capacity); + + // Shuffle trivially transferable slots in the way consistent with + // GrowIntoSingleGroupShuffleControlBytes. + // + // PRECONDITIONs: + // 1. old_capacity must be non-zero. + // 2. new_ctrl is fully initialized using + // GrowIntoSingleGroupShuffleControlBytes. + // 3. new_slots is allocated and *not* poisoned. + // + // POSTCONDITIONS: + // 1. new_slots are transferred from old_slots_ consistent with + // GrowIntoSingleGroupShuffleControlBytes. + // 2. Empty new_slots are *not* poisoned. + void GrowIntoSingleGroupShuffleTransferableSlots(void* new_slots, + size_t slot_size) const; + + // Poison empty slots that were transferred using the deterministic algorithm + // described above. + // PRECONDITIONs: + // 1. new_ctrl is fully initialized using + // GrowIntoSingleGroupShuffleControlBytes. + // 2. new_slots is fully initialized consistent with + // GrowIntoSingleGroupShuffleControlBytes. + void PoisonSingleGroupEmptySlots(CommonFields& c, size_t slot_size) const { + // poison non full items + for (size_t i = 0; i < c.capacity(); ++i) { + if (!IsFull(c.control()[i])) { + SanitizerPoisonMemoryRegion(SlotAddress(c.slot_array(), i, slot_size), + slot_size); + } + } + } + + HeapOrSoo old_heap_or_soo_; + size_t old_capacity_; + bool had_infoz_; + bool was_soo_; + bool had_soo_slot_; + // Either null infoz or a pre-sampled forced infoz for SOO tables. + HashtablezInfoHandle forced_infoz_; +}; + +inline void PrepareInsertCommon(CommonFields& common) { + common.increment_size(); + common.maybe_increment_generation_on_insert(); +} + +// Like prepare_insert, but for the case of inserting into a full SOO table. +size_t PrepareInsertAfterSoo(size_t hash, size_t slot_size, + CommonFields& common); + +// PolicyFunctions bundles together some information for a particular +// raw_hash_set instantiation. This information is passed to +// type-erased functions that want to do small amounts of type-specific +// work. +struct PolicyFunctions { + size_t slot_size; + + // Returns the pointer to the hash function stored in the set. + const void* (*hash_fn)(const CommonFields& common); + + // Returns the hash of the pointed-to slot. + size_t (*hash_slot)(const void* hash_fn, void* slot); + + // Transfers the contents of src_slot to dst_slot. + void (*transfer)(void* set, void* dst_slot, void* src_slot); + + // Deallocates the backing store from common. + void (*dealloc)(CommonFields& common, const PolicyFunctions& policy); + + // Resizes set to the new capacity. + // Arguments are used as in raw_hash_set::resize_impl. + void (*resize)(CommonFields& common, size_t new_capacity, + HashtablezInfoHandle forced_infoz); +}; + +// ClearBackingArray clears the backing array, either modifying it in place, +// or creating a new one based on the value of "reuse". +// REQUIRES: c.capacity > 0 +void ClearBackingArray(CommonFields& c, const PolicyFunctions& policy, + bool reuse, bool soo_enabled); + +// Type-erased version of raw_hash_set::erase_meta_only. +void EraseMetaOnly(CommonFields& c, size_t index, size_t slot_size); + +// Function to place in PolicyFunctions::dealloc for raw_hash_sets +// that are using std::allocator. This allows us to share the same +// function body for raw_hash_set instantiations that have the +// same slot alignment. +template +ABSL_ATTRIBUTE_NOINLINE void DeallocateStandard(CommonFields& common, + const PolicyFunctions& policy) { + // Unpoison before returning the memory to the allocator. + SanitizerUnpoisonMemoryRegion(common.slot_array(), + policy.slot_size * common.capacity()); + + std::allocator alloc; + common.infoz().Unregister(); + Deallocate( + &alloc, common.backing_array_start(), + common.alloc_size(policy.slot_size, AlignOfSlot)); +} + +// For trivially relocatable types we use memcpy directly. This allows us to +// share the same function body for raw_hash_set instantiations that have the +// same slot size as long as they are relocatable. +template +ABSL_ATTRIBUTE_NOINLINE void TransferRelocatable(void*, void* dst, void* src) { + memcpy(dst, src, SizeOfSlot); +} + +// Type erased raw_hash_set::get_hash_ref_fn for the empty hash function case. +const void* GetHashRefForEmptyHasher(const CommonFields& common); + +// Given the hash of a value not currently in the table and the first empty +// slot in the probe sequence, finds a viable slot index to insert it at. +// +// In case there's no space left, the table can be resized or rehashed +// (for tables with deleted slots, see FindInsertPositionWithGrowthOrRehash). +// +// In the case of absence of deleted slots and positive growth_left, the element +// can be inserted in the provided `target` position. +// +// When the table has deleted slots (according to GrowthInfo), the target +// position will be searched one more time using `find_first_non_full`. +// +// REQUIRES: Table is not SOO. +// REQUIRES: At least one non-full slot available. +// REQUIRES: `target` is a valid empty position to insert. +size_t PrepareInsertNonSoo(CommonFields& common, size_t hash, FindInfo target, + const PolicyFunctions& policy); + +// A SwissTable. +// +// Policy: a policy defines how to perform different operations on +// the slots of the hashtable (see hash_policy_traits.h for the full interface +// of policy). +// +// Hash: a (possibly polymorphic) functor that hashes keys of the hashtable. The +// functor should accept a key and return size_t as hash. For best performance +// it is important that the hash function provides high entropy across all bits +// of the hash. +// +// Eq: a (possibly polymorphic) functor that compares two keys for equality. It +// should accept two (of possibly different type) keys and return a bool: true +// if they are equal, false if they are not. If two keys compare equal, then +// their hash values as defined by Hash MUST be equal. +// +// Allocator: an Allocator +// [https://en.cppreference.com/w/cpp/named_req/Allocator] with which +// the storage of the hashtable will be allocated and the elements will be +// constructed and destroyed. +template +class raw_hash_set { + using PolicyTraits = hash_policy_traits; + using KeyArgImpl = + KeyArg::value && IsTransparent::value>; + + public: + using init_type = typename PolicyTraits::init_type; + using key_type = typename PolicyTraits::key_type; + // TODO(sbenza): Hide slot_type as it is an implementation detail. Needs user + // code fixes! + using slot_type = typename PolicyTraits::slot_type; + using allocator_type = Alloc; + using size_type = size_t; + using difference_type = ptrdiff_t; + using hasher = Hash; + using key_equal = Eq; + using policy_type = Policy; + using value_type = typename PolicyTraits::value_type; + using reference = value_type&; + using const_reference = const value_type&; + using pointer = typename absl::allocator_traits< + allocator_type>::template rebind_traits::pointer; + using const_pointer = typename absl::allocator_traits< + allocator_type>::template rebind_traits::const_pointer; + + // Alias used for heterogeneous lookup functions. + // `key_arg` evaluates to `K` when the functors are transparent and to + // `key_type` otherwise. It permits template argument deduction on `K` for the + // transparent case. + template + using key_arg = typename KeyArgImpl::template type; + + private: + // TODO(b/289225379): we could add extra SOO space inside raw_hash_set + // after CommonFields to allow inlining larger slot_types (e.g. std::string), + // but it's a bit complicated if we want to support incomplete mapped_type in + // flat_hash_map. We could potentially do this for flat_hash_set and for an + // allowlist of `mapped_type`s of flat_hash_map that includes e.g. arithmetic + // types, strings, cords, and pairs/tuples of allowlisted types. + constexpr static bool SooEnabled() { + return PolicyTraits::soo_enabled() && + sizeof(slot_type) <= sizeof(HeapOrSoo) && + alignof(slot_type) <= alignof(HeapOrSoo); + } + + constexpr static size_t DefaultCapacity() { + return SooEnabled() ? SooCapacity() : 0; + } + + // Whether `size` fits in the SOO capacity of this table. + bool fits_in_soo(size_t size) const { + return SooEnabled() && size <= SooCapacity(); + } + // Whether this table is in SOO mode or non-SOO mode. + bool is_soo() const { return fits_in_soo(capacity()); } + bool is_full_soo() const { return is_soo() && !empty(); } + + // Give an early error when key_type is not hashable/eq. + auto KeyTypeCanBeHashed(const Hash& h, const key_type& k) -> decltype(h(k)); + auto KeyTypeCanBeEq(const Eq& eq, const key_type& k) -> decltype(eq(k, k)); + + using AllocTraits = absl::allocator_traits; + using SlotAlloc = typename absl::allocator_traits< + allocator_type>::template rebind_alloc; + // People are often sloppy with the exact type of their allocator (sometimes + // it has an extra const or is missing the pair, but rebinds made it work + // anyway). + using CharAlloc = + typename absl::allocator_traits::template rebind_alloc; + using SlotAllocTraits = typename absl::allocator_traits< + allocator_type>::template rebind_traits; + + static_assert(std::is_lvalue_reference::value, + "Policy::element() must return a reference"); + + // An enabler for insert(T&&): T must be convertible to init_type or be the + // same as [cv] value_type [ref]. + template + using Insertable = absl::disjunction< + std::is_same, absl::remove_cvref_t>, + std::is_convertible>; + template + using IsNotBitField = std::is_pointer; + + // RequiresNotInit is a workaround for gcc prior to 7.1. + // See https://godbolt.org/g/Y4xsUh. + template + using RequiresNotInit = + typename std::enable_if::value, int>::type; + + template + using IsDecomposable = IsDecomposable; + + template + using IsDecomposableAndInsertable = + IsDecomposable::value, T>>; + + // Evaluates to true if an assignment from the given type would require the + // source object to remain alive for the life of the element. + template + using IsLifetimeBoundAssignmentFrom = std::conditional_t< + policy_trait_element_is_owner::value, std::false_type, + type_traits_internal::IsLifetimeBoundAssignment>; + + public: + static_assert(std::is_same::value, + "Allocators with custom pointer types are not supported"); + static_assert(std::is_same::value, + "Allocators with custom pointer types are not supported"); + + class iterator : private HashSetIteratorGenerationInfo { + friend class raw_hash_set; + friend struct HashtableFreeFunctionsAccess; + + public: + using iterator_category = std::forward_iterator_tag; + using value_type = typename raw_hash_set::value_type; + using reference = + absl::conditional_t; + using pointer = absl::remove_reference_t*; + using difference_type = typename raw_hash_set::difference_type; + + iterator() {} + + // PRECONDITION: not an end() iterator. + reference operator*() const { + AssertIsFull(ctrl_, generation(), generation_ptr(), "operator*()"); + return unchecked_deref(); + } + + // PRECONDITION: not an end() iterator. + pointer operator->() const { + AssertIsFull(ctrl_, generation(), generation_ptr(), "operator->"); + return &operator*(); + } + + // PRECONDITION: not an end() iterator. + iterator& operator++() { + AssertIsFull(ctrl_, generation(), generation_ptr(), "operator++"); + ++ctrl_; + ++slot_; + skip_empty_or_deleted(); + if (ABSL_PREDICT_FALSE(*ctrl_ == ctrl_t::kSentinel)) ctrl_ = nullptr; + return *this; + } + // PRECONDITION: not an end() iterator. + iterator operator++(int) { + auto tmp = *this; + ++*this; + return tmp; + } + + friend bool operator==(const iterator& a, const iterator& b) { + AssertIsValidForComparison(a.ctrl_, a.generation(), a.generation_ptr()); + AssertIsValidForComparison(b.ctrl_, b.generation(), b.generation_ptr()); + AssertSameContainer(a.ctrl_, b.ctrl_, a.slot_, b.slot_, + a.generation_ptr(), b.generation_ptr()); + return a.ctrl_ == b.ctrl_; + } + friend bool operator!=(const iterator& a, const iterator& b) { + return !(a == b); + } + + private: + iterator(ctrl_t* ctrl, slot_type* slot, + const GenerationType* generation_ptr) + : HashSetIteratorGenerationInfo(generation_ptr), + ctrl_(ctrl), + slot_(slot) { + // This assumption helps the compiler know that any non-end iterator is + // not equal to any end iterator. + ABSL_ASSUME(ctrl != nullptr); + } + // This constructor is used in begin() to avoid an MSan + // use-of-uninitialized-value error. Delegating from this constructor to + // the previous one doesn't avoid the error. + iterator(ctrl_t* ctrl, MaybeInitializedPtr slot, + const GenerationType* generation_ptr) + : HashSetIteratorGenerationInfo(generation_ptr), + ctrl_(ctrl), + slot_(to_slot(slot.get())) { + // This assumption helps the compiler know that any non-end iterator is + // not equal to any end iterator. + ABSL_ASSUME(ctrl != nullptr); + } + // For end() iterators. + explicit iterator(const GenerationType* generation_ptr) + : HashSetIteratorGenerationInfo(generation_ptr), ctrl_(nullptr) {} + + // Fixes up `ctrl_` to point to a full or sentinel by advancing `ctrl_` and + // `slot_` until they reach one. + void skip_empty_or_deleted() { + while (IsEmptyOrDeleted(*ctrl_)) { + uint32_t shift = + GroupFullEmptyOrDeleted{ctrl_}.CountLeadingEmptyOrDeleted(); + ctrl_ += shift; + slot_ += shift; + } + } + + ctrl_t* control() const { return ctrl_; } + slot_type* slot() const { return slot_; } + + // We use EmptyGroup() for default-constructed iterators so that they can + // be distinguished from end iterators, which have nullptr ctrl_. + ctrl_t* ctrl_ = EmptyGroup(); + // To avoid uninitialized member warnings, put slot_ in an anonymous union. + // The member is not initialized on singleton and end iterators. + union { + slot_type* slot_; + }; + + // An equality check which skips ABSL Hardening iterator invalidation + // checks. + // Should be used when the lifetimes of the iterators are well-enough + // understood to prove that they cannot be invalid. + bool unchecked_equals(const iterator& b) { return ctrl_ == b.control(); } + + // Dereferences the iterator without ABSL Hardening iterator invalidation + // checks. + reference unchecked_deref() const { return PolicyTraits::element(slot_); } + }; + + class const_iterator { + friend class raw_hash_set; + template + friend struct absl::container_internal::hashtable_debug_internal:: + HashtableDebugAccess; + + public: + using iterator_category = typename iterator::iterator_category; + using value_type = typename raw_hash_set::value_type; + using reference = typename raw_hash_set::const_reference; + using pointer = typename raw_hash_set::const_pointer; + using difference_type = typename raw_hash_set::difference_type; + + const_iterator() = default; + // Implicit construction from iterator. + const_iterator(iterator i) : inner_(std::move(i)) {} // NOLINT + + reference operator*() const { return *inner_; } + pointer operator->() const { return inner_.operator->(); } + + const_iterator& operator++() { + ++inner_; + return *this; + } + const_iterator operator++(int) { return inner_++; } + + friend bool operator==(const const_iterator& a, const const_iterator& b) { + return a.inner_ == b.inner_; + } + friend bool operator!=(const const_iterator& a, const const_iterator& b) { + return !(a == b); + } + + private: + const_iterator(const ctrl_t* ctrl, const slot_type* slot, + const GenerationType* gen) + : inner_(const_cast(ctrl), const_cast(slot), gen) { + } + ctrl_t* control() const { return inner_.control(); } + slot_type* slot() const { return inner_.slot(); } + + iterator inner_; + + bool unchecked_equals(const const_iterator& b) { + return inner_.unchecked_equals(b.inner_); + } + }; + + using node_type = node_handle, Alloc>; + using insert_return_type = InsertReturnType; + + // Note: can't use `= default` due to non-default noexcept (causes + // problems for some compilers). NOLINTNEXTLINE + raw_hash_set() noexcept( + std::is_nothrow_default_constructible::value && + std::is_nothrow_default_constructible::value && + std::is_nothrow_default_constructible::value) {} + + ABSL_ATTRIBUTE_NOINLINE explicit raw_hash_set( + size_t bucket_count, const hasher& hash = hasher(), + const key_equal& eq = key_equal(), + const allocator_type& alloc = allocator_type()) + : settings_(CommonFields::CreateDefault(), hash, eq, + alloc) { + if (bucket_count > DefaultCapacity()) { + if (ABSL_PREDICT_FALSE(bucket_count > + MaxValidCapacity())) { + HashTableSizeOverflow(); + } + resize(NormalizeCapacity(bucket_count)); + } + } + + raw_hash_set(size_t bucket_count, const hasher& hash, + const allocator_type& alloc) + : raw_hash_set(bucket_count, hash, key_equal(), alloc) {} + + raw_hash_set(size_t bucket_count, const allocator_type& alloc) + : raw_hash_set(bucket_count, hasher(), key_equal(), alloc) {} + + explicit raw_hash_set(const allocator_type& alloc) + : raw_hash_set(0, hasher(), key_equal(), alloc) {} + + template + raw_hash_set(InputIter first, InputIter last, size_t bucket_count = 0, + const hasher& hash = hasher(), const key_equal& eq = key_equal(), + const allocator_type& alloc = allocator_type()) + : raw_hash_set(SelectBucketCountForIterRange(first, last, bucket_count), + hash, eq, alloc) { + insert(first, last); + } + + template + raw_hash_set(InputIter first, InputIter last, size_t bucket_count, + const hasher& hash, const allocator_type& alloc) + : raw_hash_set(first, last, bucket_count, hash, key_equal(), alloc) {} + + template + raw_hash_set(InputIter first, InputIter last, size_t bucket_count, + const allocator_type& alloc) + : raw_hash_set(first, last, bucket_count, hasher(), key_equal(), alloc) {} + + template + raw_hash_set(InputIter first, InputIter last, const allocator_type& alloc) + : raw_hash_set(first, last, 0, hasher(), key_equal(), alloc) {} + + // Instead of accepting std::initializer_list as the first + // argument like std::unordered_set does, we have two overloads + // that accept std::initializer_list and std::initializer_list. + // This is advantageous for performance. + // + // // Turns {"abc", "def"} into std::initializer_list, then + // // copies the strings into the set. + // std::unordered_set s = {"abc", "def"}; + // + // // Turns {"abc", "def"} into std::initializer_list, then + // // copies the strings into the set. + // absl::flat_hash_set s = {"abc", "def"}; + // + // The same trick is used in insert(). + // + // The enabler is necessary to prevent this constructor from triggering where + // the copy constructor is meant to be called. + // + // absl::flat_hash_set a, b{a}; + // + // RequiresNotInit is a workaround for gcc prior to 7.1. + template = 0, + std::enable_if_t::value, int> = 0> + raw_hash_set(std::initializer_list init, size_t bucket_count = 0, + const hasher& hash = hasher(), const key_equal& eq = key_equal(), + const allocator_type& alloc = allocator_type()) + : raw_hash_set(init.begin(), init.end(), bucket_count, hash, eq, alloc) {} + + raw_hash_set(std::initializer_list init, size_t bucket_count = 0, + const hasher& hash = hasher(), const key_equal& eq = key_equal(), + const allocator_type& alloc = allocator_type()) + : raw_hash_set(init.begin(), init.end(), bucket_count, hash, eq, alloc) {} + + template = 0, + std::enable_if_t::value, int> = 0> + raw_hash_set(std::initializer_list init, size_t bucket_count, + const hasher& hash, const allocator_type& alloc) + : raw_hash_set(init, bucket_count, hash, key_equal(), alloc) {} + + raw_hash_set(std::initializer_list init, size_t bucket_count, + const hasher& hash, const allocator_type& alloc) + : raw_hash_set(init, bucket_count, hash, key_equal(), alloc) {} + + template = 0, + std::enable_if_t::value, int> = 0> + raw_hash_set(std::initializer_list init, size_t bucket_count, + const allocator_type& alloc) + : raw_hash_set(init, bucket_count, hasher(), key_equal(), alloc) {} + + raw_hash_set(std::initializer_list init, size_t bucket_count, + const allocator_type& alloc) + : raw_hash_set(init, bucket_count, hasher(), key_equal(), alloc) {} + + template = 0, + std::enable_if_t::value, int> = 0> + raw_hash_set(std::initializer_list init, const allocator_type& alloc) + : raw_hash_set(init, 0, hasher(), key_equal(), alloc) {} + + raw_hash_set(std::initializer_list init, + const allocator_type& alloc) + : raw_hash_set(init, 0, hasher(), key_equal(), alloc) {} + + raw_hash_set(const raw_hash_set& that) + : raw_hash_set(that, AllocTraits::select_on_container_copy_construction( + that.alloc_ref())) {} + + raw_hash_set(const raw_hash_set& that, const allocator_type& a) + : raw_hash_set(GrowthToLowerboundCapacity(that.size()), that.hash_ref(), + that.eq_ref(), a) { + that.AssertNotDebugCapacity(); + const size_t size = that.size(); + if (size == 0) { + return; + } + // We don't use `that.is_soo()` here because `that` can have non-SOO + // capacity but have a size that fits into SOO capacity. + if (fits_in_soo(size)) { + ABSL_SWISSTABLE_ASSERT(size == 1); + common().set_full_soo(); + emplace_at(soo_iterator(), *that.begin()); + const HashtablezInfoHandle infoz = try_sample_soo(); + if (infoz.IsSampled()) resize_with_soo_infoz(infoz); + return; + } + ABSL_SWISSTABLE_ASSERT(!that.is_soo()); + const size_t cap = capacity(); + // Note about single group tables: + // 1. It is correct to have any order of elements. + // 2. Order has to be non deterministic. + // 3. We are assigning elements with arbitrary `shift` starting from + // `capacity + shift` position. + // 4. `shift` must be coprime with `capacity + 1` in order to be able to use + // modular arithmetic to traverse all positions, instead if cycling + // through a subset of positions. Odd numbers are coprime with any + // `capacity + 1` (2^N). + size_t offset = cap; + const size_t shift = + is_single_group(cap) ? (PerTableSalt(control()) | 1) : 0; + IterateOverFullSlots( + that.common(), that.slot_array(), + [&](const ctrl_t* that_ctrl, + slot_type* that_slot) ABSL_ATTRIBUTE_ALWAYS_INLINE { + if (shift == 0) { + // Big tables case. Position must be searched via probing. + // The table is guaranteed to be empty, so we can do faster than + // a full `insert`. + const size_t hash = PolicyTraits::apply( + HashElement{hash_ref()}, PolicyTraits::element(that_slot)); + FindInfo target = find_first_non_full_outofline(common(), hash); + infoz().RecordInsert(hash, target.probe_length); + offset = target.offset; + } else { + // Small tables case. Next position is computed via shift. + offset = (offset + shift) & cap; + } + const h2_t h2 = static_cast(*that_ctrl); + ABSL_SWISSTABLE_ASSERT( // We rely that hash is not changed for small + // tables. + H2(PolicyTraits::apply(HashElement{hash_ref()}, + PolicyTraits::element(that_slot))) == h2 && + "hash function value changed unexpectedly during the copy"); + SetCtrl(common(), offset, h2, sizeof(slot_type)); + emplace_at(iterator_at(offset), PolicyTraits::element(that_slot)); + common().maybe_increment_generation_on_insert(); + }); + if (shift != 0) { + // On small table copy we do not record individual inserts. + // RecordInsert requires hash, but it is unknown for small tables. + infoz().RecordStorageChanged(size, cap); + } + common().set_size(size); + growth_info().OverwriteManyEmptyAsFull(size); + } + + ABSL_ATTRIBUTE_NOINLINE raw_hash_set(raw_hash_set&& that) noexcept( + std::is_nothrow_copy_constructible::value && + std::is_nothrow_copy_constructible::value && + std::is_nothrow_copy_constructible::value) + : // Hash, equality and allocator are copied instead of moved because + // `that` must be left valid. If Hash is std::function, moving it + // would create a nullptr functor that cannot be called. + // Note: we avoid using exchange for better generated code. + settings_(PolicyTraits::transfer_uses_memcpy() || !that.is_full_soo() + ? std::move(that.common()) + : CommonFields{full_soo_tag_t{}}, + that.hash_ref(), that.eq_ref(), that.alloc_ref()) { + if (!PolicyTraits::transfer_uses_memcpy() && that.is_full_soo()) { + transfer(soo_slot(), that.soo_slot()); + } + that.common() = CommonFields::CreateDefault(); + annotate_for_bug_detection_on_move(that); + } + + raw_hash_set(raw_hash_set&& that, const allocator_type& a) + : settings_(CommonFields::CreateDefault(), that.hash_ref(), + that.eq_ref(), a) { + if (a == that.alloc_ref()) { + swap_common(that); + annotate_for_bug_detection_on_move(that); + } else { + move_elements_allocs_unequal(std::move(that)); + } + } + + raw_hash_set& operator=(const raw_hash_set& that) { + that.AssertNotDebugCapacity(); + if (ABSL_PREDICT_FALSE(this == &that)) return *this; + constexpr bool propagate_alloc = + AllocTraits::propagate_on_container_copy_assignment::value; + // TODO(ezb): maybe avoid allocating a new backing array if this->capacity() + // is an exact match for that.size(). If this->capacity() is too big, then + // it would make iteration very slow to reuse the allocation. Maybe we can + // do the same heuristic as clear() and reuse if it's small enough. + raw_hash_set tmp(that, propagate_alloc ? that.alloc_ref() : alloc_ref()); + // NOLINTNEXTLINE: not returning *this for performance. + return assign_impl(std::move(tmp)); + } + + raw_hash_set& operator=(raw_hash_set&& that) noexcept( + absl::allocator_traits::is_always_equal::value && + std::is_nothrow_move_assignable::value && + std::is_nothrow_move_assignable::value) { + // TODO(sbenza): We should only use the operations from the noexcept clause + // to make sure we actually adhere to that contract. + // NOLINTNEXTLINE: not returning *this for performance. + return move_assign( + std::move(that), + typename AllocTraits::propagate_on_container_move_assignment()); + } + + ~raw_hash_set() { + destructor_impl(); +#ifndef NDEBUG + common().set_capacity(InvalidCapacity::kDestroyed); +#endif + } + + iterator begin() ABSL_ATTRIBUTE_LIFETIME_BOUND { + if (ABSL_PREDICT_FALSE(empty())) return end(); + if (is_soo()) return soo_iterator(); + iterator it = {control(), common().slots_union(), + common().generation_ptr()}; + it.skip_empty_or_deleted(); + ABSL_SWISSTABLE_ASSERT(IsFull(*it.control())); + return it; + } + iterator end() ABSL_ATTRIBUTE_LIFETIME_BOUND { + AssertNotDebugCapacity(); + return iterator(common().generation_ptr()); + } + + const_iterator begin() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return const_cast(this)->begin(); + } + const_iterator end() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return const_cast(this)->end(); + } + const_iterator cbegin() const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return begin(); + } + const_iterator cend() const ABSL_ATTRIBUTE_LIFETIME_BOUND { return end(); } + + bool empty() const { return !size(); } + size_t size() const { + AssertNotDebugCapacity(); + return common().size(); + } + size_t capacity() const { + const size_t cap = common().capacity(); + // Compiler complains when using functions in ASSUME so use local variable. + ABSL_ATTRIBUTE_UNUSED static constexpr size_t kDefaultCapacity = + DefaultCapacity(); + ABSL_ASSUME(cap >= kDefaultCapacity); + return cap; + } + size_t max_size() const { + return CapacityToGrowth(MaxValidCapacity()); + } + + ABSL_ATTRIBUTE_REINITIALIZES void clear() { + if (SwisstableGenerationsEnabled() && + capacity() >= InvalidCapacity::kMovedFrom) { + common().set_capacity(DefaultCapacity()); + } + AssertNotDebugCapacity(); + // Iterating over this container is O(bucket_count()). When bucket_count() + // is much greater than size(), iteration becomes prohibitively expensive. + // For clear() it is more important to reuse the allocated array when the + // container is small because allocation takes comparatively long time + // compared to destruction of the elements of the container. So we pick the + // largest bucket_count() threshold for which iteration is still fast and + // past that we simply deallocate the array. + const size_t cap = capacity(); + if (cap == 0) { + // Already guaranteed to be empty; so nothing to do. + } else if (is_soo()) { + if (!empty()) destroy(soo_slot()); + common().set_empty_soo(); + } else { + destroy_slots(); + ClearBackingArray(common(), GetPolicyFunctions(), /*reuse=*/cap < 128, + SooEnabled()); + } + common().set_reserved_growth(0); + common().set_reservation_size(0); + } + + // This overload kicks in when the argument is an rvalue of insertable and + // decomposable type other than init_type. + // + // flat_hash_map m; + // m.insert(std::make_pair("abc", 42)); + template ::value && + IsNotBitField::value && + !IsLifetimeBoundAssignmentFrom::value, + int> = 0> + std::pair insert(T&& value) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return emplace(std::forward(value)); + } + + template ::value && + IsNotBitField::value && + IsLifetimeBoundAssignmentFrom::value, + int> = 0> + std::pair insert( + T&& value ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this)) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return emplace(std::forward(value)); + } + + // This overload kicks in when the argument is a bitfield or an lvalue of + // insertable and decomposable type. + // + // union { int n : 1; }; + // flat_hash_set s; + // s.insert(n); + // + // flat_hash_set s; + // const char* p = "hello"; + // s.insert(p); + // + template ::value && + !IsLifetimeBoundAssignmentFrom::value, + int> = 0> + std::pair insert(const T& value) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return emplace(value); + } + template ::value && + IsLifetimeBoundAssignmentFrom::value, + int> = 0> + std::pair insert( + const T& value ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this)) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return emplace(value); + } + + // This overload kicks in when the argument is an rvalue of init_type. Its + // purpose is to handle brace-init-list arguments. + // + // flat_hash_map s; + // s.insert({"abc", 42}); + std::pair insert(init_type&& value) + ABSL_ATTRIBUTE_LIFETIME_BOUND +#if __cplusplus >= 202002L + requires(!IsLifetimeBoundAssignmentFrom::value) +#endif + { + return emplace(std::move(value)); + } +#if __cplusplus >= 202002L + std::pair insert( + init_type&& value ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this)) + ABSL_ATTRIBUTE_LIFETIME_BOUND + requires(IsLifetimeBoundAssignmentFrom::value) + { + return emplace(std::move(value)); + } +#endif + + template ::value && + IsNotBitField::value && + !IsLifetimeBoundAssignmentFrom::value, + int> = 0> + iterator insert(const_iterator, T&& value) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert(std::forward(value)).first; + } + template ::value && + IsNotBitField::value && + IsLifetimeBoundAssignmentFrom::value, + int> = 0> + iterator insert(const_iterator, T&& value ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY( + this)) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert(std::forward(value)).first; + } + + template ::value, int> = 0> + iterator insert(const_iterator, + const T& value) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert(value).first; + } + + iterator insert(const_iterator, + init_type&& value) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return insert(std::move(value)).first; + } + + template + void insert(InputIt first, InputIt last) { + for (; first != last; ++first) emplace(*first); + } + + template = 0, + std::enable_if_t::value, int> = 0> + void insert(std::initializer_list ilist) { + insert(ilist.begin(), ilist.end()); + } + + void insert(std::initializer_list ilist) { + insert(ilist.begin(), ilist.end()); + } + + insert_return_type insert(node_type&& node) ABSL_ATTRIBUTE_LIFETIME_BOUND { + if (!node) return {end(), false, node_type()}; + const auto& elem = PolicyTraits::element(CommonAccess::GetSlot(node)); + auto res = PolicyTraits::apply( + InsertSlot{*this, std::move(*CommonAccess::GetSlot(node))}, + elem); + if (res.second) { + CommonAccess::Reset(&node); + return {res.first, true, node_type()}; + } else { + return {res.first, false, std::move(node)}; + } + } + + iterator insert(const_iterator, + node_type&& node) ABSL_ATTRIBUTE_LIFETIME_BOUND { + auto res = insert(std::move(node)); + node = std::move(res.node); + return res.position; + } + + // This overload kicks in if we can deduce the key from args. This enables us + // to avoid constructing value_type if an entry with the same key already + // exists. + // + // For example: + // + // flat_hash_map m = {{"abc", "def"}}; + // // Creates no std::string copies and makes no heap allocations. + // m.emplace("abc", "xyz"); + template ::value, int> = 0> + std::pair emplace(Args&&... args) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return PolicyTraits::apply(EmplaceDecomposable{*this}, + std::forward(args)...); + } + + // This overload kicks in if we cannot deduce the key from args. It constructs + // value_type unconditionally and then either moves it into the table or + // destroys. + template ::value, int> = 0> + std::pair emplace(Args&&... args) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + alignas(slot_type) unsigned char raw[sizeof(slot_type)]; + slot_type* slot = to_slot(&raw); + + construct(slot, std::forward(args)...); + const auto& elem = PolicyTraits::element(slot); + return PolicyTraits::apply(InsertSlot{*this, std::move(*slot)}, elem); + } + + template + iterator emplace_hint(const_iterator, + Args&&... args) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return emplace(std::forward(args)...).first; + } + + // Extension API: support for lazy emplace. + // + // Looks up key in the table. If found, returns the iterator to the element. + // Otherwise calls `f` with one argument of type `raw_hash_set::constructor`, + // and returns an iterator to the new element. + // + // `f` must abide by several restrictions: + // - it MUST call `raw_hash_set::constructor` with arguments as if a + // `raw_hash_set::value_type` is constructed, + // - it MUST NOT access the container before the call to + // `raw_hash_set::constructor`, and + // - it MUST NOT erase the lazily emplaced element. + // Doing any of these is undefined behavior. + // + // For example: + // + // std::unordered_set s; + // // Makes ArenaStr even if "abc" is in the map. + // s.insert(ArenaString(&arena, "abc")); + // + // flat_hash_set s; + // // Makes ArenaStr only if "abc" is not in the map. + // s.lazy_emplace("abc", [&](const constructor& ctor) { + // ctor(&arena, "abc"); + // }); + // + // WARNING: This API is currently experimental. If there is a way to implement + // the same thing with the rest of the API, prefer that. + class constructor { + friend class raw_hash_set; + + public: + template + void operator()(Args&&... args) const { + ABSL_SWISSTABLE_ASSERT(*slot_); + PolicyTraits::construct(alloc_, *slot_, std::forward(args)...); + *slot_ = nullptr; + } + + private: + constructor(allocator_type* a, slot_type** slot) : alloc_(a), slot_(slot) {} + + allocator_type* alloc_; + slot_type** slot_; + }; + + template + iterator lazy_emplace(const key_arg& key, + F&& f) ABSL_ATTRIBUTE_LIFETIME_BOUND { + auto res = find_or_prepare_insert(key); + if (res.second) { + slot_type* slot = res.first.slot(); + std::forward(f)(constructor(&alloc_ref(), &slot)); + ABSL_SWISSTABLE_ASSERT(!slot); + } + return res.first; + } + + // Extension API: support for heterogeneous keys. + // + // std::unordered_set s; + // // Turns "abc" into std::string. + // s.erase("abc"); + // + // flat_hash_set s; + // // Uses "abc" directly without copying it into std::string. + // s.erase("abc"); + template + size_type erase(const key_arg& key) { + auto it = find(key); + if (it == end()) return 0; + erase(it); + return 1; + } + + // Erases the element pointed to by `it`. Unlike `std::unordered_set::erase`, + // this method returns void to reduce algorithmic complexity to O(1). The + // iterator is invalidated so any increment should be done before calling + // erase (e.g. `erase(it++)`). + void erase(const_iterator cit) { erase(cit.inner_); } + + // This overload is necessary because otherwise erase(const K&) would be + // a better match if non-const iterator is passed as an argument. + void erase(iterator it) { + AssertNotDebugCapacity(); + AssertIsFull(it.control(), it.generation(), it.generation_ptr(), "erase()"); + destroy(it.slot()); + if (is_soo()) { + common().set_empty_soo(); + } else { + erase_meta_only(it); + } + } + + iterator erase(const_iterator first, + const_iterator last) ABSL_ATTRIBUTE_LIFETIME_BOUND { + AssertNotDebugCapacity(); + // We check for empty first because ClearBackingArray requires that + // capacity() > 0 as a precondition. + if (empty()) return end(); + if (first == last) return last.inner_; + if (is_soo()) { + destroy(soo_slot()); + common().set_empty_soo(); + return end(); + } + if (first == begin() && last == end()) { + // TODO(ezb): we access control bytes in destroy_slots so it could make + // sense to combine destroy_slots and ClearBackingArray to avoid cache + // misses when the table is large. Note that we also do this in clear(). + destroy_slots(); + ClearBackingArray(common(), GetPolicyFunctions(), /*reuse=*/true, + SooEnabled()); + common().set_reserved_growth(common().reservation_size()); + return end(); + } + while (first != last) { + erase(first++); + } + return last.inner_; + } + + // Moves elements from `src` into `this`. + // If the element already exists in `this`, it is left unmodified in `src`. + template + void merge(raw_hash_set& src) { // NOLINT + AssertNotDebugCapacity(); + src.AssertNotDebugCapacity(); + assert(this != &src); + // Returns whether insertion took place. + const auto insert_slot = [this](slot_type* src_slot) { + return PolicyTraits::apply(InsertSlot{*this, std::move(*src_slot)}, + PolicyTraits::element(src_slot)) + .second; + }; + + if (src.is_soo()) { + if (src.empty()) return; + if (insert_slot(src.soo_slot())) src.common().set_empty_soo(); + return; + } + for (auto it = src.begin(), e = src.end(); it != e;) { + auto next = std::next(it); + if (insert_slot(it.slot())) src.erase_meta_only(it); + it = next; + } + } + + template + void merge(raw_hash_set&& src) { + merge(src); + } + + node_type extract(const_iterator position) { + AssertNotDebugCapacity(); + AssertIsFull(position.control(), position.inner_.generation(), + position.inner_.generation_ptr(), "extract()"); + auto node = CommonAccess::Transfer(alloc_ref(), position.slot()); + if (is_soo()) { + common().set_empty_soo(); + } else { + erase_meta_only(position); + } + return node; + } + + template ::value, int> = 0> + node_type extract(const key_arg& key) { + auto it = find(key); + return it == end() ? node_type() : extract(const_iterator{it}); + } + + void swap(raw_hash_set& that) noexcept( + IsNoThrowSwappable() && IsNoThrowSwappable() && + IsNoThrowSwappable( + typename AllocTraits::propagate_on_container_swap{})) { + AssertNotDebugCapacity(); + that.AssertNotDebugCapacity(); + using std::swap; + swap_common(that); + swap(hash_ref(), that.hash_ref()); + swap(eq_ref(), that.eq_ref()); + SwapAlloc(alloc_ref(), that.alloc_ref(), + typename AllocTraits::propagate_on_container_swap{}); + } + + void rehash(size_t n) { + const size_t cap = capacity(); + if (n == 0) { + if (cap == 0 || is_soo()) return; + if (empty()) { + ClearBackingArray(common(), GetPolicyFunctions(), /*reuse=*/false, + SooEnabled()); + return; + } + if (fits_in_soo(size())) { + // When the table is already sampled, we keep it sampled. + if (infoz().IsSampled()) { + const size_t kInitialSampledCapacity = NextCapacity(SooCapacity()); + if (capacity() > kInitialSampledCapacity) { + resize(kInitialSampledCapacity); + } + // This asserts that we didn't lose sampling coverage in `resize`. + ABSL_SWISSTABLE_ASSERT(infoz().IsSampled()); + return; + } + alignas(slot_type) unsigned char slot_space[sizeof(slot_type)]; + slot_type* tmp_slot = to_slot(slot_space); + transfer(tmp_slot, begin().slot()); + ClearBackingArray(common(), GetPolicyFunctions(), /*reuse=*/false, + SooEnabled()); + transfer(soo_slot(), tmp_slot); + common().set_full_soo(); + return; + } + } + + // bitor is a faster way of doing `max` here. We will round up to the next + // power-of-2-minus-1, so bitor is good enough. + auto m = NormalizeCapacity(n | GrowthToLowerboundCapacity(size())); + // n == 0 unconditionally rehashes as per the standard. + if (n == 0 || m > cap) { + if (ABSL_PREDICT_FALSE(m > MaxValidCapacity())) { + HashTableSizeOverflow(); + } + resize(m); + + // This is after resize, to ensure that we have completed the allocation + // and have potentially sampled the hashtable. + infoz().RecordReservation(n); + } + } + + void reserve(size_t n) { + const size_t max_size_before_growth = + is_soo() ? SooCapacity() : size() + growth_left(); + if (n > max_size_before_growth) { + if (ABSL_PREDICT_FALSE(n > max_size())) { + HashTableSizeOverflow(); + } + size_t m = GrowthToLowerboundCapacity(n); + resize(NormalizeCapacity(m)); + + // This is after resize, to ensure that we have completed the allocation + // and have potentially sampled the hashtable. + infoz().RecordReservation(n); + } + common().reset_reserved_growth(n); + common().set_reservation_size(n); + } + + // Extension API: support for heterogeneous keys. + // + // std::unordered_set s; + // // Turns "abc" into std::string. + // s.count("abc"); + // + // ch_set s; + // // Uses "abc" directly without copying it into std::string. + // s.count("abc"); + template + size_t count(const key_arg& key) const { + return find(key) == end() ? 0 : 1; + } + + // Issues CPU prefetch instructions for the memory needed to find or insert + // a key. Like all lookup functions, this support heterogeneous keys. + // + // NOTE: This is a very low level operation and should not be used without + // specific benchmarks indicating its importance. + template + void prefetch(const key_arg& key) const { + if (capacity() == DefaultCapacity()) return; + (void)key; + // Avoid probing if we won't be able to prefetch the addresses received. +#ifdef ABSL_HAVE_PREFETCH + prefetch_heap_block(); + auto seq = probe(common(), hash_ref()(key)); + PrefetchToLocalCache(control() + seq.offset()); + PrefetchToLocalCache(slot_array() + seq.offset()); +#endif // ABSL_HAVE_PREFETCH + } + + template + ABSL_DEPRECATE_AND_INLINE() + iterator find(const key_arg& key, + size_t) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return find(key); + } + // The API of find() has one extension: the type of the key argument doesn't + // have to be key_type. This is so called heterogeneous key support. + template + iterator find(const key_arg& key) ABSL_ATTRIBUTE_LIFETIME_BOUND { + AssertOnFind(key); + if (is_soo()) return find_soo(key); + prefetch_heap_block(); + return find_non_soo(key, hash_ref()(key)); + } + + template + ABSL_DEPRECATE_AND_INLINE() + const_iterator find(const key_arg& key, + size_t) const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return find(key); + } + template + const_iterator find(const key_arg& key) const + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return const_cast(this)->find(key); + } + + template + bool contains(const key_arg& key) const { + // Here neither the iterator returned by `find()` nor `end()` can be invalid + // outside of potential thread-safety issues. + // `find()`'s return value is constructed, used, and then destructed + // all in this context. + return !find(key).unchecked_equals(end()); + } + + template + std::pair equal_range(const key_arg& key) + ABSL_ATTRIBUTE_LIFETIME_BOUND { + auto it = find(key); + if (it != end()) return {it, std::next(it)}; + return {it, it}; + } + template + std::pair equal_range( + const key_arg& key) const ABSL_ATTRIBUTE_LIFETIME_BOUND { + auto it = find(key); + if (it != end()) return {it, std::next(it)}; + return {it, it}; + } + + size_t bucket_count() const { return capacity(); } + float load_factor() const { + return capacity() ? static_cast(size()) / capacity() : 0.0; + } + float max_load_factor() const { return 1.0f; } + void max_load_factor(float) { + // Does nothing. + } + + hasher hash_function() const { return hash_ref(); } + key_equal key_eq() const { return eq_ref(); } + allocator_type get_allocator() const { return alloc_ref(); } + + friend bool operator==(const raw_hash_set& a, const raw_hash_set& b) { + if (a.size() != b.size()) return false; + const raw_hash_set* outer = &a; + const raw_hash_set* inner = &b; + if (outer->capacity() > inner->capacity()) std::swap(outer, inner); + for (const value_type& elem : *outer) { + auto it = PolicyTraits::apply(FindElement{*inner}, elem); + if (it == inner->end()) return false; + // Note: we used key_equal to check for key equality in FindElement, but + // we may need to do an additional comparison using + // value_type::operator==. E.g. the keys could be equal and the + // mapped_types could be unequal in a map or even in a set, key_equal + // could ignore some fields that aren't ignored by operator==. + static constexpr bool kKeyEqIsValueEq = + std::is_same::value && + std::is_same>::value; + if (!kKeyEqIsValueEq && !(*it == elem)) return false; + } + return true; + } + + friend bool operator!=(const raw_hash_set& a, const raw_hash_set& b) { + return !(a == b); + } + + template + friend typename std::enable_if::value, + H>::type + AbslHashValue(H h, const raw_hash_set& s) { + return H::combine(H::combine_unordered(std::move(h), s.begin(), s.end()), + s.size()); + } + + friend void swap(raw_hash_set& a, + raw_hash_set& b) noexcept(noexcept(a.swap(b))) { + a.swap(b); + } + + private: + template + friend struct absl::container_internal::hashtable_debug_internal:: + HashtableDebugAccess; + + friend struct absl::container_internal::HashtableFreeFunctionsAccess; + + struct FindElement { + template + const_iterator operator()(const K& key, Args&&...) const { + return s.find(key); + } + const raw_hash_set& s; + }; + + struct HashElement { + template + size_t operator()(const K& key, Args&&...) const { + return h(key); + } + const hasher& h; + }; + + template + struct EqualElement { + template + bool operator()(const K2& lhs, Args&&...) const { + return eq(lhs, rhs); + } + const K1& rhs; + const key_equal& eq; + }; + + struct EmplaceDecomposable { + template + std::pair operator()(const K& key, Args&&... args) const { + auto res = s.find_or_prepare_insert(key); + if (res.second) { + s.emplace_at(res.first, std::forward(args)...); + } + return res; + } + raw_hash_set& s; + }; + + template + struct InsertSlot { + template + std::pair operator()(const K& key, Args&&...) && { + auto res = s.find_or_prepare_insert(key); + if (res.second) { + s.transfer(res.first.slot(), &slot); + } else if (do_destroy) { + s.destroy(&slot); + } + return res; + } + raw_hash_set& s; + // Constructed slot. Either moved into place or destroyed. + slot_type&& slot; + }; + + template + inline void construct(slot_type* slot, Args&&... args) { + common().RunWithReentrancyGuard([&] { + PolicyTraits::construct(&alloc_ref(), slot, std::forward(args)...); + }); + } + inline void destroy(slot_type* slot) { + common().RunWithReentrancyGuard( + [&] { PolicyTraits::destroy(&alloc_ref(), slot); }); + } + inline void transfer(slot_type* to, slot_type* from) { + common().RunWithReentrancyGuard( + [&] { PolicyTraits::transfer(&alloc_ref(), to, from); }); + } + + // TODO(b/289225379): consider having a helper class that has the impls for + // SOO functionality. + template + iterator find_soo(const key_arg& key) { + ABSL_SWISSTABLE_ASSERT(is_soo()); + return empty() || !PolicyTraits::apply(EqualElement{key, eq_ref()}, + PolicyTraits::element(soo_slot())) + ? end() + : soo_iterator(); + } + + template + iterator find_non_soo(const key_arg& key, size_t hash) { + ABSL_SWISSTABLE_ASSERT(!is_soo()); + auto seq = probe(common(), hash); + const ctrl_t* ctrl = control(); + while (true) { + Group g{ctrl + seq.offset()}; + for (uint32_t i : g.Match(H2(hash))) { + if (ABSL_PREDICT_TRUE(PolicyTraits::apply( + EqualElement{key, eq_ref()}, + PolicyTraits::element(slot_array() + seq.offset(i))))) + return iterator_at(seq.offset(i)); + } + if (ABSL_PREDICT_TRUE(g.MaskEmpty())) return end(); + seq.next(); + ABSL_SWISSTABLE_ASSERT(seq.index() <= capacity() && "full table!"); + } + } + + // Conditionally samples hashtablez for SOO tables. This should be called on + // insertion into an empty SOO table and in copy construction when the size + // can fit in SOO capacity. + inline HashtablezInfoHandle try_sample_soo() { + ABSL_SWISSTABLE_ASSERT(is_soo()); + if (!ShouldSampleHashtablezInfo()) return HashtablezInfoHandle{}; + return Sample(sizeof(slot_type), sizeof(key_type), sizeof(value_type), + SooCapacity()); + } + + inline void destroy_slots() { + ABSL_SWISSTABLE_ASSERT(!is_soo()); + if (PolicyTraits::template destroy_is_trivial()) return; + IterateOverFullSlots( + common(), slot_array(), + [&](const ctrl_t*, slot_type* slot) + ABSL_ATTRIBUTE_ALWAYS_INLINE { this->destroy(slot); }); + } + + inline void dealloc() { + ABSL_SWISSTABLE_ASSERT(capacity() != 0); + // Unpoison before returning the memory to the allocator. + SanitizerUnpoisonMemoryRegion(slot_array(), sizeof(slot_type) * capacity()); + infoz().Unregister(); + Deallocate( + &alloc_ref(), common().backing_array_start(), + common().alloc_size(sizeof(slot_type), alignof(slot_type))); + } + + inline void destructor_impl() { + if (SwisstableGenerationsEnabled() && + capacity() >= InvalidCapacity::kMovedFrom) { + return; + } + if (capacity() == 0) return; + if (is_soo()) { + if (!empty()) { + ABSL_SWISSTABLE_IGNORE_UNINITIALIZED(destroy(soo_slot())); + } + return; + } + destroy_slots(); + dealloc(); + } + + // Erases, but does not destroy, the value pointed to by `it`. + // + // This merely updates the pertinent control byte. This can be used in + // conjunction with Policy::transfer to move the object to another place. + void erase_meta_only(const_iterator it) { + ABSL_SWISSTABLE_ASSERT(!is_soo()); + EraseMetaOnly(common(), static_cast(it.control() - control()), + sizeof(slot_type)); + } + + size_t hash_of(slot_type* slot) const { + return PolicyTraits::apply(HashElement{hash_ref()}, + PolicyTraits::element(slot)); + } + + // Resizes table to the new capacity and move all elements to the new + // positions accordingly. + // + // Note that for better performance instead of + // find_first_non_full(common(), hash), + // HashSetResizeHelper::FindFirstNonFullAfterResize( + // common(), old_capacity, hash) + // can be called right after `resize`. + void resize(size_t new_capacity) { + raw_hash_set::resize_impl(common(), new_capacity, HashtablezInfoHandle{}); + } + + // As above, except that we also accept a pre-sampled, forced infoz for + // SOO tables, since they need to switch from SOO to heap in order to + // store the infoz. + void resize_with_soo_infoz(HashtablezInfoHandle forced_infoz) { + ABSL_SWISSTABLE_ASSERT(forced_infoz.IsSampled()); + raw_hash_set::resize_impl(common(), NextCapacity(SooCapacity()), + forced_infoz); + } + + // Resizes set to the new capacity. + // It is a static function in order to use its pointer in GetPolicyFunctions. + ABSL_ATTRIBUTE_NOINLINE static void resize_impl( + CommonFields& common, size_t new_capacity, + HashtablezInfoHandle forced_infoz) { + raw_hash_set* set = reinterpret_cast(&common); + ABSL_SWISSTABLE_ASSERT(IsValidCapacity(new_capacity)); + ABSL_SWISSTABLE_ASSERT(!set->fits_in_soo(new_capacity)); + const bool was_soo = set->is_soo(); + const bool had_soo_slot = was_soo && !set->empty(); + const ctrl_t soo_slot_h2 = + had_soo_slot ? static_cast(H2(set->hash_of(set->soo_slot()))) + : ctrl_t::kEmpty; + HashSetResizeHelper resize_helper(common, was_soo, had_soo_slot, + forced_infoz); + // Initialize HashSetResizeHelper::old_heap_or_soo_. We can't do this in + // HashSetResizeHelper constructor because it can't transfer slots when + // transfer_uses_memcpy is false. + // TODO(b/289225379): try to handle more of the SOO cases inside + // InitializeSlots. See comment on cl/555990034 snapshot #63. + if (PolicyTraits::transfer_uses_memcpy() || !had_soo_slot) { + resize_helper.old_heap_or_soo() = common.heap_or_soo(); + } else { + set->transfer(set->to_slot(resize_helper.old_soo_data()), + set->soo_slot()); + } + common.set_capacity(new_capacity); + // Note that `InitializeSlots` does different number initialization steps + // depending on the values of `transfer_uses_memcpy` and capacities. + // Refer to the comment in `InitializeSlots` for more details. + const bool grow_single_group = + resize_helper.InitializeSlots( + common, CharAlloc(set->alloc_ref()), soo_slot_h2, sizeof(key_type), + sizeof(value_type)); + + // In the SooEnabled() case, capacity is never 0 so we don't check. + if (!SooEnabled() && resize_helper.old_capacity() == 0) { + // InitializeSlots did all the work including infoz().RecordRehash(). + return; + } + ABSL_SWISSTABLE_ASSERT(resize_helper.old_capacity() > 0); + // Nothing more to do in this case. + if (was_soo && !had_soo_slot) return; + + slot_type* new_slots = set->slot_array(); + if (grow_single_group) { + if (PolicyTraits::transfer_uses_memcpy()) { + // InitializeSlots did all the work. + return; + } + if (was_soo) { + set->transfer(new_slots + resize_helper.SooSlotIndex(), + to_slot(resize_helper.old_soo_data())); + return; + } else { + // We want GrowSizeIntoSingleGroup to be called here in order to make + // InitializeSlots not depend on PolicyTraits. + resize_helper.GrowSizeIntoSingleGroup(common, + set->alloc_ref()); + } + } else { + // InitializeSlots prepares control bytes to correspond to empty table. + const auto insert_slot = [&](slot_type* slot) { + size_t hash = PolicyTraits::apply(HashElement{set->hash_ref()}, + PolicyTraits::element(slot)); + auto target = find_first_non_full(common, hash); + SetCtrl(common, target.offset, H2(hash), sizeof(slot_type)); + set->transfer(new_slots + target.offset, slot); + return target.probe_length; + }; + if (was_soo) { + insert_slot(to_slot(resize_helper.old_soo_data())); + return; + } else { + auto* old_slots = static_cast(resize_helper.old_slots()); + size_t total_probe_length = 0; + for (size_t i = 0; i != resize_helper.old_capacity(); ++i) { + if (IsFull(resize_helper.old_ctrl()[i])) { + total_probe_length += insert_slot(old_slots + i); + } + } + common.infoz().RecordRehash(total_probe_length); + } + } + resize_helper.DeallocateOld(CharAlloc(set->alloc_ref()), + sizeof(slot_type)); + } + + // Casting directly from e.g. char* to slot_type* can cause compilation errors + // on objective-C. This function converts to void* first, avoiding the issue. + static slot_type* to_slot(void* buf) { return static_cast(buf); } + + // Requires that lhs does not have a full SOO slot. + static void move_common(bool rhs_is_full_soo, allocator_type& rhs_alloc, + CommonFields& lhs, CommonFields&& rhs) { + if (PolicyTraits::transfer_uses_memcpy() || !rhs_is_full_soo) { + lhs = std::move(rhs); + } else { + lhs.move_non_heap_or_soo_fields(rhs); + rhs.RunWithReentrancyGuard([&] { + lhs.RunWithReentrancyGuard([&] { + PolicyTraits::transfer(&rhs_alloc, to_slot(lhs.soo_data()), + to_slot(rhs.soo_data())); + }); + }); + } + } + + // Swaps common fields making sure to avoid memcpy'ing a full SOO slot if we + // aren't allowed to do so. + void swap_common(raw_hash_set& that) { + using std::swap; + if (PolicyTraits::transfer_uses_memcpy()) { + swap(common(), that.common()); + return; + } + CommonFields tmp = CommonFields(uninitialized_tag_t{}); + const bool that_is_full_soo = that.is_full_soo(); + move_common(that_is_full_soo, that.alloc_ref(), tmp, + std::move(that.common())); + move_common(is_full_soo(), alloc_ref(), that.common(), std::move(common())); + move_common(that_is_full_soo, that.alloc_ref(), common(), std::move(tmp)); + } + + void annotate_for_bug_detection_on_move( + ABSL_ATTRIBUTE_UNUSED raw_hash_set& that) { + // We only enable moved-from validation when generations are enabled (rather + // than using NDEBUG) to avoid issues in which NDEBUG is enabled in some + // translation units but not in others. + if (SwisstableGenerationsEnabled()) { + that.common().set_capacity(this == &that ? InvalidCapacity::kSelfMovedFrom + : InvalidCapacity::kMovedFrom); + } + if (!SwisstableGenerationsEnabled() || capacity() == DefaultCapacity() || + capacity() > kAboveMaxValidCapacity) { + return; + } + common().increment_generation(); + if (!empty() && common().should_rehash_for_bug_detection_on_move()) { + resize(capacity()); + } + } + + template + raw_hash_set& assign_impl(raw_hash_set&& that) { + // We don't bother checking for this/that aliasing. We just need to avoid + // breaking the invariants in that case. + destructor_impl(); + move_common(that.is_full_soo(), that.alloc_ref(), common(), + std::move(that.common())); + hash_ref() = that.hash_ref(); + eq_ref() = that.eq_ref(); + CopyAlloc(alloc_ref(), that.alloc_ref(), + std::integral_constant()); + that.common() = CommonFields::CreateDefault(); + annotate_for_bug_detection_on_move(that); + return *this; + } + + raw_hash_set& move_elements_allocs_unequal(raw_hash_set&& that) { + const size_t size = that.size(); + if (size == 0) return *this; + reserve(size); + for (iterator it = that.begin(); it != that.end(); ++it) { + insert(std::move(PolicyTraits::element(it.slot()))); + that.destroy(it.slot()); + } + if (!that.is_soo()) that.dealloc(); + that.common() = CommonFields::CreateDefault(); + annotate_for_bug_detection_on_move(that); + return *this; + } + + raw_hash_set& move_assign(raw_hash_set&& that, + std::true_type /*propagate_alloc*/) { + return assign_impl(std::move(that)); + } + raw_hash_set& move_assign(raw_hash_set&& that, + std::false_type /*propagate_alloc*/) { + if (alloc_ref() == that.alloc_ref()) { + return assign_impl(std::move(that)); + } + // Aliasing can't happen here because allocs would compare equal above. + assert(this != &that); + destructor_impl(); + // We can't take over that's memory so we need to move each element. + // While moving elements, this should have that's hash/eq so copy hash/eq + // before moving elements. + hash_ref() = that.hash_ref(); + eq_ref() = that.eq_ref(); + return move_elements_allocs_unequal(std::move(that)); + } + + template + std::pair find_or_prepare_insert_soo(const K& key) { + if (empty()) { + const HashtablezInfoHandle infoz = try_sample_soo(); + if (infoz.IsSampled()) { + resize_with_soo_infoz(infoz); + } else { + common().set_full_soo(); + return {soo_iterator(), true}; + } + } else if (PolicyTraits::apply(EqualElement{key, eq_ref()}, + PolicyTraits::element(soo_slot()))) { + return {soo_iterator(), false}; + } else { + resize(NextCapacity(SooCapacity())); + } + const size_t index = + PrepareInsertAfterSoo(hash_ref()(key), sizeof(slot_type), common()); + return {iterator_at(index), true}; + } + + template + std::pair find_or_prepare_insert_non_soo(const K& key) { + ABSL_SWISSTABLE_ASSERT(!is_soo()); + prefetch_heap_block(); + auto hash = hash_ref()(key); + auto seq = probe(common(), hash); + const ctrl_t* ctrl = control(); + while (true) { + Group g{ctrl + seq.offset()}; + for (uint32_t i : g.Match(H2(hash))) { + if (ABSL_PREDICT_TRUE(PolicyTraits::apply( + EqualElement{key, eq_ref()}, + PolicyTraits::element(slot_array() + seq.offset(i))))) + return {iterator_at(seq.offset(i)), false}; + } + auto mask_empty = g.MaskEmpty(); + if (ABSL_PREDICT_TRUE(mask_empty)) { + size_t target = seq.offset( + GetInsertionOffset(mask_empty, capacity(), hash, control())); + return {iterator_at(PrepareInsertNonSoo(common(), hash, + FindInfo{target, seq.index()}, + GetPolicyFunctions())), + true}; + } + seq.next(); + ABSL_SWISSTABLE_ASSERT(seq.index() <= capacity() && "full table!"); + } + } + + protected: + // Asserts for correctness that we run on find/find_or_prepare_insert. + template + void AssertOnFind(ABSL_ATTRIBUTE_UNUSED const K& key) { + AssertHashEqConsistent(key); + AssertNotDebugCapacity(); + } + + // Asserts that the capacity is not a sentinel invalid value. + void AssertNotDebugCapacity() const { + if (ABSL_PREDICT_TRUE(capacity() < + InvalidCapacity::kAboveMaxValidCapacity)) { + return; + } + assert(capacity() != InvalidCapacity::kReentrance && + "Reentrant container access during element construction/destruction " + "is not allowed."); + assert(capacity() != InvalidCapacity::kDestroyed && + "Use of destroyed hash table."); + if (SwisstableGenerationsEnabled() && + ABSL_PREDICT_FALSE(capacity() >= InvalidCapacity::kMovedFrom)) { + if (capacity() == InvalidCapacity::kSelfMovedFrom) { + // If this log triggers, then a hash table was move-assigned to itself + // and then used again later without being reinitialized. + ABSL_RAW_LOG(FATAL, "Use of self-move-assigned hash table."); + } + ABSL_RAW_LOG(FATAL, "Use of moved-from hash table."); + } + } + + // Asserts that hash and equal functors provided by the user are consistent, + // meaning that `eq(k1, k2)` implies `hash(k1)==hash(k2)`. + template + void AssertHashEqConsistent(const K& key) { +#ifdef NDEBUG + return; +#endif + // If the hash/eq functors are known to be consistent, then skip validation. + if (std::is_same::value && + std::is_same::value) { + return; + } + if (std::is_scalar::value && + std::is_same>::value && + std::is_same>::value) { + return; + } + if (empty()) return; + + const size_t hash_of_arg = hash_ref()(key); + const auto assert_consistent = [&](const ctrl_t*, slot_type* slot) { + const value_type& element = PolicyTraits::element(slot); + const bool is_key_equal = + PolicyTraits::apply(EqualElement{key, eq_ref()}, element); + if (!is_key_equal) return; + + const size_t hash_of_slot = + PolicyTraits::apply(HashElement{hash_ref()}, element); + ABSL_ATTRIBUTE_UNUSED const bool is_hash_equal = + hash_of_arg == hash_of_slot; + assert((!is_key_equal || is_hash_equal) && + "eq(k1, k2) must imply that hash(k1) == hash(k2). " + "hash/eq functors are inconsistent."); + }; + + if (is_soo()) { + assert_consistent(/*unused*/ nullptr, soo_slot()); + return; + } + // We only do validation for small tables so that it's constant time. + if (capacity() > 16) return; + IterateOverFullSlots(common(), slot_array(), assert_consistent); + } + + // Attempts to find `key` in the table; if it isn't found, returns an iterator + // where the value can be inserted into, with the control byte already set to + // `key`'s H2. Returns a bool indicating whether an insertion can take place. + template + std::pair find_or_prepare_insert(const K& key) { + AssertOnFind(key); + if (is_soo()) return find_or_prepare_insert_soo(key); + return find_or_prepare_insert_non_soo(key); + } + + // Constructs the value in the space pointed by the iterator. This only works + // after an unsuccessful find_or_prepare_insert() and before any other + // modifications happen in the raw_hash_set. + // + // PRECONDITION: iter was returned from find_or_prepare_insert(k), where k is + // the key decomposed from `forward(args)...`, and the bool returned by + // find_or_prepare_insert(k) was true. + // POSTCONDITION: *m.iterator_at(i) == value_type(forward(args)...). + template + void emplace_at(iterator iter, Args&&... args) { + construct(iter.slot(), std::forward(args)...); + + assert(PolicyTraits::apply(FindElement{*this}, *iter) == iter && + "constructed value does not match the lookup key"); + } + + iterator iterator_at(size_t i) ABSL_ATTRIBUTE_LIFETIME_BOUND { + return {control() + i, slot_array() + i, common().generation_ptr()}; + } + const_iterator iterator_at(size_t i) const ABSL_ATTRIBUTE_LIFETIME_BOUND { + return const_cast(this)->iterator_at(i); + } + + reference unchecked_deref(iterator it) { return it.unchecked_deref(); } + + private: + friend struct RawHashSetTestOnlyAccess; + + // The number of slots we can still fill without needing to rehash. + // + // This is stored separately due to tombstones: we do not include tombstones + // in the growth capacity, because we'd like to rehash when the table is + // otherwise filled with tombstones: otherwise, probe sequences might get + // unacceptably long without triggering a rehash. Callers can also force a + // rehash via the standard `rehash(0)`, which will recompute this value as a + // side-effect. + // + // See `CapacityToGrowth()`. + size_t growth_left() const { + ABSL_SWISSTABLE_ASSERT(!is_soo()); + return common().growth_left(); + } + + GrowthInfo& growth_info() { + ABSL_SWISSTABLE_ASSERT(!is_soo()); + return common().growth_info(); + } + GrowthInfo growth_info() const { + ABSL_SWISSTABLE_ASSERT(!is_soo()); + return common().growth_info(); + } + + // Prefetch the heap-allocated memory region to resolve potential TLB and + // cache misses. This is intended to overlap with execution of calculating the + // hash for a key. + void prefetch_heap_block() const { + ABSL_SWISSTABLE_ASSERT(!is_soo()); +#if ABSL_HAVE_BUILTIN(__builtin_prefetch) || defined(__GNUC__) + __builtin_prefetch(control(), 0, 1); +#endif + } + + CommonFields& common() { return settings_.template get<0>(); } + const CommonFields& common() const { return settings_.template get<0>(); } + + ctrl_t* control() const { + ABSL_SWISSTABLE_ASSERT(!is_soo()); + return common().control(); + } + slot_type* slot_array() const { + ABSL_SWISSTABLE_ASSERT(!is_soo()); + return static_cast(common().slot_array()); + } + slot_type* soo_slot() { + ABSL_SWISSTABLE_ASSERT(is_soo()); + return static_cast(common().soo_data()); + } + const slot_type* soo_slot() const { + return const_cast(this)->soo_slot(); + } + iterator soo_iterator() { + return {SooControl(), soo_slot(), common().generation_ptr()}; + } + const_iterator soo_iterator() const { + return const_cast(this)->soo_iterator(); + } + HashtablezInfoHandle infoz() { + ABSL_SWISSTABLE_ASSERT(!is_soo()); + return common().infoz(); + } + + hasher& hash_ref() { return settings_.template get<1>(); } + const hasher& hash_ref() const { return settings_.template get<1>(); } + key_equal& eq_ref() { return settings_.template get<2>(); } + const key_equal& eq_ref() const { return settings_.template get<2>(); } + allocator_type& alloc_ref() { return settings_.template get<3>(); } + const allocator_type& alloc_ref() const { + return settings_.template get<3>(); + } + + static const void* get_hash_ref_fn(const CommonFields& common) { + auto* h = reinterpret_cast(&common); + return &h->hash_ref(); + } + static void transfer_slot_fn(void* set, void* dst, void* src) { + auto* h = static_cast(set); + h->transfer(static_cast(dst), static_cast(src)); + } + // Note: dealloc_fn will only be used if we have a non-standard allocator. + static void dealloc_fn(CommonFields& common, const PolicyFunctions&) { + auto* set = reinterpret_cast(&common); + + // Unpoison before returning the memory to the allocator. + SanitizerUnpoisonMemoryRegion(common.slot_array(), + sizeof(slot_type) * common.capacity()); + + common.infoz().Unregister(); + Deallocate( + &set->alloc_ref(), common.backing_array_start(), + common.alloc_size(sizeof(slot_type), alignof(slot_type))); + } + + static const PolicyFunctions& GetPolicyFunctions() { + static constexpr PolicyFunctions value = { + sizeof(slot_type), + // TODO(b/328722020): try to type erase + // for standard layout and alignof(Hash) <= alignof(CommonFields). + std::is_empty::value ? &GetHashRefForEmptyHasher + : &raw_hash_set::get_hash_ref_fn, + PolicyTraits::template get_hash_slot_fn(), + PolicyTraits::transfer_uses_memcpy() + ? TransferRelocatable + : &raw_hash_set::transfer_slot_fn, + (std::is_same>::value + ? &DeallocateStandard + : &raw_hash_set::dealloc_fn), + &raw_hash_set::resize_impl + }; + return value; + } + + // Bundle together CommonFields plus other objects which might be empty. + // CompressedTuple will ensure that sizeof is not affected by any of the empty + // fields that occur after CommonFields. + absl::container_internal::CompressedTuple + settings_{CommonFields::CreateDefault(), hasher{}, + key_equal{}, allocator_type{}}; +}; + +// Friend access for free functions in raw_hash_set.h. +struct HashtableFreeFunctionsAccess { + template + static typename Set::size_type EraseIf(Predicate& pred, Set* c) { + if (c->empty()) { + return 0; + } + if (c->is_soo()) { + auto it = c->soo_iterator(); + if (!pred(*it)) { + ABSL_SWISSTABLE_ASSERT(c->size() == 1 && + "hash table was modified unexpectedly"); + return 0; + } + c->destroy(it.slot()); + c->common().set_empty_soo(); + return 1; + } + ABSL_ATTRIBUTE_UNUSED const size_t original_size_for_assert = c->size(); + size_t num_deleted = 0; + IterateOverFullSlots( + c->common(), c->slot_array(), [&](const ctrl_t* ctrl, auto* slot) { + if (pred(Set::PolicyTraits::element(slot))) { + c->destroy(slot); + EraseMetaOnly(c->common(), static_cast(ctrl - c->control()), + sizeof(*slot)); + ++num_deleted; + } + }); + // NOTE: IterateOverFullSlots allow removal of the current element, so we + // verify the size additionally here. + ABSL_SWISSTABLE_ASSERT(original_size_for_assert - num_deleted == + c->size() && + "hash table was modified unexpectedly"); + return num_deleted; + } + + template + static void ForEach(Callback& cb, Set* c) { + if (c->empty()) { + return; + } + if (c->is_soo()) { + cb(*c->soo_iterator()); + return; + } + using ElementTypeWithConstness = decltype(*c->begin()); + IterateOverFullSlots( + c->common(), c->slot_array(), [&cb](const ctrl_t*, auto* slot) { + ElementTypeWithConstness& element = Set::PolicyTraits::element(slot); + cb(element); + }); + } +}; + +// Erases all elements that satisfy the predicate `pred` from the container `c`. +template +typename raw_hash_set::size_type EraseIf( + Predicate& pred, raw_hash_set* c) { + return HashtableFreeFunctionsAccess::EraseIf(pred, c); +} + +// Calls `cb` for all elements in the container `c`. +template +void ForEach(Callback& cb, raw_hash_set* c) { + return HashtableFreeFunctionsAccess::ForEach(cb, c); +} +template +void ForEach(Callback& cb, const raw_hash_set* c) { + return HashtableFreeFunctionsAccess::ForEach(cb, c); +} + +namespace hashtable_debug_internal { +template +struct HashtableDebugAccess> { + using Traits = typename Set::PolicyTraits; + using Slot = typename Traits::slot_type; + + static size_t GetNumProbes(const Set& set, + const typename Set::key_type& key) { + if (set.is_soo()) return 0; + size_t num_probes = 0; + size_t hash = set.hash_ref()(key); + auto seq = probe(set.common(), hash); + const ctrl_t* ctrl = set.control(); + while (true) { + container_internal::Group g{ctrl + seq.offset()}; + for (uint32_t i : g.Match(container_internal::H2(hash))) { + if (Traits::apply( + typename Set::template EqualElement{ + key, set.eq_ref()}, + Traits::element(set.slot_array() + seq.offset(i)))) + return num_probes; + ++num_probes; + } + if (g.MaskEmpty()) return num_probes; + seq.next(); + ++num_probes; + } + } + + static size_t AllocatedByteSize(const Set& c) { + size_t capacity = c.capacity(); + if (capacity == 0) return 0; + size_t m = + c.is_soo() ? 0 : c.common().alloc_size(sizeof(Slot), alignof(Slot)); + + size_t per_slot = Traits::space_used(static_cast(nullptr)); + if (per_slot != ~size_t{}) { + m += per_slot * c.size(); + } else { + for (auto it = c.begin(); it != c.end(); ++it) { + m += Traits::space_used(it.slot()); + } + } + return m; + } +}; + +} // namespace hashtable_debug_internal +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +#undef ABSL_SWISSTABLE_ENABLE_GENERATIONS +#undef ABSL_SWISSTABLE_IGNORE_UNINITIALIZED +#undef ABSL_SWISSTABLE_IGNORE_UNINITIALIZED_RETURN +#undef ABSL_SWISSTABLE_ASSERT + +#endif // ABSL_CONTAINER_INTERNAL_RAW_HASH_SET_H_ diff --git a/absl/container/internal/raw_hash_set_allocator_test.cc b/absl/container/internal/raw_hash_set_allocator_test.cc new file mode 100644 index 0000000..7e7a506 --- /dev/null +++ b/absl/container/internal/raw_hash_set_allocator_test.cc @@ -0,0 +1,520 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/config.h" +#include "absl/container/internal/container_memory.h" +#include "absl/container/internal/raw_hash_set.h" +#include "absl/container/internal/tracked.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { +namespace { +using ::testing::AnyOf; + +enum AllocSpec { + kPropagateOnCopy = 1, + kPropagateOnMove = 2, + kPropagateOnSwap = 4, +}; + +struct AllocState { + size_t num_allocs = 0; + std::set owned; +}; + +template +class CheckedAlloc { + public: + template + friend class CheckedAlloc; + + using value_type = T; + + CheckedAlloc() {} + explicit CheckedAlloc(size_t id) : id_(id) {} + CheckedAlloc(const CheckedAlloc&) = default; + CheckedAlloc& operator=(const CheckedAlloc&) = default; + + template + CheckedAlloc(const CheckedAlloc& that) + : id_(that.id_), state_(that.state_) {} + + template + struct rebind { + using other = CheckedAlloc; + }; + + using propagate_on_container_copy_assignment = + std::integral_constant; + + using propagate_on_container_move_assignment = + std::integral_constant; + + using propagate_on_container_swap = + std::integral_constant; + + CheckedAlloc select_on_container_copy_construction() const { + if (Spec & kPropagateOnCopy) return *this; + return {}; + } + + T* allocate(size_t n) { + T* ptr = std::allocator().allocate(n); + track_alloc(ptr); + return ptr; + } + void deallocate(T* ptr, size_t n) { + memset(ptr, 0, n * sizeof(T)); // The freed memory must be unpoisoned. + track_dealloc(ptr); + return std::allocator().deallocate(ptr, n); + } + + friend bool operator==(const CheckedAlloc& a, const CheckedAlloc& b) { + return a.id_ == b.id_; + } + friend bool operator!=(const CheckedAlloc& a, const CheckedAlloc& b) { + return !(a == b); + } + + size_t num_allocs() const { return state_->num_allocs; } + + void swap(CheckedAlloc& that) { + using std::swap; + swap(id_, that.id_); + swap(state_, that.state_); + } + + friend void swap(CheckedAlloc& a, CheckedAlloc& b) { a.swap(b); } + + friend std::ostream& operator<<(std::ostream& o, const CheckedAlloc& a) { + return o << "alloc(" << a.id_ << ")"; + } + + private: + void track_alloc(void* ptr) { + AllocState* state = state_.get(); + ++state->num_allocs; + if (!state->owned.insert(ptr).second) + ADD_FAILURE() << *this << " got previously allocated memory: " << ptr; + } + void track_dealloc(void* ptr) { + if (state_->owned.erase(ptr) != 1) + ADD_FAILURE() << *this + << " deleting memory owned by another allocator: " << ptr; + } + + size_t id_ = std::numeric_limits::max(); + + std::shared_ptr state_ = std::make_shared(); +}; + +struct Identity { + size_t operator()(int32_t v) const { return static_cast(v); } +}; + +struct Policy { + using slot_type = Tracked; + using init_type = Tracked; + using key_type = int32_t; + + template + static void construct(allocator_type* alloc, slot_type* slot, + Args&&... args) { + std::allocator_traits::construct( + *alloc, slot, std::forward(args)...); + } + + template + static void destroy(allocator_type* alloc, slot_type* slot) { + std::allocator_traits::destroy(*alloc, slot); + } + + template + static void transfer(allocator_type* alloc, slot_type* new_slot, + slot_type* old_slot) { + construct(alloc, new_slot, std::move(*old_slot)); + destroy(alloc, old_slot); + } + + template + static auto apply(F&& f, int32_t v) -> decltype(std::forward(f)(v, v)) { + return std::forward(f)(v, v); + } + + template + static auto apply(F&& f, const slot_type& v) + -> decltype(std::forward(f)(v.val(), v)) { + return std::forward(f)(v.val(), v); + } + + template + static auto apply(F&& f, slot_type&& v) + -> decltype(std::forward(f)(v.val(), std::move(v))) { + return std::forward(f)(v.val(), std::move(v)); + } + + static slot_type& element(slot_type* slot) { return *slot; } + + template + static constexpr HashSlotFn get_hash_slot_fn() { + return nullptr; + } +}; + +template +struct PropagateTest : public ::testing::Test { + using Alloc = CheckedAlloc, Spec>; + + using Table = raw_hash_set, Alloc>; + + PropagateTest() { + EXPECT_EQ(a1, t1.get_allocator()); + EXPECT_NE(a2, t1.get_allocator()); + } + + Alloc a1 = Alloc(1); + Table t1 = Table(0, a1); + Alloc a2 = Alloc(2); +}; + +using PropagateOnAll = + PropagateTest; +using NoPropagateOnCopy = PropagateTest; +using NoPropagateOnMove = PropagateTest; + +TEST_F(PropagateOnAll, Empty) { EXPECT_EQ(0, a1.num_allocs()); } + +TEST_F(PropagateOnAll, InsertAllocates) { + auto it = t1.insert(0).first; + EXPECT_EQ(1, a1.num_allocs()); + EXPECT_EQ(0, it->num_moves()); + EXPECT_EQ(0, it->num_copies()); +} + +TEST_F(PropagateOnAll, InsertDecomposes) { + auto it = t1.insert(0).first; + EXPECT_EQ(1, a1.num_allocs()); + EXPECT_EQ(0, it->num_moves()); + EXPECT_EQ(0, it->num_copies()); + + EXPECT_FALSE(t1.insert(0).second); + EXPECT_EQ(1, a1.num_allocs()); + EXPECT_EQ(0, it->num_moves()); + EXPECT_EQ(0, it->num_copies()); +} + +TEST_F(PropagateOnAll, RehashMoves) { + auto it = t1.insert(0).first; + EXPECT_EQ(0, it->num_moves()); + t1.rehash(2 * t1.capacity()); + EXPECT_EQ(2, a1.num_allocs()); + it = t1.find(0); + EXPECT_EQ(1, it->num_moves()); + EXPECT_EQ(0, it->num_copies()); +} + +TEST_F(PropagateOnAll, CopyConstructor) { + auto it = t1.insert(0).first; + Table u(t1); + EXPECT_EQ(2, a1.num_allocs()); + EXPECT_EQ(0, it->num_moves()); + EXPECT_EQ(1, it->num_copies()); +} + +TEST_F(NoPropagateOnCopy, CopyConstructor) { + auto it = t1.insert(0).first; + Table u(t1); + EXPECT_EQ(1, a1.num_allocs()); + EXPECT_EQ(1, u.get_allocator().num_allocs()); + EXPECT_EQ(0, it->num_moves()); + EXPECT_EQ(1, it->num_copies()); +} + +TEST_F(PropagateOnAll, CopyConstructorWithSameAlloc) { + auto it = t1.insert(0).first; + Table u(t1, a1); + EXPECT_EQ(2, a1.num_allocs()); + EXPECT_EQ(0, it->num_moves()); + EXPECT_EQ(1, it->num_copies()); +} + +TEST_F(NoPropagateOnCopy, CopyConstructorWithSameAlloc) { + auto it = t1.insert(0).first; + Table u(t1, a1); + EXPECT_EQ(2, a1.num_allocs()); + EXPECT_EQ(0, it->num_moves()); + EXPECT_EQ(1, it->num_copies()); +} + +TEST_F(PropagateOnAll, CopyConstructorWithDifferentAlloc) { + auto it = t1.insert(0).first; + Table u(t1, a2); + EXPECT_EQ(a2, u.get_allocator()); + EXPECT_EQ(1, a1.num_allocs()); + EXPECT_EQ(1, a2.num_allocs()); + EXPECT_EQ(0, it->num_moves()); + EXPECT_EQ(1, it->num_copies()); +} + +TEST_F(NoPropagateOnCopy, CopyConstructorWithDifferentAlloc) { + auto it = t1.insert(0).first; + Table u(t1, a2); + EXPECT_EQ(a2, u.get_allocator()); + EXPECT_EQ(1, a1.num_allocs()); + EXPECT_EQ(1, a2.num_allocs()); + EXPECT_EQ(0, it->num_moves()); + EXPECT_EQ(1, it->num_copies()); +} + +TEST_F(PropagateOnAll, MoveConstructor) { + t1.insert(0); + Table u(std::move(t1)); + auto it = u.begin(); + EXPECT_THAT(a1.num_allocs(), AnyOf(1, 2)); + EXPECT_THAT(it->num_moves(), AnyOf(0, 1)); + EXPECT_EQ(0, it->num_copies()); +} + +TEST_F(NoPropagateOnMove, MoveConstructor) { + t1.insert(0); + Table u(std::move(t1)); + auto it = u.begin(); + EXPECT_THAT(a1.num_allocs(), AnyOf(1, 2)); + EXPECT_THAT(it->num_moves(), AnyOf(0, 1)); + EXPECT_EQ(0, it->num_copies()); +} + +TEST_F(PropagateOnAll, MoveConstructorWithSameAlloc) { + t1.insert(0); + Table u(std::move(t1), a1); + auto it = u.begin(); + EXPECT_THAT(a1.num_allocs(), AnyOf(1, 2)); + EXPECT_THAT(it->num_moves(), AnyOf(0, 1)); + EXPECT_EQ(0, it->num_copies()); +} + +TEST_F(NoPropagateOnMove, MoveConstructorWithSameAlloc) { + t1.insert(0); + Table u(std::move(t1), a1); + auto it = u.begin(); + EXPECT_THAT(a1.num_allocs(), AnyOf(1, 2)); + EXPECT_THAT(it->num_moves(), AnyOf(0, 1)); + EXPECT_EQ(0, it->num_copies()); +} + +TEST_F(PropagateOnAll, MoveConstructorWithDifferentAlloc) { + auto it = t1.insert(0).first; + Table u(std::move(t1), a2); + it = u.find(0); + EXPECT_EQ(a2, u.get_allocator()); + EXPECT_EQ(1, a1.num_allocs()); + EXPECT_THAT(a2.num_allocs(), AnyOf(1, 2)); + EXPECT_THAT(it->num_moves(), AnyOf(1, 2)); + EXPECT_EQ(0, it->num_copies()); +} + +TEST_F(NoPropagateOnMove, MoveConstructorWithDifferentAlloc) { + auto it = t1.insert(0).first; + Table u(std::move(t1), a2); + it = u.find(0); + EXPECT_EQ(a2, u.get_allocator()); + EXPECT_EQ(1, a1.num_allocs()); + EXPECT_THAT(a2.num_allocs(), AnyOf(1, 2)); + EXPECT_THAT(it->num_moves(), AnyOf(1, 2)); + EXPECT_EQ(0, it->num_copies()); +} + +TEST_F(PropagateOnAll, CopyAssignmentWithSameAlloc) { + auto it = t1.insert(0).first; + Table u(0, a1); + u = t1; + EXPECT_THAT(a1.num_allocs(), AnyOf(2, 3)); + EXPECT_THAT(it->num_moves(), AnyOf(0, 1)); + EXPECT_EQ(1, it->num_copies()); +} + +TEST_F(NoPropagateOnCopy, CopyAssignmentWithSameAlloc) { + auto it = t1.insert(0).first; + Table u(0, a1); + u = t1; + EXPECT_THAT(a1.num_allocs(), AnyOf(2, 3)); + EXPECT_THAT(it->num_moves(), AnyOf(0, 1)); + EXPECT_EQ(1, it->num_copies()); +} + +TEST_F(PropagateOnAll, CopyAssignmentWithDifferentAlloc) { + auto it = t1.insert(0).first; + Table u(0, a2); + u = t1; + EXPECT_EQ(a1, u.get_allocator()); + EXPECT_THAT(a1.num_allocs(), AnyOf(2, 3)); + EXPECT_EQ(0, a2.num_allocs()); + EXPECT_THAT(it->num_moves(), AnyOf(0, 1)); + EXPECT_EQ(1, it->num_copies()); +} + +TEST_F(NoPropagateOnCopy, CopyAssignmentWithDifferentAlloc) { + auto it = t1.insert(0).first; + Table u(0, a2); + u = t1; + EXPECT_EQ(a2, u.get_allocator()); + EXPECT_EQ(1, a1.num_allocs()); + EXPECT_THAT(a2.num_allocs(), AnyOf(1, 2)); + EXPECT_THAT(it->num_moves(), AnyOf(0, 1)); + EXPECT_EQ(1, it->num_copies()); +} + +TEST_F(PropagateOnAll, MoveAssignmentWithSameAlloc) { + t1.insert(0); + Table u(0, a1); + u = std::move(t1); + auto it = u.begin(); + EXPECT_EQ(a1, u.get_allocator()); + EXPECT_THAT(a1.num_allocs(), AnyOf(1, 2)); + EXPECT_THAT(it->num_moves(), AnyOf(0, 1)); + EXPECT_EQ(0, it->num_copies()); +} + +TEST_F(NoPropagateOnMove, MoveAssignmentWithSameAlloc) { + t1.insert(0); + Table u(0, a1); + u = std::move(t1); + auto it = u.begin(); + EXPECT_EQ(a1, u.get_allocator()); + EXPECT_THAT(a1.num_allocs(), AnyOf(1, 2)); + EXPECT_THAT(it->num_moves(), AnyOf(0, 1)); + EXPECT_EQ(0, it->num_copies()); +} + +TEST_F(PropagateOnAll, MoveAssignmentWithDifferentAlloc) { + t1.insert(0); + Table u(0, a2); + u = std::move(t1); + auto it = u.begin(); + EXPECT_EQ(a1, u.get_allocator()); + EXPECT_THAT(a1.num_allocs(), AnyOf(1, 2)); + EXPECT_EQ(0, a2.num_allocs()); + EXPECT_THAT(it->num_moves(), AnyOf(0, 1)); + EXPECT_EQ(0, it->num_copies()); +} + +TEST_F(NoPropagateOnMove, MoveAssignmentWithDifferentAlloc) { + t1.insert(0); + Table u(0, a2); + u = std::move(t1); + auto it = u.find(0); + EXPECT_EQ(a2, u.get_allocator()); + EXPECT_EQ(1, a1.num_allocs()); + EXPECT_THAT(a2.num_allocs(), AnyOf(1, 2)); + EXPECT_THAT(it->num_moves(), AnyOf(1, 2)); + EXPECT_EQ(0, it->num_copies()); +} + +TEST_F(PropagateOnAll, Swap) { + auto it = t1.insert(0).first; + Table u(0, a2); + u.swap(t1); + EXPECT_EQ(a1, u.get_allocator()); + EXPECT_EQ(a2, t1.get_allocator()); + EXPECT_EQ(1, a1.num_allocs()); + EXPECT_EQ(0, a2.num_allocs()); + EXPECT_EQ(0, it->num_moves()); + EXPECT_EQ(0, it->num_copies()); +} + +// This allocator is similar to std::pmr::polymorphic_allocator. +// Note the disabled assignment. +template +class PAlloc { + template + friend class PAlloc; + + public: + // types + using value_type = T; + + PAlloc() noexcept = default; + explicit PAlloc(size_t id) noexcept : id_(id) {} + PAlloc(const PAlloc&) noexcept = default; + PAlloc& operator=(const PAlloc&) noexcept = delete; + + template + PAlloc(const PAlloc& that) noexcept : id_(that.id_) {} // NOLINT + + template + struct rebind { + using other = PAlloc; + }; + + constexpr PAlloc select_on_container_copy_construction() const { return {}; } + + // public member functions + T* allocate(size_t) { return new T; } + void deallocate(T* p, size_t) { delete p; } + + friend bool operator==(const PAlloc& a, const PAlloc& b) { + return a.id_ == b.id_; + } + friend bool operator!=(const PAlloc& a, const PAlloc& b) { return !(a == b); } + + private: + size_t id_ = std::numeric_limits::max(); +}; + +TEST(NoPropagateDeletedAssignment, CopyConstruct) { + using PA = PAlloc; + using Table = raw_hash_set, PA>; + + Table t1(PA{1}), t2(t1); + EXPECT_EQ(t1.get_allocator(), PA(1)); + EXPECT_EQ(t2.get_allocator(), PA()); +} + +TEST(NoPropagateDeletedAssignment, CopyAssignment) { + using PA = PAlloc; + using Table = raw_hash_set, PA>; + + Table t1(PA{1}), t2(PA{2}); + t1 = t2; + EXPECT_EQ(t1.get_allocator(), PA(1)); + EXPECT_EQ(t2.get_allocator(), PA(2)); +} + +TEST(NoPropagateDeletedAssignment, MoveAssignment) { + using PA = PAlloc; + using Table = raw_hash_set, PA>; + + Table t1(PA{1}), t2(PA{2}); + t1 = std::move(t2); + EXPECT_EQ(t1.get_allocator(), PA(1)); +} + +} // namespace +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl diff --git a/absl/container/internal/raw_hash_set_benchmark.cc b/absl/container/internal/raw_hash_set_benchmark.cc new file mode 100644 index 0000000..424b72c --- /dev/null +++ b/absl/container/internal/raw_hash_set_benchmark.cc @@ -0,0 +1,687 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "absl/base/internal/raw_logging.h" +#include "absl/container/internal/container_memory.h" +#include "absl/container/internal/hash_function_defaults.h" +#include "absl/container/internal/raw_hash_set.h" +#include "absl/random/random.h" +#include "absl/strings/str_format.h" +#include "benchmark/benchmark.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +struct RawHashSetTestOnlyAccess { + template + static auto GetSlots(const C& c) -> decltype(c.slots_) { + return c.slots_; + } +}; + +namespace { + +struct IntPolicy { + using slot_type = int64_t; + using key_type = int64_t; + using init_type = int64_t; + + static void construct(void*, int64_t* slot, int64_t v) { *slot = v; } + static void destroy(void*, int64_t*) {} + static void transfer(void*, int64_t* new_slot, int64_t* old_slot) { + *new_slot = *old_slot; + } + + static int64_t& element(slot_type* slot) { return *slot; } + + template + static auto apply(F&& f, int64_t x) -> decltype(std::forward(f)(x, x)) { + return std::forward(f)(x, x); + } + + template + static constexpr HashSlotFn get_hash_slot_fn() { + return nullptr; + } +}; + +class StringPolicy { + template ::value>::type> + decltype(std::declval()( + std::declval(), std::piecewise_construct, + std::declval>(), + std::declval())) static apply_impl(F&& f, + std::pair, V> p) { + const absl::string_view& key = std::get<0>(p.first); + return std::forward(f)(key, std::piecewise_construct, std::move(p.first), + std::move(p.second)); + } + + public: + struct slot_type { + struct ctor {}; + + template + slot_type(ctor, Ts&&... ts) : pair(std::forward(ts)...) {} + + std::pair pair; + }; + + using key_type = std::string; + using init_type = std::pair; + + template + static void construct(allocator_type* alloc, slot_type* slot, Args... args) { + std::allocator_traits::construct( + *alloc, slot, typename slot_type::ctor(), std::forward(args)...); + } + + template + static void destroy(allocator_type* alloc, slot_type* slot) { + std::allocator_traits::destroy(*alloc, slot); + } + + template + static void transfer(allocator_type* alloc, slot_type* new_slot, + slot_type* old_slot) { + construct(alloc, new_slot, std::move(old_slot->pair)); + destroy(alloc, old_slot); + } + + static std::pair& element(slot_type* slot) { + return slot->pair; + } + + template + static auto apply(F&& f, Args&&... args) + -> decltype(apply_impl(std::forward(f), + PairArgs(std::forward(args)...))) { + return apply_impl(std::forward(f), + PairArgs(std::forward(args)...)); + } + + template + static constexpr HashSlotFn get_hash_slot_fn() { + return nullptr; + } +}; + +struct StringHash : container_internal::hash_default_hash { + using is_transparent = void; +}; +struct StringEq : std::equal_to { + using is_transparent = void; +}; + +struct StringTable + : raw_hash_set> { + using Base = typename StringTable::raw_hash_set; + StringTable() {} + using Base::Base; +}; + +struct IntTable + : raw_hash_set, + std::equal_to, std::allocator> { + using Base = typename IntTable::raw_hash_set; + IntTable() {} + using Base::Base; +}; + +struct string_generator { + template + std::string operator()(RNG& rng) const { + std::string res; + res.resize(size); + std::uniform_int_distribution printable_ascii(0x20, 0x7E); + std::generate(res.begin(), res.end(), [&] { return printable_ascii(rng); }); + return res; + } + + size_t size; +}; + +// Model a cache in steady state. +// +// On a table of size N, keep deleting the LRU entry and add a random one. +void BM_CacheInSteadyState(benchmark::State& state) { + std::random_device rd; + std::mt19937 rng(rd()); + string_generator gen{12}; + StringTable t; + std::deque keys; + while (t.size() < state.range(0)) { + auto x = t.emplace(gen(rng), gen(rng)); + if (x.second) keys.push_back(x.first->first); + } + ABSL_RAW_CHECK(state.range(0) >= 10, ""); + while (state.KeepRunning()) { + // Some cache hits. + std::deque::const_iterator it; + for (int i = 0; i != 90; ++i) { + if (i % 10 == 0) it = keys.end(); + ::benchmark::DoNotOptimize(t.find(*--it)); + } + // Some cache misses. + for (int i = 0; i != 10; ++i) ::benchmark::DoNotOptimize(t.find(gen(rng))); + ABSL_RAW_CHECK(t.erase(keys.front()), keys.front().c_str()); + keys.pop_front(); + while (true) { + auto x = t.emplace(gen(rng), gen(rng)); + if (x.second) { + keys.push_back(x.first->first); + break; + } + } + } + state.SetItemsProcessed(state.iterations()); + state.SetLabel(absl::StrFormat("load_factor=%.2f", t.load_factor())); +} + +template +void CacheInSteadyStateArgs(Benchmark* bm) { + // The default. + const float max_load_factor = 0.875; + // When the cache is at the steady state, the probe sequence will equal + // capacity if there is no reclamation of deleted slots. Pick a number large + // enough to make the benchmark slow for that case. + const size_t capacity = 1 << 10; + + // Check N data points to cover load factors in [0.4, 0.8). + const size_t kNumPoints = 10; + for (size_t i = 0; i != kNumPoints; ++i) + bm->Arg(std::ceil( + capacity * (max_load_factor + i * max_load_factor / kNumPoints) / 2)); +} +BENCHMARK(BM_CacheInSteadyState)->Apply(CacheInSteadyStateArgs); + +void BM_EraseEmplace(benchmark::State& state) { + IntTable t; + int64_t size = state.range(0); + for (int64_t i = 0; i < size; ++i) { + t.emplace(i); + } + while (state.KeepRunningBatch(size)) { + for (int64_t i = 0; i < size; ++i) { + benchmark::DoNotOptimize(t); + t.erase(i); + t.emplace(i); + } + } +} +BENCHMARK(BM_EraseEmplace)->Arg(1)->Arg(2)->Arg(4)->Arg(8)->Arg(16)->Arg(100); + +void BM_EndComparison(benchmark::State& state) { + StringTable t = {{"a", "a"}, {"b", "b"}}; + auto it = t.begin(); + for (auto i : state) { + benchmark::DoNotOptimize(t); + benchmark::DoNotOptimize(it); + benchmark::DoNotOptimize(it != t.end()); + } +} +BENCHMARK(BM_EndComparison); + +void BM_Iteration(benchmark::State& state) { + std::random_device rd; + std::mt19937 rng(rd()); + string_generator gen{12}; + StringTable t; + + size_t capacity = state.range(0); + size_t size = state.range(1); + t.reserve(capacity); + + while (t.size() < size) { + t.emplace(gen(rng), gen(rng)); + } + + for (auto i : state) { + benchmark::DoNotOptimize(t); + for (auto it = t.begin(); it != t.end(); ++it) { + benchmark::DoNotOptimize(*it); + } + } +} + +BENCHMARK(BM_Iteration) + ->ArgPair(1, 1) + ->ArgPair(2, 2) + ->ArgPair(4, 4) + ->ArgPair(7, 7) + ->ArgPair(10, 10) + ->ArgPair(15, 15) + ->ArgPair(16, 16) + ->ArgPair(54, 54) + ->ArgPair(100, 100) + ->ArgPair(400, 400) + // empty + ->ArgPair(0, 0) + ->ArgPair(10, 0) + ->ArgPair(100, 0) + ->ArgPair(1000, 0) + ->ArgPair(10000, 0) + // sparse + ->ArgPair(100, 1) + ->ArgPair(1000, 10); + +void BM_CopyCtorSparseInt(benchmark::State& state) { + std::random_device rd; + std::mt19937 rng(rd()); + IntTable t; + std::uniform_int_distribution dist(0, ~uint64_t{}); + + size_t size = state.range(0); + t.reserve(size * 10); + while (t.size() < size) { + t.emplace(dist(rng)); + } + + for (auto i : state) { + IntTable t2 = t; + benchmark::DoNotOptimize(t2); + } +} +BENCHMARK(BM_CopyCtorSparseInt)->Range(1, 4096); + +void BM_CopyCtorInt(benchmark::State& state) { + std::random_device rd; + std::mt19937 rng(rd()); + IntTable t; + std::uniform_int_distribution dist(0, ~uint64_t{}); + + size_t size = state.range(0); + while (t.size() < size) { + t.emplace(dist(rng)); + } + + for (auto i : state) { + IntTable t2 = t; + benchmark::DoNotOptimize(t2); + } +} +BENCHMARK(BM_CopyCtorInt)->Range(0, 4096); + +void BM_CopyCtorString(benchmark::State& state) { + std::random_device rd; + std::mt19937 rng(rd()); + StringTable t; + std::uniform_int_distribution dist(0, ~uint64_t{}); + + size_t size = state.range(0); + while (t.size() < size) { + t.emplace(std::to_string(dist(rng)), std::to_string(dist(rng))); + } + + for (auto i : state) { + StringTable t2 = t; + benchmark::DoNotOptimize(t2); + } +} +BENCHMARK(BM_CopyCtorString)->Range(0, 4096); + +void BM_CopyAssign(benchmark::State& state) { + std::random_device rd; + std::mt19937 rng(rd()); + IntTable t; + std::uniform_int_distribution dist(0, ~uint64_t{}); + while (t.size() < state.range(0)) { + t.emplace(dist(rng)); + } + + IntTable t2; + for (auto _ : state) { + t2 = t; + benchmark::DoNotOptimize(t2); + } +} +BENCHMARK(BM_CopyAssign)->Range(128, 4096); + +void BM_RangeCtor(benchmark::State& state) { + std::random_device rd; + std::mt19937 rng(rd()); + std::uniform_int_distribution dist(0, ~uint64_t{}); + std::vector values; + const size_t desired_size = state.range(0); + while (values.size() < desired_size) { + values.emplace_back(dist(rng)); + } + + for (auto unused : state) { + IntTable t{values.begin(), values.end()}; + benchmark::DoNotOptimize(t); + } +} +BENCHMARK(BM_RangeCtor)->Range(128, 65536); + +void BM_NoOpReserveIntTable(benchmark::State& state) { + IntTable t; + t.reserve(100000); + for (auto _ : state) { + benchmark::DoNotOptimize(t); + t.reserve(100000); + } +} +BENCHMARK(BM_NoOpReserveIntTable); + +void BM_NoOpReserveStringTable(benchmark::State& state) { + StringTable t; + t.reserve(100000); + for (auto _ : state) { + benchmark::DoNotOptimize(t); + t.reserve(100000); + } +} +BENCHMARK(BM_NoOpReserveStringTable); + +void BM_ReserveIntTable(benchmark::State& state) { + constexpr size_t kBatchSize = 1024; + size_t reserve_size = static_cast(state.range(0)); + + std::vector tables; + while (state.KeepRunningBatch(kBatchSize)) { + state.PauseTiming(); + tables.clear(); + tables.resize(kBatchSize); + state.ResumeTiming(); + for (auto& t : tables) { + benchmark::DoNotOptimize(t); + t.reserve(reserve_size); + benchmark::DoNotOptimize(t); + } + } +} +BENCHMARK(BM_ReserveIntTable)->Range(1, 64); + +void BM_ReserveStringTable(benchmark::State& state) { + constexpr size_t kBatchSize = 1024; + size_t reserve_size = static_cast(state.range(0)); + + std::vector tables; + while (state.KeepRunningBatch(kBatchSize)) { + state.PauseTiming(); + tables.clear(); + tables.resize(kBatchSize); + state.ResumeTiming(); + for (auto& t : tables) { + benchmark::DoNotOptimize(t); + t.reserve(reserve_size); + benchmark::DoNotOptimize(t); + } + } +} +BENCHMARK(BM_ReserveStringTable)->Range(1, 64); + +// Like std::iota, except that ctrl_t doesn't support operator++. +template +void Iota(CtrlIter begin, CtrlIter end, int value) { + for (; begin != end; ++begin, ++value) { + *begin = static_cast(value); + } +} + +void BM_Group_Match(benchmark::State& state) { + std::array group; + Iota(group.begin(), group.end(), -4); + Group g{group.data()}; + h2_t h = 1; + for (auto _ : state) { + ::benchmark::DoNotOptimize(h); + ::benchmark::DoNotOptimize(g); + ::benchmark::DoNotOptimize(g.Match(h)); + } +} +BENCHMARK(BM_Group_Match); + +void BM_GroupPortable_Match(benchmark::State& state) { + std::array group; + Iota(group.begin(), group.end(), -4); + GroupPortableImpl g{group.data()}; + h2_t h = 1; + for (auto _ : state) { + ::benchmark::DoNotOptimize(h); + ::benchmark::DoNotOptimize(g); + ::benchmark::DoNotOptimize(g.Match(h)); + } +} +BENCHMARK(BM_GroupPortable_Match); + +void BM_Group_MaskEmpty(benchmark::State& state) { + std::array group; + Iota(group.begin(), group.end(), -4); + Group g{group.data()}; + for (auto _ : state) { + ::benchmark::DoNotOptimize(g); + ::benchmark::DoNotOptimize(g.MaskEmpty()); + } +} +BENCHMARK(BM_Group_MaskEmpty); + +void BM_Group_MaskEmptyOrDeleted(benchmark::State& state) { + std::array group; + Iota(group.begin(), group.end(), -4); + Group g{group.data()}; + for (auto _ : state) { + ::benchmark::DoNotOptimize(g); + ::benchmark::DoNotOptimize(g.MaskEmptyOrDeleted()); + } +} +BENCHMARK(BM_Group_MaskEmptyOrDeleted); + +void BM_Group_MaskNonFull(benchmark::State& state) { + std::array group; + Iota(group.begin(), group.end(), -4); + Group g{group.data()}; + for (auto _ : state) { + ::benchmark::DoNotOptimize(g); + ::benchmark::DoNotOptimize(g.MaskNonFull()); + } +} +BENCHMARK(BM_Group_MaskNonFull); + +void BM_Group_CountLeadingEmptyOrDeleted(benchmark::State& state) { + std::array group; + Iota(group.begin(), group.end(), -2); + Group g{group.data()}; + for (auto _ : state) { + ::benchmark::DoNotOptimize(g); + ::benchmark::DoNotOptimize(g.CountLeadingEmptyOrDeleted()); + } +} +BENCHMARK(BM_Group_CountLeadingEmptyOrDeleted); + +void BM_Group_MatchFirstEmptyOrDeleted(benchmark::State& state) { + std::array group; + Iota(group.begin(), group.end(), -2); + Group g{group.data()}; + for (auto _ : state) { + ::benchmark::DoNotOptimize(g); + ::benchmark::DoNotOptimize(g.MaskEmptyOrDeleted().LowestBitSet()); + } +} +BENCHMARK(BM_Group_MatchFirstEmptyOrDeleted); + +void BM_Group_MatchFirstNonFull(benchmark::State& state) { + std::array group; + Iota(group.begin(), group.end(), -2); + Group g{group.data()}; + for (auto _ : state) { + ::benchmark::DoNotOptimize(g); + ::benchmark::DoNotOptimize(g.MaskNonFull().LowestBitSet()); + } +} +BENCHMARK(BM_Group_MatchFirstNonFull); + +void BM_DropDeletes(benchmark::State& state) { + constexpr size_t capacity = (1 << 20) - 1; + std::vector ctrl(capacity + 1 + Group::kWidth); + ctrl[capacity] = ctrl_t::kSentinel; + std::vector pattern = {ctrl_t::kEmpty, static_cast(2), + ctrl_t::kDeleted, static_cast(2), + ctrl_t::kEmpty, static_cast(1), + ctrl_t::kDeleted}; + for (size_t i = 0; i != capacity; ++i) { + ctrl[i] = pattern[i % pattern.size()]; + } + while (state.KeepRunning()) { + state.PauseTiming(); + std::vector ctrl_copy = ctrl; + state.ResumeTiming(); + ConvertDeletedToEmptyAndFullToDeleted(ctrl_copy.data(), capacity); + ::benchmark::DoNotOptimize(ctrl_copy[capacity]); + } +} +BENCHMARK(BM_DropDeletes); + +void BM_Resize(benchmark::State& state) { + // For now just measure a small cheap hash table since we + // are mostly interested in the overhead of type-erasure + // in resize(). + constexpr int kElements = 64; + const int kCapacity = kElements * 2; + + IntTable table; + for (int i = 0; i < kElements; i++) { + table.insert(i); + } + for (auto unused : state) { + table.rehash(0); + table.rehash(kCapacity); + } +} +BENCHMARK(BM_Resize); + +void BM_EraseIf(benchmark::State& state) { + int64_t num_elements = state.range(0); + size_t num_erased = static_cast(state.range(1)); + + constexpr size_t kRepetitions = 64; + + absl::BitGen rng; + + std::vector> keys(kRepetitions); + std::vector tables; + std::vector threshold; + for (auto& k : keys) { + tables.push_back(IntTable()); + auto& table = tables.back(); + for (int64_t i = 0; i < num_elements; i++) { + // We use random keys to reduce noise. + k.push_back( + absl::Uniform(rng, 0, std::numeric_limits::max())); + if (!table.insert(k.back()).second) { + k.pop_back(); + --i; // duplicated value, retrying + } + } + std::sort(k.begin(), k.end()); + threshold.push_back(static_cast(num_erased) < num_elements + ? k[num_erased] + : std::numeric_limits::max()); + } + + while (state.KeepRunningBatch(static_cast(kRepetitions) * + std::max(num_elements, int64_t{1}))) { + benchmark::DoNotOptimize(tables); + for (size_t t_id = 0; t_id < kRepetitions; t_id++) { + auto& table = tables[t_id]; + benchmark::DoNotOptimize(num_erased); + auto pred = [t = threshold[t_id]](int64_t key) { return key < t; }; + benchmark::DoNotOptimize(pred); + benchmark::DoNotOptimize(table); + absl::container_internal::EraseIf(pred, &table); + } + state.PauseTiming(); + for (size_t t_id = 0; t_id < kRepetitions; t_id++) { + auto& k = keys[t_id]; + auto& table = tables[t_id]; + for (size_t i = 0; i < num_erased; i++) { + table.insert(k[i]); + } + } + state.ResumeTiming(); + } +} + +BENCHMARK(BM_EraseIf) + ->ArgNames({"num_elements", "num_erased"}) + ->ArgPair(10, 0) + ->ArgPair(1000, 0) + ->ArgPair(10, 5) + ->ArgPair(1000, 500) + ->ArgPair(10, 10) + ->ArgPair(1000, 1000); + +} // namespace +} // namespace container_internal +ABSL_NAMESPACE_END +} // namespace absl + +// These methods are here to make it easy to examine the assembly for targeted +// parts of the API. +auto CodegenAbslRawHashSetInt64Find(absl::container_internal::IntTable* table, + int64_t key) -> decltype(table->find(key)) { + return table->find(key); +} + +bool CodegenAbslRawHashSetInt64FindNeEnd( + absl::container_internal::IntTable* table, int64_t key) { + return table->find(key) != table->end(); +} + +// This is useful because the find isn't inlined but the iterator comparison is. +bool CodegenAbslRawHashSetStringFindNeEnd( + absl::container_internal::StringTable* table, const std::string& key) { + return table->find(key) != table->end(); +} + +auto CodegenAbslRawHashSetInt64Insert(absl::container_internal::IntTable* table, + int64_t key) + -> decltype(table->insert(key)) { + return table->insert(key); +} + +bool CodegenAbslRawHashSetInt64Contains( + absl::container_internal::IntTable* table, int64_t key) { + return table->contains(key); +} + +void CodegenAbslRawHashSetInt64Iterate( + absl::container_internal::IntTable* table) { + for (auto x : *table) benchmark::DoNotOptimize(x); +} + +int odr = + (::benchmark::DoNotOptimize(std::make_tuple( + &CodegenAbslRawHashSetInt64Find, &CodegenAbslRawHashSetInt64FindNeEnd, + &CodegenAbslRawHashSetStringFindNeEnd, + &CodegenAbslRawHashSetInt64Insert, &CodegenAbslRawHashSetInt64Contains, + &CodegenAbslRawHashSetInt64Iterate)), + 1); diff --git a/absl/container/internal/raw_hash_set_probe_benchmark.cc b/absl/container/internal/raw_hash_set_probe_benchmark.cc new file mode 100644 index 0000000..8f36305 --- /dev/null +++ b/absl/container/internal/raw_hash_set_probe_benchmark.cc @@ -0,0 +1,597 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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. +// +// Generates probe length statistics for many combinations of key types and key +// distributions, all using the default hash function for swisstable. + +#include +#include // NOLINT +#include + +#include "absl/base/no_destructor.h" +#include "absl/container/flat_hash_map.h" +#include "absl/container/internal/hash_function_defaults.h" +#include "absl/container/internal/hashtable_debug.h" +#include "absl/container/internal/raw_hash_set.h" +#include "absl/random/distributions.h" +#include "absl/random/random.h" +#include "absl/strings/str_cat.h" +#include "absl/strings/str_format.h" +#include "absl/strings/string_view.h" +#include "absl/strings/strip.h" +#include "absl/types/optional.h" + +namespace { + +enum class OutputStyle { kRegular, kBenchmark }; + +// The --benchmark command line flag. +// This is populated from main(). +// When run in "benchmark" mode, we have different output. This allows +// A/B comparisons with tools like `benchy`. +absl::string_view benchmarks; + +OutputStyle output() { + return !benchmarks.empty() ? OutputStyle::kBenchmark : OutputStyle::kRegular; +} + +template +struct Policy { + using slot_type = T; + using key_type = T; + using init_type = T; + + template + static void construct(allocator_type* alloc, slot_type* slot, + const Arg& arg) { + std::allocator_traits::construct(*alloc, slot, arg); + } + + template + static void destroy(allocator_type* alloc, slot_type* slot) { + std::allocator_traits::destroy(*alloc, slot); + } + + static slot_type& element(slot_type* slot) { return *slot; } + + template + static auto apply(F&& f, const slot_type& arg) + -> decltype(std::forward(f)(arg, arg)) { + return std::forward(f)(arg, arg); + } + + template + static constexpr auto get_hash_slot_fn() { + return nullptr; + } +}; + +absl::BitGen& GlobalBitGen() { + static absl::NoDestructor value; + return *value; +} + +// Keeps a pool of allocations and randomly gives one out. +// This introduces more randomization to the addresses given to swisstable and +// should help smooth out this factor from probe length calculation. +template +class RandomizedAllocator { + public: + using value_type = T; + + RandomizedAllocator() = default; + template + RandomizedAllocator(RandomizedAllocator) {} // NOLINT + + static T* allocate(size_t n) { + auto& pointers = GetPointers(n); + // Fill the pool + while (pointers.size() < kRandomPool) { + pointers.push_back(std::allocator{}.allocate(n)); + } + + // Choose a random one. + size_t i = absl::Uniform(GlobalBitGen(), 0, pointers.size()); + T* result = pointers[i]; + pointers[i] = pointers.back(); + pointers.pop_back(); + return result; + } + + static void deallocate(T* p, size_t n) { + // Just put it back on the pool. No need to release the memory. + GetPointers(n).push_back(p); + } + + private: + // We keep at least kRandomPool allocations for each size. + static constexpr size_t kRandomPool = 20; + + static std::vector& GetPointers(size_t n) { + static absl::NoDestructor>> m; + return (*m)[n]; + } +}; + +template +struct DefaultHash { + using type = absl::container_internal::hash_default_hash; +}; + +template +using DefaultHashT = typename DefaultHash::type; + +template +struct Table : absl::container_internal::raw_hash_set< + Policy, DefaultHashT, + absl::container_internal::hash_default_eq, + RandomizedAllocator> {}; + +struct LoadSizes { + size_t min_load; + size_t max_load; +}; + +LoadSizes GetMinMaxLoadSizes() { + static const auto sizes = [] { + Table t; + + // First, fill enough to have a good distribution. + constexpr size_t kMinSize = 10000; + while (t.size() < kMinSize) t.insert(t.size()); + + const auto reach_min_load_factor = [&] { + const double lf = t.load_factor(); + while (lf <= t.load_factor()) t.insert(t.size()); + }; + + // Then, insert until we reach min load factor. + reach_min_load_factor(); + const size_t min_load_size = t.size(); + + // Keep going until we hit min load factor again, then go back one. + t.insert(t.size()); + reach_min_load_factor(); + + return LoadSizes{min_load_size, t.size() - 1}; + }(); + return sizes; +} + +struct Ratios { + double min_load; + double avg_load; + double max_load; +}; + +// See absl/container/internal/hashtable_debug.h for details on +// probe length calculation. +template +Ratios CollectMeanProbeLengths() { + const auto min_max_sizes = GetMinMaxLoadSizes(); + + ElemFn elem; + using Key = decltype(elem()); + Table t; + + Ratios result; + while (t.size() < min_max_sizes.min_load) t.insert(elem()); + result.min_load = + absl::container_internal::GetHashtableDebugProbeSummary(t).mean; + + while (t.size() < (min_max_sizes.min_load + min_max_sizes.max_load) / 2) + t.insert(elem()); + result.avg_load = + absl::container_internal::GetHashtableDebugProbeSummary(t).mean; + + while (t.size() < min_max_sizes.max_load) t.insert(elem()); + result.max_load = + absl::container_internal::GetHashtableDebugProbeSummary(t).mean; + + return result; +} + +template +uintptr_t PointerForAlignment() { + alignas(Align) static constexpr uintptr_t kInitPointer = 0; + return reinterpret_cast(&kInitPointer); +} + +// This incomplete type is used for testing hash of pointers of different +// alignments. +// NOTE: We are generating invalid pointer values on the fly with +// reinterpret_cast. There are not "safely derived" pointers so using them is +// technically UB. It is unlikely to be a problem, though. +template +struct Ptr; + +template +Ptr* MakePtr(uintptr_t v) { + if (sizeof(v) == 8) { + constexpr int kCopyBits = 16; + // Ensure high bits are all the same. + v = static_cast(static_cast(v << kCopyBits) >> + kCopyBits); + } + return reinterpret_cast*>(v); +} + +struct IntIdentity { + uint64_t i; + friend bool operator==(IntIdentity a, IntIdentity b) { return a.i == b.i; } + IntIdentity operator++(int) { return IntIdentity{i++}; } +}; + +template +struct PtrIdentity { + explicit PtrIdentity(uintptr_t val = PointerForAlignment()) : i(val) {} + uintptr_t i; + friend bool operator==(PtrIdentity a, PtrIdentity b) { return a.i == b.i; } + PtrIdentity operator++(int) { + PtrIdentity p(i); + i += Align; + return p; + } +}; + +constexpr char kStringFormat[] = "/path/to/file/name-%07d-of-9999999.txt"; + +template +struct String { + std::string value; + static std::string Make(uint32_t v) { + return {small ? absl::StrCat(v) : absl::StrFormat(kStringFormat, v)}; + } +}; + +template <> +struct DefaultHash { + struct type { + size_t operator()(IntIdentity t) const { return t.i; } + }; +}; + +template +struct DefaultHash> { + struct type { + size_t operator()(PtrIdentity t) const { return t.i; } + }; +}; + +template +struct Sequential { + T operator()() const { return current++; } + mutable T current{}; +}; + +template +struct Sequential*> { + Ptr* operator()() const { + auto* result = MakePtr(current); + current += Align; + return result; + } + mutable uintptr_t current = PointerForAlignment(); +}; + + +template +struct Sequential> { + std::string operator()() const { return String::Make(current++); } + mutable uint32_t current = 0; +}; + +template +struct Sequential> { + mutable Sequential tseq; + mutable Sequential useq; + + using RealT = decltype(tseq()); + using RealU = decltype(useq()); + + mutable std::vector ts; + mutable std::vector us; + mutable size_t ti = 0, ui = 0; + + std::pair operator()() const { + std::pair value{get_t(), get_u()}; + if (ti == 0) { + ti = ui + 1; + ui = 0; + } else { + --ti; + ++ui; + } + return value; + } + + RealT get_t() const { + while (ti >= ts.size()) ts.push_back(tseq()); + return ts[ti]; + } + + RealU get_u() const { + while (ui >= us.size()) us.push_back(useq()); + return us[ui]; + } +}; + +template +struct AlmostSequential { + mutable Sequential current; + + auto operator()() const -> decltype(current()) { + while (absl::Uniform(GlobalBitGen(), 0.0, 1.0) <= percent_skip / 100.) + current(); + return current(); + } +}; + +struct Uniform { + template + T operator()(T) const { + return absl::Uniform(absl::IntervalClosed, GlobalBitGen(), T{0}, ~T{0}); + } +}; + +struct Gaussian { + template + T operator()(T) const { + double d; + do { + d = absl::Gaussian(GlobalBitGen(), 1e6, 1e4); + } while (d <= 0 || d > std::numeric_limits::max() / 2); + return static_cast(d); + } +}; + +struct Zipf { + template + T operator()(T) const { + return absl::Zipf(GlobalBitGen(), std::numeric_limits::max(), 1.6); + } +}; + +template +struct Random { + T operator()() const { return Dist{}(T{}); } +}; + +template +struct Random*, Dist> { + Ptr* operator()() const { + return MakePtr(Random{}() * Align); + } +}; + +template +struct Random { + IntIdentity operator()() const { + return IntIdentity{Random{}()}; + } +}; + +template +struct Random, Dist> { + PtrIdentity operator()() const { + return PtrIdentity{Random{}() * Align}; + } +}; + +template +struct Random, Dist> { + std::string operator()() const { + return String::Make(Random{}()); + } +}; + +template +struct Random, Dist> { + auto operator()() const + -> decltype(std::make_pair(Random{}(), Random{}())) { + return std::make_pair(Random{}(), Random{}()); + } +}; + +template +std::string Name(); + +std::string Name(uint32_t*) { return "u32"; } +std::string Name(uint64_t*) { return "u64"; } +std::string Name(IntIdentity*) { return "IntIdentity"; } + +template +std::string Name(Ptr**) { + return absl::StrCat("Ptr", Align); +} + +template +std::string Name(PtrIdentity*) { + return absl::StrCat("PtrIdentity", Align); +} + +template +std::string Name(String*) { + return small ? "StrS" : "StrL"; +} + +template +std::string Name(std::pair*) { + if (output() == OutputStyle::kBenchmark) + return absl::StrCat("P_", Name(), "_", Name()); + return absl::StrCat("P<", Name(), ",", Name(), ">"); +} + +template +std::string Name(Sequential*) { + return "Sequential"; +} + +template +std::string Name(AlmostSequential*) { + return absl::StrCat("AlmostSeq_", P); +} + +template +std::string Name(Random*) { + return "UnifRand"; +} + +template +std::string Name(Random*) { + return "GausRand"; +} + +template +std::string Name(Random*) { + return "ZipfRand"; +} + +template +std::string Name() { + return Name(static_cast(nullptr)); +} + +constexpr int kNameWidth = 15; +constexpr int kDistWidth = 16; + +bool CanRunBenchmark(absl::string_view name) { + static const absl::NoDestructor> filter([] { + return benchmarks.empty() || benchmarks == "all" + ? absl::nullopt + : absl::make_optional(std::regex(std::string(benchmarks))); + }()); + return !filter->has_value() || std::regex_search(std::string(name), **filter); +} + +struct Result { + std::string name; + std::string dist_name; + Ratios ratios; +}; + +template +void RunForTypeAndDistribution(std::vector& results) { + std::string name = absl::StrCat(Name(), "/", Name()); + // We have to check against all three names (min/avg/max) before we run it. + // If any of them is enabled, we run it. + if (!CanRunBenchmark(absl::StrCat(name, "/min")) && + !CanRunBenchmark(absl::StrCat(name, "/avg")) && + !CanRunBenchmark(absl::StrCat(name, "/max"))) { + return; + } + results.push_back({Name(), Name(), CollectMeanProbeLengths()}); +} + +template +void RunForType(std::vector& results) { + RunForTypeAndDistribution>(results); + RunForTypeAndDistribution>(results); + RunForTypeAndDistribution>(results); + RunForTypeAndDistribution>(results); +#ifdef NDEBUG + // Disable these in non-opt mode because they take too long. + RunForTypeAndDistribution>(results); + RunForTypeAndDistribution>(results); +#endif // NDEBUG +} + +} // namespace + +int main(int argc, char** argv) { + // Parse the benchmark flags. Ignore all of them except the regex pattern. + for (int i = 1; i < argc; ++i) { + absl::string_view arg = argv[i]; + const auto next = [&] { return argv[std::min(i + 1, argc - 1)]; }; + + if (absl::ConsumePrefix(&arg, "--benchmark_filter")) { + if (arg == "") { + // --benchmark_filter X + benchmarks = next(); + } else if (absl::ConsumePrefix(&arg, "=")) { + // --benchmark_filter=X + benchmarks = arg; + } + } + + // Any --benchmark flag turns on the mode. + if (absl::ConsumePrefix(&arg, "--benchmark")) { + if (benchmarks.empty()) benchmarks="all"; + } + } + + std::vector results; + RunForType(results); + RunForType(results); + RunForType*>(results); + RunForType*>(results); + RunForType*>(results); + RunForType*>(results); + RunForType>(results); + RunForType>(results); + RunForType>(results); + RunForType>(results); + RunForType>(results); + RunForType>(results); + RunForType>(results); + RunForType>>(results); + RunForType, uint64_t>>(results); + RunForType>>(results); + RunForType, uint64_t>>(results); + + switch (output()) { + case OutputStyle::kRegular: + absl::PrintF("%-*s%-*s Min Avg Max\n%s\n", kNameWidth, + "Type", kDistWidth, "Distribution", + std::string(kNameWidth + kDistWidth + 10 * 3, '-')); + for (const auto& result : results) { + absl::PrintF("%-*s%-*s %8.4f %8.4f %8.4f\n", kNameWidth, result.name, + kDistWidth, result.dist_name, result.ratios.min_load, + result.ratios.avg_load, result.ratios.max_load); + } + break; + case OutputStyle::kBenchmark: { + absl::PrintF("{\n"); + absl::PrintF(" \"benchmarks\": [\n"); + absl::string_view comma; + for (const auto& result : results) { + auto print = [&](absl::string_view stat, double Ratios::*val) { + std::string name = + absl::StrCat(result.name, "/", result.dist_name, "/", stat); + // Check the regex again. We might had have enabled only one of the + // stats for the benchmark. + if (!CanRunBenchmark(name)) return; + absl::PrintF(" %s{\n", comma); + absl::PrintF(" \"cpu_time\": %f,\n", 1e9 * result.ratios.*val); + absl::PrintF(" \"real_time\": %f,\n", 1e9 * result.ratios.*val); + absl::PrintF(" \"iterations\": 1,\n"); + absl::PrintF(" \"name\": \"%s\",\n", name); + absl::PrintF(" \"time_unit\": \"ns\"\n"); + absl::PrintF(" }\n"); + comma = ","; + }; + print("min", &Ratios::min_load); + print("avg", &Ratios::avg_load); + print("max", &Ratios::max_load); + } + absl::PrintF(" ],\n"); + absl::PrintF(" \"context\": {\n"); + absl::PrintF(" }\n"); + absl::PrintF("}\n"); + break; + } + } + + return 0; +} diff --git a/absl/container/internal/raw_hash_set_test.cc b/absl/container/internal/raw_hash_set_test.cc new file mode 100644 index 0000000..8a17c01 --- /dev/null +++ b/absl/container/internal/raw_hash_set_test.cc @@ -0,0 +1,3751 @@ +// Copyright 2018 The Abseil Authors. +// +// 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 +// +// https://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 "absl/container/internal/raw_hash_set.h" + +#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 "gmock/gmock.h" +#include "gtest/gtest.h" +#include "absl/base/attributes.h" +#include "absl/base/config.h" +#include "absl/base/internal/cycleclock.h" +#include "absl/base/prefetch.h" +#include "absl/container/flat_hash_map.h" +#include "absl/container/flat_hash_set.h" +#include "absl/container/internal/container_memory.h" +#include "absl/container/internal/hash_function_defaults.h" +#include "absl/container/internal/hash_policy_testing.h" +#include "absl/container/internal/hashtable_debug.h" +#include "absl/container/internal/hashtablez_sampler.h" +#include "absl/container/internal/test_allocator.h" +#include "absl/container/internal/test_instance_tracker.h" +#include "absl/container/node_hash_set.h" +#include "absl/functional/function_ref.h" +#include "absl/hash/hash.h" +#include "absl/log/check.h" +#include "absl/log/log.h" +#include "absl/memory/memory.h" +#include "absl/meta/type_traits.h" +#include "absl/strings/str_cat.h" +#include "absl/strings/string_view.h" +#include "absl/types/optional.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace container_internal { + +struct RawHashSetTestOnlyAccess { + template + static auto GetCommon(const C& c) -> decltype(c.common()) { + return c.common(); + } + template + static auto GetSlots(const C& c) -> decltype(c.slot_array()) { + return c.slot_array(); + } + template + static size_t CountTombstones(const C& c) { + return c.common().TombstonesCount(); + } +}; + +namespace { + +using ::testing::ElementsAre; +using ::testing::ElementsAreArray; +using ::testing::Eq; +using ::testing::Ge; +using ::testing::Lt; +using ::testing::Pair; +using ::testing::UnorderedElementsAre; + +// Convenience function to static cast to ctrl_t. +ctrl_t CtrlT(int i) { return static_cast(i); } + +TEST(GrowthInfoTest, GetGrowthLeft) { + GrowthInfo gi; + gi.InitGrowthLeftNoDeleted(5); + EXPECT_EQ(gi.GetGrowthLeft(), 5); + gi.OverwriteFullAsDeleted(); + EXPECT_EQ(gi.GetGrowthLeft(), 5); +} + +TEST(GrowthInfoTest, HasNoDeleted) { + GrowthInfo gi; + gi.InitGrowthLeftNoDeleted(5); + EXPECT_TRUE(gi.HasNoDeleted()); + gi.OverwriteFullAsDeleted(); + EXPECT_FALSE(gi.HasNoDeleted()); + // After reinitialization we have no deleted slots. + gi.InitGrowthLeftNoDeleted(5); + EXPECT_TRUE(gi.HasNoDeleted()); +} + +TEST(GrowthInfoTest, HasNoDeletedAndGrowthLeft) { + GrowthInfo gi; + gi.InitGrowthLeftNoDeleted(5); + EXPECT_TRUE(gi.HasNoDeletedAndGrowthLeft()); + gi.OverwriteFullAsDeleted(); + EXPECT_FALSE(gi.HasNoDeletedAndGrowthLeft()); + gi.InitGrowthLeftNoDeleted(0); + EXPECT_FALSE(gi.HasNoDeletedAndGrowthLeft()); + gi.OverwriteFullAsDeleted(); + EXPECT_FALSE(gi.HasNoDeletedAndGrowthLeft()); + // After reinitialization we have no deleted slots. + gi.InitGrowthLeftNoDeleted(5); + EXPECT_TRUE(gi.HasNoDeletedAndGrowthLeft()); +} + +TEST(GrowthInfoTest, HasNoGrowthLeftAndNoDeleted) { + GrowthInfo gi; + gi.InitGrowthLeftNoDeleted(1); + EXPECT_FALSE(gi.HasNoGrowthLeftAndNoDeleted()); + gi.OverwriteEmptyAsFull(); + EXPECT_TRUE(gi.HasNoGrowthLeftAndNoDeleted()); + gi.OverwriteFullAsDeleted(); + EXPECT_FALSE(gi.HasNoGrowthLeftAndNoDeleted()); + gi.OverwriteFullAsEmpty(); + EXPECT_FALSE(gi.HasNoGrowthLeftAndNoDeleted()); + gi.InitGrowthLeftNoDeleted(0); + EXPECT_TRUE(gi.HasNoGrowthLeftAndNoDeleted()); + gi.OverwriteFullAsEmpty(); + EXPECT_FALSE(gi.HasNoGrowthLeftAndNoDeleted()); +} + +TEST(GrowthInfoTest, OverwriteFullAsEmpty) { + GrowthInfo gi; + gi.InitGrowthLeftNoDeleted(5); + gi.OverwriteFullAsEmpty(); + EXPECT_EQ(gi.GetGrowthLeft(), 6); + gi.OverwriteFullAsDeleted(); + EXPECT_EQ(gi.GetGrowthLeft(), 6); + gi.OverwriteFullAsEmpty(); + EXPECT_EQ(gi.GetGrowthLeft(), 7); + EXPECT_FALSE(gi.HasNoDeleted()); +} + +TEST(GrowthInfoTest, OverwriteEmptyAsFull) { + GrowthInfo gi; + gi.InitGrowthLeftNoDeleted(5); + gi.OverwriteEmptyAsFull(); + EXPECT_EQ(gi.GetGrowthLeft(), 4); + gi.OverwriteFullAsDeleted(); + EXPECT_EQ(gi.GetGrowthLeft(), 4); + gi.OverwriteEmptyAsFull(); + EXPECT_EQ(gi.GetGrowthLeft(), 3); + EXPECT_FALSE(gi.HasNoDeleted()); +} + +TEST(GrowthInfoTest, OverwriteControlAsFull) { + GrowthInfo gi; + gi.InitGrowthLeftNoDeleted(5); + gi.OverwriteControlAsFull(ctrl_t::kEmpty); + EXPECT_EQ(gi.GetGrowthLeft(), 4); + gi.OverwriteControlAsFull(ctrl_t::kDeleted); + EXPECT_EQ(gi.GetGrowthLeft(), 4); + gi.OverwriteFullAsDeleted(); + gi.OverwriteControlAsFull(ctrl_t::kDeleted); + // We do not count number of deleted, so the bit sticks till the next rehash. + EXPECT_FALSE(gi.HasNoDeletedAndGrowthLeft()); + EXPECT_FALSE(gi.HasNoDeleted()); +} + +TEST(Util, NormalizeCapacity) { + EXPECT_EQ(1, NormalizeCapacity(0)); + EXPECT_EQ(1, NormalizeCapacity(1)); + EXPECT_EQ(3, NormalizeCapacity(2)); + EXPECT_EQ(3, NormalizeCapacity(3)); + EXPECT_EQ(7, NormalizeCapacity(4)); + EXPECT_EQ(7, NormalizeCapacity(7)); + EXPECT_EQ(15, NormalizeCapacity(8)); + EXPECT_EQ(15, NormalizeCapacity(15)); + EXPECT_EQ(15 * 2 + 1, NormalizeCapacity(15 + 1)); + EXPECT_EQ(15 * 2 + 1, NormalizeCapacity(15 + 2)); +} + +TEST(Util, GrowthAndCapacity) { + // Verify that GrowthToCapacity gives the minimum capacity that has enough + // growth. + for (size_t growth = 0; growth < 10000; ++growth) { + SCOPED_TRACE(growth); + size_t capacity = NormalizeCapacity(GrowthToLowerboundCapacity(growth)); + // The capacity is large enough for `growth`. + EXPECT_THAT(CapacityToGrowth(capacity), Ge(growth)); + // For (capacity+1) < kWidth, growth should equal capacity. + if (capacity + 1 < Group::kWidth) { + EXPECT_THAT(CapacityToGrowth(capacity), Eq(capacity)); + } else { + EXPECT_THAT(CapacityToGrowth(capacity), Lt(capacity)); + } + if (growth != 0 && capacity > 1) { + // There is no smaller capacity that works. + EXPECT_THAT(CapacityToGrowth(capacity / 2), Lt(growth)); + } + } + + for (size_t capacity = Group::kWidth - 1; capacity < 10000; + capacity = 2 * capacity + 1) { + SCOPED_TRACE(capacity); + size_t growth = CapacityToGrowth(capacity); + EXPECT_THAT(growth, Lt(capacity)); + EXPECT_LE(GrowthToLowerboundCapacity(growth), capacity); + EXPECT_EQ(NormalizeCapacity(GrowthToLowerboundCapacity(growth)), capacity); + } +} + +TEST(Util, probe_seq) { + probe_seq<16> seq(0, 127); + auto gen = [&]() { + size_t res = seq.offset(); + seq.next(); + return res; + }; + std::vector offsets(8); + std::generate_n(offsets.begin(), 8, gen); + EXPECT_THAT(offsets, ElementsAre(0, 16, 48, 96, 32, 112, 80, 64)); + seq = probe_seq<16>(128, 127); + std::generate_n(offsets.begin(), 8, gen); + EXPECT_THAT(offsets, ElementsAre(0, 16, 48, 96, 32, 112, 80, 64)); +} + +TEST(BitMask, Smoke) { + EXPECT_FALSE((BitMask(0))); + EXPECT_TRUE((BitMask(5))); + + EXPECT_THAT((BitMask(0)), ElementsAre()); + EXPECT_THAT((BitMask(0x1)), ElementsAre(0)); + EXPECT_THAT((BitMask(0x2)), ElementsAre(1)); + EXPECT_THAT((BitMask(0x3)), ElementsAre(0, 1)); + EXPECT_THAT((BitMask(0x4)), ElementsAre(2)); + EXPECT_THAT((BitMask(0x5)), ElementsAre(0, 2)); + EXPECT_THAT((BitMask(0x55)), ElementsAre(0, 2, 4, 6)); + EXPECT_THAT((BitMask(0xAA)), ElementsAre(1, 3, 5, 7)); +} + +TEST(BitMask, WithShift_MatchPortable) { + // See the non-SSE version of Group for details on what this math is for. + uint64_t ctrl = 0x1716151413121110; + uint64_t hash = 0x12; + constexpr uint64_t lsbs = 0x0101010101010101ULL; + auto x = ctrl ^ (lsbs * hash); + uint64_t mask = (x - lsbs) & ~x & kMsbs8Bytes; + EXPECT_EQ(0x0000000080800000, mask); + + BitMask b(mask); + EXPECT_EQ(*b, 2); +} + +constexpr uint64_t kSome8BytesMask = /* */ 0x8000808080008000ULL; +constexpr uint64_t kSome8BytesMaskAllOnes = 0xff00ffffff00ff00ULL; +constexpr auto kSome8BytesMaskBits = std::array{1, 3, 4, 5, 7}; + + +TEST(BitMask, WithShift_FullMask) { + EXPECT_THAT((BitMask(kMsbs8Bytes)), + ElementsAre(0, 1, 2, 3, 4, 5, 6, 7)); + EXPECT_THAT( + (BitMask(kMsbs8Bytes)), + ElementsAre(0, 1, 2, 3, 4, 5, 6, 7)); + EXPECT_THAT( + (BitMask(~uint64_t{0})), + ElementsAre(0, 1, 2, 3, 4, 5, 6, 7)); +} + +TEST(BitMask, WithShift_EmptyMask) { + EXPECT_THAT((BitMask(0)), ElementsAre()); + EXPECT_THAT((BitMask(0)), + ElementsAre()); +} + +TEST(BitMask, WithShift_SomeMask) { + EXPECT_THAT((BitMask(kSome8BytesMask)), + ElementsAreArray(kSome8BytesMaskBits)); + EXPECT_THAT((BitMask( + kSome8BytesMask)), + ElementsAreArray(kSome8BytesMaskBits)); + EXPECT_THAT((BitMask( + kSome8BytesMaskAllOnes)), + ElementsAreArray(kSome8BytesMaskBits)); +} + +TEST(BitMask, WithShift_SomeMaskExtraBitsForNullify) { + // Verify that adding extra bits into non zero bytes is fine. + uint64_t extra_bits = 77; + for (int i = 0; i < 100; ++i) { + // Add extra bits, but keep zero bytes untouched. + uint64_t extra_mask = extra_bits & kSome8BytesMaskAllOnes; + EXPECT_THAT((BitMask( + kSome8BytesMask | extra_mask)), + ElementsAreArray(kSome8BytesMaskBits)) + << i << " " << extra_mask; + extra_bits = (extra_bits + 1) * 3; + } +} + +TEST(BitMask, LeadingTrailing) { + EXPECT_EQ((BitMask(0x00001a40).LeadingZeros()), 3); + EXPECT_EQ((BitMask(0x00001a40).TrailingZeros()), 6); + + EXPECT_EQ((BitMask(0x00000001).LeadingZeros()), 15); + EXPECT_EQ((BitMask(0x00000001).TrailingZeros()), 0); + + EXPECT_EQ((BitMask(0x00008000).LeadingZeros()), 0); + EXPECT_EQ((BitMask(0x00008000).TrailingZeros()), 15); + + EXPECT_EQ((BitMask(0x0000008080808000).LeadingZeros()), 3); + EXPECT_EQ((BitMask(0x0000008080808000).TrailingZeros()), 1); + + EXPECT_EQ((BitMask(0x0000000000000080).LeadingZeros()), 7); + EXPECT_EQ((BitMask(0x0000000000000080).TrailingZeros()), 0); + + EXPECT_EQ((BitMask(0x8000000000000000).LeadingZeros()), 0); + EXPECT_EQ((BitMask(0x8000000000000000).TrailingZeros()), 7); +} + +TEST(Group, EmptyGroup) { + for (h2_t h = 0; h != 128; ++h) EXPECT_FALSE(Group{EmptyGroup()}.Match(h)); +} + +TEST(Group, Match) { + if (Group::kWidth == 16) { + ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), ctrl_t::kDeleted, CtrlT(3), + ctrl_t::kEmpty, CtrlT(5), ctrl_t::kSentinel, CtrlT(7), + CtrlT(7), CtrlT(5), CtrlT(3), CtrlT(1), + CtrlT(1), CtrlT(1), CtrlT(1), CtrlT(1)}; + EXPECT_THAT(Group{group}.Match(0), ElementsAre()); + EXPECT_THAT(Group{group}.Match(1), ElementsAre(1, 11, 12, 13, 14, 15)); + EXPECT_THAT(Group{group}.Match(3), ElementsAre(3, 10)); + EXPECT_THAT(Group{group}.Match(5), ElementsAre(5, 9)); + EXPECT_THAT(Group{group}.Match(7), ElementsAre(7, 8)); + } else if (Group::kWidth == 8) { + ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), CtrlT(2), + ctrl_t::kDeleted, CtrlT(2), CtrlT(1), + ctrl_t::kSentinel, CtrlT(1)}; + EXPECT_THAT(Group{group}.Match(0), ElementsAre()); + EXPECT_THAT(Group{group}.Match(1), ElementsAre(1, 5, 7)); + EXPECT_THAT(Group{group}.Match(2), ElementsAre(2, 4)); + } else { + FAIL() << "No test coverage for Group::kWidth==" << Group::kWidth; + } +} + +TEST(Group, MaskEmpty) { + if (Group::kWidth == 16) { + ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), ctrl_t::kDeleted, CtrlT(3), + ctrl_t::kEmpty, CtrlT(5), ctrl_t::kSentinel, CtrlT(7), + CtrlT(7), CtrlT(5), CtrlT(3), CtrlT(1), + CtrlT(1), CtrlT(1), CtrlT(1), CtrlT(1)}; + EXPECT_THAT(Group{group}.MaskEmpty().LowestBitSet(), 0); + EXPECT_THAT(Group{group}.MaskEmpty().HighestBitSet(), 4); + } else if (Group::kWidth == 8) { + ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), CtrlT(2), + ctrl_t::kDeleted, CtrlT(2), CtrlT(1), + ctrl_t::kSentinel, CtrlT(1)}; + EXPECT_THAT(Group{group}.MaskEmpty().LowestBitSet(), 0); + EXPECT_THAT(Group{group}.MaskEmpty().HighestBitSet(), 0); + } else { + FAIL() << "No test coverage for Group::kWidth==" << Group::kWidth; + } +} + +TEST(Group, MaskFull) { + if (Group::kWidth == 16) { + ctrl_t group[] = { + ctrl_t::kEmpty, CtrlT(1), ctrl_t::kDeleted, CtrlT(3), + ctrl_t::kEmpty, CtrlT(5), ctrl_t::kSentinel, CtrlT(7), + CtrlT(7), CtrlT(5), ctrl_t::kDeleted, CtrlT(1), + CtrlT(1), ctrl_t::kSentinel, ctrl_t::kEmpty, CtrlT(1)}; + EXPECT_THAT(Group{group}.MaskFull(), + ElementsAre(1, 3, 5, 7, 8, 9, 11, 12, 15)); + } else if (Group::kWidth == 8) { + ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), ctrl_t::kEmpty, + ctrl_t::kDeleted, CtrlT(2), ctrl_t::kSentinel, + ctrl_t::kSentinel, CtrlT(1)}; + EXPECT_THAT(Group{group}.MaskFull(), ElementsAre(1, 4, 7)); + } else { + FAIL() << "No test coverage for Group::kWidth==" << Group::kWidth; + } +} + +TEST(Group, MaskNonFull) { + if (Group::kWidth == 16) { + ctrl_t group[] = { + ctrl_t::kEmpty, CtrlT(1), ctrl_t::kDeleted, CtrlT(3), + ctrl_t::kEmpty, CtrlT(5), ctrl_t::kSentinel, CtrlT(7), + CtrlT(7), CtrlT(5), ctrl_t::kDeleted, CtrlT(1), + CtrlT(1), ctrl_t::kSentinel, ctrl_t::kEmpty, CtrlT(1)}; + EXPECT_THAT(Group{group}.MaskNonFull(), + ElementsAre(0, 2, 4, 6, 10, 13, 14)); + } else if (Group::kWidth == 8) { + ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), ctrl_t::kEmpty, + ctrl_t::kDeleted, CtrlT(2), ctrl_t::kSentinel, + ctrl_t::kSentinel, CtrlT(1)}; + EXPECT_THAT(Group{group}.MaskNonFull(), ElementsAre(0, 2, 3, 5, 6)); + } else { + FAIL() << "No test coverage for Group::kWidth==" << Group::kWidth; + } +} + +TEST(Group, MaskEmptyOrDeleted) { + if (Group::kWidth == 16) { + ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), ctrl_t::kEmpty, CtrlT(3), + ctrl_t::kDeleted, CtrlT(5), ctrl_t::kSentinel, CtrlT(7), + CtrlT(7), CtrlT(5), CtrlT(3), CtrlT(1), + CtrlT(1), CtrlT(1), CtrlT(1), CtrlT(1)}; + EXPECT_THAT(Group{group}.MaskEmptyOrDeleted().LowestBitSet(), 0); + EXPECT_THAT(Group{group}.MaskEmptyOrDeleted().HighestBitSet(), 4); + } else if (Group::kWidth == 8) { + ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), CtrlT(2), + ctrl_t::kDeleted, CtrlT(2), CtrlT(1), + ctrl_t::kSentinel, CtrlT(1)}; + EXPECT_THAT(Group{group}.MaskEmptyOrDeleted().LowestBitSet(), 0); + EXPECT_THAT(Group{group}.MaskEmptyOrDeleted().HighestBitSet(), 3); + } else { + FAIL() << "No test coverage for Group::kWidth==" << Group::kWidth; + } +} + +TEST(Batch, DropDeletes) { + constexpr size_t kCapacity = 63; + constexpr size_t kGroupWidth = container_internal::Group::kWidth; + std::vector ctrl(kCapacity + 1 + kGroupWidth); + ctrl[kCapacity] = ctrl_t::kSentinel; + std::vector pattern = { + ctrl_t::kEmpty, CtrlT(2), ctrl_t::kDeleted, CtrlT(2), + ctrl_t::kEmpty, CtrlT(1), ctrl_t::kDeleted}; + for (size_t i = 0; i != kCapacity; ++i) { + ctrl[i] = pattern[i % pattern.size()]; + if (i < kGroupWidth - 1) + ctrl[i + kCapacity + 1] = pattern[i % pattern.size()]; + } + ConvertDeletedToEmptyAndFullToDeleted(ctrl.data(), kCapacity); + ASSERT_EQ(ctrl[kCapacity], ctrl_t::kSentinel); + for (size_t i = 0; i < kCapacity + kGroupWidth; ++i) { + ctrl_t expected = pattern[i % (kCapacity + 1) % pattern.size()]; + if (i == kCapacity) expected = ctrl_t::kSentinel; + if (expected == ctrl_t::kDeleted) expected = ctrl_t::kEmpty; + if (IsFull(expected)) expected = ctrl_t::kDeleted; + EXPECT_EQ(ctrl[i], expected) + << i << " " << static_cast(pattern[i % pattern.size()]); + } +} + +TEST(Group, CountLeadingEmptyOrDeleted) { + const std::vector empty_examples = {ctrl_t::kEmpty, ctrl_t::kDeleted}; + const std::vector full_examples = { + CtrlT(0), CtrlT(1), CtrlT(2), CtrlT(3), + CtrlT(5), CtrlT(9), CtrlT(127), ctrl_t::kSentinel}; + + for (ctrl_t empty : empty_examples) { + std::vector e(Group::kWidth, empty); + EXPECT_EQ(Group::kWidth, Group{e.data()}.CountLeadingEmptyOrDeleted()); + for (ctrl_t full : full_examples) { + for (size_t i = 0; i != Group::kWidth; ++i) { + std::vector f(Group::kWidth, empty); + f[i] = full; + EXPECT_EQ(i, Group{f.data()}.CountLeadingEmptyOrDeleted()); + } + std::vector f(Group::kWidth, empty); + f[Group::kWidth * 2 / 3] = full; + f[Group::kWidth / 2] = full; + EXPECT_EQ(Group::kWidth / 2, + Group{f.data()}.CountLeadingEmptyOrDeleted()); + } + } +} + +template +struct ValuePolicy { + using slot_type = T; + using key_type = T; + using init_type = T; + + template + static void construct(Allocator* alloc, slot_type* slot, Args&&... args) { + absl::allocator_traits::construct(*alloc, slot, + std::forward(args)...); + } + + template + static void destroy(Allocator* alloc, slot_type* slot) { + absl::allocator_traits::destroy(*alloc, slot); + } + + template + static std::integral_constant transfer( + Allocator* alloc, slot_type* new_slot, slot_type* old_slot) { + construct(alloc, new_slot, std::move(*old_slot)); + destroy(alloc, old_slot); + return {}; + } + + static T& element(slot_type* slot) { return *slot; } + + template + static decltype(absl::container_internal::DecomposeValue( + std::declval(), std::declval()...)) + apply(F&& f, Args&&... args) { + return absl::container_internal::DecomposeValue( + std::forward(f), std::forward(args)...); + } + + template + static constexpr HashSlotFn get_hash_slot_fn() { + return nullptr; + } + + static constexpr bool soo_enabled() { return kSoo; } +}; + +using IntPolicy = ValuePolicy; +using Uint8Policy = ValuePolicy; + +using TranferableIntPolicy = ValuePolicy; + +// For testing SOO. +template +class SizedValue { + public: + SizedValue(int64_t v) { // NOLINT + vals_[0] = v; + } + SizedValue() : SizedValue(0) {} + SizedValue(const SizedValue&) = default; + SizedValue& operator=(const SizedValue&) = default; + + int64_t operator*() const { + // Suppress erroneous uninitialized memory errors on GCC. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + return vals_[0]; +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + } + explicit operator int() const { return **this; } + explicit operator int64_t() const { return **this; } + + template + friend H AbslHashValue(H h, SizedValue sv) { + return H::combine(std::move(h), *sv); + } + bool operator==(const SizedValue& rhs) const { return **this == *rhs; } + + private: + int64_t vals_[N / sizeof(int64_t)]; +}; +template +using SizedValuePolicy = + ValuePolicy, /*kTransferable=*/true, kSoo>; + +class StringPolicy { + template ::value>::type> + decltype(std::declval()( + std::declval(), std::piecewise_construct, + std::declval>(), + std::declval())) static apply_impl(F&& f, + std::pair, V> p) { + const absl::string_view& key = std::get<0>(p.first); + return std::forward(f)(key, std::piecewise_construct, std::move(p.first), + std::move(p.second)); + } + + public: + struct slot_type { + struct ctor {}; + + template + explicit slot_type(ctor, Ts&&... ts) : pair(std::forward(ts)...) {} + + std::pair pair; + }; + + using key_type = std::string; + using init_type = std::pair; + + template + static void construct(allocator_type* alloc, slot_type* slot, Args... args) { + std::allocator_traits::construct( + *alloc, slot, typename slot_type::ctor(), std::forward(args)...); + } + + template + static void destroy(allocator_type* alloc, slot_type* slot) { + std::allocator_traits::destroy(*alloc, slot); + } + + template + static void transfer(allocator_type* alloc, slot_type* new_slot, + slot_type* old_slot) { + construct(alloc, new_slot, std::move(old_slot->pair)); + destroy(alloc, old_slot); + } + + static std::pair& element(slot_type* slot) { + return slot->pair; + } + + template + static auto apply(F&& f, Args&&... args) + -> decltype(apply_impl(std::forward(f), + PairArgs(std::forward(args)...))) { + return apply_impl(std::forward(f), + PairArgs(std::forward(args)...)); + } + + template + static constexpr HashSlotFn get_hash_slot_fn() { + return nullptr; + } +}; + +struct StringHash : absl::Hash { + using is_transparent = void; +}; +struct StringEq : std::equal_to { + using is_transparent = void; +}; + +struct StringTable + : raw_hash_set> { + using Base = typename StringTable::raw_hash_set; + StringTable() = default; + using Base::Base; +}; + +template +struct ValueTable + : raw_hash_set, hash_default_hash, + std::equal_to, std::allocator> { + using Base = typename ValueTable::raw_hash_set; + using Base::Base; +}; + +using IntTable = ValueTable; +using Uint8Table = ValueTable; + +using TransferableIntTable = ValueTable; + +constexpr size_t kNonSooSize = sizeof(HeapOrSoo) + 8; +static_assert(sizeof(SizedValue) >= kNonSooSize, "too small"); +using NonSooIntTable = ValueTable>; +using SooIntTable = ValueTable; + +template +struct CustomAlloc : std::allocator { + CustomAlloc() = default; + + template + explicit CustomAlloc(const CustomAlloc& /*other*/) {} + + template + struct rebind { + using other = CustomAlloc; + }; +}; + +struct CustomAllocIntTable + : raw_hash_set, + std::equal_to, CustomAlloc> { + using Base = typename CustomAllocIntTable::raw_hash_set; + using Base::Base; +}; + +struct MinimumAlignmentUint8Table + : raw_hash_set, + std::equal_to, MinimumAlignmentAlloc> { + using Base = typename MinimumAlignmentUint8Table::raw_hash_set; + using Base::Base; +}; + +// Allows for freezing the allocator to expect no further allocations. +template +struct FreezableAlloc : std::allocator { + explicit FreezableAlloc(bool* f) : frozen(f) {} + + template + explicit FreezableAlloc(const FreezableAlloc& other) + : frozen(other.frozen) {} + + template + struct rebind { + using other = FreezableAlloc; + }; + + T* allocate(size_t n) { + EXPECT_FALSE(*frozen); + return std::allocator::allocate(n); + } + + bool* frozen; +}; + +template +struct FreezableSizedValueSooTable + : raw_hash_set, + container_internal::hash_default_hash>, + std::equal_to>, + FreezableAlloc>> { + using Base = typename FreezableSizedValueSooTable::raw_hash_set; + using Base::Base; +}; + +struct BadFastHash { + template + size_t operator()(const T&) const { + return 0; + } +}; + +struct BadHashFreezableIntTable + : raw_hash_set, + FreezableAlloc> { + using Base = typename BadHashFreezableIntTable::raw_hash_set; + using Base::Base; +}; + +struct BadTable : raw_hash_set, + std::allocator> { + using Base = typename BadTable::raw_hash_set; + BadTable() = default; + using Base::Base; +}; + +TEST(Table, EmptyFunctorOptimization) { + static_assert(std::is_empty>::value, ""); + static_assert(std::is_empty>::value, ""); + + struct MockTable { + void* ctrl; + void* slots; + size_t size; + size_t capacity; + }; + struct StatelessHash { + size_t operator()(absl::string_view) const { return 0; } + }; + struct StatefulHash : StatelessHash { + size_t dummy; + }; + + struct GenerationData { + size_t reserved_growth; + size_t reservation_size; + GenerationType* generation; + }; + +// Ignore unreachable-code warning. Compiler thinks one branch of each ternary +// conditional is unreachable. +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunreachable-code" +#endif + constexpr size_t mock_size = sizeof(MockTable); + constexpr size_t generation_size = + SwisstableGenerationsEnabled() ? sizeof(GenerationData) : 0; +#if defined(__clang__) +#pragma clang diagnostic pop +#endif + + EXPECT_EQ( + mock_size + generation_size, + sizeof( + raw_hash_set, std::allocator>)); + + EXPECT_EQ( + mock_size + sizeof(StatefulHash) + generation_size, + sizeof( + raw_hash_set, std::allocator>)); +} + +template +class SooTest : public testing::Test {}; + +using SooTableTypes = ::testing::Types; +TYPED_TEST_SUITE(SooTest, SooTableTypes); + +TYPED_TEST(SooTest, Empty) { + TypeParam t; + EXPECT_EQ(0, t.size()); + EXPECT_TRUE(t.empty()); +} + +TYPED_TEST(SooTest, LookupEmpty) { + TypeParam t; + auto it = t.find(0); + EXPECT_TRUE(it == t.end()); +} + +TYPED_TEST(SooTest, Insert1) { + TypeParam t; + EXPECT_TRUE(t.find(0) == t.end()); + auto res = t.emplace(0); + EXPECT_TRUE(res.second); + EXPECT_THAT(*res.first, 0); + EXPECT_EQ(1, t.size()); + EXPECT_THAT(*t.find(0), 0); +} + +TYPED_TEST(SooTest, Insert2) { + TypeParam t; + EXPECT_TRUE(t.find(0) == t.end()); + auto res = t.emplace(0); + EXPECT_TRUE(res.second); + EXPECT_THAT(*res.first, 0); + EXPECT_EQ(1, t.size()); + EXPECT_TRUE(t.find(1) == t.end()); + res = t.emplace(1); + EXPECT_TRUE(res.second); + EXPECT_THAT(*res.first, 1); + EXPECT_EQ(2, t.size()); + EXPECT_THAT(*t.find(0), 0); + EXPECT_THAT(*t.find(1), 1); +} + +TEST(Table, InsertCollision) { + BadTable t; + EXPECT_TRUE(t.find(1) == t.end()); + auto res = t.emplace(1); + EXPECT_TRUE(res.second); + EXPECT_THAT(*res.first, 1); + EXPECT_EQ(1, t.size()); + + EXPECT_TRUE(t.find(2) == t.end()); + res = t.emplace(2); + EXPECT_THAT(*res.first, 2); + EXPECT_TRUE(res.second); + EXPECT_EQ(2, t.size()); + + EXPECT_THAT(*t.find(1), 1); + EXPECT_THAT(*t.find(2), 2); +} + +// Test that we do not add existent element in case we need to search through +// many groups with deleted elements +TEST(Table, InsertCollisionAndFindAfterDelete) { + BadTable t; // all elements go to the same group. + // Have at least 2 groups with Group::kWidth collisions + // plus some extra collisions in the last group. + constexpr size_t kNumInserts = Group::kWidth * 2 + 5; + for (size_t i = 0; i < kNumInserts; ++i) { + auto res = t.emplace(i); + EXPECT_TRUE(res.second); + EXPECT_THAT(*res.first, i); + EXPECT_EQ(i + 1, t.size()); + } + + // Remove elements one by one and check + // that we still can find all other elements. + for (size_t i = 0; i < kNumInserts; ++i) { + EXPECT_EQ(1, t.erase(i)) << i; + for (size_t j = i + 1; j < kNumInserts; ++j) { + EXPECT_THAT(*t.find(j), j); + auto res = t.emplace(j); + EXPECT_FALSE(res.second) << i << " " << j; + EXPECT_THAT(*res.first, j); + EXPECT_EQ(kNumInserts - i - 1, t.size()); + } + } + EXPECT_TRUE(t.empty()); +} + +TYPED_TEST(SooTest, EraseInSmallTables) { + for (int64_t size = 0; size < 64; ++size) { + TypeParam t; + for (int64_t i = 0; i < size; ++i) { + t.insert(i); + } + for (int64_t i = 0; i < size; ++i) { + t.erase(i); + EXPECT_EQ(t.size(), size - i - 1); + for (int64_t j = i + 1; j < size; ++j) { + EXPECT_THAT(*t.find(j), j); + } + } + EXPECT_TRUE(t.empty()); + } +} + +TYPED_TEST(SooTest, InsertWithinCapacity) { + TypeParam t; + t.reserve(10); + const size_t original_capacity = t.capacity(); + const auto addr = [&](int i) { + return reinterpret_cast(&*t.find(i)); + }; + // Inserting an element does not change capacity. + t.insert(0); + EXPECT_THAT(t.capacity(), original_capacity); + const uintptr_t original_addr_0 = addr(0); + // Inserting another element does not rehash. + t.insert(1); + EXPECT_THAT(t.capacity(), original_capacity); + EXPECT_THAT(addr(0), original_addr_0); + // Inserting lots of duplicate elements does not rehash. + for (int i = 0; i < 100; ++i) { + t.insert(i % 10); + } + EXPECT_THAT(t.capacity(), original_capacity); + EXPECT_THAT(addr(0), original_addr_0); + // Inserting a range of duplicate elements does not rehash. + std::vector dup_range; + for (int i = 0; i < 100; ++i) { + dup_range.push_back(i % 10); + } + t.insert(dup_range.begin(), dup_range.end()); + EXPECT_THAT(t.capacity(), original_capacity); + EXPECT_THAT(addr(0), original_addr_0); +} + +template +class SmallTableResizeTest : public testing::Test {}; + +using SmallTableTypes = + ::testing::Types; +TYPED_TEST_SUITE(SmallTableResizeTest, SmallTableTypes); + +TYPED_TEST(SmallTableResizeTest, InsertIntoSmallTable) { + TypeParam t; + for (int i = 0; i < 32; ++i) { + t.insert(i); + ASSERT_EQ(t.size(), i + 1); + for (int j = 0; j < i + 1; ++j) { + EXPECT_TRUE(t.find(j) != t.end()); + EXPECT_EQ(*t.find(j), j); + } + } +} + +TYPED_TEST(SmallTableResizeTest, ResizeGrowSmallTables) { + for (size_t source_size = 0; source_size < 32; ++source_size) { + for (size_t target_size = source_size; target_size < 32; ++target_size) { + for (bool rehash : {false, true}) { + TypeParam t; + for (size_t i = 0; i < source_size; ++i) { + t.insert(static_cast(i)); + } + if (rehash) { + t.rehash(target_size); + } else { + t.reserve(target_size); + } + for (size_t i = 0; i < source_size; ++i) { + EXPECT_TRUE(t.find(static_cast(i)) != t.end()); + EXPECT_EQ(*t.find(static_cast(i)), static_cast(i)); + } + } + } + } +} + +TYPED_TEST(SmallTableResizeTest, ResizeReduceSmallTables) { + for (size_t source_size = 0; source_size < 32; ++source_size) { + for (size_t target_size = 0; target_size <= source_size; ++target_size) { + TypeParam t; + size_t inserted_count = std::min(source_size, 5); + for (size_t i = 0; i < inserted_count; ++i) { + t.insert(static_cast(i)); + } + const size_t minimum_capacity = t.capacity(); + t.reserve(source_size); + t.rehash(target_size); + if (target_size == 0) { + EXPECT_EQ(t.capacity(), minimum_capacity) + << "rehash(0) must resize to the minimum capacity"; + } + for (size_t i = 0; i < inserted_count; ++i) { + EXPECT_TRUE(t.find(static_cast(i)) != t.end()); + EXPECT_EQ(*t.find(static_cast(i)), static_cast(i)); + } + } + } +} + +TEST(Table, LazyEmplace) { + StringTable t; + bool called = false; + auto it = t.lazy_emplace("abc", [&](const StringTable::constructor& f) { + called = true; + f("abc", "ABC"); + }); + EXPECT_TRUE(called); + EXPECT_THAT(*it, Pair("abc", "ABC")); + called = false; + it = t.lazy_emplace("abc", [&](const StringTable::constructor& f) { + called = true; + f("abc", "DEF"); + }); + EXPECT_FALSE(called); + EXPECT_THAT(*it, Pair("abc", "ABC")); +} + +TYPED_TEST(SooTest, ContainsEmpty) { + TypeParam t; + + EXPECT_FALSE(t.contains(0)); +} + +TYPED_TEST(SooTest, Contains1) { + TypeParam t; + + EXPECT_TRUE(t.insert(0).second); + EXPECT_TRUE(t.contains(0)); + EXPECT_FALSE(t.contains(1)); + + EXPECT_EQ(1, t.erase(0)); + EXPECT_FALSE(t.contains(0)); +} + +TYPED_TEST(SooTest, Contains2) { + TypeParam t; + + EXPECT_TRUE(t.insert(0).second); + EXPECT_TRUE(t.contains(0)); + EXPECT_FALSE(t.contains(1)); + + t.clear(); + EXPECT_FALSE(t.contains(0)); +} + +int decompose_constructed; +int decompose_copy_constructed; +int decompose_copy_assigned; +int decompose_move_constructed; +int decompose_move_assigned; +struct DecomposeType { + DecomposeType(int i = 0) : i(i) { // NOLINT + ++decompose_constructed; + } + + explicit DecomposeType(const char* d) : DecomposeType(*d) {} + + DecomposeType(const DecomposeType& other) : i(other.i) { + ++decompose_copy_constructed; + } + DecomposeType& operator=(const DecomposeType& other) { + ++decompose_copy_assigned; + i = other.i; + return *this; + } + DecomposeType(DecomposeType&& other) : i(other.i) { + ++decompose_move_constructed; + } + DecomposeType& operator=(DecomposeType&& other) { + ++decompose_move_assigned; + i = other.i; + return *this; + } + + int i; +}; + +struct DecomposeHash { + using is_transparent = void; + size_t operator()(const DecomposeType& a) const { return a.i; } + size_t operator()(int a) const { return a; } + size_t operator()(const char* a) const { return *a; } +}; + +struct DecomposeEq { + using is_transparent = void; + bool operator()(const DecomposeType& a, const DecomposeType& b) const { + return a.i == b.i; + } + bool operator()(const DecomposeType& a, int b) const { return a.i == b; } + bool operator()(const DecomposeType& a, const char* b) const { + return a.i == *b; + } +}; + +struct DecomposePolicy { + using slot_type = DecomposeType; + using key_type = DecomposeType; + using init_type = DecomposeType; + + template + static void construct(void*, DecomposeType* slot, T&& v) { + ::new (slot) DecomposeType(std::forward(v)); + } + static void destroy(void*, DecomposeType* slot) { slot->~DecomposeType(); } + static DecomposeType& element(slot_type* slot) { return *slot; } + + template + static auto apply(F&& f, const T& x) -> decltype(std::forward(f)(x, x)) { + return std::forward(f)(x, x); + } + + template + static constexpr HashSlotFn get_hash_slot_fn() { + return nullptr; + } +}; + +template +void TestDecompose(bool construct_three) { + DecomposeType elem{0}; + const int one = 1; + const char* three_p = "3"; + const auto& three = three_p; + const int elem_vector_count = 256; + std::vector elem_vector(elem_vector_count, DecomposeType{0}); + std::iota(elem_vector.begin(), elem_vector.end(), 0); + + using DecomposeSet = + raw_hash_set>; + DecomposeSet set1; + + decompose_constructed = 0; + int expected_constructed = 0; + EXPECT_EQ(expected_constructed, decompose_constructed); + set1.insert(elem); + EXPECT_EQ(expected_constructed, decompose_constructed); + set1.insert(1); + EXPECT_EQ(++expected_constructed, decompose_constructed); + set1.emplace("3"); + EXPECT_EQ(++expected_constructed, decompose_constructed); + EXPECT_EQ(expected_constructed, decompose_constructed); + + { // insert(T&&) + set1.insert(1); + EXPECT_EQ(expected_constructed, decompose_constructed); + } + + { // insert(const T&) + set1.insert(one); + EXPECT_EQ(expected_constructed, decompose_constructed); + } + + { // insert(hint, T&&) + set1.insert(set1.begin(), 1); + EXPECT_EQ(expected_constructed, decompose_constructed); + } + + { // insert(hint, const T&) + set1.insert(set1.begin(), one); + EXPECT_EQ(expected_constructed, decompose_constructed); + } + + { // emplace(...) + set1.emplace(1); + EXPECT_EQ(expected_constructed, decompose_constructed); + set1.emplace("3"); + expected_constructed += construct_three; + EXPECT_EQ(expected_constructed, decompose_constructed); + set1.emplace(one); + EXPECT_EQ(expected_constructed, decompose_constructed); + set1.emplace(three); + expected_constructed += construct_three; + EXPECT_EQ(expected_constructed, decompose_constructed); + } + + { // emplace_hint(...) + set1.emplace_hint(set1.begin(), 1); + EXPECT_EQ(expected_constructed, decompose_constructed); + set1.emplace_hint(set1.begin(), "3"); + expected_constructed += construct_three; + EXPECT_EQ(expected_constructed, decompose_constructed); + set1.emplace_hint(set1.begin(), one); + EXPECT_EQ(expected_constructed, decompose_constructed); + set1.emplace_hint(set1.begin(), three); + expected_constructed += construct_three; + EXPECT_EQ(expected_constructed, decompose_constructed); + } + + decompose_copy_constructed = 0; + decompose_copy_assigned = 0; + decompose_move_constructed = 0; + decompose_move_assigned = 0; + int expected_copy_constructed = 0; + int expected_move_constructed = 0; + { // raw_hash_set(first, last) with random-access iterators + DecomposeSet set2(elem_vector.begin(), elem_vector.end()); + // Expect exactly one copy-constructor call for each element if no + // rehashing is done. + expected_copy_constructed += elem_vector_count; + EXPECT_EQ(expected_copy_constructed, decompose_copy_constructed); + EXPECT_EQ(expected_move_constructed, decompose_move_constructed); + EXPECT_EQ(0, decompose_move_assigned); + EXPECT_EQ(0, decompose_copy_assigned); + } + + { // raw_hash_set(first, last) with forward iterators + std::list elem_list(elem_vector.begin(), elem_vector.end()); + expected_copy_constructed = decompose_copy_constructed; + DecomposeSet set2(elem_list.begin(), elem_list.end()); + // Expect exactly N elements copied into set, expect at most 2*N elements + // moving internally for all resizing needed (for a growth factor of 2). + expected_copy_constructed += elem_vector_count; + EXPECT_EQ(expected_copy_constructed, decompose_copy_constructed); + expected_move_constructed += elem_vector_count; + EXPECT_LT(expected_move_constructed, decompose_move_constructed); + expected_move_constructed += elem_vector_count; + EXPECT_GE(expected_move_constructed, decompose_move_constructed); + EXPECT_EQ(0, decompose_move_assigned); + EXPECT_EQ(0, decompose_copy_assigned); + expected_copy_constructed = decompose_copy_constructed; + expected_move_constructed = decompose_move_constructed; + } + + { // insert(first, last) + DecomposeSet set2; + set2.insert(elem_vector.begin(), elem_vector.end()); + // Expect exactly N elements copied into set, expect at most 2*N elements + // moving internally for all resizing needed (for a growth factor of 2). + const int expected_new_elements = elem_vector_count; + const int expected_max_element_moves = 2 * elem_vector_count; + expected_copy_constructed += expected_new_elements; + EXPECT_EQ(expected_copy_constructed, decompose_copy_constructed); + expected_move_constructed += expected_max_element_moves; + EXPECT_GE(expected_move_constructed, decompose_move_constructed); + EXPECT_EQ(0, decompose_move_assigned); + EXPECT_EQ(0, decompose_copy_assigned); + expected_copy_constructed = decompose_copy_constructed; + expected_move_constructed = decompose_move_constructed; + } +} + +TEST(Table, Decompose) { + if (SwisstableGenerationsEnabled()) { + GTEST_SKIP() << "Generations being enabled causes extra rehashes."; + } + + TestDecompose(false); + + struct TransparentHashIntOverload { + size_t operator()(const DecomposeType& a) const { return a.i; } + size_t operator()(int a) const { return a; } + }; + struct TransparentEqIntOverload { + bool operator()(const DecomposeType& a, const DecomposeType& b) const { + return a.i == b.i; + } + bool operator()(const DecomposeType& a, int b) const { return a.i == b; } + }; + TestDecompose(true); + TestDecompose(true); + TestDecompose(true); +} + +// Returns the largest m such that a table with m elements has the same number +// of buckets as a table with n elements. +size_t MaxDensitySize(size_t n) { + IntTable t; + t.reserve(n); + for (size_t i = 0; i != n; ++i) t.emplace(i); + const size_t c = t.bucket_count(); + while (c == t.bucket_count()) t.emplace(n++); + return t.size() - 1; +} + +struct Modulo1000Hash { + size_t operator()(int64_t x) const { return static_cast(x) % 1000; } +}; + +struct Modulo1000HashTable + : public raw_hash_set, + std::allocator> {}; + +// Test that rehash with no resize happen in case of many deleted slots. +TEST(Table, RehashWithNoResize) { + if (SwisstableGenerationsEnabled()) { + GTEST_SKIP() << "Generations being enabled causes extra rehashes."; + } + + Modulo1000HashTable t; + // Adding the same length (and the same hash) strings + // to have at least kMinFullGroups groups + // with Group::kWidth collisions. Then fill up to MaxDensitySize; + const size_t kMinFullGroups = 7; + std::vector keys; + for (size_t i = 0; i < MaxDensitySize(Group::kWidth * kMinFullGroups); ++i) { + int k = i * 1000; + t.emplace(k); + keys.push_back(k); + } + const size_t capacity = t.capacity(); + + // Remove elements from all groups except the first and the last one. + // All elements removed from full groups will be marked as ctrl_t::kDeleted. + const size_t erase_begin = Group::kWidth / 2; + const size_t erase_end = (t.size() / Group::kWidth - 1) * Group::kWidth; + for (size_t i = erase_begin; i < erase_end; ++i) { + EXPECT_EQ(1, t.erase(keys[i])) << i; + } + keys.erase(keys.begin() + erase_begin, keys.begin() + erase_end); + + auto last_key = keys.back(); + size_t last_key_num_probes = GetHashtableDebugNumProbes(t, last_key); + + // Make sure that we have to make a lot of probes for last key. + ASSERT_GT(last_key_num_probes, kMinFullGroups); + + int x = 1; + // Insert and erase one element, before inplace rehash happen. + while (last_key_num_probes == GetHashtableDebugNumProbes(t, last_key)) { + t.emplace(x); + ASSERT_EQ(capacity, t.capacity()); + // All elements should be there. + ASSERT_TRUE(t.find(x) != t.end()) << x; + for (const auto& k : keys) { + ASSERT_TRUE(t.find(k) != t.end()) << k; + } + t.erase(x); + ++x; + } +} + +TYPED_TEST(SooTest, InsertEraseStressTest) { + TypeParam t; + const size_t kMinElementCount = 250; + std::deque keys; + size_t i = 0; + for (; i < MaxDensitySize(kMinElementCount); ++i) { + t.emplace(i); + keys.push_back(i); + } + const size_t kNumIterations = 1000000; + for (; i < kNumIterations; ++i) { + ASSERT_EQ(1, t.erase(keys.front())); + keys.pop_front(); + t.emplace(i); + keys.push_back(i); + } +} + +TEST(Table, InsertOverloads) { + StringTable t; + // These should all trigger the insert(init_type) overload. + t.insert({{}, {}}); + t.insert({"ABC", {}}); + t.insert({"DEF", "!!!"}); + + EXPECT_THAT(t, UnorderedElementsAre(Pair("", ""), Pair("ABC", ""), + Pair("DEF", "!!!"))); +} + +TYPED_TEST(SooTest, LargeTable) { + TypeParam t; + for (int64_t i = 0; i != 100000; ++i) t.emplace(i << 40); + for (int64_t i = 0; i != 100000; ++i) + ASSERT_EQ(i << 40, static_cast(*t.find(i << 40))); +} + +// Timeout if copy is quadratic as it was in Rust. +TYPED_TEST(SooTest, EnsureNonQuadraticAsInRust) { + static const size_t kLargeSize = 1 << 15; + + TypeParam t; + for (size_t i = 0; i != kLargeSize; ++i) { + t.insert(i); + } + + // If this is quadratic, the test will timeout. + TypeParam t2; + for (const auto& entry : t) t2.insert(entry); +} + +TYPED_TEST(SooTest, ClearBug) { + if (SwisstableGenerationsEnabled()) { + GTEST_SKIP() << "Generations being enabled causes extra rehashes."; + } + + TypeParam t; + constexpr size_t capacity = container_internal::Group::kWidth - 1; + constexpr size_t max_size = capacity / 2 + 1; + for (size_t i = 0; i < max_size; ++i) { + t.insert(i); + } + ASSERT_EQ(capacity, t.capacity()); + intptr_t original = reinterpret_cast(&*t.find(2)); + t.clear(); + ASSERT_EQ(capacity, t.capacity()); + for (size_t i = 0; i < max_size; ++i) { + t.insert(i); + } + ASSERT_EQ(capacity, t.capacity()); + intptr_t second = reinterpret_cast(&*t.find(2)); + // We are checking that original and second are close enough to each other + // that they are probably still in the same group. This is not strictly + // guaranteed. + EXPECT_LT(static_cast(std::abs(original - second)), + capacity * sizeof(typename TypeParam::value_type)); +} + +TYPED_TEST(SooTest, Erase) { + TypeParam t; + EXPECT_TRUE(t.find(0) == t.end()); + auto res = t.emplace(0); + EXPECT_TRUE(res.second); + EXPECT_EQ(1, t.size()); + t.erase(res.first); + EXPECT_EQ(0, t.size()); + EXPECT_TRUE(t.find(0) == t.end()); +} + +TYPED_TEST(SooTest, EraseMaintainsValidIterator) { + TypeParam t; + const int kNumElements = 100; + for (int i = 0; i < kNumElements; i++) { + EXPECT_TRUE(t.emplace(i).second); + } + EXPECT_EQ(t.size(), kNumElements); + + int num_erase_calls = 0; + auto it = t.begin(); + while (it != t.end()) { + t.erase(it++); + num_erase_calls++; + } + + EXPECT_TRUE(t.empty()); + EXPECT_EQ(num_erase_calls, kNumElements); +} + +TYPED_TEST(SooTest, EraseBeginEnd) { + TypeParam t; + for (int i = 0; i < 10; ++i) t.insert(i); + EXPECT_EQ(t.size(), 10); + t.erase(t.begin(), t.end()); + EXPECT_EQ(t.size(), 0); +} + +// Collect N bad keys by following algorithm: +// 1. Create an empty table and reserve it to 2 * N. +// 2. Insert N random elements. +// 3. Take first Group::kWidth - 1 to bad_keys array. +// 4. Clear the table without resize. +// 5. Go to point 2 while N keys not collected +std::vector CollectBadMergeKeys(size_t N) { + static constexpr int kGroupSize = Group::kWidth - 1; + + auto topk_range = [](size_t b, size_t e, + IntTable* t) -> std::vector { + for (size_t i = b; i != e; ++i) { + t->emplace(i); + } + std::vector res; + res.reserve(kGroupSize); + auto it = t->begin(); + for (size_t i = b; i != e && i != b + kGroupSize; ++i, ++it) { + res.push_back(*it); + } + return res; + }; + + std::vector bad_keys; + bad_keys.reserve(N); + IntTable t; + t.reserve(N * 2); + + for (size_t b = 0; bad_keys.size() < N; b += N) { + auto keys = topk_range(b, b + N, &t); + bad_keys.insert(bad_keys.end(), keys.begin(), keys.end()); + t.erase(t.begin(), t.end()); + EXPECT_TRUE(t.empty()); + } + return bad_keys; +} + +struct ProbeStats { + // Number of elements with specific probe length over all tested tables. + std::vector all_probes_histogram; + // Ratios total_probe_length/size for every tested table. + std::vector single_table_ratios; + + // Average ratio total_probe_length/size over tables. + double AvgRatio() const { + return std::accumulate(single_table_ratios.begin(), + single_table_ratios.end(), 0.0) / + single_table_ratios.size(); + } + + // Maximum ratio total_probe_length/size over tables. + double MaxRatio() const { + return *std::max_element(single_table_ratios.begin(), + single_table_ratios.end()); + } + + // Percentile ratio total_probe_length/size over tables. + double PercentileRatio(double Percentile = 0.95) const { + auto r = single_table_ratios; + auto mid = r.begin() + static_cast(r.size() * Percentile); + if (mid != r.end()) { + std::nth_element(r.begin(), mid, r.end()); + return *mid; + } else { + return MaxRatio(); + } + } + + // Maximum probe length over all elements and all tables. + size_t MaxProbe() const { return all_probes_histogram.size(); } + + // Fraction of elements with specified probe length. + std::vector ProbeNormalizedHistogram() const { + double total_elements = std::accumulate(all_probes_histogram.begin(), + all_probes_histogram.end(), 0ull); + std::vector res; + for (size_t p : all_probes_histogram) { + res.push_back(p / total_elements); + } + return res; + } + + size_t PercentileProbe(double Percentile = 0.99) const { + size_t idx = 0; + for (double p : ProbeNormalizedHistogram()) { + if (Percentile > p) { + Percentile -= p; + ++idx; + } else { + return idx; + } + } + return idx; + } + + friend std::ostream& operator<<(std::ostream& out, const ProbeStats& s) { + out << "{AvgRatio:" << s.AvgRatio() << ", MaxRatio:" << s.MaxRatio() + << ", PercentileRatio:" << s.PercentileRatio() + << ", MaxProbe:" << s.MaxProbe() << ", Probes=["; + for (double p : s.ProbeNormalizedHistogram()) { + out << p << ","; + } + out << "]}"; + + return out; + } +}; + +struct ExpectedStats { + double avg_ratio; + double max_ratio; + std::vector> pecentile_ratios; + std::vector> pecentile_probes; + + friend std::ostream& operator<<(std::ostream& out, const ExpectedStats& s) { + out << "{AvgRatio:" << s.avg_ratio << ", MaxRatio:" << s.max_ratio + << ", PercentileRatios: ["; + for (auto el : s.pecentile_ratios) { + out << el.first << ":" << el.second << ", "; + } + out << "], PercentileProbes: ["; + for (auto el : s.pecentile_probes) { + out << el.first << ":" << el.second << ", "; + } + out << "]}"; + + return out; + } +}; + +void VerifyStats(size_t size, const ExpectedStats& exp, + const ProbeStats& stats) { + EXPECT_LT(stats.AvgRatio(), exp.avg_ratio) << size << " " << stats; + EXPECT_LT(stats.MaxRatio(), exp.max_ratio) << size << " " << stats; + for (auto pr : exp.pecentile_ratios) { + EXPECT_LE(stats.PercentileRatio(pr.first), pr.second) + << size << " " << pr.first << " " << stats; + } + + for (auto pr : exp.pecentile_probes) { + EXPECT_LE(stats.PercentileProbe(pr.first), pr.second) + << size << " " << pr.first << " " << stats; + } +} + +using ProbeStatsPerSize = std::map; + +// Collect total ProbeStats on num_iters iterations of the following algorithm: +// 1. Create new table and reserve it to keys.size() * 2 +// 2. Insert all keys xored with seed +// 3. Collect ProbeStats from final table. +ProbeStats CollectProbeStatsOnKeysXoredWithSeed( + const std::vector& keys, size_t num_iters) { + const size_t reserve_size = keys.size() * 2; + + ProbeStats stats; + + int64_t seed = 0x71b1a19b907d6e33; + while (num_iters--) { + seed = static_cast(static_cast(seed) * 17 + 13); + IntTable t1; + t1.reserve(reserve_size); + for (const auto& key : keys) { + t1.emplace(key ^ seed); + } + + auto probe_histogram = GetHashtableDebugNumProbesHistogram(t1); + stats.all_probes_histogram.resize( + std::max(stats.all_probes_histogram.size(), probe_histogram.size())); + std::transform(probe_histogram.begin(), probe_histogram.end(), + stats.all_probes_histogram.begin(), + stats.all_probes_histogram.begin(), std::plus()); + + size_t total_probe_seq_length = 0; + for (size_t i = 0; i < probe_histogram.size(); ++i) { + total_probe_seq_length += i * probe_histogram[i]; + } + stats.single_table_ratios.push_back(total_probe_seq_length * 1.0 / + keys.size()); + t1.erase(t1.begin(), t1.end()); + } + return stats; +} + +ExpectedStats XorSeedExpectedStats() { + constexpr bool kRandomizesInserts = +#ifdef NDEBUG + false; +#else // NDEBUG + true; +#endif // NDEBUG + + // The effective load factor is larger in non-opt mode because we insert + // elements out of order. + switch (container_internal::Group::kWidth) { + case 8: + if (kRandomizesInserts) { + return {0.05, + 1.0, + {{0.95, 0.5}}, + {{0.95, 0}, {0.99, 2}, {0.999, 4}, {0.9999, 10}}}; + } else { + return {0.05, + 2.0, + {{0.95, 0.1}}, + {{0.95, 0}, {0.99, 2}, {0.999, 4}, {0.9999, 10}}}; + } + case 16: + if (kRandomizesInserts) { + return {0.1, + 2.0, + {{0.95, 0.1}}, + {{0.95, 0}, {0.99, 1}, {0.999, 8}, {0.9999, 15}}}; + } else { + return {0.05, + 1.0, + {{0.95, 0.05}}, + {{0.95, 0}, {0.99, 1}, {0.999, 4}, {0.9999, 10}}}; + } + } + LOG(FATAL) << "Unknown Group width"; + return {}; +} + +// TODO(b/80415403): Figure out why this test is so flaky, esp. on MSVC +TEST(Table, DISABLED_EnsureNonQuadraticTopNXorSeedByProbeSeqLength) { + ProbeStatsPerSize stats; + std::vector sizes = {Group::kWidth << 5, Group::kWidth << 10}; + for (size_t size : sizes) { + stats[size] = + CollectProbeStatsOnKeysXoredWithSeed(CollectBadMergeKeys(size), 200); + } + auto expected = XorSeedExpectedStats(); + for (size_t size : sizes) { + auto& stat = stats[size]; + VerifyStats(size, expected, stat); + LOG(INFO) << size << " " << stat; + } +} + +// Collect total ProbeStats on num_iters iterations of the following algorithm: +// 1. Create new table +// 2. Select 10% of keys and insert 10 elements key * 17 + j * 13 +// 3. Collect ProbeStats from final table +ProbeStats CollectProbeStatsOnLinearlyTransformedKeys( + const std::vector& keys, size_t num_iters) { + ProbeStats stats; + + std::random_device rd; + std::mt19937 rng(rd()); + auto linear_transform = [](size_t x, size_t y) { return x * 17 + y * 13; }; + std::uniform_int_distribution dist(0, keys.size() - 1); + while (num_iters--) { + IntTable t1; + size_t num_keys = keys.size() / 10; + size_t start = dist(rng); + for (size_t i = 0; i != num_keys; ++i) { + for (size_t j = 0; j != 10; ++j) { + t1.emplace(linear_transform(keys[(i + start) % keys.size()], j)); + } + } + + auto probe_histogram = GetHashtableDebugNumProbesHistogram(t1); + stats.all_probes_histogram.resize( + std::max(stats.all_probes_histogram.size(), probe_histogram.size())); + std::transform(probe_histogram.begin(), probe_histogram.end(), + stats.all_probes_histogram.begin(), + stats.all_probes_histogram.begin(), std::plus()); + + size_t total_probe_seq_length = 0; + for (size_t i = 0; i < probe_histogram.size(); ++i) { + total_probe_seq_length += i * probe_histogram[i]; + } + stats.single_table_ratios.push_back(total_probe_seq_length * 1.0 / + t1.size()); + t1.erase(t1.begin(), t1.end()); + } + return stats; +} + +ExpectedStats LinearTransformExpectedStats() { + constexpr bool kRandomizesInserts = +#ifdef NDEBUG + false; +#else // NDEBUG + true; +#endif // NDEBUG + + // The effective load factor is larger in non-opt mode because we insert + // elements out of order. + switch (container_internal::Group::kWidth) { + case 8: + if (kRandomizesInserts) { + return {0.1, + 0.5, + {{0.95, 0.3}}, + {{0.95, 0}, {0.99, 1}, {0.999, 8}, {0.9999, 15}}}; + } else { + return {0.4, + 0.6, + {{0.95, 0.5}}, + {{0.95, 1}, {0.99, 14}, {0.999, 23}, {0.9999, 26}}}; + } + case 16: + if (kRandomizesInserts) { + return {0.1, + 0.4, + {{0.95, 0.3}}, + {{0.95, 1}, {0.99, 2}, {0.999, 9}, {0.9999, 15}}}; + } else { + return {0.05, + 0.2, + {{0.95, 0.1}}, + {{0.95, 0}, {0.99, 1}, {0.999, 6}, {0.9999, 10}}}; + } + } + LOG(FATAL) << "Unknown Group width"; + return {}; +} + +// TODO(b/80415403): Figure out why this test is so flaky. +TEST(Table, DISABLED_EnsureNonQuadraticTopNLinearTransformByProbeSeqLength) { + ProbeStatsPerSize stats; + std::vector sizes = {Group::kWidth << 5, Group::kWidth << 10}; + for (size_t size : sizes) { + stats[size] = CollectProbeStatsOnLinearlyTransformedKeys( + CollectBadMergeKeys(size), 300); + } + auto expected = LinearTransformExpectedStats(); + for (size_t size : sizes) { + auto& stat = stats[size]; + VerifyStats(size, expected, stat); + LOG(INFO) << size << " " << stat; + } +} + +TEST(Table, EraseCollision) { + BadTable t; + + // 1 2 3 + t.emplace(1); + t.emplace(2); + t.emplace(3); + EXPECT_THAT(*t.find(1), 1); + EXPECT_THAT(*t.find(2), 2); + EXPECT_THAT(*t.find(3), 3); + EXPECT_EQ(3, t.size()); + + // 1 DELETED 3 + t.erase(t.find(2)); + EXPECT_THAT(*t.find(1), 1); + EXPECT_TRUE(t.find(2) == t.end()); + EXPECT_THAT(*t.find(3), 3); + EXPECT_EQ(2, t.size()); + + // DELETED DELETED 3 + t.erase(t.find(1)); + EXPECT_TRUE(t.find(1) == t.end()); + EXPECT_TRUE(t.find(2) == t.end()); + EXPECT_THAT(*t.find(3), 3); + EXPECT_EQ(1, t.size()); + + // DELETED DELETED DELETED + t.erase(t.find(3)); + EXPECT_TRUE(t.find(1) == t.end()); + EXPECT_TRUE(t.find(2) == t.end()); + EXPECT_TRUE(t.find(3) == t.end()); + EXPECT_EQ(0, t.size()); +} + +TEST(Table, EraseInsertProbing) { + BadTable t(100); + + // 1 2 3 4 + t.emplace(1); + t.emplace(2); + t.emplace(3); + t.emplace(4); + + // 1 DELETED 3 DELETED + t.erase(t.find(2)); + t.erase(t.find(4)); + + // 1 10 3 11 12 + t.emplace(10); + t.emplace(11); + t.emplace(12); + + EXPECT_EQ(5, t.size()); + EXPECT_THAT(t, UnorderedElementsAre(1, 10, 3, 11, 12)); +} + +TEST(Table, GrowthInfoDeletedBit) { + BadTable t; + EXPECT_TRUE( + RawHashSetTestOnlyAccess::GetCommon(t).growth_info().HasNoDeleted()); + int64_t init_count = static_cast( + CapacityToGrowth(NormalizeCapacity(Group::kWidth + 1))); + for (int64_t i = 0; i < init_count; ++i) { + t.insert(i); + } + EXPECT_TRUE( + RawHashSetTestOnlyAccess::GetCommon(t).growth_info().HasNoDeleted()); + t.erase(0); + EXPECT_EQ(RawHashSetTestOnlyAccess::CountTombstones(t), 1); + EXPECT_FALSE( + RawHashSetTestOnlyAccess::GetCommon(t).growth_info().HasNoDeleted()); + t.rehash(0); + EXPECT_EQ(RawHashSetTestOnlyAccess::CountTombstones(t), 0); + EXPECT_TRUE( + RawHashSetTestOnlyAccess::GetCommon(t).growth_info().HasNoDeleted()); +} + +TYPED_TEST(SooTest, Clear) { + TypeParam t; + EXPECT_TRUE(t.find(0) == t.end()); + t.clear(); + EXPECT_TRUE(t.find(0) == t.end()); + auto res = t.emplace(0); + EXPECT_TRUE(res.second); + EXPECT_EQ(1, t.size()); + t.clear(); + EXPECT_EQ(0, t.size()); + EXPECT_TRUE(t.find(0) == t.end()); +} + +TYPED_TEST(SooTest, Swap) { + TypeParam t; + EXPECT_TRUE(t.find(0) == t.end()); + auto res = t.emplace(0); + EXPECT_TRUE(res.second); + EXPECT_EQ(1, t.size()); + TypeParam u; + t.swap(u); + EXPECT_EQ(0, t.size()); + EXPECT_EQ(1, u.size()); + EXPECT_TRUE(t.find(0) == t.end()); + EXPECT_THAT(*u.find(0), 0); +} + +TYPED_TEST(SooTest, Rehash) { + TypeParam t; + EXPECT_TRUE(t.find(0) == t.end()); + t.emplace(0); + t.emplace(1); + EXPECT_EQ(2, t.size()); + t.rehash(128); + EXPECT_EQ(2, t.size()); + EXPECT_THAT(*t.find(0), 0); + EXPECT_THAT(*t.find(1), 1); +} + +TYPED_TEST(SooTest, RehashDoesNotRehashWhenNotNecessary) { + TypeParam t; + t.emplace(0); + t.emplace(1); + auto* p = &*t.find(0); + t.rehash(1); + EXPECT_EQ(p, &*t.find(0)); +} + +// Following two tests use non-SOO table because they test for 0 capacity. +TEST(Table, RehashZeroDoesNotAllocateOnEmptyTable) { + NonSooIntTable t; + t.rehash(0); + EXPECT_EQ(0, t.bucket_count()); +} + +TEST(Table, RehashZeroDeallocatesEmptyTable) { + NonSooIntTable t; + t.emplace(0); + t.clear(); + EXPECT_NE(0, t.bucket_count()); + t.rehash(0); + EXPECT_EQ(0, t.bucket_count()); +} + +TYPED_TEST(SooTest, RehashZeroForcesRehash) { + TypeParam t; + t.emplace(0); + t.emplace(1); + auto* p = &*t.find(0); + t.rehash(0); + EXPECT_NE(p, &*t.find(0)); +} + +TEST(Table, ConstructFromInitList) { + using P = std::pair; + struct Q { + operator P() const { return {}; } // NOLINT + }; + StringTable t = {P(), Q(), {}, {{}, {}}}; +} + +TYPED_TEST(SooTest, CopyConstruct) { + TypeParam t; + t.emplace(0); + EXPECT_EQ(1, t.size()); + { + TypeParam u(t); + EXPECT_EQ(1, u.size()); + EXPECT_THAT(*u.find(0), 0); + } + { + TypeParam u{t}; + EXPECT_EQ(1, u.size()); + EXPECT_THAT(*u.find(0), 0); + } + { + TypeParam u = t; + EXPECT_EQ(1, u.size()); + EXPECT_THAT(*u.find(0), 0); + } +} + +TYPED_TEST(SooTest, CopyDifferentSizes) { + TypeParam t; + + for (int i = 0; i < 100; ++i) { + t.emplace(i); + TypeParam c = t; + for (int j = 0; j <= i; ++j) { + ASSERT_TRUE(c.find(j) != c.end()) << "i=" << i << " j=" << j; + } + // Testing find miss to verify that table is not full. + ASSERT_TRUE(c.find(-1) == c.end()); + } +} + +TYPED_TEST(SooTest, CopyDifferentCapacities) { + for (int cap = 1; cap < 100; cap = cap * 2 + 1) { + TypeParam t; + t.reserve(static_cast(cap)); + for (int i = 0; i <= cap; ++i) { + t.emplace(i); + if (i != cap && i % 5 != 0) { + continue; + } + TypeParam c = t; + for (int j = 0; j <= i; ++j) { + ASSERT_TRUE(c.find(j) != c.end()) + << "cap=" << cap << " i=" << i << " j=" << j; + } + // Testing find miss to verify that table is not full. + ASSERT_TRUE(c.find(-1) == c.end()); + } + } +} + +TEST(Table, CopyConstructWithAlloc) { + StringTable t; + t.emplace("a", "b"); + EXPECT_EQ(1, t.size()); + StringTable u(t, Alloc>()); + EXPECT_EQ(1, u.size()); + EXPECT_THAT(*u.find("a"), Pair("a", "b")); +} + +struct ExplicitAllocIntTable + : raw_hash_set, + std::equal_to, Alloc> { + ExplicitAllocIntTable() = default; +}; + +TEST(Table, AllocWithExplicitCtor) { + ExplicitAllocIntTable t; + EXPECT_EQ(0, t.size()); +} + +TEST(Table, MoveConstruct) { + { + StringTable t; + t.emplace("a", "b"); + EXPECT_EQ(1, t.size()); + + StringTable u(std::move(t)); + EXPECT_EQ(1, u.size()); + EXPECT_THAT(*u.find("a"), Pair("a", "b")); + } + { + StringTable t; + t.emplace("a", "b"); + EXPECT_EQ(1, t.size()); + + StringTable u{std::move(t)}; + EXPECT_EQ(1, u.size()); + EXPECT_THAT(*u.find("a"), Pair("a", "b")); + } + { + StringTable t; + t.emplace("a", "b"); + EXPECT_EQ(1, t.size()); + + StringTable u = std::move(t); + EXPECT_EQ(1, u.size()); + EXPECT_THAT(*u.find("a"), Pair("a", "b")); + } +} + +TEST(Table, MoveConstructWithAlloc) { + StringTable t; + t.emplace("a", "b"); + EXPECT_EQ(1, t.size()); + StringTable u(std::move(t), Alloc>()); + EXPECT_EQ(1, u.size()); + EXPECT_THAT(*u.find("a"), Pair("a", "b")); +} + +TEST(Table, CopyAssign) { + StringTable t; + t.emplace("a", "b"); + EXPECT_EQ(1, t.size()); + StringTable u; + u = t; + EXPECT_EQ(1, u.size()); + EXPECT_THAT(*u.find("a"), Pair("a", "b")); +} + +TEST(Table, CopySelfAssign) { + StringTable t; + t.emplace("a", "b"); + EXPECT_EQ(1, t.size()); + t = *&t; + EXPECT_EQ(1, t.size()); + EXPECT_THAT(*t.find("a"), Pair("a", "b")); +} + +TEST(Table, MoveAssign) { + StringTable t; + t.emplace("a", "b"); + EXPECT_EQ(1, t.size()); + StringTable u; + u = std::move(t); + EXPECT_EQ(1, u.size()); + EXPECT_THAT(*u.find("a"), Pair("a", "b")); +} + +TEST(Table, MoveSelfAssign) { + StringTable t; + t.emplace("a", "b"); + EXPECT_EQ(1, t.size()); + t = std::move(*&t); + if (SwisstableGenerationsEnabled()) { + // NOLINTNEXTLINE(bugprone-use-after-move) + EXPECT_DEATH_IF_SUPPORTED(t.contains("a"), "self-move-assigned"); + } + // As long as we don't crash, it's fine. +} + +TEST(Table, Equality) { + StringTable t; + std::vector> v = {{"a", "b"}, + {"aa", "bb"}}; + t.insert(std::begin(v), std::end(v)); + StringTable u = t; + EXPECT_EQ(u, t); +} + +TEST(Table, Equality2) { + StringTable t; + std::vector> v1 = {{"a", "b"}, + {"aa", "bb"}}; + t.insert(std::begin(v1), std::end(v1)); + StringTable u; + std::vector> v2 = {{"a", "a"}, + {"aa", "aa"}}; + u.insert(std::begin(v2), std::end(v2)); + EXPECT_NE(u, t); +} + +TEST(Table, Equality3) { + StringTable t; + std::vector> v1 = {{"b", "b"}, + {"bb", "bb"}}; + t.insert(std::begin(v1), std::end(v1)); + StringTable u; + std::vector> v2 = {{"a", "a"}, + {"aa", "aa"}}; + u.insert(std::begin(v2), std::end(v2)); + EXPECT_NE(u, t); +} + +TYPED_TEST(SooTest, NumDeletedRegression) { + TypeParam t; + t.emplace(0); + t.erase(t.find(0)); + // construct over a deleted slot. + t.emplace(0); + t.clear(); +} + +TYPED_TEST(SooTest, FindFullDeletedRegression) { + TypeParam t; + for (int i = 0; i < 1000; ++i) { + t.emplace(i); + t.erase(t.find(i)); + } + EXPECT_EQ(0, t.size()); +} + +TYPED_TEST(SooTest, ReplacingDeletedSlotDoesNotRehash) { + // We need to disable hashtablez to avoid issues related to SOO and sampling. + SetHashtablezEnabled(false); + + size_t n; + { + // Compute n such that n is the maximum number of elements before rehash. + TypeParam t; + t.emplace(0); + size_t c = t.bucket_count(); + for (n = 1; c == t.bucket_count(); ++n) t.emplace(n); + --n; + } + TypeParam t; + t.rehash(n); + const size_t c = t.bucket_count(); + for (size_t i = 0; i != n; ++i) t.emplace(i); + EXPECT_EQ(c, t.bucket_count()) << "rehashing threshold = " << n; + t.erase(0); + t.emplace(0); + EXPECT_EQ(c, t.bucket_count()) << "rehashing threshold = " << n; +} + +TEST(Table, NoThrowMoveConstruct) { + ASSERT_TRUE( + std::is_nothrow_copy_constructible>::value); + ASSERT_TRUE(std::is_nothrow_copy_constructible< + std::equal_to>::value); + ASSERT_TRUE(std::is_nothrow_copy_constructible>::value); + EXPECT_TRUE(std::is_nothrow_move_constructible::value); +} + +TEST(Table, NoThrowMoveAssign) { + ASSERT_TRUE( + std::is_nothrow_move_assignable>::value); + ASSERT_TRUE( + std::is_nothrow_move_assignable>::value); + ASSERT_TRUE(std::is_nothrow_move_assignable>::value); + ASSERT_TRUE( + absl::allocator_traits>::is_always_equal::value); + EXPECT_TRUE(std::is_nothrow_move_assignable::value); +} + +TEST(Table, NoThrowSwappable) { + ASSERT_TRUE( + container_internal::IsNoThrowSwappable>()); + ASSERT_TRUE(container_internal::IsNoThrowSwappable< + std::equal_to>()); + ASSERT_TRUE(container_internal::IsNoThrowSwappable>()); + EXPECT_TRUE(container_internal::IsNoThrowSwappable()); +} + +TEST(Table, HeterogeneousLookup) { + struct Hash { + size_t operator()(int64_t i) const { return i; } + size_t operator()(double i) const { + ADD_FAILURE(); + return i; + } + }; + struct Eq { + bool operator()(int64_t a, int64_t b) const { return a == b; } + bool operator()(double a, int64_t b) const { + ADD_FAILURE(); + return a == b; + } + bool operator()(int64_t a, double b) const { + ADD_FAILURE(); + return a == b; + } + bool operator()(double a, double b) const { + ADD_FAILURE(); + return a == b; + } + }; + + struct THash { + using is_transparent = void; + size_t operator()(int64_t i) const { return i; } + size_t operator()(double i) const { return i; } + }; + struct TEq { + using is_transparent = void; + bool operator()(int64_t a, int64_t b) const { return a == b; } + bool operator()(double a, int64_t b) const { return a == b; } + bool operator()(int64_t a, double b) const { return a == b; } + bool operator()(double a, double b) const { return a == b; } + }; + + raw_hash_set> s{0, 1, 2}; + // It will convert to int64_t before the query. + EXPECT_EQ(1, *s.find(double{1.1})); + + raw_hash_set> ts{0, 1, 2}; + // It will try to use the double, and fail to find the object. + EXPECT_TRUE(ts.find(1.1) == ts.end()); +} + +template +using CallFind = decltype(std::declval().find(17)); + +template +using CallErase = decltype(std::declval().erase(17)); + +template +using CallExtract = decltype(std::declval().extract(17)); + +template +using CallPrefetch = decltype(std::declval().prefetch(17)); + +template +using CallCount = decltype(std::declval().count(17)); + +template

|rAO8>tq|4(r#QaH$ZZ6Y}fxhY6gjKz%^- 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 z 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