diff options
author | David Tolnay <dtolnay@gmail.com> | 2021-08-27 13:20:35 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-27 13:20:35 -0700 |
commit | 800d98989532e519d422b94544e1421c9cb73006 (patch) | |
tree | 69dda3e26ff6e0c96715050fd6dd5917ee1402f5 /src | |
parent | 36131a0818cee5c64c36b53eeb58d2d42e75adf4 (diff) | |
parent | 8f56cbbaceb349e9d054ee5e88170a199e917d19 (diff) | |
download | cxx-800d98989532e519d422b94544e1421c9cb73006.tar.gz |
Merge pull request #924 from dtolnay/ruststringcap
Expose capacity and reserve on rust::String
Diffstat (limited to 'src')
-rw-r--r-- | src/cxx.cc | 11 | ||||
-rw-r--r-- | src/symbols/rust_string.rs | 13 |
2 files changed, 24 insertions, 0 deletions
@@ -40,8 +40,11 @@ bool cxxbridge1$string$from_utf16(rust::String *self, const char16_t *ptr, 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; +std::size_t cxxbridge1$string$capacity(const rust::String *self) noexcept; void cxxbridge1$string$reserve_additional(rust::String *self, size_t additional) noexcept; +void cxxbridge1$string$reserve_total(rust::String *self, + size_t new_cap) noexcept; // rust::Str void cxxbridge1$str$new(rust::Str *self) noexcept; @@ -165,6 +168,14 @@ const char *String::c_str() noexcept { return ptr; } +std::size_t String::capacity() const noexcept { + return cxxbridge1$string$capacity(this); +} + +void String::reserve(std::size_t new_cap) noexcept { + cxxbridge1$string$reserve_total(this, new_cap); +} + String::iterator String::begin() noexcept { return const_cast<char *>(this->data()); } diff --git a/src/symbols/rust_string.rs b/src/symbols/rust_string.rs index 202c55fc..49d40697 100644 --- a/src/symbols/rust_string.rs +++ b/src/symbols/rust_string.rs @@ -69,7 +69,20 @@ unsafe extern "C" fn string_len(this: &String) -> usize { this.len() } +#[export_name = "cxxbridge1$string$capacity"] +unsafe extern "C" fn string_capacity(this: &String) -> usize { + this.capacity() +} + #[export_name = "cxxbridge1$string$reserve_additional"] unsafe extern "C" fn string_reserve_additional(this: &mut String, additional: usize) { this.reserve(additional); } + +#[export_name = "cxxbridge1$string$reserve_total"] +unsafe extern "C" fn string_reserve_total(this: &mut String, new_cap: usize) { + if new_cap > this.capacity() { + let additional = new_cap - this.len(); + this.reserve(additional); + } +} |