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