diff --git a/absl/container/internal/btree.h b/absl/container/internal/btree.h index 8644255c0..fd5c0e7ab 100644 --- a/absl/container/internal/btree.h +++ b/absl/container/internal/btree.h @@ -1906,8 +1906,7 @@ inline auto btree

::insert_hint_unique(iterator position, const key_type &key, -> std::pair { if (!empty()) { if (position == end() || compare_keys(key, position.key())) { - iterator prev = position; - if (position == begin() || compare_keys((--prev).key(), key)) { + if (position == begin() || compare_keys(std::prev(position).key(), key)) { // prev.key() < key < position.key() return {internal_emplace(position, std::forward(args)...), true}; } @@ -1953,17 +1952,16 @@ 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)) { - iterator prev = position; - if (position == begin() || !compare_keys(key, (--prev).key())) { + if (position == begin() || + !compare_keys(key, std::prev(position).key())) { // prev.key() <= key <= position.key() return internal_emplace(position, std::forward(v)); } } else { - iterator next = position; - ++next; - if (next == end() || !compare_keys(next.key(), key)) { - // position.key() < key <= next.key() - return internal_emplace(next, std::forward(v)); + ++position; + if (position == end() || !compare_keys(position.key(), key)) { + // {original `position`}.key() < key < {current `position`}.key() + return internal_emplace(position, std::forward(v)); } } } diff --git a/absl/flags/internal/commandlineflag.h b/absl/flags/internal/commandlineflag.h index 6a0b5fad8..4ac50190c 100644 --- a/absl/flags/internal/commandlineflag.h +++ b/absl/flags/internal/commandlineflag.h @@ -178,9 +178,6 @@ class CommandLineFlag { public: constexpr CommandLineFlag() = default; - // Virtual destructor - virtual void Destroy() = 0; - // Not copyable/assignable. CommandLineFlag(const CommandLineFlag&) = delete; CommandLineFlag& operator=(const CommandLineFlag&) = delete; diff --git a/absl/flags/internal/flag.cc b/absl/flags/internal/flag.cc index cfc0cf4d9..ba70da91a 100644 --- a/absl/flags/internal/flag.cc +++ b/absl/flags/internal/flag.cc @@ -120,27 +120,6 @@ absl::Mutex* FlagImpl::DataGuard() const { return reinterpret_cast(&data_guard_); } -void FlagImpl::Destroy() { - { - absl::MutexLock l(DataGuard()); - - // Values are heap allocated for Abseil Flags. - if (value_.dynamic) Delete(op_, value_.dynamic); - - // Release the dynamically allocated default value if any. - if (DefaultKind() == FlagDefaultKind::kDynamicValue) { - Delete(op_, default_src_.dynamic_value); - } - - // If this flag has an assigned callback, release callback data. - if (callback_) delete callback_; - } - - absl::MutexLock l(&flag_mutex_lifetime_guard); - DataGuard()->~Mutex(); - is_data_guard_inited_ = false; -} - void FlagImpl::AssertValidType(const flags_internal::FlagOpFn op) const { // `op` is the unmarshaling operation corresponding to the declaration // visibile at the call site. `op_` is the Flag's defined unmarshalling diff --git a/absl/flags/internal/flag.h b/absl/flags/internal/flag.h index c6c4a2f7b..ef30a22f5 100644 --- a/absl/flags/internal/flag.h +++ b/absl/flags/internal/flag.h @@ -290,9 +290,6 @@ class FlagImpl { default_src_(default_value_gen), data_guard_{} {} - // Forces destruction of the Flag's data. - void Destroy(); - // Constant access methods absl::string_view Name() const; std::string Filename() const; @@ -515,8 +512,6 @@ class Flag final : public flags_internal::CommandLineFlag { private: friend class FlagState; - void Destroy() override { impl_.Destroy(); } - void Read(void* dst) const override { impl_.Read(dst); } FlagOpFn TypeId() const override { return &FlagOps; } diff --git a/absl/flags/internal/registry.cc b/absl/flags/internal/registry.cc index 7889b1f34..2ef16e848 100644 --- a/absl/flags/internal/registry.cc +++ b/absl/flags/internal/registry.cc @@ -57,11 +57,7 @@ namespace flags_internal { class FlagRegistry { public: FlagRegistry() = default; - ~FlagRegistry() { - for (auto& p : flags_) { - p.second->Destroy(); - } - } + ~FlagRegistry() = default; // Store a flag in this registry. Takes ownership of *flag. void RegisterFlag(CommandLineFlag* flag); @@ -113,6 +109,7 @@ class FlagRegistryLock { FlagRegistry* const fr_; }; +void DestroyRetiredFlag(CommandLineFlag* flag); } // namespace void FlagRegistry::RegisterFlag(CommandLineFlag* flag) { @@ -140,8 +137,8 @@ void FlagRegistry::RegisterFlag(CommandLineFlag* flag) { flag->Typename(), "', respectively."), true); } else if (old_flag->IsRetired()) { - // Retired definitions are idempotent. Just keep the old one. - flag->Destroy(); + // Retired flag can just be deleted. + DestroyRetiredFlag(flag); return; } else if (old_flag->Filename() != flag->Filename()) { flags_internal::ReportUsageError( @@ -291,11 +288,6 @@ class RetiredFlagObj final : public flags_internal::CommandLineFlag { : name_(name), op_(ops) {} private: - void Destroy() override { - // Values are heap allocated for Retired Flags. - delete this; - } - absl::string_view Name() const override { return name_; } std::string Filename() const override { return "RETIRED"; } absl::string_view Typename() const override { return ""; } @@ -328,6 +320,11 @@ class RetiredFlagObj final : public flags_internal::CommandLineFlag { const FlagOpFn op_; }; +void DestroyRetiredFlag(flags_internal::CommandLineFlag* flag) { + assert(flag->IsRetired()); + delete static_cast(flag); +} + } // namespace bool Retire(const char* name, FlagOpFn ops) { diff --git a/absl/strings/string_view.h b/absl/strings/string_view.h index 418dbc809..1861ea62a 100644 --- a/absl/strings/string_view.h +++ b/absl/strings/string_view.h @@ -398,12 +398,11 @@ class string_view { // on the respective sizes of the two `string_view`s to determine which is // smaller, equal, or greater. constexpr int compare(string_view x) const noexcept { - return CompareImpl( - length_, x.length_, - length_ == 0 || x.length_ == 0 - ? 0 - : ABSL_INTERNAL_STRING_VIEW_MEMCMP( - ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_)); + return CompareImpl(length_, x.length_, + Min(length_, x.length_) == 0 + ? 0 + : ABSL_INTERNAL_STRING_VIEW_MEMCMP( + ptr_, x.ptr_, Min(length_, x.length_))); } // Overload of `string_view::compare()` for comparing a substring of the @@ -541,12 +540,15 @@ class string_view { #endif } + static constexpr size_t Min(size_type length_a, size_type length_b) { + return length_a < length_b ? length_a : length_b; + } + static constexpr int CompareImpl(size_type length_a, size_type length_b, int compare_result) { return compare_result == 0 ? static_cast(length_a > length_b) - static_cast(length_a < length_b) - : static_cast(compare_result > 0) - - static_cast(compare_result < 0); + : (compare_result < 0 ? -1 : 1); } const char* ptr_;