// 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<int32_t> 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<int32_t> may use much less memory per
// stored value. For the random insertion benchmark in btree_bench.cc, a
// btree_set<int32_t> 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 <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <functional>
#include <iterator>
#include <limits>
#include <new>
#include <string>
#include <type_traits>
#include <utility>
#include "absl/base/internal/raw_logging.h"
#include "absl/base/macros.h"
#include "absl/container/internal/common.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"
#include "absl/utility/utility.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_MEMORY_SANITIZER)
// 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
template <typename Compare, typename T, typename U>
using compare_result_t = absl::result_of_t<const Compare(const T &, const U &)>;
// A helper class that indicates if the Compare parameter is a key-compare-to
// comparator.
template <typename Compare, typename T>
using btree_is_key_compare_to =
std::is_convertible<compare_result_t<Compare, T, T>, absl::weak_ordering>;
struct StringBtreeDefaultLess {
using is_transparent = void;
StringBtreeDefaultLess() = default;
// Compatibility constructor.
StringBtreeDefaultLess(std::less<std::string>) {} // NOLINT
StringBtreeDefaultLess(std::less<absl::string_view>) {} // NOLINT
// Allow converting to std::less for use in key_comp()/value_comp().
explicit operator std::less<std::string>() const { return {}; }
explicit operator std::less<absl::string_view>() const { return {}; }
explicit operator std::less<absl::Cord>() 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<absl::Cord>) {} // 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<std::string>) {} // NOLINT
StringBtreeDefaultGreater(std::greater<absl::string_view>) {} // NOLINT
// Allow converting to std::greater for use in key_comp()/value_comp().
explicit operator std::greater<std::string>() const { return {}; }
explicit operator std::greater<absl::string_view>() const { return {}; }
explicit operator std::greater<absl::Cord>() 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<absl::Cord>) {} // 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 <typename Compare, bool is_class = std::is_class<Compare>::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 <typename Compare>
struct checked_compare_base<Compare, false> {
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<std::string>, greater<std::string>, less<string_view>,
// greater<string_view>, less<absl::Cord>, and greater<absl::Cord>.
// (2) Adapt the comparat
没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
收起资源包目录
Abseil在linux上编译的静态库(c++17) (520个子文件)
libabsl_time_zone.a 1.01MB
libabsl_str_format_internal.a 720KB
libabsl_flags_parse.a 622KB
libabsl_flags_reflection.a 584KB
libabsl_strings.a 522KB
libabsl_cord.a 480KB
libabsl_flags_usage_internal.a 474KB
libabsl_time.a 461KB
libabsl_cord_internal.a 444KB
libabsl_status.a 327KB
libabsl_flags_marshalling.a 265KB
libabsl_synchronization.a 223KB
libabsl_flags_internal.a 211KB
libabsl_flags_config.a 124KB
libabsl_random_distributions.a 102KB
libabsl_cordz_handle.a 93KB
libabsl_cordz_info.a 90KB
libabsl_base.a 73KB
libabsl_graphcycles_internal.a 68KB
libabsl_random_internal_pool_urbg.a 63KB
libabsl_random_internal_distribution_test_util.a 58KB
libabsl_symbolize.a 56KB
libabsl_statusor.a 55KB
libabsl_demangle_internal.a 49KB
libabsl_random_seed_sequences.a 49KB
libabsl_hashtablez_sampler.a 46KB
libabsl_int128.a 45KB
libabsl_malloc_internal.a 38KB
libabsl_debugging_internal.a 34KB
libabsl_civil_time.a 32KB
libabsl_raw_logging_internal.a 29KB
libabsl_flags_program_name.a 27KB
libabsl_throw_delegate.a 26KB
libabsl_flags_usage.a 25KB
libabsl_raw_hash_set.a 23KB
libabsl_random_internal_seed_material.a 22KB
libabsl_strings_internal.a 21KB
libabsl_strerror.a 20KB
libabsl_city.a 18KB
libabsl_random_internal_randen_slow.a 15KB
libabsl_scoped_set_env.a 14KB
libabsl_failure_signal_handler.a 14KB
libabsl_hash.a 12KB
libabsl_stacktrace.a 10KB
libabsl_random_internal_randen_hwaes_impl.a 9KB
libabsl_low_level_hash.a 9KB
libabsl_examine_stack.a 8KB
libabsl_random_seed_gen_exception.a 7KB
libabsl_spinlock_wait.a 7KB
libabsl_random_internal_platform.a 6KB
libabsl_cordz_functions.a 6KB
libabsl_periodic_sampler.a 5KB
libabsl_cordz_sample_token.a 5KB
libabsl_exponential_biased.a 5KB
libabsl_flags_private_handle_accessor.a 4KB
libabsl_log_severity.a 4KB
libabsl_flags_commandlineflag.a 4KB
libabsl_random_internal_randen.a 4KB
libabsl_flags_commandlineflag_internal.a 4KB
libabsl_leak_check.a 3KB
libabsl_random_internal_randen_hwaes.a 2KB
libabsl_flags.a 2KB
libabsl_bad_optional_access.a 1KB
libabsl_bad_variant_access.a 1KB
libabsl_bad_any_cast_impl.a 1KB
abslTargets.cmake 51KB
abslTargets-noconfig.cmake 33KB
abslConfigVersion.cmake 2KB
abslConfig.cmake 1KB
btree.h 105KB
raw_hash_set.h 90KB
container.h 76KB
time.h 60KB
cord.h 59KB
conformance_testing.h 58KB
variant.h 55KB
hash.h 49KB
conformance_archetype.h 44KB
mutex.h 43KB
cord_rep_btree.h 39KB
conformance_profile.h 39KB
int128.h 38KB
exception_safety_testing.h 37KB
any_invocable.h 37KB
config.h 35KB
status.h 34KB
substitute.h 33KB
variant.h 33KB
inlined_vector.h 32KB
str_format.h 32KB
inlined_vector.h 32KB
type_traits.h 31KB
btree_map.h 31KB
attributes.h 30KB
optional.h 28KB
flag.h 28KB
btree_set.h 27KB
statusor.h 27KB
btree_container.h 27KB
string_view.h 27KB
共 520 条
- 1
- 2
- 3
- 4
- 5
- 6
xiaobaiPlayGame
- 粉丝: 1401
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0