// Protocol Buffers - Google's data interchange format // Copyright 2024 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 #ifndef GOOGLE_PROTOBUF_RUST_CPP_KERNEL_STRINGS_H__ #define GOOGLE_PROTOBUF_RUST_CPP_KERNEL_STRINGS_H__ #include #include #include namespace google { namespace protobuf { namespace rust { // Represents an ABI-stable version of &[u8]/string_view (borrowed slice of // bytes) for FFI use only. struct PtrAndLen { /// Borrows the memory. const char* ptr; size_t len; PtrAndLen(const char* ptr, size_t len) : ptr(ptr), len(len) {} }; // Represents an owned string for FFI purposes. // // This must only be used to transfer a string from C++ to Rust. The // below invariants must hold: // * Rust and C++ versions of this struct are ABI compatible. // * The data were allocated using the Rust allocator and are 1 byte aligned. // * The data is valid UTF-8. struct RustStringRawParts { // Owns the memory. const char* data; size_t len; RustStringRawParts() = delete; // Copies src. explicit RustStringRawParts(std::string src); }; } // namespace rust } // namespace protobuf } // namespace google extern "C" { // Allocates a new std::string on the C++ heap and returns a pointer to it. std::string* proto2_rust_cpp_new_string(google::protobuf::rust::PtrAndLen src); // Deletes a std::string object from the C++ heap. void proto2_rust_cpp_delete_string(std::string* str); // Obtain a PtrAndLen, the FFI-safe view type, from a std::string. google::protobuf::rust::PtrAndLen proto2_rust_cpp_string_to_view(std::string* str); } #endif // GOOGLE_PROTOBUF_RUST_CPP_KERNEL_STRINGS_H__