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_;