133d722a9Sopenharmony_ci{{#title rust::Vec<T> — Rust ♡ C++}} 233d722a9Sopenharmony_ci# rust::Vec\<T\> 333d722a9Sopenharmony_ci 433d722a9Sopenharmony_ci### Public API: 533d722a9Sopenharmony_ci 633d722a9Sopenharmony_ci```cpp,hidelines 733d722a9Sopenharmony_ci// rust/cxx.h 833d722a9Sopenharmony_ci# 933d722a9Sopenharmony_ci# #include <initializer_list> 1033d722a9Sopenharmony_ci# #include <iterator> 1133d722a9Sopenharmony_ci# #include <type_traits> 1233d722a9Sopenharmony_ci# 1333d722a9Sopenharmony_ci# namespace rust { 1433d722a9Sopenharmony_ci 1533d722a9Sopenharmony_citemplate <typename T> 1633d722a9Sopenharmony_ciclass Vec final { 1733d722a9Sopenharmony_cipublic: 1833d722a9Sopenharmony_ci using value_type = T; 1933d722a9Sopenharmony_ci 2033d722a9Sopenharmony_ci Vec() noexcept; 2133d722a9Sopenharmony_ci Vec(std::initializer_list<T>); 2233d722a9Sopenharmony_ci Vec(const Vec &); 2333d722a9Sopenharmony_ci Vec(Vec &&) noexcept; 2433d722a9Sopenharmony_ci ~Vec() noexcept; 2533d722a9Sopenharmony_ci 2633d722a9Sopenharmony_ci Vec &operator=(Vec &&) noexcept; 2733d722a9Sopenharmony_ci Vec &operator=(const Vec &); 2833d722a9Sopenharmony_ci 2933d722a9Sopenharmony_ci size_t size() const noexcept; 3033d722a9Sopenharmony_ci bool empty() const noexcept; 3133d722a9Sopenharmony_ci const T *data() const noexcept; 3233d722a9Sopenharmony_ci T *data() noexcept; 3333d722a9Sopenharmony_ci size_t capacity() const noexcept; 3433d722a9Sopenharmony_ci 3533d722a9Sopenharmony_ci const T &operator[](size_t n) const noexcept; 3633d722a9Sopenharmony_ci const T &at(size_t n) const; 3733d722a9Sopenharmony_ci const T &front() const; 3833d722a9Sopenharmony_ci const T &back() const; 3933d722a9Sopenharmony_ci 4033d722a9Sopenharmony_ci T &operator[](size_t n) noexcept; 4133d722a9Sopenharmony_ci T &at(size_t n); 4233d722a9Sopenharmony_ci T &front(); 4333d722a9Sopenharmony_ci T &back(); 4433d722a9Sopenharmony_ci 4533d722a9Sopenharmony_ci void reserve(size_t new_cap); 4633d722a9Sopenharmony_ci void push_back(const T &value); 4733d722a9Sopenharmony_ci void push_back(T &&value); 4833d722a9Sopenharmony_ci template <typename... Args> 4933d722a9Sopenharmony_ci void emplace_back(Args &&...args); 5033d722a9Sopenharmony_ci void truncate(size_t len); 5133d722a9Sopenharmony_ci void clear(); 5233d722a9Sopenharmony_ci 5333d722a9Sopenharmony_ci class iterator; 5433d722a9Sopenharmony_ci iterator begin() noexcept; 5533d722a9Sopenharmony_ci iterator end() noexcept; 5633d722a9Sopenharmony_ci 5733d722a9Sopenharmony_ci class const_iterator; 5833d722a9Sopenharmony_ci const_iterator begin() const noexcept; 5933d722a9Sopenharmony_ci const_iterator end() const noexcept; 6033d722a9Sopenharmony_ci const_iterator cbegin() const noexcept; 6133d722a9Sopenharmony_ci const_iterator cend() const noexcept; 6233d722a9Sopenharmony_ci 6333d722a9Sopenharmony_ci void swap(Vec &) noexcept; 6433d722a9Sopenharmony_ci}; 6533d722a9Sopenharmony_ci# 6633d722a9Sopenharmony_ci# template <typename T> 6733d722a9Sopenharmony_ci# class Vec<T>::iterator final { 6833d722a9Sopenharmony_ci# public: 6933d722a9Sopenharmony_ci# using iterator_category = std::random_access_iterator_tag; 7033d722a9Sopenharmony_ci# using value_type = T; 7133d722a9Sopenharmony_ci# using pointer = T *; 7233d722a9Sopenharmony_ci# using reference = T &; 7333d722a9Sopenharmony_ci# 7433d722a9Sopenharmony_ci# T &operator*() const noexcept; 7533d722a9Sopenharmony_ci# T *operator->() const noexcept; 7633d722a9Sopenharmony_ci# T &operator[](ptrdiff_t) const noexcept; 7733d722a9Sopenharmony_ci# 7833d722a9Sopenharmony_ci# iterator &operator++() noexcept; 7933d722a9Sopenharmony_ci# iterator operator++(int) noexcept; 8033d722a9Sopenharmony_ci# iterator &operator--() noexcept; 8133d722a9Sopenharmony_ci# iterator operator--(int) noexcept; 8233d722a9Sopenharmony_ci# 8333d722a9Sopenharmony_ci# iterator &operator+=(ptrdiff_t) noexcept; 8433d722a9Sopenharmony_ci# iterator &operator-=(ptrdiff_t) noexcept; 8533d722a9Sopenharmony_ci# iterator operator+(ptrdiff_t) const noexcept; 8633d722a9Sopenharmony_ci# iterator operator-(ptrdiff_t) const noexcept; 8733d722a9Sopenharmony_ci# ptrdiff_t operator-(const iterator &) const noexcept; 8833d722a9Sopenharmony_ci# 8933d722a9Sopenharmony_ci# bool operator==(const iterator &) const noexcept; 9033d722a9Sopenharmony_ci# bool operator!=(const iterator &) const noexcept; 9133d722a9Sopenharmony_ci# bool operator<(const iterator &) const noexcept; 9233d722a9Sopenharmony_ci# bool operator<=(const iterator &) const noexcept; 9333d722a9Sopenharmony_ci# bool operator>(const iterator &) const noexcept; 9433d722a9Sopenharmony_ci# bool operator>=(const iterator &) const noexcept; 9533d722a9Sopenharmony_ci# }; 9633d722a9Sopenharmony_ci# 9733d722a9Sopenharmony_ci# template <typename T> 9833d722a9Sopenharmony_ci# class Vec<T>::const_iterator final { 9933d722a9Sopenharmony_ci# public: 10033d722a9Sopenharmony_ci# using iterator_category = std::random_access_iterator_tag; 10133d722a9Sopenharmony_ci# using value_type = const T; 10233d722a9Sopenharmony_ci# using pointer = const T *; 10333d722a9Sopenharmony_ci# using reference = const T &; 10433d722a9Sopenharmony_ci# 10533d722a9Sopenharmony_ci# const T &operator*() const noexcept; 10633d722a9Sopenharmony_ci# const T *operator->() const noexcept; 10733d722a9Sopenharmony_ci# const T &operator[](ptrdiff_t) const noexcept; 10833d722a9Sopenharmony_ci# 10933d722a9Sopenharmony_ci# const_iterator &operator++() noexcept; 11033d722a9Sopenharmony_ci# const_iterator operator++(int) noexcept; 11133d722a9Sopenharmony_ci# const_iterator &operator--() noexcept; 11233d722a9Sopenharmony_ci# const_iterator operator--(int) noexcept; 11333d722a9Sopenharmony_ci# 11433d722a9Sopenharmony_ci# const_iterator &operator+=(ptrdiff_t) noexcept; 11533d722a9Sopenharmony_ci# const_iterator &operator-=(ptrdiff_t) noexcept; 11633d722a9Sopenharmony_ci# const_iterator operator+(ptrdiff_t) const noexcept; 11733d722a9Sopenharmony_ci# const_iterator operator-(ptrdiff_t) const noexcept; 11833d722a9Sopenharmony_ci# ptrdiff_t operator-(const const_iterator &) const noexcept; 11933d722a9Sopenharmony_ci# 12033d722a9Sopenharmony_ci# bool operator==(const const_iterator &) const noexcept; 12133d722a9Sopenharmony_ci# bool operator!=(const const_iterator &) const noexcept; 12233d722a9Sopenharmony_ci# bool operator<(const const_iterator &) const noexcept; 12333d722a9Sopenharmony_ci# bool operator<=(const const_iterator &) const noexcept; 12433d722a9Sopenharmony_ci# bool operator>(const const_iterator &) const noexcept; 12533d722a9Sopenharmony_ci# bool operator>=(const const_iterator &) const noexcept; 12633d722a9Sopenharmony_ci# }; 12733d722a9Sopenharmony_ci# 12833d722a9Sopenharmony_ci# } // namespace rust 12933d722a9Sopenharmony_ci``` 13033d722a9Sopenharmony_ci 13133d722a9Sopenharmony_ci### Restrictions: 13233d722a9Sopenharmony_ci 13333d722a9Sopenharmony_ciVec\<T\> does not support T being an opaque C++ type. You should use 13433d722a9Sopenharmony_ciCxxVector\<T\> (C++ std::vector\<T\>) instead for collections of opaque C++ 13533d722a9Sopenharmony_citypes on the language boundary. 13633d722a9Sopenharmony_ci 13733d722a9Sopenharmony_ci## Example 13833d722a9Sopenharmony_ci 13933d722a9Sopenharmony_ci```rust,noplayground 14033d722a9Sopenharmony_ci// src/main.rs 14133d722a9Sopenharmony_ci 14233d722a9Sopenharmony_ci#[cxx::bridge] 14333d722a9Sopenharmony_cimod ffi { 14433d722a9Sopenharmony_ci struct Shared { 14533d722a9Sopenharmony_ci v: u32, 14633d722a9Sopenharmony_ci } 14733d722a9Sopenharmony_ci 14833d722a9Sopenharmony_ci unsafe extern "C++" { 14933d722a9Sopenharmony_ci include!("example/include/example.h"); 15033d722a9Sopenharmony_ci 15133d722a9Sopenharmony_ci fn f(elements: Vec<Shared>); 15233d722a9Sopenharmony_ci } 15333d722a9Sopenharmony_ci} 15433d722a9Sopenharmony_ci 15533d722a9Sopenharmony_cifn main() { 15633d722a9Sopenharmony_ci let shared = |v| ffi::Shared { v }; 15733d722a9Sopenharmony_ci let elements = vec![shared(3), shared(2), shared(1)]; 15833d722a9Sopenharmony_ci ffi::f(elements); 15933d722a9Sopenharmony_ci} 16033d722a9Sopenharmony_ci``` 16133d722a9Sopenharmony_ci 16233d722a9Sopenharmony_ci```cpp 16333d722a9Sopenharmony_ci// include/example.h 16433d722a9Sopenharmony_ci 16533d722a9Sopenharmony_ci#pragma once 16633d722a9Sopenharmony_ci#include "example/src/main.rs.h" 16733d722a9Sopenharmony_ci#include "rust/cxx.h" 16833d722a9Sopenharmony_ci 16933d722a9Sopenharmony_civoid f(rust::Vec<Shared> elements); 17033d722a9Sopenharmony_ci``` 17133d722a9Sopenharmony_ci 17233d722a9Sopenharmony_ci```cpp 17333d722a9Sopenharmony_ci// src/example.cc 17433d722a9Sopenharmony_ci 17533d722a9Sopenharmony_ci#include "example/include/example.h" 17633d722a9Sopenharmony_ci#include <algorithm> 17733d722a9Sopenharmony_ci#include <cassert> 17833d722a9Sopenharmony_ci#include <iostream> 17933d722a9Sopenharmony_ci#include <iterator> 18033d722a9Sopenharmony_ci#include <vector> 18133d722a9Sopenharmony_ci 18233d722a9Sopenharmony_civoid f(rust::Vec<Shared> v) { 18333d722a9Sopenharmony_ci for (auto shared : v) { 18433d722a9Sopenharmony_ci std::cout << shared.v << std::endl; 18533d722a9Sopenharmony_ci } 18633d722a9Sopenharmony_ci 18733d722a9Sopenharmony_ci // Copy the elements to a C++ std::vector using STL algorithm. 18833d722a9Sopenharmony_ci std::vector<Shared> stdv; 18933d722a9Sopenharmony_ci std::copy(v.begin(), v.end(), std::back_inserter(stdv)); 19033d722a9Sopenharmony_ci assert(v.size() == stdv.size()); 19133d722a9Sopenharmony_ci} 19233d722a9Sopenharmony_ci``` 193