aboutsummaryrefslogtreecommitdiff
path: root/src/cxx.cc
diff options
context:
space:
mode:
authorGerhard de Clercq <gerharddeclercq@outlook.com>2021-07-31 15:17:27 +0200
committerGerhard de Clercq <gerhard.declercq@kdab.com>2021-08-03 07:17:20 +0200
commit31a410246a915c8e0a1b7037148348978f0be572 (patch)
treedad03e1aa6dd3dc992fb9f5987b963b426115e2f /src/cxx.cc
parentc59a4022cd9dd1730a40fba25be9d03ecb8e1ead (diff)
downloadcxx-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.cc27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/cxx.cc b/src/cxx.cc
index ecfc1c69..4080ad66 100644
--- a/src/cxx.cc
+++ b/src/cxx.cc
@@ -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);