diff options
author | Gerhard de Clercq <gerharddeclercq@outlook.com> | 2021-07-31 15:17:27 +0200 |
---|---|---|
committer | Gerhard de Clercq <gerhard.declercq@kdab.com> | 2021-08-03 07:17:20 +0200 |
commit | 31a410246a915c8e0a1b7037148348978f0be572 (patch) | |
tree | dad03e1aa6dd3dc992fb9f5987b963b426115e2f /src/cxx.cc | |
parent | c59a4022cd9dd1730a40fba25be9d03ecb8e1ead (diff) | |
download | cxx-31a410246a915c8e0a1b7037148348978f0be572.tar.gz |
Added UTF-16 rust::String initialization
This patch exposes String::from_utf16 to the C++ interface
for rust::String.
Diffstat (limited to 'src/cxx.cc')
-rw-r--r-- | src/cxx.cc | 27 |
1 files changed, 24 insertions, 3 deletions
@@ -31,8 +31,10 @@ void cxxbridge1$cxx_string$push(std::string &s, const std::uint8_t *ptr, void cxxbridge1$string$new(rust::String *self) noexcept; void cxxbridge1$string$clone(rust::String *self, const rust::String &other) noexcept; -bool cxxbridge1$string$from(rust::String *self, const char *ptr, - std::size_t len) noexcept; +bool cxxbridge1$string$from_utf8(rust::String *self, const char *ptr, + std::size_t len) noexcept; +bool cxxbridge1$string$from_utf16(rust::String *self, const char16_t *ptr, + std::size_t len) noexcept; void cxxbridge1$string$drop(rust::String *self) noexcept; const char *cxxbridge1$string$ptr(const rust::String *self) noexcept; std::size_t cxxbridge1$string$len(const rust::String *self) noexcept; @@ -81,11 +83,17 @@ String::String(String &&other) noexcept : repr(other.repr) { String::~String() noexcept { cxxbridge1$string$drop(this); } static void initString(String *self, const char *s, std::size_t len) { - if (!cxxbridge1$string$from(self, s, len)) { + if (!cxxbridge1$string$from_utf8(self, s, len)) { panic<std::invalid_argument>("data for rust::String is not utf-8"); } } +static void initString(String *self, const char16_t *s, std::size_t len) { + if (!cxxbridge1$string$from_utf16(self, s, len)) { + panic<std::invalid_argument>("data for rust::String is not utf-16"); + } +} + String::String(const std::string &s) { initString(this, s.data(), s.length()); } String::String(const char *s) { @@ -100,6 +108,19 @@ String::String(const char *s, std::size_t len) { len); } +String::String(const char16_t *s) { + assert(s != nullptr); + initString(this, s, std::char_traits<char16_t>::length(s)); +} + +String::String(const char16_t *s, std::size_t len) { + assert(s != nullptr || len == 0); + initString(this, + s == nullptr && len == 0 ? reinterpret_cast<const char16_t *>(2) + : s, + len); +} + String &String::operator=(const String &other) &noexcept { if (this != &other) { cxxbridge1$string$drop(this); |