blob: 1295d04fab1fbfecf75ba5be874aabb87abd43bd [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 Tolnay8f16ae72020-10-08 18:21:13 -070012const char *cxxbridge05$cxx_string$data(const std::string &s) noexcept {
David Tolnay7db73692019-10-20 14:51:12 -040013 return s.data();
14}
15
David Tolnay8f16ae72020-10-08 18:21:13 -070016size_t cxxbridge05$cxx_string$length(const std::string &s) noexcept {
David Tolnay7db73692019-10-20 14:51:12 -040017 return s.length();
18}
19
David Tolnay90691f42020-11-14 20:01:46 -080020void cxxbridge05$cxx_string$push(std::string &s, const uint8_t *ptr,
21 size_t len) noexcept {
22 s.append(reinterpret_cast<const char *>(ptr), len);
23}
24
David Tolnay750755e2020-03-01 13:04:08 -080025// rust::String
David Tolnay8f16ae72020-10-08 18:21:13 -070026void cxxbridge05$string$new(rust::String *self) noexcept;
27void cxxbridge05$string$clone(rust::String *self,
David Tolnay6c089102020-03-02 00:21:13 -080028 const rust::String &other) noexcept;
David Tolnay8f16ae72020-10-08 18:21:13 -070029bool cxxbridge05$string$from(rust::String *self, const char *ptr,
David Tolnay6c089102020-03-02 00:21:13 -080030 size_t len) noexcept;
David Tolnay8f16ae72020-10-08 18:21:13 -070031void cxxbridge05$string$drop(rust::String *self) noexcept;
32const char *cxxbridge05$string$ptr(const rust::String *self) noexcept;
33size_t cxxbridge05$string$len(const rust::String *self) noexcept;
David Tolnay7db73692019-10-20 14:51:12 -040034
David Tolnay750755e2020-03-01 13:04:08 -080035// rust::Str
David Tolnay8f16ae72020-10-08 18:21:13 -070036bool cxxbridge05$str$valid(const char *ptr, size_t len) noexcept;
David Tolnay7db73692019-10-20 14:51:12 -040037} // extern "C"
38
David Tolnay750755e2020-03-01 13:04:08 -080039namespace rust {
David Tolnay8f16ae72020-10-08 18:21:13 -070040inline namespace cxxbridge05 {
David Tolnay7db73692019-10-20 14:51:12 -040041
David Tolnay521d99d2020-08-26 20:45:40 -070042template <typename Exception>
43void panic [[noreturn]] (const char *msg) {
44#if defined(RUST_CXX_NO_EXCEPTIONS)
45 std::cerr << "Error: " << msg << ". Aborting." << std::endl;
46 std::terminate();
47#else
48 throw Exception(msg);
49#endif
50}
51
David Tolnayb10c4bc2020-08-26 21:55:29 -070052template void panic<std::out_of_range>[[noreturn]] (const char *msg);
David Tolnay521d99d2020-08-26 20:45:40 -070053
David Tolnay8f16ae72020-10-08 18:21:13 -070054String::String() noexcept { cxxbridge05$string$new(this); }
David Tolnay7db73692019-10-20 14:51:12 -040055
David Tolnay56082162020-03-01 12:57:33 -080056String::String(const String &other) noexcept {
David Tolnay8f16ae72020-10-08 18:21:13 -070057 cxxbridge05$string$clone(this, other);
David Tolnay7db73692019-10-20 14:51:12 -040058}
59
David Tolnay56082162020-03-01 12:57:33 -080060String::String(String &&other) noexcept {
David Tolnay7db73692019-10-20 14:51:12 -040061 this->repr = other.repr;
David Tolnay8f16ae72020-10-08 18:21:13 -070062 cxxbridge05$string$new(&other);
David Tolnay7db73692019-10-20 14:51:12 -040063}
64
David Tolnay8f16ae72020-10-08 18:21:13 -070065String::~String() noexcept { cxxbridge05$string$drop(this); }
David Tolnay7db73692019-10-20 14:51:12 -040066
David Tolnay032d8532020-10-30 20:47:31 -070067static void initString(String *self, const char *s, size_t len) {
68 if (!cxxbridge05$string$from(self, s, len)) {
David Tolnay8d323662020-10-30 19:32:26 -070069 panic<std::invalid_argument>("data for rust::String is not utf-8");
70 }
71}
David Tolnay7db73692019-10-20 14:51:12 -040072
David Tolnay032d8532020-10-30 20:47:31 -070073String::String(const std::string &s) { initString(this, s.data(), s.length()); }
74
David Tolnay54b13222020-10-30 20:58:32 -070075String::String(const char *s) {
76 assert(s != nullptr);
77 initString(this, s, std::strlen(s));
78}
David Tolnayc2bbd952020-07-29 18:15:26 -070079
80String::String(const char *s, size_t len) {
David Tolnay54b13222020-10-30 20:58:32 -070081 assert(s != nullptr || len == 0);
David Tolnay032d8532020-10-30 20:47:31 -070082 initString(this,
83 s == nullptr && len == 0 ? reinterpret_cast<const char *>(1) : s,
84 len);
David Tolnay7db73692019-10-20 14:51:12 -040085}
86
David Tolnay56082162020-03-01 12:57:33 -080087String &String::operator=(const String &other) noexcept {
David Tolnay7db73692019-10-20 14:51:12 -040088 if (this != &other) {
David Tolnay8f16ae72020-10-08 18:21:13 -070089 cxxbridge05$string$drop(this);
90 cxxbridge05$string$clone(this, other);
David Tolnay7db73692019-10-20 14:51:12 -040091 }
92 return *this;
93}
94
David Tolnay56082162020-03-01 12:57:33 -080095String &String::operator=(String &&other) noexcept {
David Tolnay7db73692019-10-20 14:51:12 -040096 if (this != &other) {
David Tolnay8f16ae72020-10-08 18:21:13 -070097 cxxbridge05$string$drop(this);
David Tolnay7db73692019-10-20 14:51:12 -040098 this->repr = other.repr;
David Tolnay8f16ae72020-10-08 18:21:13 -070099 cxxbridge05$string$new(&other);
David Tolnay7db73692019-10-20 14:51:12 -0400100 }
101 return *this;
102}
103
David Tolnayd9c4ac92020-03-01 20:33:58 -0800104String::operator std::string() const {
105 return std::string(this->data(), this->size());
106}
107
David Tolnay56082162020-03-01 12:57:33 -0800108const char *String::data() const noexcept {
David Tolnay8f16ae72020-10-08 18:21:13 -0700109 return cxxbridge05$string$ptr(this);
David Tolnay7db73692019-10-20 14:51:12 -0400110}
111
David Tolnay8f16ae72020-10-08 18:21:13 -0700112size_t String::size() const noexcept { return cxxbridge05$string$len(this); }
David Tolnay7db73692019-10-20 14:51:12 -0400113
David Tolnay8f16ae72020-10-08 18:21:13 -0700114size_t String::length() const noexcept { return cxxbridge05$string$len(this); }
David Tolnay7db73692019-10-20 14:51:12 -0400115
David Tolnayd1e2efc2020-03-03 22:25:43 -0800116String::String(unsafe_bitcopy_t, const String &bits) noexcept
117 : repr(bits.repr) {}
118
David Tolnay56082162020-03-01 12:57:33 -0800119std::ostream &operator<<(std::ostream &os, const String &s) {
David Tolnay7db73692019-10-20 14:51:12 -0400120 os.write(s.data(), s.size());
121 return os;
122}
123
David Tolnay5df1f062020-10-31 12:31:10 -0700124Str::Str() noexcept : ptr(reinterpret_cast<const char *>(1)), len(0) {}
David Tolnay7db73692019-10-20 14:51:12 -0400125
David Tolnay5df1f062020-10-31 12:31:10 -0700126static void initStr(const char *ptr, size_t len) {
127 if (!cxxbridge05$str$valid(ptr, len)) {
David Tolnay8d323662020-10-30 19:32:26 -0700128 panic<std::invalid_argument>("data for rust::Str is not utf-8");
129 }
130}
David Tolnay7db73692019-10-20 14:51:12 -0400131
David Tolnay5df1f062020-10-31 12:31:10 -0700132Str::Str(const std::string &s) : ptr(s.data()), len(s.length()) {
133 initStr(this->ptr, this->len);
David Tolnay8d323662020-10-30 19:32:26 -0700134}
David Tolnay894c5e42020-07-29 18:20:00 -0700135
David Tolnay5df1f062020-10-31 12:31:10 -0700136Str::Str(const char *s) : ptr(s), len(std::strlen(s)) {
David Tolnay54b13222020-10-30 20:58:32 -0700137 assert(s != nullptr);
David Tolnay5df1f062020-10-31 12:31:10 -0700138 initStr(this->ptr, this->len);
David Tolnay54b13222020-10-30 20:58:32 -0700139}
David Tolnay032d8532020-10-30 20:47:31 -0700140
David Tolnay8d323662020-10-30 19:32:26 -0700141Str::Str(const char *s, size_t len)
David Tolnay5df1f062020-10-31 12:31:10 -0700142 : ptr(s == nullptr && len == 0 ? reinterpret_cast<const char *>(1) : s),
143 len(len) {
David Tolnay54b13222020-10-30 20:58:32 -0700144 assert(s != nullptr || len == 0);
David Tolnay5df1f062020-10-31 12:31:10 -0700145 initStr(this->ptr, this->len);
David Tolnayd9c4ac92020-03-01 20:33:58 -0800146}
David Tolnay7db73692019-10-20 14:51:12 -0400147
David Tolnay09dbe752020-03-01 13:00:40 -0800148Str::operator std::string() const {
David Tolnay7db73692019-10-20 14:51:12 -0400149 return std::string(this->data(), this->size());
150}
151
David Tolnay09dbe752020-03-01 13:00:40 -0800152std::ostream &operator<<(std::ostream &os, const Str &s) {
David Tolnay7db73692019-10-20 14:51:12 -0400153 os.write(s.data(), s.size());
154 return os;
155}
156
David Tolnay9ed15c62020-10-31 18:02:03 -0700157static_assert(std::is_trivially_copy_constructible<Str>::value,
158 "trivial Str(const Str &)");
159static_assert(std::is_trivially_copy_assignable<Str>::value,
160 "trivial operator=(const Str &)");
161static_assert(std::is_trivially_destructible<Str>::value, "trivial ~Str()");
162
David Tolnay1e548172020-03-16 13:37:09 -0700163extern "C" {
David Tolnay8f16ae72020-10-08 18:21:13 -0700164const char *cxxbridge05$error(const char *ptr, size_t len) {
David Tolnay1e548172020-03-16 13:37:09 -0700165 char *copy = new char[len];
David Tolnay504cf3c2020-10-31 16:08:04 -0700166 std::strncpy(copy, ptr, len);
David Tolnay1e548172020-03-16 13:37:09 -0700167 return copy;
168}
169} // extern "C"
170
David Tolnayd5712ee2020-10-31 17:10:00 -0700171Error::Error(const Error &other)
David Tolnay23c23192020-10-31 17:11:48 -0700172 : std::exception(other), msg(cxxbridge05$error(other.msg, other.len)),
173 len(other.len) {}
David Tolnay1e548172020-03-16 13:37:09 -0700174
David Tolnay23c23192020-10-31 17:11:48 -0700175Error::Error(Error &&other) noexcept
176 : std::exception(std::move(other)), msg(other.msg), len(other.len) {
David Tolnaya0c9bc72020-10-31 14:37:14 -0700177 other.msg = nullptr;
178 other.len = 0;
David Tolnay1e548172020-03-16 13:37:09 -0700179}
180
David Tolnaya0c9bc72020-10-31 14:37:14 -0700181Error::~Error() noexcept { delete[] this->msg; }
David Tolnay1e548172020-03-16 13:37:09 -0700182
David Tolnay7c6ac712020-10-31 17:22:28 -0700183Error &Error::operator=(const Error &other) {
184 if (this != &other) {
185 std::exception::operator=(other);
186 delete[] this->msg;
187 this->msg = nullptr;
188 this->msg = cxxbridge05$error(other.msg, other.len);
189 this->len = other.len;
190 }
191 return *this;
192}
193
David Tolnay15491062020-10-31 17:25:13 -0700194Error &Error::operator=(Error &&other) noexcept {
195 if (this != &other) {
196 std::exception::operator=(std::move(other));
197 this->msg = other.msg;
198 this->len = other.len;
199 other.msg = nullptr;
200 other.len = 0;
201 }
202 return *this;
203}
204
David Tolnaya0c9bc72020-10-31 14:37:14 -0700205const char *Error::what() const noexcept { return this->msg; }
David Tolnay1e548172020-03-16 13:37:09 -0700206
David Tolnay8f16ae72020-10-08 18:21:13 -0700207} // namespace cxxbridge05
David Tolnay750755e2020-03-01 13:04:08 -0800208} // namespace rust
David Tolnay7db73692019-10-20 14:51:12 -0400209
210extern "C" {
David Tolnay8f16ae72020-10-08 18:21:13 -0700211void cxxbridge05$unique_ptr$std$string$null(
David Tolnay7db73692019-10-20 14:51:12 -0400212 std::unique_ptr<std::string> *ptr) noexcept {
213 new (ptr) std::unique_ptr<std::string>();
214}
David Tolnay8f16ae72020-10-08 18:21:13 -0700215void cxxbridge05$unique_ptr$std$string$raw(std::unique_ptr<std::string> *ptr,
David Tolnay7db73692019-10-20 14:51:12 -0400216 std::string *raw) noexcept {
217 new (ptr) std::unique_ptr<std::string>(raw);
218}
David Tolnay8f16ae72020-10-08 18:21:13 -0700219const std::string *cxxbridge05$unique_ptr$std$string$get(
David Tolnay7db73692019-10-20 14:51:12 -0400220 const std::unique_ptr<std::string> &ptr) noexcept {
221 return ptr.get();
222}
David Tolnay8f16ae72020-10-08 18:21:13 -0700223std::string *cxxbridge05$unique_ptr$std$string$release(
David Tolnay7db73692019-10-20 14:51:12 -0400224 std::unique_ptr<std::string> &ptr) noexcept {
225 return ptr.release();
226}
David Tolnay8f16ae72020-10-08 18:21:13 -0700227void cxxbridge05$unique_ptr$std$string$drop(
David Tolnay7db73692019-10-20 14:51:12 -0400228 std::unique_ptr<std::string> *ptr) noexcept {
229 ptr->~unique_ptr();
230}
231} // extern "C"
Myron Ahneba35cf2020-02-05 19:41:51 +0700232
David Tolnay37dd7e12020-04-25 12:51:59 -0700233#define STD_VECTOR_OPS(RUST_TYPE, CXX_TYPE) \
David Tolnay8f16ae72020-10-08 18:21:13 -0700234 size_t cxxbridge05$std$vector$##RUST_TYPE##$size( \
David Tolnay37dd7e12020-04-25 12:51:59 -0700235 const std::vector<CXX_TYPE> &s) noexcept { \
236 return s.size(); \
237 } \
David Tolnay8f16ae72020-10-08 18:21:13 -0700238 const CXX_TYPE *cxxbridge05$std$vector$##RUST_TYPE##$get_unchecked( \
David Tolnay37dd7e12020-04-25 12:51:59 -0700239 const std::vector<CXX_TYPE> &s, size_t pos) noexcept { \
David Tolnay9626d082020-04-24 14:52:45 -0700240 return &s[pos]; \
David Tolnay37dd7e12020-04-25 12:51:59 -0700241 } \
David Tolnay8f16ae72020-10-08 18:21:13 -0700242 void cxxbridge05$unique_ptr$std$vector$##RUST_TYPE##$null( \
David Tolnay996db1e2020-04-24 14:46:31 -0700243 std::unique_ptr<std::vector<CXX_TYPE>> *ptr) noexcept { \
244 new (ptr) std::unique_ptr<std::vector<CXX_TYPE>>(); \
David Tolnay37dd7e12020-04-25 12:51:59 -0700245 } \
David Tolnay8f16ae72020-10-08 18:21:13 -0700246 void cxxbridge05$unique_ptr$std$vector$##RUST_TYPE##$raw( \
David Tolnay996db1e2020-04-24 14:46:31 -0700247 std::unique_ptr<std::vector<CXX_TYPE>> *ptr, \
David Tolnay37dd7e12020-04-25 12:51:59 -0700248 std::vector<CXX_TYPE> *raw) noexcept { \
David Tolnay996db1e2020-04-24 14:46:31 -0700249 new (ptr) std::unique_ptr<std::vector<CXX_TYPE>>(raw); \
David Tolnay37dd7e12020-04-25 12:51:59 -0700250 } \
David Tolnay4e7e7c42020-04-24 14:48:07 -0700251 const std::vector<CXX_TYPE> \
David Tolnay8f16ae72020-10-08 18:21:13 -0700252 *cxxbridge05$unique_ptr$std$vector$##RUST_TYPE##$get( \
David Tolnay996db1e2020-04-24 14:46:31 -0700253 const std::unique_ptr<std::vector<CXX_TYPE>> &ptr) noexcept { \
David Tolnay37dd7e12020-04-25 12:51:59 -0700254 return ptr.get(); \
255 } \
David Tolnay4e7e7c42020-04-24 14:48:07 -0700256 std::vector<CXX_TYPE> \
David Tolnay8f16ae72020-10-08 18:21:13 -0700257 *cxxbridge05$unique_ptr$std$vector$##RUST_TYPE##$release( \
David Tolnay996db1e2020-04-24 14:46:31 -0700258 std::unique_ptr<std::vector<CXX_TYPE>> &ptr) noexcept { \
David Tolnay37dd7e12020-04-25 12:51:59 -0700259 return ptr.release(); \
260 } \
David Tolnay8f16ae72020-10-08 18:21:13 -0700261 void cxxbridge05$unique_ptr$std$vector$##RUST_TYPE##$drop( \
David Tolnay996db1e2020-04-24 14:46:31 -0700262 std::unique_ptr<std::vector<CXX_TYPE>> *ptr) noexcept { \
David Tolnay37dd7e12020-04-25 12:51:59 -0700263 ptr->~unique_ptr(); \
David Tolnay4e7e7c42020-04-24 14:48:07 -0700264 }
Myron Ahneba35cf2020-02-05 19:41:51 +0700265
David Tolnay6787be62020-04-25 11:01:02 -0700266#define RUST_VEC_EXTERNS(RUST_TYPE, CXX_TYPE) \
David Tolnay8f16ae72020-10-08 18:21:13 -0700267 void cxxbridge05$rust_vec$##RUST_TYPE##$new( \
David Tolnayf97c2d52020-04-25 16:37:48 -0700268 rust::Vec<CXX_TYPE> *ptr) noexcept; \
David Tolnay8f16ae72020-10-08 18:21:13 -0700269 void cxxbridge05$rust_vec$##RUST_TYPE##$drop( \
David Tolnay6787be62020-04-25 11:01:02 -0700270 rust::Vec<CXX_TYPE> *ptr) noexcept; \
David Tolnay8f16ae72020-10-08 18:21:13 -0700271 size_t cxxbridge05$rust_vec$##RUST_TYPE##$len( \
David Tolnay6787be62020-04-25 11:01:02 -0700272 const rust::Vec<CXX_TYPE> *ptr) noexcept; \
David Tolnay8f16ae72020-10-08 18:21:13 -0700273 const CXX_TYPE *cxxbridge05$rust_vec$##RUST_TYPE##$data( \
David Tolnay6787be62020-04-25 11:01:02 -0700274 const rust::Vec<CXX_TYPE> *ptr) noexcept; \
David Tolnayfb6b73c2020-11-10 14:32:16 -0800275 void cxxbridge05$rust_vec$##RUST_TYPE##$reserve_total( \
276 rust::Vec<CXX_TYPE> *ptr, size_t cap) noexcept; \
277 void cxxbridge05$rust_vec$##RUST_TYPE##$set_len(rust::Vec<CXX_TYPE> *ptr, \
278 size_t len) noexcept; \
David Tolnay8f16ae72020-10-08 18:21:13 -0700279 size_t cxxbridge05$rust_vec$##RUST_TYPE##$stride() noexcept;
David Tolnay6787be62020-04-25 11:01:02 -0700280
281#define RUST_VEC_OPS(RUST_TYPE, CXX_TYPE) \
282 template <> \
David Tolnay1768d8f2020-04-25 18:15:11 -0700283 Vec<CXX_TYPE>::Vec() noexcept { \
David Tolnay8f16ae72020-10-08 18:21:13 -0700284 cxxbridge05$rust_vec$##RUST_TYPE##$new(this); \
David Tolnayf97c2d52020-04-25 16:37:48 -0700285 } \
286 template <> \
David Tolnay1768d8f2020-04-25 18:15:11 -0700287 void Vec<CXX_TYPE>::drop() noexcept { \
David Tolnay8f16ae72020-10-08 18:21:13 -0700288 return cxxbridge05$rust_vec$##RUST_TYPE##$drop(this); \
David Tolnay6787be62020-04-25 11:01:02 -0700289 } \
290 template <> \
David Tolnay1768d8f2020-04-25 18:15:11 -0700291 size_t Vec<CXX_TYPE>::size() const noexcept { \
David Tolnay8f16ae72020-10-08 18:21:13 -0700292 return cxxbridge05$rust_vec$##RUST_TYPE##$len(this); \
David Tolnay6787be62020-04-25 11:01:02 -0700293 } \
294 template <> \
David Tolnay1768d8f2020-04-25 18:15:11 -0700295 const CXX_TYPE *Vec<CXX_TYPE>::data() const noexcept { \
David Tolnay8f16ae72020-10-08 18:21:13 -0700296 return cxxbridge05$rust_vec$##RUST_TYPE##$data(this); \
David Tolnay6787be62020-04-25 11:01:02 -0700297 } \
298 template <> \
David Tolnayfb6b73c2020-11-10 14:32:16 -0800299 void Vec<CXX_TYPE>::reserve_total(size_t cap) noexcept { \
300 cxxbridge05$rust_vec$##RUST_TYPE##$reserve_total(this, cap); \
301 } \
302 template <> \
303 void Vec<CXX_TYPE>::set_len(size_t len) noexcept { \
304 cxxbridge05$rust_vec$##RUST_TYPE##$set_len(this, len); \
305 } \
306 template <> \
David Tolnay1768d8f2020-04-25 18:15:11 -0700307 size_t Vec<CXX_TYPE>::stride() noexcept { \
David Tolnay8f16ae72020-10-08 18:21:13 -0700308 return cxxbridge05$rust_vec$##RUST_TYPE##$stride(); \
David Tolnay6787be62020-04-25 11:01:02 -0700309 }
310
311// Usize and isize are the same type as one of the below.
David Tolnayf336b3b2020-04-30 08:45:54 -0700312#define FOR_EACH_NUMERIC(MACRO) \
David Tolnay6787be62020-04-25 11:01:02 -0700313 MACRO(u8, uint8_t) \
314 MACRO(u16, uint16_t) \
315 MACRO(u32, uint32_t) \
316 MACRO(u64, uint64_t) \
317 MACRO(i8, int8_t) \
318 MACRO(i16, int16_t) \
319 MACRO(i32, int32_t) \
320 MACRO(i64, int64_t) \
321 MACRO(f32, float) \
322 MACRO(f64, double)
323
David Tolnayf336b3b2020-04-30 08:45:54 -0700324#define FOR_EACH_STD_VECTOR(MACRO) \
325 FOR_EACH_NUMERIC(MACRO) \
David Tolnay6787be62020-04-25 11:01:02 -0700326 MACRO(usize, size_t) \
David Tolnay47e239d2020-08-28 00:32:04 -0700327 MACRO(isize, rust::isize) \
328 MACRO(string, std::string)
David Tolnay6787be62020-04-25 11:01:02 -0700329
David Tolnayf336b3b2020-04-30 08:45:54 -0700330#define FOR_EACH_RUST_VEC(MACRO) \
331 FOR_EACH_NUMERIC(MACRO) \
David Tolnay33f56ad2020-08-27 17:06:35 -0700332 MACRO(bool, bool) \
333 MACRO(string, rust::String)
David Tolnayf336b3b2020-04-30 08:45:54 -0700334
David Tolnay4e7e7c42020-04-24 14:48:07 -0700335extern "C" {
David Tolnayf336b3b2020-04-30 08:45:54 -0700336FOR_EACH_STD_VECTOR(STD_VECTOR_OPS)
337FOR_EACH_RUST_VEC(RUST_VEC_EXTERNS)
David Tolnay4e7e7c42020-04-24 14:48:07 -0700338} // extern "C"
David Tolnay6787be62020-04-25 11:01:02 -0700339
David Tolnay1768d8f2020-04-25 18:15:11 -0700340namespace rust {
David Tolnay8f16ae72020-10-08 18:21:13 -0700341inline namespace cxxbridge05 {
David Tolnayf336b3b2020-04-30 08:45:54 -0700342FOR_EACH_RUST_VEC(RUST_VEC_OPS)
David Tolnay8f16ae72020-10-08 18:21:13 -0700343} // namespace cxxbridge05
David Tolnay1768d8f2020-04-25 18:15:11 -0700344} // namespace rust