blob: 923b6412d2fbeee71fdd0ae4fb938bcc8fba19c7 [file] [log] [blame]
David Tolnay736cbca2020-03-11 16:49:18 -07001#include "../include/cxx.h"
David Tolnay54b13222020-10-30 20:58:32 -07002#include <cassert>
David Tolnay7db73692019-10-20 14:51:12 -04003#include <cstring>
David Tolnay71918ec2020-04-11 21:52:09 -07004#include <exception>
David Tolnay001102a2020-03-01 20:05:04 -08005#include <iostream>
David Tolnay7db73692019-10-20 14:51:12 -04006#include <memory>
7#include <stdexcept>
David Tolnay9ed15c62020-10-31 18:02:03 -07008#include <type_traits>
David Tolnay37dd7e12020-04-25 12:51:59 -07009#include <vector>
David Tolnay7db73692019-10-20 14:51:12 -040010
David Tolnay7db73692019-10-20 14:51:12 -040011extern "C" {
David Tolnay0f0162f2020-11-16 23:43:37 -080012void cxxbridge1$cxx_string$init(std::string *s, const uint8_t *ptr,
13 size_t len) noexcept {
David Tolnaybb3ff5d2020-11-15 19:45:11 -080014 new (s) std::string(reinterpret_cast<const char *>(ptr), len);
15}
16
David Tolnay0f0162f2020-11-16 23:43:37 -080017void cxxbridge1$cxx_string$destroy(std::string *s) noexcept {
David Tolnaybb3ff5d2020-11-15 19:45:11 -080018 using std::string;
19 s->~string();
20}
21
David Tolnay0f0162f2020-11-16 23:43:37 -080022const char *cxxbridge1$cxx_string$data(const std::string &s) noexcept {
David Tolnay7db73692019-10-20 14:51:12 -040023 return s.data();
24}
25
David Tolnay0f0162f2020-11-16 23:43:37 -080026size_t cxxbridge1$cxx_string$length(const std::string &s) noexcept {
David Tolnay7db73692019-10-20 14:51:12 -040027 return s.length();
28}
29
David Tolnay0f0162f2020-11-16 23:43:37 -080030void cxxbridge1$cxx_string$push(std::string &s, const uint8_t *ptr,
31 size_t len) noexcept {
David Tolnay90691f42020-11-14 20:01:46 -080032 s.append(reinterpret_cast<const char *>(ptr), len);
33}
34
David Tolnay750755e2020-03-01 13:04:08 -080035// rust::String
David Tolnay0f0162f2020-11-16 23:43:37 -080036void cxxbridge1$string$new(rust::String *self) noexcept;
37void cxxbridge1$string$clone(rust::String *self,
38 const rust::String &other) noexcept;
39bool cxxbridge1$string$from(rust::String *self, const char *ptr,
40 size_t len) noexcept;
41void cxxbridge1$string$drop(rust::String *self) noexcept;
42const char *cxxbridge1$string$ptr(const rust::String *self) noexcept;
43size_t cxxbridge1$string$len(const rust::String *self) noexcept;
David Tolnay7db73692019-10-20 14:51:12 -040044
David Tolnay750755e2020-03-01 13:04:08 -080045// rust::Str
David Tolnay0f0162f2020-11-16 23:43:37 -080046bool cxxbridge1$str$valid(const char *ptr, size_t len) noexcept;
David Tolnay7db73692019-10-20 14:51:12 -040047} // extern "C"
48
David Tolnay750755e2020-03-01 13:04:08 -080049namespace rust {
David Tolnay0f0162f2020-11-16 23:43:37 -080050inline namespace cxxbridge1 {
David Tolnay7db73692019-10-20 14:51:12 -040051
David Tolnay521d99d2020-08-26 20:45:40 -070052template <typename Exception>
53void panic [[noreturn]] (const char *msg) {
54#if defined(RUST_CXX_NO_EXCEPTIONS)
55 std::cerr << "Error: " << msg << ". Aborting." << std::endl;
56 std::terminate();
57#else
58 throw Exception(msg);
59#endif
60}
61
David Tolnayb10c4bc2020-08-26 21:55:29 -070062template void panic<std::out_of_range>[[noreturn]] (const char *msg);
David Tolnay521d99d2020-08-26 20:45:40 -070063
David Tolnay0f0162f2020-11-16 23:43:37 -080064String::String() noexcept { cxxbridge1$string$new(this); }
David Tolnay7db73692019-10-20 14:51:12 -040065
David Tolnay56082162020-03-01 12:57:33 -080066String::String(const String &other) noexcept {
David Tolnay0f0162f2020-11-16 23:43:37 -080067 cxxbridge1$string$clone(this, other);
David Tolnay7db73692019-10-20 14:51:12 -040068}
69
David Tolnay15671862020-11-23 18:13:56 -080070String::String(String &&other) noexcept : repr(other.repr) {
David Tolnay0f0162f2020-11-16 23:43:37 -080071 cxxbridge1$string$new(&other);
David Tolnay7db73692019-10-20 14:51:12 -040072}
73
David Tolnay0f0162f2020-11-16 23:43:37 -080074String::~String() noexcept { cxxbridge1$string$drop(this); }
David Tolnay7db73692019-10-20 14:51:12 -040075
David Tolnay032d8532020-10-30 20:47:31 -070076static void initString(String *self, const char *s, size_t len) {
David Tolnay0f0162f2020-11-16 23:43:37 -080077 if (!cxxbridge1$string$from(self, s, len)) {
David Tolnay8d323662020-10-30 19:32:26 -070078 panic<std::invalid_argument>("data for rust::String is not utf-8");
79 }
80}
David Tolnay7db73692019-10-20 14:51:12 -040081
David Tolnay032d8532020-10-30 20:47:31 -070082String::String(const std::string &s) { initString(this, s.data(), s.length()); }
83
David Tolnay54b13222020-10-30 20:58:32 -070084String::String(const char *s) {
85 assert(s != nullptr);
86 initString(this, s, std::strlen(s));
87}
David Tolnayc2bbd952020-07-29 18:15:26 -070088
89String::String(const char *s, size_t len) {
David Tolnay54b13222020-10-30 20:58:32 -070090 assert(s != nullptr || len == 0);
David Tolnay032d8532020-10-30 20:47:31 -070091 initString(this,
92 s == nullptr && len == 0 ? reinterpret_cast<const char *>(1) : s,
93 len);
David Tolnay7db73692019-10-20 14:51:12 -040094}
95
David Tolnay56082162020-03-01 12:57:33 -080096String &String::operator=(const String &other) noexcept {
David Tolnay7db73692019-10-20 14:51:12 -040097 if (this != &other) {
David Tolnay0f0162f2020-11-16 23:43:37 -080098 cxxbridge1$string$drop(this);
99 cxxbridge1$string$clone(this, other);
David Tolnay7db73692019-10-20 14:51:12 -0400100 }
101 return *this;
102}
103
David Tolnay56082162020-03-01 12:57:33 -0800104String &String::operator=(String &&other) noexcept {
David Tolnay7db73692019-10-20 14:51:12 -0400105 if (this != &other) {
David Tolnay0f0162f2020-11-16 23:43:37 -0800106 cxxbridge1$string$drop(this);
David Tolnay7db73692019-10-20 14:51:12 -0400107 this->repr = other.repr;
David Tolnay0f0162f2020-11-16 23:43:37 -0800108 cxxbridge1$string$new(&other);
David Tolnay7db73692019-10-20 14:51:12 -0400109 }
110 return *this;
111}
112
David Tolnayd9c4ac92020-03-01 20:33:58 -0800113String::operator std::string() const {
114 return std::string(this->data(), this->size());
115}
116
David Tolnay56082162020-03-01 12:57:33 -0800117const char *String::data() const noexcept {
David Tolnay0f0162f2020-11-16 23:43:37 -0800118 return cxxbridge1$string$ptr(this);
David Tolnay7db73692019-10-20 14:51:12 -0400119}
120
David Tolnay0f0162f2020-11-16 23:43:37 -0800121size_t String::size() const noexcept { return cxxbridge1$string$len(this); }
David Tolnay7db73692019-10-20 14:51:12 -0400122
David Tolnay0f0162f2020-11-16 23:43:37 -0800123size_t String::length() const noexcept { return cxxbridge1$string$len(this); }
David Tolnay7db73692019-10-20 14:51:12 -0400124
David Tolnayd1e2efc2020-03-03 22:25:43 -0800125String::String(unsafe_bitcopy_t, const String &bits) noexcept
126 : repr(bits.repr) {}
127
David Tolnay56082162020-03-01 12:57:33 -0800128std::ostream &operator<<(std::ostream &os, const String &s) {
David Tolnay7db73692019-10-20 14:51:12 -0400129 os.write(s.data(), s.size());
130 return os;
131}
132
David Tolnay5df1f062020-10-31 12:31:10 -0700133Str::Str() noexcept : ptr(reinterpret_cast<const char *>(1)), len(0) {}
David Tolnay7db73692019-10-20 14:51:12 -0400134
David Tolnay5df1f062020-10-31 12:31:10 -0700135static void initStr(const char *ptr, size_t len) {
David Tolnay0f0162f2020-11-16 23:43:37 -0800136 if (!cxxbridge1$str$valid(ptr, len)) {
David Tolnay8d323662020-10-30 19:32:26 -0700137 panic<std::invalid_argument>("data for rust::Str is not utf-8");
138 }
139}
David Tolnay7db73692019-10-20 14:51:12 -0400140
David Tolnay5df1f062020-10-31 12:31:10 -0700141Str::Str(const std::string &s) : ptr(s.data()), len(s.length()) {
142 initStr(this->ptr, this->len);
David Tolnay8d323662020-10-30 19:32:26 -0700143}
David Tolnay894c5e42020-07-29 18:20:00 -0700144
David Tolnay5df1f062020-10-31 12:31:10 -0700145Str::Str(const char *s) : ptr(s), len(std::strlen(s)) {
David Tolnay54b13222020-10-30 20:58:32 -0700146 assert(s != nullptr);
David Tolnay5df1f062020-10-31 12:31:10 -0700147 initStr(this->ptr, this->len);
David Tolnay54b13222020-10-30 20:58:32 -0700148}
David Tolnay032d8532020-10-30 20:47:31 -0700149
David Tolnay8d323662020-10-30 19:32:26 -0700150Str::Str(const char *s, size_t len)
David Tolnay5df1f062020-10-31 12:31:10 -0700151 : ptr(s == nullptr && len == 0 ? reinterpret_cast<const char *>(1) : s),
152 len(len) {
David Tolnay54b13222020-10-30 20:58:32 -0700153 assert(s != nullptr || len == 0);
David Tolnay5df1f062020-10-31 12:31:10 -0700154 initStr(this->ptr, this->len);
David Tolnayd9c4ac92020-03-01 20:33:58 -0800155}
David Tolnay7db73692019-10-20 14:51:12 -0400156
David Tolnay09dbe752020-03-01 13:00:40 -0800157Str::operator std::string() const {
David Tolnay7db73692019-10-20 14:51:12 -0400158 return std::string(this->data(), this->size());
159}
160
David Tolnay09dbe752020-03-01 13:00:40 -0800161std::ostream &operator<<(std::ostream &os, const Str &s) {
David Tolnay7db73692019-10-20 14:51:12 -0400162 os.write(s.data(), s.size());
163 return os;
164}
165
David Tolnay9ed15c62020-10-31 18:02:03 -0700166static_assert(std::is_trivially_copy_constructible<Str>::value,
167 "trivial Str(const Str &)");
168static_assert(std::is_trivially_copy_assignable<Str>::value,
169 "trivial operator=(const Str &)");
170static_assert(std::is_trivially_destructible<Str>::value, "trivial ~Str()");
171
David Tolnay40921912020-11-23 20:44:48 -0800172static_assert(std::is_trivially_copy_constructible<Slice<const uint8_t>>::value,
173 "trivial Slice(const Slice &)");
174static_assert(std::is_trivially_move_constructible<Slice<const uint8_t>>::value,
175 "trivial Slice(Slice &&)");
176static_assert(std::is_trivially_copy_assignable<Slice<const uint8_t>>::value,
177 "trivial Slice::operator=(const Slice &) for const slices");
178static_assert(std::is_trivially_move_assignable<Slice<const uint8_t>>::value,
179 "trivial Slice::operator=(Slice &&)");
180static_assert(std::is_trivially_destructible<Slice<const uint8_t>>::value,
181 "trivial ~Slice()");
182
David Tolnay1e548172020-03-16 13:37:09 -0700183extern "C" {
David Tolnay0f0162f2020-11-16 23:43:37 -0800184const char *cxxbridge1$error(const char *ptr, size_t len) {
David Tolnay1e548172020-03-16 13:37:09 -0700185 char *copy = new char[len];
David Tolnay504cf3c2020-10-31 16:08:04 -0700186 std::strncpy(copy, ptr, len);
David Tolnay1e548172020-03-16 13:37:09 -0700187 return copy;
188}
189} // extern "C"
190
David Tolnayd5712ee2020-10-31 17:10:00 -0700191Error::Error(const Error &other)
David Tolnay0f0162f2020-11-16 23:43:37 -0800192 : std::exception(other), msg(cxxbridge1$error(other.msg, other.len)),
David Tolnay23c23192020-10-31 17:11:48 -0700193 len(other.len) {}
David Tolnay1e548172020-03-16 13:37:09 -0700194
David Tolnay23c23192020-10-31 17:11:48 -0700195Error::Error(Error &&other) noexcept
196 : std::exception(std::move(other)), msg(other.msg), len(other.len) {
David Tolnaya0c9bc72020-10-31 14:37:14 -0700197 other.msg = nullptr;
198 other.len = 0;
David Tolnay1e548172020-03-16 13:37:09 -0700199}
200
David Tolnaya0c9bc72020-10-31 14:37:14 -0700201Error::~Error() noexcept { delete[] this->msg; }
David Tolnay1e548172020-03-16 13:37:09 -0700202
David Tolnay7c6ac712020-10-31 17:22:28 -0700203Error &Error::operator=(const Error &other) {
204 if (this != &other) {
205 std::exception::operator=(other);
206 delete[] this->msg;
207 this->msg = nullptr;
David Tolnay0f0162f2020-11-16 23:43:37 -0800208 this->msg = cxxbridge1$error(other.msg, other.len);
David Tolnay7c6ac712020-10-31 17:22:28 -0700209 this->len = other.len;
210 }
211 return *this;
212}
213
David Tolnay15491062020-10-31 17:25:13 -0700214Error &Error::operator=(Error &&other) noexcept {
215 if (this != &other) {
216 std::exception::operator=(std::move(other));
217 this->msg = other.msg;
218 this->len = other.len;
219 other.msg = nullptr;
220 other.len = 0;
221 }
222 return *this;
223}
224
David Tolnaya0c9bc72020-10-31 14:37:14 -0700225const char *Error::what() const noexcept { return this->msg; }
David Tolnay1e548172020-03-16 13:37:09 -0700226
David Tolnay0f0162f2020-11-16 23:43:37 -0800227} // namespace cxxbridge1
David Tolnay750755e2020-03-01 13:04:08 -0800228} // namespace rust
David Tolnay7db73692019-10-20 14:51:12 -0400229
230extern "C" {
David Tolnay0f0162f2020-11-16 23:43:37 -0800231void cxxbridge1$unique_ptr$std$string$null(
David Tolnay7db73692019-10-20 14:51:12 -0400232 std::unique_ptr<std::string> *ptr) noexcept {
233 new (ptr) std::unique_ptr<std::string>();
234}
David Tolnay0f0162f2020-11-16 23:43:37 -0800235void cxxbridge1$unique_ptr$std$string$raw(std::unique_ptr<std::string> *ptr,
236 std::string *raw) noexcept {
David Tolnay7db73692019-10-20 14:51:12 -0400237 new (ptr) std::unique_ptr<std::string>(raw);
238}
David Tolnay0f0162f2020-11-16 23:43:37 -0800239const std::string *cxxbridge1$unique_ptr$std$string$get(
David Tolnay7db73692019-10-20 14:51:12 -0400240 const std::unique_ptr<std::string> &ptr) noexcept {
241 return ptr.get();
242}
David Tolnay0f0162f2020-11-16 23:43:37 -0800243std::string *cxxbridge1$unique_ptr$std$string$release(
David Tolnay7db73692019-10-20 14:51:12 -0400244 std::unique_ptr<std::string> &ptr) noexcept {
245 return ptr.release();
246}
David Tolnay0f0162f2020-11-16 23:43:37 -0800247void cxxbridge1$unique_ptr$std$string$drop(
David Tolnay7db73692019-10-20 14:51:12 -0400248 std::unique_ptr<std::string> *ptr) noexcept {
249 ptr->~unique_ptr();
250}
251} // extern "C"
Myron Ahneba35cf2020-02-05 19:41:51 +0700252
David Tolnay06677b32020-11-23 18:05:45 -0800253namespace {
254const size_t kMaxExpectedWordsInString = 8;
David Tolnaybb3ff5d2020-11-15 19:45:11 -0800255static_assert(alignof(std::string) <= alignof(void *),
256 "unexpectedly large std::string alignment");
David Tolnay06677b32020-11-23 18:05:45 -0800257static_assert(sizeof(std::string) <= kMaxExpectedWordsInString * sizeof(void *),
David Tolnaybb3ff5d2020-11-15 19:45:11 -0800258 "unexpectedly large std::string size");
David Tolnayc26de542020-11-23 18:18:19 -0800259} // namespace
David Tolnaybb3ff5d2020-11-15 19:45:11 -0800260
David Tolnay37dd7e12020-04-25 12:51:59 -0700261#define STD_VECTOR_OPS(RUST_TYPE, CXX_TYPE) \
David Tolnay0f0162f2020-11-16 23:43:37 -0800262 size_t cxxbridge1$std$vector$##RUST_TYPE##$size( \
David Tolnay37dd7e12020-04-25 12:51:59 -0700263 const std::vector<CXX_TYPE> &s) noexcept { \
264 return s.size(); \
265 } \
David Tolnay0f0162f2020-11-16 23:43:37 -0800266 const CXX_TYPE *cxxbridge1$std$vector$##RUST_TYPE##$get_unchecked( \
David Tolnay37dd7e12020-04-25 12:51:59 -0700267 const std::vector<CXX_TYPE> &s, size_t pos) noexcept { \
David Tolnay9626d082020-04-24 14:52:45 -0700268 return &s[pos]; \
David Tolnay37dd7e12020-04-25 12:51:59 -0700269 } \
David Tolnay0f0162f2020-11-16 23:43:37 -0800270 void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$null( \
David Tolnay996db1e2020-04-24 14:46:31 -0700271 std::unique_ptr<std::vector<CXX_TYPE>> *ptr) noexcept { \
272 new (ptr) std::unique_ptr<std::vector<CXX_TYPE>>(); \
David Tolnay37dd7e12020-04-25 12:51:59 -0700273 } \
David Tolnay0f0162f2020-11-16 23:43:37 -0800274 void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$raw( \
David Tolnay996db1e2020-04-24 14:46:31 -0700275 std::unique_ptr<std::vector<CXX_TYPE>> *ptr, \
David Tolnay37dd7e12020-04-25 12:51:59 -0700276 std::vector<CXX_TYPE> *raw) noexcept { \
David Tolnay996db1e2020-04-24 14:46:31 -0700277 new (ptr) std::unique_ptr<std::vector<CXX_TYPE>>(raw); \
David Tolnay37dd7e12020-04-25 12:51:59 -0700278 } \
David Tolnay4e7e7c42020-04-24 14:48:07 -0700279 const std::vector<CXX_TYPE> \
David Tolnay0f0162f2020-11-16 23:43:37 -0800280 *cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$get( \
David Tolnay996db1e2020-04-24 14:46:31 -0700281 const std::unique_ptr<std::vector<CXX_TYPE>> &ptr) noexcept { \
David Tolnay37dd7e12020-04-25 12:51:59 -0700282 return ptr.get(); \
283 } \
David Tolnay4e7e7c42020-04-24 14:48:07 -0700284 std::vector<CXX_TYPE> \
David Tolnay0f0162f2020-11-16 23:43:37 -0800285 *cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$release( \
David Tolnay996db1e2020-04-24 14:46:31 -0700286 std::unique_ptr<std::vector<CXX_TYPE>> &ptr) noexcept { \
David Tolnay37dd7e12020-04-25 12:51:59 -0700287 return ptr.release(); \
288 } \
David Tolnay0f0162f2020-11-16 23:43:37 -0800289 void cxxbridge1$unique_ptr$std$vector$##RUST_TYPE##$drop( \
David Tolnay996db1e2020-04-24 14:46:31 -0700290 std::unique_ptr<std::vector<CXX_TYPE>> *ptr) noexcept { \
David Tolnay37dd7e12020-04-25 12:51:59 -0700291 ptr->~unique_ptr(); \
David Tolnay4e7e7c42020-04-24 14:48:07 -0700292 }
Myron Ahneba35cf2020-02-05 19:41:51 +0700293
David Tolnay6787be62020-04-25 11:01:02 -0700294#define RUST_VEC_EXTERNS(RUST_TYPE, CXX_TYPE) \
David Tolnay0f0162f2020-11-16 23:43:37 -0800295 void cxxbridge1$rust_vec$##RUST_TYPE##$new( \
David Tolnayf97c2d52020-04-25 16:37:48 -0700296 rust::Vec<CXX_TYPE> *ptr) noexcept; \
David Tolnay0f0162f2020-11-16 23:43:37 -0800297 void cxxbridge1$rust_vec$##RUST_TYPE##$drop( \
David Tolnay6787be62020-04-25 11:01:02 -0700298 rust::Vec<CXX_TYPE> *ptr) noexcept; \
David Tolnay0f0162f2020-11-16 23:43:37 -0800299 size_t cxxbridge1$rust_vec$##RUST_TYPE##$len( \
David Tolnay6787be62020-04-25 11:01:02 -0700300 const rust::Vec<CXX_TYPE> *ptr) noexcept; \
David Tolnay0f0162f2020-11-16 23:43:37 -0800301 const CXX_TYPE *cxxbridge1$rust_vec$##RUST_TYPE##$data( \
David Tolnay6787be62020-04-25 11:01:02 -0700302 const rust::Vec<CXX_TYPE> *ptr) noexcept; \
David Tolnay0f0162f2020-11-16 23:43:37 -0800303 void cxxbridge1$rust_vec$##RUST_TYPE##$reserve_total( \
David Tolnayfb6b73c2020-11-10 14:32:16 -0800304 rust::Vec<CXX_TYPE> *ptr, size_t cap) noexcept; \
David Tolnay0f0162f2020-11-16 23:43:37 -0800305 void cxxbridge1$rust_vec$##RUST_TYPE##$set_len(rust::Vec<CXX_TYPE> *ptr, \
306 size_t len) noexcept; \
307 size_t cxxbridge1$rust_vec$##RUST_TYPE##$stride() noexcept;
David Tolnay6787be62020-04-25 11:01:02 -0700308
309#define RUST_VEC_OPS(RUST_TYPE, CXX_TYPE) \
310 template <> \
David Tolnay1768d8f2020-04-25 18:15:11 -0700311 Vec<CXX_TYPE>::Vec() noexcept { \
David Tolnay0f0162f2020-11-16 23:43:37 -0800312 cxxbridge1$rust_vec$##RUST_TYPE##$new(this); \
David Tolnayf97c2d52020-04-25 16:37:48 -0700313 } \
314 template <> \
David Tolnay1768d8f2020-04-25 18:15:11 -0700315 void Vec<CXX_TYPE>::drop() noexcept { \
David Tolnay0f0162f2020-11-16 23:43:37 -0800316 return cxxbridge1$rust_vec$##RUST_TYPE##$drop(this); \
David Tolnay6787be62020-04-25 11:01:02 -0700317 } \
318 template <> \
David Tolnay1768d8f2020-04-25 18:15:11 -0700319 size_t Vec<CXX_TYPE>::size() const noexcept { \
David Tolnay0f0162f2020-11-16 23:43:37 -0800320 return cxxbridge1$rust_vec$##RUST_TYPE##$len(this); \
David Tolnay6787be62020-04-25 11:01:02 -0700321 } \
322 template <> \
David Tolnay1768d8f2020-04-25 18:15:11 -0700323 const CXX_TYPE *Vec<CXX_TYPE>::data() const noexcept { \
David Tolnay0f0162f2020-11-16 23:43:37 -0800324 return cxxbridge1$rust_vec$##RUST_TYPE##$data(this); \
David Tolnay6787be62020-04-25 11:01:02 -0700325 } \
326 template <> \
David Tolnayfb6b73c2020-11-10 14:32:16 -0800327 void Vec<CXX_TYPE>::reserve_total(size_t cap) noexcept { \
David Tolnay0f0162f2020-11-16 23:43:37 -0800328 cxxbridge1$rust_vec$##RUST_TYPE##$reserve_total(this, cap); \
David Tolnayfb6b73c2020-11-10 14:32:16 -0800329 } \
330 template <> \
331 void Vec<CXX_TYPE>::set_len(size_t len) noexcept { \
David Tolnay0f0162f2020-11-16 23:43:37 -0800332 cxxbridge1$rust_vec$##RUST_TYPE##$set_len(this, len); \
David Tolnayfb6b73c2020-11-10 14:32:16 -0800333 } \
334 template <> \
David Tolnay1768d8f2020-04-25 18:15:11 -0700335 size_t Vec<CXX_TYPE>::stride() noexcept { \
David Tolnay0f0162f2020-11-16 23:43:37 -0800336 return cxxbridge1$rust_vec$##RUST_TYPE##$stride(); \
David Tolnay6787be62020-04-25 11:01:02 -0700337 }
338
339// Usize and isize are the same type as one of the below.
David Tolnayf336b3b2020-04-30 08:45:54 -0700340#define FOR_EACH_NUMERIC(MACRO) \
David Tolnay6787be62020-04-25 11:01:02 -0700341 MACRO(u8, uint8_t) \
342 MACRO(u16, uint16_t) \
343 MACRO(u32, uint32_t) \
344 MACRO(u64, uint64_t) \
345 MACRO(i8, int8_t) \
346 MACRO(i16, int16_t) \
347 MACRO(i32, int32_t) \
348 MACRO(i64, int64_t) \
349 MACRO(f32, float) \
350 MACRO(f64, double)
351
David Tolnayf336b3b2020-04-30 08:45:54 -0700352#define FOR_EACH_STD_VECTOR(MACRO) \
353 FOR_EACH_NUMERIC(MACRO) \
David Tolnay6787be62020-04-25 11:01:02 -0700354 MACRO(usize, size_t) \
David Tolnay47e239d2020-08-28 00:32:04 -0700355 MACRO(isize, rust::isize) \
356 MACRO(string, std::string)
David Tolnay6787be62020-04-25 11:01:02 -0700357
David Tolnayf336b3b2020-04-30 08:45:54 -0700358#define FOR_EACH_RUST_VEC(MACRO) \
359 FOR_EACH_NUMERIC(MACRO) \
David Tolnay33f56ad2020-08-27 17:06:35 -0700360 MACRO(bool, bool) \
361 MACRO(string, rust::String)
David Tolnayf336b3b2020-04-30 08:45:54 -0700362
David Tolnay4e7e7c42020-04-24 14:48:07 -0700363extern "C" {
David Tolnayf336b3b2020-04-30 08:45:54 -0700364FOR_EACH_STD_VECTOR(STD_VECTOR_OPS)
365FOR_EACH_RUST_VEC(RUST_VEC_EXTERNS)
David Tolnay4e7e7c42020-04-24 14:48:07 -0700366} // extern "C"
David Tolnay6787be62020-04-25 11:01:02 -0700367
David Tolnay1768d8f2020-04-25 18:15:11 -0700368namespace rust {
David Tolnay0f0162f2020-11-16 23:43:37 -0800369inline namespace cxxbridge1 {
David Tolnayf336b3b2020-04-30 08:45:54 -0700370FOR_EACH_RUST_VEC(RUST_VEC_OPS)
David Tolnay0f0162f2020-11-16 23:43:37 -0800371} // namespace cxxbridge1
David Tolnay1768d8f2020-04-25 18:15:11 -0700372} // namespace rust