Internal change
PiperOrigin-RevId: 811418305
diff --git a/rust/cpp_kernel/BUILD b/rust/cpp_kernel/BUILD
index 16fbb46..d007309 100644
--- a/rust/cpp_kernel/BUILD
+++ b/rust/cpp_kernel/BUILD
@@ -32,6 +32,7 @@
"@abseil-cpp//absl/functional:overload",
"@abseil-cpp//absl/log:absl_check",
"@abseil-cpp//absl/log:absl_log",
+ "@abseil-cpp//absl/memory",
"@abseil-cpp//absl/strings:string_view",
],
)
diff --git a/rust/cpp_kernel/map.cc b/rust/cpp_kernel/map.cc
index 92151b9..f53c372 100644
--- a/rust/cpp_kernel/map.cc
+++ b/rust/cpp_kernel/map.cc
@@ -2,12 +2,14 @@
#include <cstddef>
#include <cstdint>
+#include <memory>
#include <string>
#include <type_traits>
#include <utility>
#include "absl/functional/overload.h"
#include "absl/log/absl_log.h"
+#include "absl/memory/memory.h"
#include "absl/strings/string_view.h"
#include "google/protobuf/message.h"
#include "google/protobuf/message_lite.h"
@@ -56,18 +58,25 @@
absl::string_view AsViewType(PtrAndLen key) { return key.AsStringView(); }
-void InitializeMessageValue(void* raw_ptr, MessageLite* msg) {
- MessageLite* new_msg = internal::RustMapHelper::PlacementNew(msg, raw_ptr);
- auto* full_msg = DynamicCastMessage<Message>(new_msg);
+constexpr bool kHasFullRuntime = true;
+void InitializeMessageValue(void* raw_ptr,
+ std::unique_ptr<MessageLite> prototype) {
+ MessageLite* new_msg =
+ internal::RustMapHelper::PlacementNew(prototype.get(), raw_ptr);
// If we are working with a full (non-lite) proto, we reflectively swap the
// value into place. Otherwise, we have to perform a copy.
- if (full_msg != nullptr) {
- full_msg->GetReflection()->Swap(full_msg, DynamicCastMessage<Message>(msg));
+ if constexpr (kHasFullRuntime) {
+ auto* full_msg = DynamicCastMessage<Message>(new_msg);
+ if (full_msg != nullptr) {
+ full_msg->GetReflection()->Swap(
+ full_msg, DynamicCastMessage<Message>(prototype.get()));
+ } else {
+ new_msg->CheckTypeAndMergeFrom(*prototype);
+ }
} else {
- new_msg->CheckTypeAndMergeFrom(*msg);
+ new_msg->CheckTypeAndMergeFrom(*prototype);
}
- delete msg;
}
template <typename Key>
@@ -90,7 +99,8 @@
delete value.s;
},
[&](MessageLite* msg) {
- InitializeMessageValue(msg, value.message);
+ InitializeMessageValue(
+ msg, absl::WrapUnique(value.message));
},
});