| #include "rust/cpp_kernel/strings.h" | |
| #include <cstring> | |
| #include <string> | |
| #include "absl/strings/string_view.h" | |
| #include "rust/cpp_kernel/rust_alloc_for_cpp_api.h" | |
| namespace google { | |
| namespace protobuf { | |
| namespace rust { | |
| std::string PtrAndLen::CopyToString() const { | |
| return len == 0 ? "" : std::string(ptr, len); | |
| } | |
| absl::string_view PtrAndLen::AsStringView() const { | |
| return absl::string_view(len == 0 ? nullptr : ptr, len); | |
| } | |
| void PtrAndLen::PlacementNewString(void* location) { | |
| new (location) std::string(len == 0 ? nullptr : ptr, len); | |
| } | |
| RustStringRawParts::RustStringRawParts(std::string src) { | |
| if (src.empty()) { | |
| data = nullptr; | |
| len = 0; | |
| } else { | |
| void* d = proto2_rust_alloc(src.length(), 1); | |
| std::memcpy(d, src.data(), src.length()); | |
| data = static_cast<char*>(d); | |
| len = src.length(); | |
| } | |
| } | |
| } // namespace rust | |
| } // namespace protobuf | |
| } // namespace google | |
| extern "C" { | |
| std::string* proto2_rust_cpp_new_string(google::protobuf::rust::PtrAndLen src) { | |
| return new std::string(src.CopyToString()); | |
| } | |
| void proto2_rust_cpp_delete_string(std::string* str) { delete str; } | |
| google::protobuf::rust::PtrAndLen proto2_rust_cpp_string_to_view(std::string* str) { | |
| return google::protobuf::rust::PtrAndLen{str->data(), str->length()}; | |
| } | |
| } |