Use transparent lookups in ExtensionRegistry in order to avoid initializing all the fields in the lookup key in FindRegisteredExtension.

PiperOrigin-RevId: 663037843
pull/17805/head
Evan Brown 8 months ago committed by Copybara-Service
parent f355d99f75
commit a60097abfc
  1. 18
      src/google/protobuf/extension_set.cc

@ -52,16 +52,32 @@ inline WireFormatLite::CppType cpp_type(FieldType type) {
// Registry stuff.
struct ExtensionInfoKey {
const MessageLite* message;
int number;
};
struct ExtensionEq {
using is_transparent = void;
bool operator()(const ExtensionInfo& lhs, const ExtensionInfo& rhs) const {
return lhs.message == rhs.message && lhs.number == rhs.number;
}
bool operator()(const ExtensionInfo& lhs, const ExtensionInfoKey& rhs) const {
return lhs.message == rhs.message && lhs.number == rhs.number;
}
bool operator()(const ExtensionInfoKey& lhs, const ExtensionInfo& rhs) const {
return lhs.message == rhs.message && lhs.number == rhs.number;
}
};
struct ExtensionHasher {
using is_transparent = void;
std::size_t operator()(const ExtensionInfo& info) const {
return absl::HashOf(info.message, info.number);
}
std::size_t operator()(const ExtensionInfoKey& info) const {
return absl::HashOf(info.message, info.number);
}
};
using ExtensionRegistry =
@ -85,7 +101,7 @@ const ExtensionInfo* FindRegisteredExtension(const MessageLite* extendee,
int number) {
if (!global_registry) return nullptr;
ExtensionInfo info;
ExtensionInfoKey info;
info.message = extendee;
info.number = number;

Loading…
Cancel
Save