blob: 423f72e03af4aecc6b2efb26892de6a64719ce83 [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 Tolnaybb3ff5d2020-11-15 19:45:11 -080012void cxxbridge05$cxx_string$init(std::string *s, const uint8_t *ptr,
13 size_t len) noexcept {
14 new (s) std::string(reinterpret_cast<const char *>(ptr), len);
15}
16
17void cxxbridge05$cxx_string$destroy(std::string *s) noexcept {
18 using std::string;
19 s->~string();
20}
21
David Tolnay8f16ae72020-10-08 18:21:13 -070022const char *cxxbridge05$cxx_string$data(const std::string &s) noexcept {
David Tolnay7db73692019-10-20 14:51:12 -040023 return s.data();
24}
25
David Tolnay8f16ae72020-10-08 18:21:13 -070026size_t cxxbridge05$cxx_string$length(const std::string &s) noexcept {
David Tolnay7db73692019-10-20 14:51:12 -040027 return s.length();
28}
29
David Tolnay90691f42020-11-14 20:01:46 -080030void cxxbridge05$cxx_string$push(std::string &s, const uint8_t *ptr,
31 size_t len) noexcept {
32 s.append(reinterpret_cast<const char *>(ptr), len);
33}
34
David Tolnay750755e2020-03-01 13:04:08 -080035// rust::String
David Tolnay8f16ae72020-10-08 18:21:13 -070036void cxxbridge05$string$new(rust::String *self) noexcept;
37void cxxbridge05$string$clone(rust::String *self,
David Tolnay6c089102020-03-02 00:21:13 -080038 const rust::String &other) noexcept;
David Tolnay8f16ae72020-10-08 18:21:13 -070039bool cxxbridge05$string$from(rust::String *self, const char *ptr,
David Tolnay6c089102020-03-02 00:21:13 -080040 size_t len) noexcept;
David Tolnay8f16ae72020-10-08 18:21:13 -070041void cxxbridge05$string$drop(rust::String *self) noexcept;
42const char *cxxbridge05$string$ptr(const rust::String *self) noexcept;
43size_t cxxbridge05$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 Tolnay8f16ae72020-10-08 18:21:13 -070046bool cxxbridge05$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 Tolnay8f16ae72020-10-08 18:21:13 -070050inline namespace cxxbridge05 {
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 Tolnay8f16ae72020-10-08 18:21:13 -070064String::String() noexcept { cxxbridge05$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 Tolnay8f16ae72020-10-08 18:21:13 -070067 cxxbridge05$string$clone(this, other);
David Tolnay7db73692019-10-20 14:51:12 -040068}
69
David Tolnay56082162020-03-01 12:57:33 -080070String::String(String &&other) noexcept {
David Tolnay7db73692019-10-20 14:51:12 -040071 this->repr = other.repr;
David Tolnay8f16ae72020-10-08 18:21:13 -070072 cxxbridge05$string$new(&other);
David Tolnay7db73692019-10-20 14:51:12 -040073}
74
David Tolnay8f16ae72020-10-08 18:21:13 -070075String::~String() noexcept { cxxbridge05$string$drop(this); }
David Tolnay7db73692019-10-20 14:51:12 -040076
David Tolnay032d8532020-10-30 20:47:31 -070077static void initString(String *self, const char *s, size_t len) {
78 if (!cxxbridge05$string$from(self, s, len)) {
David Tolnay8d323662020-10-30 19:32:26 -070079 panic<std::invalid_argument>("data for rust::String is not utf-8");
80 }
81}
David Tolnay7db73692019-10-20 14:51:12 -040082
David Tolnay032d8532020-10-30 20:47:31 -070083String::String(const std::string &s) { initString(this, s.data(), s.length()); }
84
David Tolnay54b13222020-10-30 20:58:32 -070085String::String(const char *s) {
86 assert(s != nullptr);
87 initString(this, s, std::strlen(s));
88}
David Tolnayc2bbd952020-07-29 18:15:26 -070089
90String::String(const char *s, size_t len) {
David Tolnay54b13222020-10-30 20:58:32 -070091 assert(s != nullptr || len == 0);
David Tolnay032d8532020-10-30 20:47:31 -070092 initString(this,
93 s == nullptr && len == 0 ? reinterpret_cast<const char *>(1) : s,
94 len);
David Tolnay7db73692019-10-20 14:51:12 -040095}
96
David Tolnay56082162020-03-01 12:57:33 -080097String &String::operator=(const String &other) noexcept {
David Tolnay7db73692019-10-20 14:51:12 -040098 if (this != &other) {
David Tolnay8f16ae72020-10-08 18:21:13 -070099 cxxbridge05$string$drop(this);
100 cxxbridge05$string$clone(this, other);
David Tolnay7db73692019-10-20 14:51:12 -0400101 }
102 return *this;
103}
104
David Tolnay56082162020-03-01 12:57:33 -0800105String &String::operator=(String &&other) noexcept {
David Tolnay7db73692019-10-20 14:51:12 -0400106 if (this != &other) {
David Tolnay8f16ae72020-10-08 18:21:13 -0700107 cxxbridge05$string$drop(this);
David Tolnay7db73692019-10-20 14:51:12 -0400108 this->repr = other.repr;
David Tolnay8f16ae72020-10-08 18:21:13 -0700109 cxxbridge05$string$new(&other);
David Tolnay7db73692019-10-20 14:51:12 -0400110 }
111 return *this;
112}
113
David Tolnayd9c4ac92020-03-01 20:33:58 -0800114String::operator std::string() const {
115 return std::string(this->data(), this->size());
116}
117
David Tolnay56082162020-03-01 12:57:33 -0800118const char *String::data() const noexcept {
David Tolnay8f16ae72020-10-08 18:21:13 -0700119 return cxxbridge05$string$ptr(this);
David Tolnay7db73692019-10-20 14:51:12 -0400120}
121
David Tolnay8f16ae72020-10-08 18:21:13 -0700122size_t String::size() const noexcept { return cxxbridge05$string$len(this); }
David Tolnay7db73692019-10-20 14:51:12 -0400123
David Tolnay8f16ae72020-10-08 18:21:13 -0700124size_t String::length() const noexcept { return cxxbridge05$string$len(this); }
David Tolnay7db73692019-10-20 14:51:12 -0400125
David Tolnayd1e2efc2020-03-03 22:25:43 -0800126String::String(unsafe_bitcopy_t, const String &bits) noexcept
127 : repr(bits.repr) {}
128
David Tolnay56082162020-03-01 12:57:33 -0800129std::ostream &operator<<(std::ostream &os, const String &s) {
David Tolnay7db73692019-10-20 14:51:12 -0400130 os.write(s.data(), s.size());
131 return os;
132}
133
David Tolnay5df1f062020-10-31 12:31:10 -0700134Str::Str() noexcept : ptr(reinterpret_cast<const char *>(1)), len(0) {}
David Tolnay7db73692019-10-20 14:51:12 -0400135
David Tolnay5df1f062020-10-31 12:31:10 -0700136static void initStr(const char *ptr, size_t len) {
137 if (!cxxbridge05$str$valid(ptr, len)) {
David Tolnay8d323662020-10-30 19:32:26 -0700138 panic<std::invalid_argument>("data for rust::Str is not utf-8");
139 }
140}
David Tolnay7db73692019-10-20 14:51:12 -0400141
David Tolnay5df1f062020-10-31 12:31:10 -0700142Str::Str(const std::string &s) : ptr(s.data()), len(s.length()) {
143 initStr(this->ptr, this->len);
David Tolnay8d323662020-10-30 19:32:26 -0700144}
David Tolnay894c5e42020-07-29 18:20:00 -0700145
David Tolnay5df1f062020-10-31 12:31:10 -0700146Str::Str(const char *s) : ptr(s), len(std::strlen(s)) {
David Tolnay54b13222020-10-30 20:58:32 -0700147 assert(s != nullptr);
David Tolnay5df1f062020-10-31 12:31:10 -0700148 initStr(this->ptr, this->len);
David Tolnay54b13222020-10-30 20:58:32 -0700149}
David Tolnay032d8532020-10-30 20:47:31 -0700150
David Tolnay8d323662020-10-30 19:32:26 -0700151Str::Str(const char *s, size_t len)
David Tolnay5df1f062020-10-31 12:31:10 -0700152 : ptr(s == nullptr && len == 0 ? reinterpret_cast<const char *>(1) : s),
153 len(len) {
David Tolnay54b13222020-10-30 20:58:32 -0700154 assert(s != nullptr || len == 0);
David Tolnay5df1f062020-10-31 12:31:10 -0700155 initStr(this->ptr, this->len);
David Tolnayd9c4ac92020-03-01 20:33:58 -0800156}
David Tolnay7db73692019-10-20 14:51:12 -0400157
David Tolnay09dbe752020-03-01 13:00:40 -0800158Str::operator std::string() const {
David Tolnay7db73692019-10-20 14:51:12 -0400159 return std::string(this->data(), this->size());
160}
161
David Tolnay09dbe752020-03-01 13:00:40 -0800162std::ostream &operator<<(std::ostream &os, const Str &s) {
David Tolnay7db73692019-10-20 14:51:12 -0400163 os.write(s.data(), s.size());
164 return os;
165}
166
David Tolnay9ed15c62020-10-31 18:02:03 -0700167static_assert(std::is_trivially_copy_constructible<Str>::value,
168 "trivial Str(const Str &)");
169static_assert(std::is_trivially_copy_assignable<Str>::value,
170 "trivial operator=(const Str &)");
171static_assert(std::is_trivially_destructible<Str>::value, "trivial ~Str()");
172
David Tolnay1e548172020-03-16 13:37:09 -0700173extern "C" {
David Tolnay8f16ae72020-10-08 18:21:13 -0700174const char *cxxbridge05$error(const char *ptr, size_t len) {
David Tolnay1e548172020-03-16 13:37:09 -0700175 char *copy = new char[len];
David Tolnay504cf3c2020-10-31 16:08:04 -0700176 std::strncpy(copy, ptr, len);
David Tolnay1e548172020-03-16 13:37:09 -0700177 return copy;
178}
179} // extern "C"
180
David Tolnayd5712ee2020-10-31 17:10:00 -0700181Error::Error(const Error &other)
David Tolnay23c23192020-10-31 17:11:48 -0700182 : std::exception(other), msg(cxxbridge05$error(other.msg, other.len)),
183 len(other.len) {}
David Tolnay1e548172020-03-16 13:37:09 -0700184
David Tolnay23c23192020-10-31 17:11:48 -0700185Error::Error(Error &&other) noexcept
186 : std::exception(std::move(other)), msg(other.msg), len(other.len) {
David Tolnaya0c9bc72020-10-31 14:37:14 -0700187 other.msg = nullptr;
188 other.len = 0;
David Tolnay1e548172020-03-16 13:37:09 -0700189}
190
David Tolnaya0c9bc72020-10-31 14:37:14 -0700191Error::~Error() noexcept { delete[] this->msg; }
David Tolnay1e548172020-03-16 13:37:09 -0700192
David Tolnay7c6ac712020-10-31 17:22:28 -0700193Error &Error::operator=(const Error &other) {
194 if (this != &other) {
195 std::exception::operator=(other);
196 delete[] this->msg;
197 this->msg = nullptr;
198 this->msg = cxxbridge05$error(other.msg, other.len);
199 this->len = other.len;
200 }
201 return *this;
202}
203
David Tolnay15491062020-10-31 17:25:13 -0700204Error &Error::operator=(Error &&other) noexcept {
205 if (this != &other) {
206 std::exception::operator=(std::move(other));
207 this->msg = other.msg;
208 this->len = other.len;
209 other.msg = nullptr;
210 other.len = 0;
211 }
212 return *this;
213}
214
David Tolnaya0c9bc72020-10-31 14:37:14 -0700215const char *Error::what() const noexcept { return this->msg; }
David Tolnay1e548172020-03-16 13:37:09 -0700216
David Tolnay8f16ae72020-10-08 18:21:13 -0700217} // namespace cxxbridge05
David Tolnay750755e2020-03-01 13:04:08 -0800218} // namespace rust
David Tolnay7db73692019-10-20 14:51:12 -0400219
220extern "C" {
David Tolnay8f16ae72020-10-08 18:21:13 -0700221void cxxbridge05$unique_ptr$std$string$null(
David Tolnay7db73692019-10-20 14:51:12 -0400222 std::unique_ptr<std::string> *ptr) noexcept {
223 new (ptr) std::unique_ptr<std::string>();
224}
David Tolnay8f16ae72020-10-08 18:21:13 -0700225void cxxbridge05$unique_ptr$std$string$raw(std::unique_ptr<std::string> *ptr,
David Tolnay7db73692019-10-20 14:51:12 -0400226 std::string *raw) noexcept {
227 new (ptr) std::unique_ptr<std::string>(raw);
228}
David Tolnay8f16ae72020-10-08 18:21:13 -0700229const std::string *cxxbridge05$unique_ptr$std$string$get(
David Tolnay7db73692019-10-20 14:51:12 -0400230 const std::unique_ptr<std::string> &ptr) noexcept {
231 return ptr.get();
232}
David Tolnay8f16ae72020-10-08 18:21:13 -0700233std::string *cxxbridge05$unique_ptr$std$string$release(
David Tolnay7db73692019-10-20 14:51:12 -0400234 std::unique_ptr<std::string> &ptr) noexcept {
235 return ptr.release();
236}
David Tolnay8f16ae72020-10-08 18:21:13 -0700237void cxxbridge05$unique_ptr$std$string$drop(
David Tolnay7db73692019-10-20 14:51:12 -0400238 std::unique_ptr<std::string> *ptr) noexcept {
239 ptr->~unique_ptr();
240}
241} // extern "C"
Myron Ahneba35cf2020-02-05 19:41:51 +0700242
David Tolnaybb3ff5d2020-11-15 19:45:11 -0800243static_assert(alignof(std::string) <= alignof(void *),
244 "unexpectedly large std::string alignment");
245static_assert(sizeof(std::string) <= 8 * sizeof(void *),
246 "unexpectedly large std::string size");
247
David Tolnay37dd7e12020-04-25 12:51:59 -0700248#define STD_VECTOR_OPS(RUST_TYPE, CXX_TYPE) \
David Tolnay8f16ae72020-10-08 18:21:13 -0700249 size_t cxxbridge05$std$vector$##RUST_TYPE##$size( \
David Tolnay37dd7e12020-04-25 12:51:59 -0700250 const std::vector<CXX_TYPE> &s) noexcept { \
251 return s.size(); \
252 } \
David Tolnay8f16ae72020-10-08 18:21:13 -0700253 const CXX_TYPE *cxxbridge05$std$vector$##RUST_TYPE##$get_unchecked( \
David Tolnay37dd7e12020-04-25 12:51:59 -0700254 const std::vector<CXX_TYPE> &s, size_t pos) noexcept { \
David Tolnay9626d082020-04-24 14:52:45 -0700255 return &s[pos]; \
David Tolnay37dd7e12020-04-25 12:51:59 -0700256 } \
David Tolnay8f16ae72020-10-08 18:21:13 -0700257 void cxxbridge05$unique_ptr$std$vector$##RUST_TYPE##$null( \
David Tolnay996db1e2020-04-24 14:46:31 -0700258 std::unique_ptr<std::vector<CXX_TYPE>> *ptr) noexcept { \
259 new (ptr) std::unique_ptr<std::vector<CXX_TYPE>>(); \
David Tolnay37dd7e12020-04-25 12:51:59 -0700260 } \
David Tolnay8f16ae72020-10-08 18:21:13 -0700261 void cxxbridge05$unique_ptr$std$vector$##RUST_TYPE##$raw( \
David Tolnay996db1e2020-04-24 14:46:31 -0700262 std::unique_ptr<std::vector<CXX_TYPE>> *ptr, \
David Tolnay37dd7e12020-04-25 12:51:59 -0700263 std::vector<CXX_TYPE> *raw) noexcept { \
David Tolnay996db1e2020-04-24 14:46:31 -0700264 new (ptr) std::unique_ptr<std::vector<CXX_TYPE>>(raw); \
David Tolnay37dd7e12020-04-25 12:51:59 -0700265 } \
David Tolnay4e7e7c42020-04-24 14:48:07 -0700266 const std::vector<CXX_TYPE> \
David Tolnay8f16ae72020-10-08 18:21:13 -0700267 *cxxbridge05$unique_ptr$std$vector$##RUST_TYPE##$get( \
David Tolnay996db1e2020-04-24 14:46:31 -0700268 const std::unique_ptr<std::vector<CXX_TYPE>> &ptr) noexcept { \
David Tolnay37dd7e12020-04-25 12:51:59 -0700269 return ptr.get(); \
270 } \
David Tolnay4e7e7c42020-04-24 14:48:07 -0700271 std::vector<CXX_TYPE> \
David Tolnay8f16ae72020-10-08 18:21:13 -0700272 *cxxbridge05$unique_ptr$std$vector$##RUST_TYPE##$release( \
David Tolnay996db1e2020-04-24 14:46:31 -0700273 std::unique_ptr<std::vector<CXX_TYPE>> &ptr) noexcept { \
David Tolnay37dd7e12020-04-25 12:51:59 -0700274 return ptr.release(); \
275 } \
David Tolnay8f16ae72020-10-08 18:21:13 -0700276 void cxxbridge05$unique_ptr$std$vector$##RUST_TYPE##$drop( \
David Tolnay996db1e2020-04-24 14:46:31 -0700277 std::unique_ptr<std::vector<CXX_TYPE>> *ptr) noexcept { \
David Tolnay37dd7e12020-04-25 12:51:59 -0700278 ptr->~unique_ptr(); \
David Tolnay4e7e7c42020-04-24 14:48:07 -0700279 }
Myron Ahneba35cf2020-02-05 19:41:51 +0700280
David Tolnay6787be62020-04-25 11:01:02 -0700281#define RUST_VEC_EXTERNS(RUST_TYPE, CXX_TYPE) \
David Tolnay8f16ae72020-10-08 18:21:13 -0700282 void cxxbridge05$rust_vec$##RUST_TYPE##$new( \
David Tolnayf97c2d52020-04-25 16:37:48 -0700283 rust::Vec<CXX_TYPE> *ptr) noexcept; \
David Tolnay8f16ae72020-10-08 18:21:13 -0700284 void cxxbridge05$rust_vec$##RUST_TYPE##$drop( \
David Tolnay6787be62020-04-25 11:01:02 -0700285 rust::Vec<CXX_TYPE> *ptr) noexcept; \
David Tolnay8f16ae72020-10-08 18:21:13 -0700286 size_t cxxbridge05$rust_vec$##RUST_TYPE##$len( \
David Tolnay6787be62020-04-25 11:01:02 -0700287 const rust::Vec<CXX_TYPE> *ptr) noexcept; \
David Tolnay8f16ae72020-10-08 18:21:13 -0700288 const CXX_TYPE *cxxbridge05$rust_vec$##RUST_TYPE##$data( \
David Tolnay6787be62020-04-25 11:01:02 -0700289 const rust::Vec<CXX_TYPE> *ptr) noexcept; \
David Tolnayfb6b73c2020-11-10 14:32:16 -0800290 void cxxbridge05$rust_vec$##RUST_TYPE##$reserve_total( \
291 rust::Vec<CXX_TYPE> *ptr, size_t cap) noexcept; \
292 void cxxbridge05$rust_vec$##RUST_TYPE##$set_len(rust::Vec<CXX_TYPE> *ptr, \
293 size_t len) noexcept; \
David Tolnay8f16ae72020-10-08 18:21:13 -0700294 size_t cxxbridge05$rust_vec$##RUST_TYPE##$stride() noexcept;
David Tolnay6787be62020-04-25 11:01:02 -0700295
296#define RUST_VEC_OPS(RUST_TYPE, CXX_TYPE) \
297 template <> \
David Tolnay1768d8f2020-04-25 18:15:11 -0700298 Vec<CXX_TYPE>::Vec() noexcept { \
David Tolnay8f16ae72020-10-08 18:21:13 -0700299 cxxbridge05$rust_vec$##RUST_TYPE##$new(this); \
David Tolnayf97c2d52020-04-25 16:37:48 -0700300 } \
301 template <> \
David Tolnay1768d8f2020-04-25 18:15:11 -0700302 void Vec<CXX_TYPE>::drop() noexcept { \
David Tolnay8f16ae72020-10-08 18:21:13 -0700303 return cxxbridge05$rust_vec$##RUST_TYPE##$drop(this); \
David Tolnay6787be62020-04-25 11:01:02 -0700304 } \
305 template <> \
David Tolnay1768d8f2020-04-25 18:15:11 -0700306 size_t Vec<CXX_TYPE>::size() const noexcept { \
David Tolnay8f16ae72020-10-08 18:21:13 -0700307 return cxxbridge05$rust_vec$##RUST_TYPE##$len(this); \
David Tolnay6787be62020-04-25 11:01:02 -0700308 } \
309 template <> \
David Tolnay1768d8f2020-04-25 18:15:11 -0700310 const CXX_TYPE *Vec<CXX_TYPE>::data() const noexcept { \
David Tolnay8f16ae72020-10-08 18:21:13 -0700311 return cxxbridge05$rust_vec$##RUST_TYPE##$data(this); \
David Tolnay6787be62020-04-25 11:01:02 -0700312 } \
313 template <> \
David Tolnayfb6b73c2020-11-10 14:32:16 -0800314 void Vec<CXX_TYPE>::reserve_total(size_t cap) noexcept { \
315 cxxbridge05$rust_vec$##RUST_TYPE##$reserve_total(this, cap); \
316 } \
317 template <> \
318 void Vec<CXX_TYPE>::set_len(size_t len) noexcept { \
319 cxxbridge05$rust_vec$##RUST_TYPE##$set_len(this, len); \
320 } \
321 template <> \
David Tolnay1768d8f2020-04-25 18:15:11 -0700322 size_t Vec<CXX_TYPE>::stride() noexcept { \
David Tolnay8f16ae72020-10-08 18:21:13 -0700323 return cxxbridge05$rust_vec$##RUST_TYPE##$stride(); \
David Tolnay6787be62020-04-25 11:01:02 -0700324 }
325
326// Usize and isize are the same type as one of the below.
David Tolnayf336b3b2020-04-30 08:45:54 -0700327#define FOR_EACH_NUMERIC(MACRO) \
David Tolnay6787be62020-04-25 11:01:02 -0700328 MACRO(u8, uint8_t) \
329 MACRO(u16, uint16_t) \
330 MACRO(u32, uint32_t) \
331 MACRO(u64, uint64_t) \
332 MACRO(i8, int8_t) \
333 MACRO(i16, int16_t) \
334 MACRO(i32, int32_t) \
335 MACRO(i64, int64_t) \
336 MACRO(f32, float) \
337 MACRO(f64, double)
338
David Tolnayf336b3b2020-04-30 08:45:54 -0700339#define FOR_EACH_STD_VECTOR(MACRO) \
340 FOR_EACH_NUMERIC(MACRO) \
David Tolnay6787be62020-04-25 11:01:02 -0700341 MACRO(usize, size_t) \
David Tolnay47e239d2020-08-28 00:32:04 -0700342 MACRO(isize, rust::isize) \
343 MACRO(string, std::string)
David Tolnay6787be62020-04-25 11:01:02 -0700344
David Tolnayf336b3b2020-04-30 08:45:54 -0700345#define FOR_EACH_RUST_VEC(MACRO) \
346 FOR_EACH_NUMERIC(MACRO) \
David Tolnay33f56ad2020-08-27 17:06:35 -0700347 MACRO(bool, bool) \
348 MACRO(string, rust::String)
David Tolnayf336b3b2020-04-30 08:45:54 -0700349
David Tolnay4e7e7c42020-04-24 14:48:07 -0700350extern "C" {
David Tolnayf336b3b2020-04-30 08:45:54 -0700351FOR_EACH_STD_VECTOR(STD_VECTOR_OPS)
352FOR_EACH_RUST_VEC(RUST_VEC_EXTERNS)
David Tolnay4e7e7c42020-04-24 14:48:07 -0700353} // extern "C"
David Tolnay6787be62020-04-25 11:01:02 -0700354
David Tolnay1768d8f2020-04-25 18:15:11 -0700355namespace rust {
David Tolnay8f16ae72020-10-08 18:21:13 -0700356inline namespace cxxbridge05 {
David Tolnayf336b3b2020-04-30 08:45:54 -0700357FOR_EACH_RUST_VEC(RUST_VEC_OPS)
David Tolnay8f16ae72020-10-08 18:21:13 -0700358} // namespace cxxbridge05
David Tolnay1768d8f2020-04-25 18:15:11 -0700359} // namespace rust