| // Protocol Buffers - Google's data interchange format | |
| // Copyright 2023 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 "absl/log/absl_check.h" | |
| #include "absl/strings/string_view.h" | |
| #include "google/protobuf/descriptor.h" | |
| #include "rust/cpp_kernel/serialized_data.h" | |
| #include "rust/cpp_kernel/strings.h" | |
| #include "rust/test/cpp/interop/interop_test.pb.h" | |
| using google::protobuf::rust::SerializedData; | |
| using google::protobuf::rust::SerializeMsg; | |
| using rust_cpp_interop_test::InteropTestMessage; | |
| extern "C" void MutateInteropTestMessage(InteropTestMessage* msg) { | |
| msg->set_i64(42); | |
| msg->set_bytes("something mysterious"); | |
| msg->set_b(false); | |
| } | |
| extern "C" SerializedData SerializeInteropTestMessage( | |
| const InteropTestMessage* msg) { | |
| SerializedData data; | |
| ABSL_CHECK(SerializeMsg(msg, &data)); | |
| return data; | |
| } | |
| extern "C" void DeleteInteropTestMessage(InteropTestMessage* msg) { | |
| delete msg; | |
| } | |
| extern "C" void* DeserializeInteropTestMessage(const void* data, size_t size) { | |
| auto* proto = new InteropTestMessage; | |
| ABSL_CHECK(proto->ParseFromArray(data, static_cast<int>(size))); | |
| return proto; | |
| } | |
| extern "C" void* NewWithExtension() { | |
| auto* proto = new InteropTestMessage; | |
| proto->SetExtension(rust_cpp_interop_test::bytes_extension, "smuggled"); | |
| return proto; | |
| } | |
| extern "C" google::protobuf::rust::PtrAndLen GetBytesExtension( | |
| const InteropTestMessage* proto) { | |
| absl::string_view bytes = | |
| proto->GetExtension(rust_cpp_interop_test::bytes_extension); | |
| return {bytes.data(), bytes.size()}; | |
| } | |
| extern "C" int64_t TakeOwnershipAndGetOptionalInt64(InteropTestMessage* msg) { | |
| int64_t i = msg->i64(); | |
| delete msg; | |
| return i; | |
| } | |
| extern "C" const void* GetConstStaticInteropTestMessage() { | |
| static const auto* msg = new InteropTestMessage; | |
| return msg; | |
| } | |
| extern "C" bool IsExpectedDescriptor(const google::protobuf::Descriptor* descriptor) { | |
| return descriptor == InteropTestMessage::GetDescriptor(); | |
| } |