blob: d74081156343cfbf657e67d730f76e8cbdf48955 [file] [edit]
// Protocol Buffers - Google's data interchange format
// Copyright 2026 Google LLC. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
#include <cstddef>
#include <cstdint>
#include <string>
#include <utility>
#include "absl/log/absl_check.h"
#include "google/protobuf/extension_set.h"
#include "google/protobuf/generated_message_util.h"
#include "google/protobuf/message_lite.h"
#include "rust/cpp_kernel/strings.h"
static const google::protobuf::internal::ExtensionSet* GetExtensionSet(
const google::protobuf::MessageLite* m) {
const google::protobuf::internal::ExtensionSet* ext =
google::protobuf::internal::PrivateAccess::GetExtensionSet(m);
ABSL_DCHECK(ext != nullptr);
return ext;
}
static google::protobuf::internal::ExtensionSet* GetExtensionSet(google::protobuf::MessageLite* m) {
google::protobuf::internal::ExtensionSet* ext =
google::protobuf::internal::PrivateAccess::GetExtensionSet(m);
ABSL_DCHECK(ext != nullptr);
return ext;
}
extern "C" {
bool proto2_rust_Message_has_extension(const google::protobuf::MessageLite* m,
int32_t number) {
return GetExtensionSet(m)->Has(number);
}
void proto2_rust_Message_clear_extension(google::protobuf::MessageLite* m,
int32_t number) {
GetExtensionSet(m)->ClearExtension(number);
}
#define DEFN_EXT_PRIMITIVE(rust_type, cpp_type) \
void proto2_rust_Message_set_extension_##rust_type( \
google::protobuf::MessageLite* m, int32_t number, int32_t type, cpp_type value) { \
GetExtensionSet(m)->Set<cpp_type>(m->GetArena(), number, type, value, \
nullptr); \
} \
cpp_type proto2_rust_Message_get_extension_##rust_type( \
google::protobuf::MessageLite* m, int32_t number, cpp_type default_value) { \
return GetExtensionSet(m)->Get<cpp_type>(number, default_value); \
}
DEFN_EXT_PRIMITIVE(bool, bool)
DEFN_EXT_PRIMITIVE(float, float)
DEFN_EXT_PRIMITIVE(double, double)
DEFN_EXT_PRIMITIVE(int32, int32_t)
DEFN_EXT_PRIMITIVE(int64, int64_t)
DEFN_EXT_PRIMITIVE(uint32, uint32_t)
DEFN_EXT_PRIMITIVE(uint64, uint64_t)
#undef DEFN_EXT_PRIMITIVE
void proto2_rust_Message_set_extension_string(google::protobuf::MessageLite* m,
int32_t number, int32_t type,
std::string* value) {
GetExtensionSet(m)->Set<std::string>(m->GetArena(), number, type,
std::move(*value), nullptr);
delete value;
}
google::protobuf::rust::PtrAndLen proto2_rust_Message_get_extension_string(
google::protobuf::MessageLite* m, int32_t number,
google::protobuf::rust::PtrAndLen default_value) {
if (!proto2_rust_Message_has_extension(m, number)) {
return default_value;
}
std::string fake_default;
const std::string& value =
GetExtensionSet(m)->Get<std::string>(number, fake_default);
return google::protobuf::rust::PtrAndLen{value.data(), value.size()};
}
const google::protobuf::MessageLite* proto2_rust_Message_get_extension_message(
const google::protobuf::MessageLite* m, int32_t number,
const google::protobuf::MessageLite* default_instance) {
return &GetExtensionSet(m)->GetMessage(m->GetArena(), number,
*default_instance);
}
google::protobuf::MessageLite* proto2_rust_Message_mutable_extension_message(
google::protobuf::MessageLite* m, int32_t number, int32_t type,
const google::protobuf::MessageLite* default_instance) {
return GetExtensionSet(m)->MutableMessage(m->GetArena(), number, type,
*default_instance, nullptr);
}
} // extern "C"