C++ std::vector<T> and Rust std::vec::Vec<T> support
Add basic std::vector and std::vec::Vec support across FFI boundary.
diff --git a/demo-cxx/demo.cc b/demo-cxx/demo.cc
index cd447ea..387c56a 100644
--- a/demo-cxx/demo.cc
+++ b/demo-cxx/demo.cc
@@ -9,13 +9,41 @@
ThingC::~ThingC() { std::cout << "done with ThingC" << std::endl; }
-std::unique_ptr<ThingC> make_demo(rust::Str appname) {
+std::unique_ptr<ThingC> make_demo(::rust::Str appname) {
return std::unique_ptr<ThingC>(new ThingC(std::string(appname)));
}
const std::string &get_name(const ThingC &thing) { return thing.appname; }
-void do_thing(SharedThing state) { print_r(*state.y); }
+std::unique_ptr<std::vector<uint8_t>> do_thing(SharedThing state) {
+ print_r(*state.y);
+ auto vec = std::unique_ptr<std::vector<uint8_t>>(new std::vector<uint8_t>());
+ for (uint8_t i = 0; i < 10; i++) {
+ vec->push_back(i * i);
+ }
+ return vec;
+}
+
+JsonBlob get_jb(const ::rust::Vec<uint8_t>& vec) {
+ JsonBlob retval;
+
+ std::cout << "incoming vec length is " << vec.size() << "\n";
+ auto vec_copy = static_cast<std::vector<uint8_t>>(vec);
+ std::cout << "vec_copy length is " << vec_copy.size() << "\n";
+ std::cout << "vec_copy[0] is " << (int)vec_copy[0] << "\n";
+
+ auto blob = std::unique_ptr<std::vector<uint8_t>>(new std::vector<uint8_t>());
+ for (uint8_t i = 0; i < 10; i++) {
+ blob->push_back(i * 2);
+ }
+
+ auto json = std::unique_ptr<std::string>(new std::string("{\"demo\": 23}"));
+
+ retval.json = std::move(json);
+ retval.blob = std::move(blob);
+
+ return retval;
+}
} // namespace example
} // namespace org