133d722a9Sopenharmony_ci#pragma once
233d722a9Sopenharmony_ci#include <algorithm>
333d722a9Sopenharmony_ci#include <array>
433d722a9Sopenharmony_ci#include <cassert>
533d722a9Sopenharmony_ci#include <cstddef>
633d722a9Sopenharmony_ci#include <cstdint>
733d722a9Sopenharmony_ci#include <exception>
833d722a9Sopenharmony_ci#include <initializer_list>
933d722a9Sopenharmony_ci#include <iosfwd>
1033d722a9Sopenharmony_ci#include <iterator>
1133d722a9Sopenharmony_ci#include <new>
1233d722a9Sopenharmony_ci#include <stdexcept>
1333d722a9Sopenharmony_ci#include <string>
1433d722a9Sopenharmony_ci#include <type_traits>
1533d722a9Sopenharmony_ci#include <utility>
1633d722a9Sopenharmony_ci#include <vector>
1733d722a9Sopenharmony_ci#if defined(_WIN32)
1833d722a9Sopenharmony_ci#include <basetsd.h>
1933d722a9Sopenharmony_ci#else
2033d722a9Sopenharmony_ci#include <sys/types.h>
2133d722a9Sopenharmony_ci#endif
2233d722a9Sopenharmony_ci
2333d722a9Sopenharmony_cinamespace rust {
2433d722a9Sopenharmony_ciinline namespace cxxbridge1 {
2533d722a9Sopenharmony_ci
2633d722a9Sopenharmony_cistruct unsafe_bitcopy_t;
2733d722a9Sopenharmony_ci
2833d722a9Sopenharmony_cinamespace {
2933d722a9Sopenharmony_citemplate <typename T>
3033d722a9Sopenharmony_ciclass impl;
3133d722a9Sopenharmony_ci}
3233d722a9Sopenharmony_ci
3333d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_RUST_STRING
3433d722a9Sopenharmony_ci#define CXXBRIDGE1_RUST_STRING
3533d722a9Sopenharmony_ci// https://cxx.rs/binding/string.html
3633d722a9Sopenharmony_ciclass String final {
3733d722a9Sopenharmony_cipublic:
3833d722a9Sopenharmony_ci  String() noexcept;
3933d722a9Sopenharmony_ci  String(const String &) noexcept;
4033d722a9Sopenharmony_ci  String(String &&) noexcept;
4133d722a9Sopenharmony_ci  ~String() noexcept;
4233d722a9Sopenharmony_ci
4333d722a9Sopenharmony_ci  String(const std::string &);
4433d722a9Sopenharmony_ci  String(const char *);
4533d722a9Sopenharmony_ci  String(const char *, std::size_t);
4633d722a9Sopenharmony_ci  String(const char16_t *);
4733d722a9Sopenharmony_ci  String(const char16_t *, std::size_t);
4833d722a9Sopenharmony_ci
4933d722a9Sopenharmony_ci  // Replace invalid Unicode data with the replacement character (U+FFFD).
5033d722a9Sopenharmony_ci  static String lossy(const std::string &) noexcept;
5133d722a9Sopenharmony_ci  static String lossy(const char *) noexcept;
5233d722a9Sopenharmony_ci  static String lossy(const char *, std::size_t) noexcept;
5333d722a9Sopenharmony_ci  static String lossy(const char16_t *) noexcept;
5433d722a9Sopenharmony_ci  static String lossy(const char16_t *, std::size_t) noexcept;
5533d722a9Sopenharmony_ci
5633d722a9Sopenharmony_ci  String &operator=(const String &) &noexcept;
5733d722a9Sopenharmony_ci  String &operator=(String &&) &noexcept;
5833d722a9Sopenharmony_ci
5933d722a9Sopenharmony_ci  explicit operator std::string() const;
6033d722a9Sopenharmony_ci
6133d722a9Sopenharmony_ci  // Note: no null terminator.
6233d722a9Sopenharmony_ci  const char *data() const noexcept;
6333d722a9Sopenharmony_ci  std::size_t size() const noexcept;
6433d722a9Sopenharmony_ci  std::size_t length() const noexcept;
6533d722a9Sopenharmony_ci  bool empty() const noexcept;
6633d722a9Sopenharmony_ci
6733d722a9Sopenharmony_ci  const char *c_str() noexcept;
6833d722a9Sopenharmony_ci
6933d722a9Sopenharmony_ci  std::size_t capacity() const noexcept;
7033d722a9Sopenharmony_ci  void reserve(size_t new_cap) noexcept;
7133d722a9Sopenharmony_ci
7233d722a9Sopenharmony_ci  using iterator = char *;
7333d722a9Sopenharmony_ci  iterator begin() noexcept;
7433d722a9Sopenharmony_ci  iterator end() noexcept;
7533d722a9Sopenharmony_ci
7633d722a9Sopenharmony_ci  using const_iterator = const char *;
7733d722a9Sopenharmony_ci  const_iterator begin() const noexcept;
7833d722a9Sopenharmony_ci  const_iterator end() const noexcept;
7933d722a9Sopenharmony_ci  const_iterator cbegin() const noexcept;
8033d722a9Sopenharmony_ci  const_iterator cend() const noexcept;
8133d722a9Sopenharmony_ci
8233d722a9Sopenharmony_ci  bool operator==(const String &) const noexcept;
8333d722a9Sopenharmony_ci  bool operator!=(const String &) const noexcept;
8433d722a9Sopenharmony_ci  bool operator<(const String &) const noexcept;
8533d722a9Sopenharmony_ci  bool operator<=(const String &) const noexcept;
8633d722a9Sopenharmony_ci  bool operator>(const String &) const noexcept;
8733d722a9Sopenharmony_ci  bool operator>=(const String &) const noexcept;
8833d722a9Sopenharmony_ci
8933d722a9Sopenharmony_ci  void swap(String &) noexcept;
9033d722a9Sopenharmony_ci
9133d722a9Sopenharmony_ci  // Internal API only intended for the cxxbridge code generator.
9233d722a9Sopenharmony_ci  String(unsafe_bitcopy_t, const String &) noexcept;
9333d722a9Sopenharmony_ci
9433d722a9Sopenharmony_ciprivate:
9533d722a9Sopenharmony_ci  struct lossy_t;
9633d722a9Sopenharmony_ci  String(lossy_t, const char *, std::size_t) noexcept;
9733d722a9Sopenharmony_ci  String(lossy_t, const char16_t *, std::size_t) noexcept;
9833d722a9Sopenharmony_ci  friend void swap(String &lhs, String &rhs) noexcept { lhs.swap(rhs); }
9933d722a9Sopenharmony_ci
10033d722a9Sopenharmony_ci  // Size and alignment statically verified by rust_string.rs.
10133d722a9Sopenharmony_ci  std::array<std::uintptr_t, 3> repr;
10233d722a9Sopenharmony_ci};
10333d722a9Sopenharmony_ci#endif // CXXBRIDGE1_RUST_STRING
10433d722a9Sopenharmony_ci
10533d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_RUST_STR
10633d722a9Sopenharmony_ci#define CXXBRIDGE1_RUST_STR
10733d722a9Sopenharmony_ci// https://cxx.rs/binding/str.html
10833d722a9Sopenharmony_ciclass Str final {
10933d722a9Sopenharmony_cipublic:
11033d722a9Sopenharmony_ci  Str() noexcept;
11133d722a9Sopenharmony_ci  Str(const String &) noexcept;
11233d722a9Sopenharmony_ci  Str(const std::string &);
11333d722a9Sopenharmony_ci  Str(const char *);
11433d722a9Sopenharmony_ci  Str(const char *, std::size_t);
11533d722a9Sopenharmony_ci
11633d722a9Sopenharmony_ci  Str &operator=(const Str &) &noexcept = default;
11733d722a9Sopenharmony_ci
11833d722a9Sopenharmony_ci  explicit operator std::string() const;
11933d722a9Sopenharmony_ci
12033d722a9Sopenharmony_ci  // Note: no null terminator.
12133d722a9Sopenharmony_ci  const char *data() const noexcept;
12233d722a9Sopenharmony_ci  std::size_t size() const noexcept;
12333d722a9Sopenharmony_ci  std::size_t length() const noexcept;
12433d722a9Sopenharmony_ci  bool empty() const noexcept;
12533d722a9Sopenharmony_ci
12633d722a9Sopenharmony_ci  // Important in order for System V ABI to pass in registers.
12733d722a9Sopenharmony_ci  Str(const Str &) noexcept = default;
12833d722a9Sopenharmony_ci  ~Str() noexcept = default;
12933d722a9Sopenharmony_ci
13033d722a9Sopenharmony_ci  using iterator = const char *;
13133d722a9Sopenharmony_ci  using const_iterator = const char *;
13233d722a9Sopenharmony_ci  const_iterator begin() const noexcept;
13333d722a9Sopenharmony_ci  const_iterator end() const noexcept;
13433d722a9Sopenharmony_ci  const_iterator cbegin() const noexcept;
13533d722a9Sopenharmony_ci  const_iterator cend() const noexcept;
13633d722a9Sopenharmony_ci
13733d722a9Sopenharmony_ci  bool operator==(const Str &) const noexcept;
13833d722a9Sopenharmony_ci  bool operator!=(const Str &) const noexcept;
13933d722a9Sopenharmony_ci  bool operator<(const Str &) const noexcept;
14033d722a9Sopenharmony_ci  bool operator<=(const Str &) const noexcept;
14133d722a9Sopenharmony_ci  bool operator>(const Str &) const noexcept;
14233d722a9Sopenharmony_ci  bool operator>=(const Str &) const noexcept;
14333d722a9Sopenharmony_ci
14433d722a9Sopenharmony_ci  void swap(Str &) noexcept;
14533d722a9Sopenharmony_ci
14633d722a9Sopenharmony_ciprivate:
14733d722a9Sopenharmony_ci  class uninit;
14833d722a9Sopenharmony_ci  Str(uninit) noexcept;
14933d722a9Sopenharmony_ci  friend impl<Str>;
15033d722a9Sopenharmony_ci
15133d722a9Sopenharmony_ci  std::array<std::uintptr_t, 2> repr;
15233d722a9Sopenharmony_ci};
15333d722a9Sopenharmony_ci#endif // CXXBRIDGE1_RUST_STR
15433d722a9Sopenharmony_ci
15533d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_RUST_SLICE
15633d722a9Sopenharmony_cinamespace detail {
15733d722a9Sopenharmony_citemplate <bool>
15833d722a9Sopenharmony_cistruct copy_assignable_if {};
15933d722a9Sopenharmony_ci
16033d722a9Sopenharmony_citemplate <>
16133d722a9Sopenharmony_cistruct copy_assignable_if<false> {
16233d722a9Sopenharmony_ci  copy_assignable_if() noexcept = default;
16333d722a9Sopenharmony_ci  copy_assignable_if(const copy_assignable_if &) noexcept = default;
16433d722a9Sopenharmony_ci  copy_assignable_if &operator=(const copy_assignable_if &) &noexcept = delete;
16533d722a9Sopenharmony_ci  copy_assignable_if &operator=(copy_assignable_if &&) &noexcept = default;
16633d722a9Sopenharmony_ci};
16733d722a9Sopenharmony_ci} // namespace detail
16833d722a9Sopenharmony_ci
16933d722a9Sopenharmony_ci// https://cxx.rs/binding/slice.html
17033d722a9Sopenharmony_citemplate <typename T>
17133d722a9Sopenharmony_ciclass Slice final
17233d722a9Sopenharmony_ci    : private detail::copy_assignable_if<std::is_const<T>::value> {
17333d722a9Sopenharmony_cipublic:
17433d722a9Sopenharmony_ci  using value_type = T;
17533d722a9Sopenharmony_ci
17633d722a9Sopenharmony_ci  Slice() noexcept;
17733d722a9Sopenharmony_ci  Slice(T *, std::size_t count) noexcept;
17833d722a9Sopenharmony_ci
17933d722a9Sopenharmony_ci  Slice &operator=(const Slice<T> &) &noexcept = default;
18033d722a9Sopenharmony_ci  Slice &operator=(Slice<T> &&) &noexcept = default;
18133d722a9Sopenharmony_ci
18233d722a9Sopenharmony_ci  T *data() const noexcept;
18333d722a9Sopenharmony_ci  std::size_t size() const noexcept;
18433d722a9Sopenharmony_ci  std::size_t length() const noexcept;
18533d722a9Sopenharmony_ci  bool empty() const noexcept;
18633d722a9Sopenharmony_ci
18733d722a9Sopenharmony_ci  T &operator[](std::size_t n) const noexcept;
18833d722a9Sopenharmony_ci  T &at(std::size_t n) const;
18933d722a9Sopenharmony_ci  T &front() const noexcept;
19033d722a9Sopenharmony_ci  T &back() const noexcept;
19133d722a9Sopenharmony_ci
19233d722a9Sopenharmony_ci  // Important in order for System V ABI to pass in registers.
19333d722a9Sopenharmony_ci  Slice(const Slice<T> &) noexcept = default;
19433d722a9Sopenharmony_ci  ~Slice() noexcept = default;
19533d722a9Sopenharmony_ci
19633d722a9Sopenharmony_ci  class iterator;
19733d722a9Sopenharmony_ci  iterator begin() const noexcept;
19833d722a9Sopenharmony_ci  iterator end() const noexcept;
19933d722a9Sopenharmony_ci
20033d722a9Sopenharmony_ci  void swap(Slice &) noexcept;
20133d722a9Sopenharmony_ci
20233d722a9Sopenharmony_ciprivate:
20333d722a9Sopenharmony_ci  class uninit;
20433d722a9Sopenharmony_ci  Slice(uninit) noexcept;
20533d722a9Sopenharmony_ci  friend impl<Slice>;
20633d722a9Sopenharmony_ci  friend void sliceInit(void *, const void *, std::size_t) noexcept;
20733d722a9Sopenharmony_ci  friend void *slicePtr(const void *) noexcept;
20833d722a9Sopenharmony_ci  friend std::size_t sliceLen(const void *) noexcept;
20933d722a9Sopenharmony_ci
21033d722a9Sopenharmony_ci  std::array<std::uintptr_t, 2> repr;
21133d722a9Sopenharmony_ci};
21233d722a9Sopenharmony_ci
21333d722a9Sopenharmony_citemplate <typename T>
21433d722a9Sopenharmony_ciclass Slice<T>::iterator final {
21533d722a9Sopenharmony_cipublic:
21633d722a9Sopenharmony_ci  using iterator_category = std::random_access_iterator_tag;
21733d722a9Sopenharmony_ci  using value_type = T;
21833d722a9Sopenharmony_ci  using difference_type = std::ptrdiff_t;
21933d722a9Sopenharmony_ci  using pointer = typename std::add_pointer<T>::type;
22033d722a9Sopenharmony_ci  using reference = typename std::add_lvalue_reference<T>::type;
22133d722a9Sopenharmony_ci
22233d722a9Sopenharmony_ci  reference operator*() const noexcept;
22333d722a9Sopenharmony_ci  pointer operator->() const noexcept;
22433d722a9Sopenharmony_ci  reference operator[](difference_type) const noexcept;
22533d722a9Sopenharmony_ci
22633d722a9Sopenharmony_ci  iterator &operator++() noexcept;
22733d722a9Sopenharmony_ci  iterator operator++(int) noexcept;
22833d722a9Sopenharmony_ci  iterator &operator--() noexcept;
22933d722a9Sopenharmony_ci  iterator operator--(int) noexcept;
23033d722a9Sopenharmony_ci
23133d722a9Sopenharmony_ci  iterator &operator+=(difference_type) noexcept;
23233d722a9Sopenharmony_ci  iterator &operator-=(difference_type) noexcept;
23333d722a9Sopenharmony_ci  iterator operator+(difference_type) const noexcept;
23433d722a9Sopenharmony_ci  iterator operator-(difference_type) const noexcept;
23533d722a9Sopenharmony_ci  difference_type operator-(const iterator &) const noexcept;
23633d722a9Sopenharmony_ci
23733d722a9Sopenharmony_ci  bool operator==(const iterator &) const noexcept;
23833d722a9Sopenharmony_ci  bool operator!=(const iterator &) const noexcept;
23933d722a9Sopenharmony_ci  bool operator<(const iterator &) const noexcept;
24033d722a9Sopenharmony_ci  bool operator<=(const iterator &) const noexcept;
24133d722a9Sopenharmony_ci  bool operator>(const iterator &) const noexcept;
24233d722a9Sopenharmony_ci  bool operator>=(const iterator &) const noexcept;
24333d722a9Sopenharmony_ci
24433d722a9Sopenharmony_ciprivate:
24533d722a9Sopenharmony_ci  friend class Slice;
24633d722a9Sopenharmony_ci  void *pos;
24733d722a9Sopenharmony_ci  std::size_t stride;
24833d722a9Sopenharmony_ci};
24933d722a9Sopenharmony_ci#endif // CXXBRIDGE1_RUST_SLICE
25033d722a9Sopenharmony_ci
25133d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_RUST_BOX
25233d722a9Sopenharmony_ci// https://cxx.rs/binding/box.html
25333d722a9Sopenharmony_citemplate <typename T>
25433d722a9Sopenharmony_ciclass Box final {
25533d722a9Sopenharmony_cipublic:
25633d722a9Sopenharmony_ci  using element_type = T;
25733d722a9Sopenharmony_ci  using const_pointer =
25833d722a9Sopenharmony_ci      typename std::add_pointer<typename std::add_const<T>::type>::type;
25933d722a9Sopenharmony_ci  using pointer = typename std::add_pointer<T>::type;
26033d722a9Sopenharmony_ci
26133d722a9Sopenharmony_ci  Box() = delete;
26233d722a9Sopenharmony_ci  Box(Box &&) noexcept;
26333d722a9Sopenharmony_ci  ~Box() noexcept;
26433d722a9Sopenharmony_ci
26533d722a9Sopenharmony_ci  explicit Box(const T &);
26633d722a9Sopenharmony_ci  explicit Box(T &&);
26733d722a9Sopenharmony_ci
26833d722a9Sopenharmony_ci  Box &operator=(Box &&) &noexcept;
26933d722a9Sopenharmony_ci
27033d722a9Sopenharmony_ci  const T *operator->() const noexcept;
27133d722a9Sopenharmony_ci  const T &operator*() const noexcept;
27233d722a9Sopenharmony_ci  T *operator->() noexcept;
27333d722a9Sopenharmony_ci  T &operator*() noexcept;
27433d722a9Sopenharmony_ci
27533d722a9Sopenharmony_ci  template <typename... Fields>
27633d722a9Sopenharmony_ci  static Box in_place(Fields &&...);
27733d722a9Sopenharmony_ci
27833d722a9Sopenharmony_ci  void swap(Box &) noexcept;
27933d722a9Sopenharmony_ci
28033d722a9Sopenharmony_ci  // Important: requires that `raw` came from an into_raw call. Do not pass a
28133d722a9Sopenharmony_ci  // pointer from `new` or any other source.
28233d722a9Sopenharmony_ci  static Box from_raw(T *) noexcept;
28333d722a9Sopenharmony_ci
28433d722a9Sopenharmony_ci  T *into_raw() noexcept;
28533d722a9Sopenharmony_ci
28633d722a9Sopenharmony_ci  /* Deprecated */ using value_type = element_type;
28733d722a9Sopenharmony_ci
28833d722a9Sopenharmony_ciprivate:
28933d722a9Sopenharmony_ci  class uninit;
29033d722a9Sopenharmony_ci  class allocation;
29133d722a9Sopenharmony_ci  Box(uninit) noexcept;
29233d722a9Sopenharmony_ci  void drop() noexcept;
29333d722a9Sopenharmony_ci
29433d722a9Sopenharmony_ci  friend void swap(Box &lhs, Box &rhs) noexcept { lhs.swap(rhs); }
29533d722a9Sopenharmony_ci
29633d722a9Sopenharmony_ci  T *ptr;
29733d722a9Sopenharmony_ci};
29833d722a9Sopenharmony_ci#endif // CXXBRIDGE1_RUST_BOX
29933d722a9Sopenharmony_ci
30033d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_RUST_VEC
30133d722a9Sopenharmony_ci// https://cxx.rs/binding/vec.html
30233d722a9Sopenharmony_citemplate <typename T>
30333d722a9Sopenharmony_ciclass Vec final {
30433d722a9Sopenharmony_cipublic:
30533d722a9Sopenharmony_ci  using value_type = T;
30633d722a9Sopenharmony_ci
30733d722a9Sopenharmony_ci  Vec() noexcept;
30833d722a9Sopenharmony_ci  Vec(std::initializer_list<T>);
30933d722a9Sopenharmony_ci  Vec(const Vec &);
31033d722a9Sopenharmony_ci  Vec(Vec &&) noexcept;
31133d722a9Sopenharmony_ci  ~Vec() noexcept;
31233d722a9Sopenharmony_ci
31333d722a9Sopenharmony_ci  Vec &operator=(Vec &&) &noexcept;
31433d722a9Sopenharmony_ci  Vec &operator=(const Vec &) &;
31533d722a9Sopenharmony_ci
31633d722a9Sopenharmony_ci  std::size_t size() const noexcept;
31733d722a9Sopenharmony_ci  bool empty() const noexcept;
31833d722a9Sopenharmony_ci  const T *data() const noexcept;
31933d722a9Sopenharmony_ci  T *data() noexcept;
32033d722a9Sopenharmony_ci  std::size_t capacity() const noexcept;
32133d722a9Sopenharmony_ci
32233d722a9Sopenharmony_ci  const T &operator[](std::size_t n) const noexcept;
32333d722a9Sopenharmony_ci  const T &at(std::size_t n) const;
32433d722a9Sopenharmony_ci  const T &front() const noexcept;
32533d722a9Sopenharmony_ci  const T &back() const noexcept;
32633d722a9Sopenharmony_ci
32733d722a9Sopenharmony_ci  T &operator[](std::size_t n) noexcept;
32833d722a9Sopenharmony_ci  T &at(std::size_t n);
32933d722a9Sopenharmony_ci  T &front() noexcept;
33033d722a9Sopenharmony_ci  T &back() noexcept;
33133d722a9Sopenharmony_ci
33233d722a9Sopenharmony_ci  void reserve(std::size_t new_cap);
33333d722a9Sopenharmony_ci  void push_back(const T &value);
33433d722a9Sopenharmony_ci  void push_back(T &&value);
33533d722a9Sopenharmony_ci  template <typename... Args>
33633d722a9Sopenharmony_ci  void emplace_back(Args &&...args);
33733d722a9Sopenharmony_ci  void truncate(std::size_t len);
33833d722a9Sopenharmony_ci  void clear();
33933d722a9Sopenharmony_ci
34033d722a9Sopenharmony_ci  using iterator = typename Slice<T>::iterator;
34133d722a9Sopenharmony_ci  iterator begin() noexcept;
34233d722a9Sopenharmony_ci  iterator end() noexcept;
34333d722a9Sopenharmony_ci
34433d722a9Sopenharmony_ci  using const_iterator = typename Slice<const T>::iterator;
34533d722a9Sopenharmony_ci  const_iterator begin() const noexcept;
34633d722a9Sopenharmony_ci  const_iterator end() const noexcept;
34733d722a9Sopenharmony_ci  const_iterator cbegin() const noexcept;
34833d722a9Sopenharmony_ci  const_iterator cend() const noexcept;
34933d722a9Sopenharmony_ci
35033d722a9Sopenharmony_ci  void swap(Vec &) noexcept;
35133d722a9Sopenharmony_ci
35233d722a9Sopenharmony_ci  // Internal API only intended for the cxxbridge code generator.
35333d722a9Sopenharmony_ci  Vec(unsafe_bitcopy_t, const Vec &) noexcept;
35433d722a9Sopenharmony_ci
35533d722a9Sopenharmony_ciprivate:
35633d722a9Sopenharmony_ci  void reserve_total(std::size_t new_cap) noexcept;
35733d722a9Sopenharmony_ci  void set_len(std::size_t len) noexcept;
35833d722a9Sopenharmony_ci  void drop() noexcept;
35933d722a9Sopenharmony_ci
36033d722a9Sopenharmony_ci  friend void swap(Vec &lhs, Vec &rhs) noexcept { lhs.swap(rhs); }
36133d722a9Sopenharmony_ci
36233d722a9Sopenharmony_ci  // Size and alignment statically verified by rust_vec.rs.
36333d722a9Sopenharmony_ci  std::array<std::uintptr_t, 3> repr;
36433d722a9Sopenharmony_ci};
36533d722a9Sopenharmony_ci#endif // CXXBRIDGE1_RUST_VEC
36633d722a9Sopenharmony_ci
36733d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_RUST_FN
36833d722a9Sopenharmony_ci// https://cxx.rs/binding/fn.html
36933d722a9Sopenharmony_citemplate <typename Signature>
37033d722a9Sopenharmony_ciclass Fn;
37133d722a9Sopenharmony_ci
37233d722a9Sopenharmony_citemplate <typename Ret, typename... Args>
37333d722a9Sopenharmony_ciclass Fn<Ret(Args...)> final {
37433d722a9Sopenharmony_cipublic:
37533d722a9Sopenharmony_ci  Ret operator()(Args... args) const noexcept;
37633d722a9Sopenharmony_ci  Fn operator*() const noexcept;
37733d722a9Sopenharmony_ci
37833d722a9Sopenharmony_ciprivate:
37933d722a9Sopenharmony_ci  Ret (*trampoline)(Args..., void *fn) noexcept;
38033d722a9Sopenharmony_ci  void *fn;
38133d722a9Sopenharmony_ci};
38233d722a9Sopenharmony_ci#endif // CXXBRIDGE1_RUST_FN
38333d722a9Sopenharmony_ci
38433d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_RUST_ERROR
38533d722a9Sopenharmony_ci#define CXXBRIDGE1_RUST_ERROR
38633d722a9Sopenharmony_ci// https://cxx.rs/binding/result.html
38733d722a9Sopenharmony_ciclass Error final : public std::exception {
38833d722a9Sopenharmony_cipublic:
38933d722a9Sopenharmony_ci  Error(const Error &);
39033d722a9Sopenharmony_ci  Error(Error &&) noexcept;
39133d722a9Sopenharmony_ci  ~Error() noexcept override;
39233d722a9Sopenharmony_ci
39333d722a9Sopenharmony_ci  Error &operator=(const Error &) &;
39433d722a9Sopenharmony_ci  Error &operator=(Error &&) &noexcept;
39533d722a9Sopenharmony_ci
39633d722a9Sopenharmony_ci  const char *what() const noexcept override;
39733d722a9Sopenharmony_ci
39833d722a9Sopenharmony_ciprivate:
39933d722a9Sopenharmony_ci  Error() noexcept = default;
40033d722a9Sopenharmony_ci  friend impl<Error>;
40133d722a9Sopenharmony_ci  const char *msg;
40233d722a9Sopenharmony_ci  std::size_t len;
40333d722a9Sopenharmony_ci};
40433d722a9Sopenharmony_ci#endif // CXXBRIDGE1_RUST_ERROR
40533d722a9Sopenharmony_ci
40633d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_RUST_ISIZE
40733d722a9Sopenharmony_ci#define CXXBRIDGE1_RUST_ISIZE
40833d722a9Sopenharmony_ci#if defined(_WIN32)
40933d722a9Sopenharmony_ciusing isize = SSIZE_T;
41033d722a9Sopenharmony_ci#else
41133d722a9Sopenharmony_ciusing isize = ssize_t;
41233d722a9Sopenharmony_ci#endif
41333d722a9Sopenharmony_ci#endif // CXXBRIDGE1_RUST_ISIZE
41433d722a9Sopenharmony_ci
41533d722a9Sopenharmony_cistd::ostream &operator<<(std::ostream &, const String &);
41633d722a9Sopenharmony_cistd::ostream &operator<<(std::ostream &, const Str &);
41733d722a9Sopenharmony_ci
41833d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_RUST_OPAQUE
41933d722a9Sopenharmony_ci#define CXXBRIDGE1_RUST_OPAQUE
42033d722a9Sopenharmony_ci// Base class of generated opaque Rust types.
42133d722a9Sopenharmony_ciclass Opaque {
42233d722a9Sopenharmony_cipublic:
42333d722a9Sopenharmony_ci  Opaque() = delete;
42433d722a9Sopenharmony_ci  Opaque(const Opaque &) = delete;
42533d722a9Sopenharmony_ci  ~Opaque() = delete;
42633d722a9Sopenharmony_ci};
42733d722a9Sopenharmony_ci#endif // CXXBRIDGE1_RUST_OPAQUE
42833d722a9Sopenharmony_ci
42933d722a9Sopenharmony_citemplate <typename T>
43033d722a9Sopenharmony_cistd::size_t size_of();
43133d722a9Sopenharmony_citemplate <typename T>
43233d722a9Sopenharmony_cistd::size_t align_of();
43333d722a9Sopenharmony_ci
43433d722a9Sopenharmony_ci// IsRelocatable<T> is used in assertions that a C++ type passed by value
43533d722a9Sopenharmony_ci// between Rust and C++ is soundly relocatable by Rust.
43633d722a9Sopenharmony_ci//
43733d722a9Sopenharmony_ci// There may be legitimate reasons to opt out of the check for support of types
43833d722a9Sopenharmony_ci// that the programmer knows are soundly Rust-movable despite not being
43933d722a9Sopenharmony_ci// recognized as such by the C++ type system due to a move constructor or
44033d722a9Sopenharmony_ci// destructor. To opt out of the relocatability check, do either of the
44133d722a9Sopenharmony_ci// following things in any header used by `include!` in the bridge.
44233d722a9Sopenharmony_ci//
44333d722a9Sopenharmony_ci//      --- if you define the type:
44433d722a9Sopenharmony_ci//      struct MyType {
44533d722a9Sopenharmony_ci//        ...
44633d722a9Sopenharmony_ci//    +   using IsRelocatable = std::true_type;
44733d722a9Sopenharmony_ci//      };
44833d722a9Sopenharmony_ci//
44933d722a9Sopenharmony_ci//      --- otherwise:
45033d722a9Sopenharmony_ci//    + template <>
45133d722a9Sopenharmony_ci//    + struct rust::IsRelocatable<MyType> : std::true_type {};
45233d722a9Sopenharmony_citemplate <typename T>
45333d722a9Sopenharmony_cistruct IsRelocatable;
45433d722a9Sopenharmony_ci
45533d722a9Sopenharmony_ciusing u8 = std::uint8_t;
45633d722a9Sopenharmony_ciusing u16 = std::uint16_t;
45733d722a9Sopenharmony_ciusing u32 = std::uint32_t;
45833d722a9Sopenharmony_ciusing u64 = std::uint64_t;
45933d722a9Sopenharmony_ciusing usize = std::size_t; // see static asserts in cxx.cc
46033d722a9Sopenharmony_ciusing i8 = std::int8_t;
46133d722a9Sopenharmony_ciusing i16 = std::int16_t;
46233d722a9Sopenharmony_ciusing i32 = std::int32_t;
46333d722a9Sopenharmony_ciusing i64 = std::int64_t;
46433d722a9Sopenharmony_ciusing f32 = float;
46533d722a9Sopenharmony_ciusing f64 = double;
46633d722a9Sopenharmony_ci
46733d722a9Sopenharmony_ci// Snake case aliases for use in code that uses this style for type names.
46833d722a9Sopenharmony_ciusing string = String;
46933d722a9Sopenharmony_ciusing str = Str;
47033d722a9Sopenharmony_citemplate <typename T>
47133d722a9Sopenharmony_ciusing slice = Slice<T>;
47233d722a9Sopenharmony_citemplate <typename T>
47333d722a9Sopenharmony_ciusing box = Box<T>;
47433d722a9Sopenharmony_citemplate <typename T>
47533d722a9Sopenharmony_ciusing vec = Vec<T>;
47633d722a9Sopenharmony_ciusing error = Error;
47733d722a9Sopenharmony_citemplate <typename Signature>
47833d722a9Sopenharmony_ciusing fn = Fn<Signature>;
47933d722a9Sopenharmony_citemplate <typename T>
48033d722a9Sopenharmony_ciusing is_relocatable = IsRelocatable<T>;
48133d722a9Sopenharmony_ci
48233d722a9Sopenharmony_ci
48333d722a9Sopenharmony_ci
48433d722a9Sopenharmony_ci////////////////////////////////////////////////////////////////////////////////
48533d722a9Sopenharmony_ci/// end public API, begin implementation details
48633d722a9Sopenharmony_ci
48733d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_PANIC
48833d722a9Sopenharmony_ci#define CXXBRIDGE1_PANIC
48933d722a9Sopenharmony_citemplate <typename Exception>
49033d722a9Sopenharmony_civoid panic [[noreturn]] (const char *msg);
49133d722a9Sopenharmony_ci#endif // CXXBRIDGE1_PANIC
49233d722a9Sopenharmony_ci
49333d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_RUST_FN
49433d722a9Sopenharmony_ci#define CXXBRIDGE1_RUST_FN
49533d722a9Sopenharmony_citemplate <typename Ret, typename... Args>
49633d722a9Sopenharmony_ciRet Fn<Ret(Args...)>::operator()(Args... args) const noexcept {
49733d722a9Sopenharmony_ci  return (*this->trampoline)(std::forward<Args>(args)..., this->fn);
49833d722a9Sopenharmony_ci}
49933d722a9Sopenharmony_ci
50033d722a9Sopenharmony_citemplate <typename Ret, typename... Args>
50133d722a9Sopenharmony_ciFn<Ret(Args...)> Fn<Ret(Args...)>::operator*() const noexcept {
50233d722a9Sopenharmony_ci  return *this;
50333d722a9Sopenharmony_ci}
50433d722a9Sopenharmony_ci#endif // CXXBRIDGE1_RUST_FN
50533d722a9Sopenharmony_ci
50633d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_RUST_BITCOPY_T
50733d722a9Sopenharmony_ci#define CXXBRIDGE1_RUST_BITCOPY_T
50833d722a9Sopenharmony_cistruct unsafe_bitcopy_t final {
50933d722a9Sopenharmony_ci  explicit unsafe_bitcopy_t() = default;
51033d722a9Sopenharmony_ci};
51133d722a9Sopenharmony_ci#endif // CXXBRIDGE1_RUST_BITCOPY_T
51233d722a9Sopenharmony_ci
51333d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_RUST_BITCOPY
51433d722a9Sopenharmony_ci#define CXXBRIDGE1_RUST_BITCOPY
51533d722a9Sopenharmony_ciconstexpr unsafe_bitcopy_t unsafe_bitcopy{};
51633d722a9Sopenharmony_ci#endif // CXXBRIDGE1_RUST_BITCOPY
51733d722a9Sopenharmony_ci
51833d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_RUST_SLICE
51933d722a9Sopenharmony_ci#define CXXBRIDGE1_RUST_SLICE
52033d722a9Sopenharmony_citemplate <typename T>
52133d722a9Sopenharmony_ciSlice<T>::Slice() noexcept {
52233d722a9Sopenharmony_ci  sliceInit(this, reinterpret_cast<void *>(align_of<T>()), 0);
52333d722a9Sopenharmony_ci}
52433d722a9Sopenharmony_ci
52533d722a9Sopenharmony_citemplate <typename T>
52633d722a9Sopenharmony_ciSlice<T>::Slice(T *s, std::size_t count) noexcept {
52733d722a9Sopenharmony_ci  assert(s != nullptr || count == 0);
52833d722a9Sopenharmony_ci  sliceInit(this,
52933d722a9Sopenharmony_ci            s == nullptr && count == 0
53033d722a9Sopenharmony_ci                ? reinterpret_cast<void *>(align_of<T>())
53133d722a9Sopenharmony_ci                : const_cast<typename std::remove_const<T>::type *>(s),
53233d722a9Sopenharmony_ci            count);
53333d722a9Sopenharmony_ci}
53433d722a9Sopenharmony_ci
53533d722a9Sopenharmony_citemplate <typename T>
53633d722a9Sopenharmony_ciT *Slice<T>::data() const noexcept {
53733d722a9Sopenharmony_ci  return reinterpret_cast<T *>(slicePtr(this));
53833d722a9Sopenharmony_ci}
53933d722a9Sopenharmony_ci
54033d722a9Sopenharmony_citemplate <typename T>
54133d722a9Sopenharmony_cistd::size_t Slice<T>::size() const noexcept {
54233d722a9Sopenharmony_ci  return sliceLen(this);
54333d722a9Sopenharmony_ci}
54433d722a9Sopenharmony_ci
54533d722a9Sopenharmony_citemplate <typename T>
54633d722a9Sopenharmony_cistd::size_t Slice<T>::length() const noexcept {
54733d722a9Sopenharmony_ci  return this->size();
54833d722a9Sopenharmony_ci}
54933d722a9Sopenharmony_ci
55033d722a9Sopenharmony_citemplate <typename T>
55133d722a9Sopenharmony_cibool Slice<T>::empty() const noexcept {
55233d722a9Sopenharmony_ci  return this->size() == 0;
55333d722a9Sopenharmony_ci}
55433d722a9Sopenharmony_ci
55533d722a9Sopenharmony_citemplate <typename T>
55633d722a9Sopenharmony_ciT &Slice<T>::operator[](std::size_t n) const noexcept {
55733d722a9Sopenharmony_ci  assert(n < this->size());
55833d722a9Sopenharmony_ci  auto ptr = static_cast<char *>(slicePtr(this)) + size_of<T>() * n;
55933d722a9Sopenharmony_ci  return *reinterpret_cast<T *>(ptr);
56033d722a9Sopenharmony_ci}
56133d722a9Sopenharmony_ci
56233d722a9Sopenharmony_citemplate <typename T>
56333d722a9Sopenharmony_ciT &Slice<T>::at(std::size_t n) const {
56433d722a9Sopenharmony_ci  if (n >= this->size()) {
56533d722a9Sopenharmony_ci    panic<std::out_of_range>("rust::Slice index out of range");
56633d722a9Sopenharmony_ci  }
56733d722a9Sopenharmony_ci  return (*this)[n];
56833d722a9Sopenharmony_ci}
56933d722a9Sopenharmony_ci
57033d722a9Sopenharmony_citemplate <typename T>
57133d722a9Sopenharmony_ciT &Slice<T>::front() const noexcept {
57233d722a9Sopenharmony_ci  assert(!this->empty());
57333d722a9Sopenharmony_ci  return (*this)[0];
57433d722a9Sopenharmony_ci}
57533d722a9Sopenharmony_ci
57633d722a9Sopenharmony_citemplate <typename T>
57733d722a9Sopenharmony_ciT &Slice<T>::back() const noexcept {
57833d722a9Sopenharmony_ci  assert(!this->empty());
57933d722a9Sopenharmony_ci  return (*this)[this->size() - 1];
58033d722a9Sopenharmony_ci}
58133d722a9Sopenharmony_ci
58233d722a9Sopenharmony_citemplate <typename T>
58333d722a9Sopenharmony_citypename Slice<T>::iterator::reference
58433d722a9Sopenharmony_ciSlice<T>::iterator::operator*() const noexcept {
58533d722a9Sopenharmony_ci  return *static_cast<T *>(this->pos);
58633d722a9Sopenharmony_ci}
58733d722a9Sopenharmony_ci
58833d722a9Sopenharmony_citemplate <typename T>
58933d722a9Sopenharmony_citypename Slice<T>::iterator::pointer
59033d722a9Sopenharmony_ciSlice<T>::iterator::operator->() const noexcept {
59133d722a9Sopenharmony_ci  return static_cast<T *>(this->pos);
59233d722a9Sopenharmony_ci}
59333d722a9Sopenharmony_ci
59433d722a9Sopenharmony_citemplate <typename T>
59533d722a9Sopenharmony_citypename Slice<T>::iterator::reference Slice<T>::iterator::operator[](
59633d722a9Sopenharmony_ci    typename Slice<T>::iterator::difference_type n) const noexcept {
59733d722a9Sopenharmony_ci  auto ptr = static_cast<char *>(this->pos) + this->stride * n;
59833d722a9Sopenharmony_ci  return *reinterpret_cast<T *>(ptr);
59933d722a9Sopenharmony_ci}
60033d722a9Sopenharmony_ci
60133d722a9Sopenharmony_citemplate <typename T>
60233d722a9Sopenharmony_citypename Slice<T>::iterator &Slice<T>::iterator::operator++() noexcept {
60333d722a9Sopenharmony_ci  this->pos = static_cast<char *>(this->pos) + this->stride;
60433d722a9Sopenharmony_ci  return *this;
60533d722a9Sopenharmony_ci}
60633d722a9Sopenharmony_ci
60733d722a9Sopenharmony_citemplate <typename T>
60833d722a9Sopenharmony_citypename Slice<T>::iterator Slice<T>::iterator::operator++(int) noexcept {
60933d722a9Sopenharmony_ci  auto ret = iterator(*this);
61033d722a9Sopenharmony_ci  this->pos = static_cast<char *>(this->pos) + this->stride;
61133d722a9Sopenharmony_ci  return ret;
61233d722a9Sopenharmony_ci}
61333d722a9Sopenharmony_ci
61433d722a9Sopenharmony_citemplate <typename T>
61533d722a9Sopenharmony_citypename Slice<T>::iterator &Slice<T>::iterator::operator--() noexcept {
61633d722a9Sopenharmony_ci  this->pos = static_cast<char *>(this->pos) - this->stride;
61733d722a9Sopenharmony_ci  return *this;
61833d722a9Sopenharmony_ci}
61933d722a9Sopenharmony_ci
62033d722a9Sopenharmony_citemplate <typename T>
62133d722a9Sopenharmony_citypename Slice<T>::iterator Slice<T>::iterator::operator--(int) noexcept {
62233d722a9Sopenharmony_ci  auto ret = iterator(*this);
62333d722a9Sopenharmony_ci  this->pos = static_cast<char *>(this->pos) - this->stride;
62433d722a9Sopenharmony_ci  return ret;
62533d722a9Sopenharmony_ci}
62633d722a9Sopenharmony_ci
62733d722a9Sopenharmony_citemplate <typename T>
62833d722a9Sopenharmony_citypename Slice<T>::iterator &Slice<T>::iterator::operator+=(
62933d722a9Sopenharmony_ci    typename Slice<T>::iterator::difference_type n) noexcept {
63033d722a9Sopenharmony_ci  this->pos = static_cast<char *>(this->pos) + this->stride * n;
63133d722a9Sopenharmony_ci  return *this;
63233d722a9Sopenharmony_ci}
63333d722a9Sopenharmony_ci
63433d722a9Sopenharmony_citemplate <typename T>
63533d722a9Sopenharmony_citypename Slice<T>::iterator &Slice<T>::iterator::operator-=(
63633d722a9Sopenharmony_ci    typename Slice<T>::iterator::difference_type n) noexcept {
63733d722a9Sopenharmony_ci  this->pos = static_cast<char *>(this->pos) - this->stride * n;
63833d722a9Sopenharmony_ci  return *this;
63933d722a9Sopenharmony_ci}
64033d722a9Sopenharmony_ci
64133d722a9Sopenharmony_citemplate <typename T>
64233d722a9Sopenharmony_citypename Slice<T>::iterator Slice<T>::iterator::operator+(
64333d722a9Sopenharmony_ci    typename Slice<T>::iterator::difference_type n) const noexcept {
64433d722a9Sopenharmony_ci  auto ret = iterator(*this);
64533d722a9Sopenharmony_ci  ret.pos = static_cast<char *>(this->pos) + this->stride * n;
64633d722a9Sopenharmony_ci  return ret;
64733d722a9Sopenharmony_ci}
64833d722a9Sopenharmony_ci
64933d722a9Sopenharmony_citemplate <typename T>
65033d722a9Sopenharmony_citypename Slice<T>::iterator Slice<T>::iterator::operator-(
65133d722a9Sopenharmony_ci    typename Slice<T>::iterator::difference_type n) const noexcept {
65233d722a9Sopenharmony_ci  auto ret = iterator(*this);
65333d722a9Sopenharmony_ci  ret.pos = static_cast<char *>(this->pos) - this->stride * n;
65433d722a9Sopenharmony_ci  return ret;
65533d722a9Sopenharmony_ci}
65633d722a9Sopenharmony_ci
65733d722a9Sopenharmony_citemplate <typename T>
65833d722a9Sopenharmony_citypename Slice<T>::iterator::difference_type
65933d722a9Sopenharmony_ciSlice<T>::iterator::operator-(const iterator &other) const noexcept {
66033d722a9Sopenharmony_ci  auto diff = std::distance(static_cast<char *>(other.pos),
66133d722a9Sopenharmony_ci                            static_cast<char *>(this->pos));
66233d722a9Sopenharmony_ci  return diff / static_cast<typename Slice<T>::iterator::difference_type>(this->stride);
66333d722a9Sopenharmony_ci}
66433d722a9Sopenharmony_ci
66533d722a9Sopenharmony_citemplate <typename T>
66633d722a9Sopenharmony_cibool Slice<T>::iterator::operator==(const iterator &other) const noexcept {
66733d722a9Sopenharmony_ci  return this->pos == other.pos;
66833d722a9Sopenharmony_ci}
66933d722a9Sopenharmony_ci
67033d722a9Sopenharmony_citemplate <typename T>
67133d722a9Sopenharmony_cibool Slice<T>::iterator::operator!=(const iterator &other) const noexcept {
67233d722a9Sopenharmony_ci  return this->pos != other.pos;
67333d722a9Sopenharmony_ci}
67433d722a9Sopenharmony_ci
67533d722a9Sopenharmony_citemplate <typename T>
67633d722a9Sopenharmony_cibool Slice<T>::iterator::operator<(const iterator &other) const noexcept {
67733d722a9Sopenharmony_ci  return this->pos < other.pos;
67833d722a9Sopenharmony_ci}
67933d722a9Sopenharmony_ci
68033d722a9Sopenharmony_citemplate <typename T>
68133d722a9Sopenharmony_cibool Slice<T>::iterator::operator<=(const iterator &other) const noexcept {
68233d722a9Sopenharmony_ci  return this->pos <= other.pos;
68333d722a9Sopenharmony_ci}
68433d722a9Sopenharmony_ci
68533d722a9Sopenharmony_citemplate <typename T>
68633d722a9Sopenharmony_cibool Slice<T>::iterator::operator>(const iterator &other) const noexcept {
68733d722a9Sopenharmony_ci  return this->pos > other.pos;
68833d722a9Sopenharmony_ci}
68933d722a9Sopenharmony_ci
69033d722a9Sopenharmony_citemplate <typename T>
69133d722a9Sopenharmony_cibool Slice<T>::iterator::operator>=(const iterator &other) const noexcept {
69233d722a9Sopenharmony_ci  return this->pos >= other.pos;
69333d722a9Sopenharmony_ci}
69433d722a9Sopenharmony_ci
69533d722a9Sopenharmony_citemplate <typename T>
69633d722a9Sopenharmony_citypename Slice<T>::iterator Slice<T>::begin() const noexcept {
69733d722a9Sopenharmony_ci  iterator it;
69833d722a9Sopenharmony_ci  it.pos = slicePtr(this);
69933d722a9Sopenharmony_ci  it.stride = size_of<T>();
70033d722a9Sopenharmony_ci  return it;
70133d722a9Sopenharmony_ci}
70233d722a9Sopenharmony_ci
70333d722a9Sopenharmony_citemplate <typename T>
70433d722a9Sopenharmony_citypename Slice<T>::iterator Slice<T>::end() const noexcept {
70533d722a9Sopenharmony_ci  iterator it = this->begin();
70633d722a9Sopenharmony_ci  it.pos = static_cast<char *>(it.pos) + it.stride * this->size();
70733d722a9Sopenharmony_ci  return it;
70833d722a9Sopenharmony_ci}
70933d722a9Sopenharmony_ci
71033d722a9Sopenharmony_citemplate <typename T>
71133d722a9Sopenharmony_civoid Slice<T>::swap(Slice &rhs) noexcept {
71233d722a9Sopenharmony_ci  std::swap(*this, rhs);
71333d722a9Sopenharmony_ci}
71433d722a9Sopenharmony_ci#endif // CXXBRIDGE1_RUST_SLICE
71533d722a9Sopenharmony_ci
71633d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_RUST_BOX
71733d722a9Sopenharmony_ci#define CXXBRIDGE1_RUST_BOX
71833d722a9Sopenharmony_citemplate <typename T>
71933d722a9Sopenharmony_ciclass Box<T>::uninit {};
72033d722a9Sopenharmony_ci
72133d722a9Sopenharmony_citemplate <typename T>
72233d722a9Sopenharmony_ciclass Box<T>::allocation {
72333d722a9Sopenharmony_ci  static T *alloc() noexcept;
72433d722a9Sopenharmony_ci  static void dealloc(T *) noexcept;
72533d722a9Sopenharmony_ci
72633d722a9Sopenharmony_cipublic:
72733d722a9Sopenharmony_ci  allocation() noexcept : ptr(alloc()) {}
72833d722a9Sopenharmony_ci  ~allocation() noexcept {
72933d722a9Sopenharmony_ci    if (this->ptr) {
73033d722a9Sopenharmony_ci      dealloc(this->ptr);
73133d722a9Sopenharmony_ci    }
73233d722a9Sopenharmony_ci  }
73333d722a9Sopenharmony_ci  T *ptr;
73433d722a9Sopenharmony_ci};
73533d722a9Sopenharmony_ci
73633d722a9Sopenharmony_citemplate <typename T>
73733d722a9Sopenharmony_ciBox<T>::Box(Box &&other) noexcept : ptr(other.ptr) {
73833d722a9Sopenharmony_ci  other.ptr = nullptr;
73933d722a9Sopenharmony_ci}
74033d722a9Sopenharmony_ci
74133d722a9Sopenharmony_citemplate <typename T>
74233d722a9Sopenharmony_ciBox<T>::Box(const T &val) {
74333d722a9Sopenharmony_ci  allocation alloc;
74433d722a9Sopenharmony_ci  ::new (alloc.ptr) T(val);
74533d722a9Sopenharmony_ci  this->ptr = alloc.ptr;
74633d722a9Sopenharmony_ci  alloc.ptr = nullptr;
74733d722a9Sopenharmony_ci}
74833d722a9Sopenharmony_ci
74933d722a9Sopenharmony_citemplate <typename T>
75033d722a9Sopenharmony_ciBox<T>::Box(T &&val) {
75133d722a9Sopenharmony_ci  allocation alloc;
75233d722a9Sopenharmony_ci  ::new (alloc.ptr) T(std::move(val));
75333d722a9Sopenharmony_ci  this->ptr = alloc.ptr;
75433d722a9Sopenharmony_ci  alloc.ptr = nullptr;
75533d722a9Sopenharmony_ci}
75633d722a9Sopenharmony_ci
75733d722a9Sopenharmony_citemplate <typename T>
75833d722a9Sopenharmony_ciBox<T>::~Box() noexcept {
75933d722a9Sopenharmony_ci  if (this->ptr) {
76033d722a9Sopenharmony_ci    this->drop();
76133d722a9Sopenharmony_ci  }
76233d722a9Sopenharmony_ci}
76333d722a9Sopenharmony_ci
76433d722a9Sopenharmony_citemplate <typename T>
76533d722a9Sopenharmony_ciBox<T> &Box<T>::operator=(Box &&other) &noexcept {
76633d722a9Sopenharmony_ci  if (this->ptr) {
76733d722a9Sopenharmony_ci    this->drop();
76833d722a9Sopenharmony_ci  }
76933d722a9Sopenharmony_ci  this->ptr = other.ptr;
77033d722a9Sopenharmony_ci  other.ptr = nullptr;
77133d722a9Sopenharmony_ci  return *this;
77233d722a9Sopenharmony_ci}
77333d722a9Sopenharmony_ci
77433d722a9Sopenharmony_citemplate <typename T>
77533d722a9Sopenharmony_ciconst T *Box<T>::operator->() const noexcept {
77633d722a9Sopenharmony_ci  return this->ptr;
77733d722a9Sopenharmony_ci}
77833d722a9Sopenharmony_ci
77933d722a9Sopenharmony_citemplate <typename T>
78033d722a9Sopenharmony_ciconst T &Box<T>::operator*() const noexcept {
78133d722a9Sopenharmony_ci  return *this->ptr;
78233d722a9Sopenharmony_ci}
78333d722a9Sopenharmony_ci
78433d722a9Sopenharmony_citemplate <typename T>
78533d722a9Sopenharmony_ciT *Box<T>::operator->() noexcept {
78633d722a9Sopenharmony_ci  return this->ptr;
78733d722a9Sopenharmony_ci}
78833d722a9Sopenharmony_ci
78933d722a9Sopenharmony_citemplate <typename T>
79033d722a9Sopenharmony_ciT &Box<T>::operator*() noexcept {
79133d722a9Sopenharmony_ci  return *this->ptr;
79233d722a9Sopenharmony_ci}
79333d722a9Sopenharmony_ci
79433d722a9Sopenharmony_citemplate <typename T>
79533d722a9Sopenharmony_citemplate <typename... Fields>
79633d722a9Sopenharmony_ciBox<T> Box<T>::in_place(Fields &&...fields) {
79733d722a9Sopenharmony_ci  allocation alloc;
79833d722a9Sopenharmony_ci  auto ptr = alloc.ptr;
79933d722a9Sopenharmony_ci  ::new (ptr) T{std::forward<Fields>(fields)...};
80033d722a9Sopenharmony_ci  alloc.ptr = nullptr;
80133d722a9Sopenharmony_ci  return from_raw(ptr);
80233d722a9Sopenharmony_ci}
80333d722a9Sopenharmony_ci
80433d722a9Sopenharmony_citemplate <typename T>
80533d722a9Sopenharmony_civoid Box<T>::swap(Box &rhs) noexcept {
80633d722a9Sopenharmony_ci  using std::swap;
80733d722a9Sopenharmony_ci  swap(this->ptr, rhs.ptr);
80833d722a9Sopenharmony_ci}
80933d722a9Sopenharmony_ci
81033d722a9Sopenharmony_citemplate <typename T>
81133d722a9Sopenharmony_ciBox<T> Box<T>::from_raw(T *raw) noexcept {
81233d722a9Sopenharmony_ci  Box box = uninit{};
81333d722a9Sopenharmony_ci  box.ptr = raw;
81433d722a9Sopenharmony_ci  return box;
81533d722a9Sopenharmony_ci}
81633d722a9Sopenharmony_ci
81733d722a9Sopenharmony_citemplate <typename T>
81833d722a9Sopenharmony_ciT *Box<T>::into_raw() noexcept {
81933d722a9Sopenharmony_ci  T *raw = this->ptr;
82033d722a9Sopenharmony_ci  this->ptr = nullptr;
82133d722a9Sopenharmony_ci  return raw;
82233d722a9Sopenharmony_ci}
82333d722a9Sopenharmony_ci
82433d722a9Sopenharmony_citemplate <typename T>
82533d722a9Sopenharmony_ciBox<T>::Box(uninit) noexcept {}
82633d722a9Sopenharmony_ci#endif // CXXBRIDGE1_RUST_BOX
82733d722a9Sopenharmony_ci
82833d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_RUST_VEC
82933d722a9Sopenharmony_ci#define CXXBRIDGE1_RUST_VEC
83033d722a9Sopenharmony_citemplate <typename T>
83133d722a9Sopenharmony_ciVec<T>::Vec(std::initializer_list<T> init) : Vec{} {
83233d722a9Sopenharmony_ci  this->reserve_total(init.size());
83333d722a9Sopenharmony_ci  std::move(init.begin(), init.end(), std::back_inserter(*this));
83433d722a9Sopenharmony_ci}
83533d722a9Sopenharmony_ci
83633d722a9Sopenharmony_citemplate <typename T>
83733d722a9Sopenharmony_ciVec<T>::Vec(const Vec &other) : Vec() {
83833d722a9Sopenharmony_ci  this->reserve_total(other.size());
83933d722a9Sopenharmony_ci  std::copy(other.begin(), other.end(), std::back_inserter(*this));
84033d722a9Sopenharmony_ci}
84133d722a9Sopenharmony_ci
84233d722a9Sopenharmony_citemplate <typename T>
84333d722a9Sopenharmony_ciVec<T>::Vec(Vec &&other) noexcept : repr(other.repr) {
84433d722a9Sopenharmony_ci  new (&other) Vec();
84533d722a9Sopenharmony_ci}
84633d722a9Sopenharmony_ci
84733d722a9Sopenharmony_citemplate <typename T>
84833d722a9Sopenharmony_ciVec<T>::~Vec() noexcept {
84933d722a9Sopenharmony_ci  this->drop();
85033d722a9Sopenharmony_ci}
85133d722a9Sopenharmony_ci
85233d722a9Sopenharmony_citemplate <typename T>
85333d722a9Sopenharmony_ciVec<T> &Vec<T>::operator=(Vec &&other) &noexcept {
85433d722a9Sopenharmony_ci  this->drop();
85533d722a9Sopenharmony_ci  this->repr = other.repr;
85633d722a9Sopenharmony_ci  new (&other) Vec();
85733d722a9Sopenharmony_ci  return *this;
85833d722a9Sopenharmony_ci}
85933d722a9Sopenharmony_ci
86033d722a9Sopenharmony_citemplate <typename T>
86133d722a9Sopenharmony_ciVec<T> &Vec<T>::operator=(const Vec &other) & {
86233d722a9Sopenharmony_ci  if (this != &other) {
86333d722a9Sopenharmony_ci    this->drop();
86433d722a9Sopenharmony_ci    new (this) Vec(other);
86533d722a9Sopenharmony_ci  }
86633d722a9Sopenharmony_ci  return *this;
86733d722a9Sopenharmony_ci}
86833d722a9Sopenharmony_ci
86933d722a9Sopenharmony_citemplate <typename T>
87033d722a9Sopenharmony_cibool Vec<T>::empty() const noexcept {
87133d722a9Sopenharmony_ci  return this->size() == 0;
87233d722a9Sopenharmony_ci}
87333d722a9Sopenharmony_ci
87433d722a9Sopenharmony_citemplate <typename T>
87533d722a9Sopenharmony_ciT *Vec<T>::data() noexcept {
87633d722a9Sopenharmony_ci  return const_cast<T *>(const_cast<const Vec<T> *>(this)->data());
87733d722a9Sopenharmony_ci}
87833d722a9Sopenharmony_ci
87933d722a9Sopenharmony_citemplate <typename T>
88033d722a9Sopenharmony_ciconst T &Vec<T>::operator[](std::size_t n) const noexcept {
88133d722a9Sopenharmony_ci  assert(n < this->size());
88233d722a9Sopenharmony_ci  auto data = reinterpret_cast<const char *>(this->data());
88333d722a9Sopenharmony_ci  return *reinterpret_cast<const T *>(data + n * size_of<T>());
88433d722a9Sopenharmony_ci}
88533d722a9Sopenharmony_ci
88633d722a9Sopenharmony_citemplate <typename T>
88733d722a9Sopenharmony_ciconst T &Vec<T>::at(std::size_t n) const {
88833d722a9Sopenharmony_ci  if (n >= this->size()) {
88933d722a9Sopenharmony_ci    panic<std::out_of_range>("rust::Vec index out of range");
89033d722a9Sopenharmony_ci  }
89133d722a9Sopenharmony_ci  return (*this)[n];
89233d722a9Sopenharmony_ci}
89333d722a9Sopenharmony_ci
89433d722a9Sopenharmony_citemplate <typename T>
89533d722a9Sopenharmony_ciconst T &Vec<T>::front() const noexcept {
89633d722a9Sopenharmony_ci  assert(!this->empty());
89733d722a9Sopenharmony_ci  return (*this)[0];
89833d722a9Sopenharmony_ci}
89933d722a9Sopenharmony_ci
90033d722a9Sopenharmony_citemplate <typename T>
90133d722a9Sopenharmony_ciconst T &Vec<T>::back() const noexcept {
90233d722a9Sopenharmony_ci  assert(!this->empty());
90333d722a9Sopenharmony_ci  return (*this)[this->size() - 1];
90433d722a9Sopenharmony_ci}
90533d722a9Sopenharmony_ci
90633d722a9Sopenharmony_citemplate <typename T>
90733d722a9Sopenharmony_ciT &Vec<T>::operator[](std::size_t n) noexcept {
90833d722a9Sopenharmony_ci  assert(n < this->size());
90933d722a9Sopenharmony_ci  auto data = reinterpret_cast<char *>(this->data());
91033d722a9Sopenharmony_ci  return *reinterpret_cast<T *>(data + n * size_of<T>());
91133d722a9Sopenharmony_ci}
91233d722a9Sopenharmony_ci
91333d722a9Sopenharmony_citemplate <typename T>
91433d722a9Sopenharmony_ciT &Vec<T>::at(std::size_t n) {
91533d722a9Sopenharmony_ci  if (n >= this->size()) {
91633d722a9Sopenharmony_ci    panic<std::out_of_range>("rust::Vec index out of range");
91733d722a9Sopenharmony_ci  }
91833d722a9Sopenharmony_ci  return (*this)[n];
91933d722a9Sopenharmony_ci}
92033d722a9Sopenharmony_ci
92133d722a9Sopenharmony_citemplate <typename T>
92233d722a9Sopenharmony_ciT &Vec<T>::front() noexcept {
92333d722a9Sopenharmony_ci  assert(!this->empty());
92433d722a9Sopenharmony_ci  return (*this)[0];
92533d722a9Sopenharmony_ci}
92633d722a9Sopenharmony_ci
92733d722a9Sopenharmony_citemplate <typename T>
92833d722a9Sopenharmony_ciT &Vec<T>::back() noexcept {
92933d722a9Sopenharmony_ci  assert(!this->empty());
93033d722a9Sopenharmony_ci  return (*this)[this->size() - 1];
93133d722a9Sopenharmony_ci}
93233d722a9Sopenharmony_ci
93333d722a9Sopenharmony_citemplate <typename T>
93433d722a9Sopenharmony_civoid Vec<T>::reserve(std::size_t new_cap) {
93533d722a9Sopenharmony_ci  this->reserve_total(new_cap);
93633d722a9Sopenharmony_ci}
93733d722a9Sopenharmony_ci
93833d722a9Sopenharmony_citemplate <typename T>
93933d722a9Sopenharmony_civoid Vec<T>::push_back(const T &value) {
94033d722a9Sopenharmony_ci  this->emplace_back(value);
94133d722a9Sopenharmony_ci}
94233d722a9Sopenharmony_ci
94333d722a9Sopenharmony_citemplate <typename T>
94433d722a9Sopenharmony_civoid Vec<T>::push_back(T &&value) {
94533d722a9Sopenharmony_ci  this->emplace_back(std::move(value));
94633d722a9Sopenharmony_ci}
94733d722a9Sopenharmony_ci
94833d722a9Sopenharmony_citemplate <typename T>
94933d722a9Sopenharmony_citemplate <typename... Args>
95033d722a9Sopenharmony_civoid Vec<T>::emplace_back(Args &&...args) {
95133d722a9Sopenharmony_ci  auto size = this->size();
95233d722a9Sopenharmony_ci  this->reserve_total(size + 1);
95333d722a9Sopenharmony_ci  ::new (reinterpret_cast<T *>(reinterpret_cast<char *>(this->data()) +
95433d722a9Sopenharmony_ci                               size * size_of<T>()))
95533d722a9Sopenharmony_ci      T(std::forward<Args>(args)...);
95633d722a9Sopenharmony_ci  this->set_len(size + 1);
95733d722a9Sopenharmony_ci}
95833d722a9Sopenharmony_ci
95933d722a9Sopenharmony_citemplate <typename T>
96033d722a9Sopenharmony_civoid Vec<T>::clear() {
96133d722a9Sopenharmony_ci  this->truncate(0);
96233d722a9Sopenharmony_ci}
96333d722a9Sopenharmony_ci
96433d722a9Sopenharmony_citemplate <typename T>
96533d722a9Sopenharmony_citypename Vec<T>::iterator Vec<T>::begin() noexcept {
96633d722a9Sopenharmony_ci  return Slice<T>(this->data(), this->size()).begin();
96733d722a9Sopenharmony_ci}
96833d722a9Sopenharmony_ci
96933d722a9Sopenharmony_citemplate <typename T>
97033d722a9Sopenharmony_citypename Vec<T>::iterator Vec<T>::end() noexcept {
97133d722a9Sopenharmony_ci  return Slice<T>(this->data(), this->size()).end();
97233d722a9Sopenharmony_ci}
97333d722a9Sopenharmony_ci
97433d722a9Sopenharmony_citemplate <typename T>
97533d722a9Sopenharmony_citypename Vec<T>::const_iterator Vec<T>::begin() const noexcept {
97633d722a9Sopenharmony_ci  return this->cbegin();
97733d722a9Sopenharmony_ci}
97833d722a9Sopenharmony_ci
97933d722a9Sopenharmony_citemplate <typename T>
98033d722a9Sopenharmony_citypename Vec<T>::const_iterator Vec<T>::end() const noexcept {
98133d722a9Sopenharmony_ci  return this->cend();
98233d722a9Sopenharmony_ci}
98333d722a9Sopenharmony_ci
98433d722a9Sopenharmony_citemplate <typename T>
98533d722a9Sopenharmony_citypename Vec<T>::const_iterator Vec<T>::cbegin() const noexcept {
98633d722a9Sopenharmony_ci  return Slice<const T>(this->data(), this->size()).begin();
98733d722a9Sopenharmony_ci}
98833d722a9Sopenharmony_ci
98933d722a9Sopenharmony_citemplate <typename T>
99033d722a9Sopenharmony_citypename Vec<T>::const_iterator Vec<T>::cend() const noexcept {
99133d722a9Sopenharmony_ci  return Slice<const T>(this->data(), this->size()).end();
99233d722a9Sopenharmony_ci}
99333d722a9Sopenharmony_ci
99433d722a9Sopenharmony_citemplate <typename T>
99533d722a9Sopenharmony_civoid Vec<T>::swap(Vec &rhs) noexcept {
99633d722a9Sopenharmony_ci  using std::swap;
99733d722a9Sopenharmony_ci  swap(this->repr, rhs.repr);
99833d722a9Sopenharmony_ci}
99933d722a9Sopenharmony_ci
100033d722a9Sopenharmony_ci// Internal API only intended for the cxxbridge code generator.
100133d722a9Sopenharmony_citemplate <typename T>
100233d722a9Sopenharmony_ciVec<T>::Vec(unsafe_bitcopy_t, const Vec &bits) noexcept : repr(bits.repr) {}
100333d722a9Sopenharmony_ci#endif // CXXBRIDGE1_RUST_VEC
100433d722a9Sopenharmony_ci
100533d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_IS_COMPLETE
100633d722a9Sopenharmony_ci#define CXXBRIDGE1_IS_COMPLETE
100733d722a9Sopenharmony_cinamespace detail {
100833d722a9Sopenharmony_cinamespace {
100933d722a9Sopenharmony_citemplate <typename T, typename = std::size_t>
101033d722a9Sopenharmony_cistruct is_complete : std::false_type {};
101133d722a9Sopenharmony_citemplate <typename T>
101233d722a9Sopenharmony_cistruct is_complete<T, decltype(sizeof(T))> : std::true_type {};
101333d722a9Sopenharmony_ci} // namespace
101433d722a9Sopenharmony_ci} // namespace detail
101533d722a9Sopenharmony_ci#endif // CXXBRIDGE1_IS_COMPLETE
101633d722a9Sopenharmony_ci
101733d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_LAYOUT
101833d722a9Sopenharmony_ci#define CXXBRIDGE1_LAYOUT
101933d722a9Sopenharmony_ciclass layout {
102033d722a9Sopenharmony_ci  template <typename T>
102133d722a9Sopenharmony_ci  friend std::size_t size_of();
102233d722a9Sopenharmony_ci  template <typename T>
102333d722a9Sopenharmony_ci  friend std::size_t align_of();
102433d722a9Sopenharmony_ci  template <typename T>
102533d722a9Sopenharmony_ci  static typename std::enable_if<std::is_base_of<Opaque, T>::value,
102633d722a9Sopenharmony_ci                                 std::size_t>::type
102733d722a9Sopenharmony_ci  do_size_of() {
102833d722a9Sopenharmony_ci    return T::layout::size();
102933d722a9Sopenharmony_ci  }
103033d722a9Sopenharmony_ci  template <typename T>
103133d722a9Sopenharmony_ci  static typename std::enable_if<!std::is_base_of<Opaque, T>::value,
103233d722a9Sopenharmony_ci                                 std::size_t>::type
103333d722a9Sopenharmony_ci  do_size_of() {
103433d722a9Sopenharmony_ci    return sizeof(T);
103533d722a9Sopenharmony_ci  }
103633d722a9Sopenharmony_ci  template <typename T>
103733d722a9Sopenharmony_ci  static
103833d722a9Sopenharmony_ci      typename std::enable_if<detail::is_complete<T>::value, std::size_t>::type
103933d722a9Sopenharmony_ci      size_of() {
104033d722a9Sopenharmony_ci    return do_size_of<T>();
104133d722a9Sopenharmony_ci  }
104233d722a9Sopenharmony_ci  template <typename T>
104333d722a9Sopenharmony_ci  static typename std::enable_if<std::is_base_of<Opaque, T>::value,
104433d722a9Sopenharmony_ci                                 std::size_t>::type
104533d722a9Sopenharmony_ci  do_align_of() {
104633d722a9Sopenharmony_ci    return T::layout::align();
104733d722a9Sopenharmony_ci  }
104833d722a9Sopenharmony_ci  template <typename T>
104933d722a9Sopenharmony_ci  static typename std::enable_if<!std::is_base_of<Opaque, T>::value,
105033d722a9Sopenharmony_ci                                 std::size_t>::type
105133d722a9Sopenharmony_ci  do_align_of() {
105233d722a9Sopenharmony_ci    return alignof(T);
105333d722a9Sopenharmony_ci  }
105433d722a9Sopenharmony_ci  template <typename T>
105533d722a9Sopenharmony_ci  static
105633d722a9Sopenharmony_ci      typename std::enable_if<detail::is_complete<T>::value, std::size_t>::type
105733d722a9Sopenharmony_ci      align_of() {
105833d722a9Sopenharmony_ci    return do_align_of<T>();
105933d722a9Sopenharmony_ci  }
106033d722a9Sopenharmony_ci};
106133d722a9Sopenharmony_ci
106233d722a9Sopenharmony_citemplate <typename T>
106333d722a9Sopenharmony_cistd::size_t size_of() {
106433d722a9Sopenharmony_ci  return layout::size_of<T>();
106533d722a9Sopenharmony_ci}
106633d722a9Sopenharmony_ci
106733d722a9Sopenharmony_citemplate <typename T>
106833d722a9Sopenharmony_cistd::size_t align_of() {
106933d722a9Sopenharmony_ci  return layout::align_of<T>();
107033d722a9Sopenharmony_ci}
107133d722a9Sopenharmony_ci#endif // CXXBRIDGE1_LAYOUT
107233d722a9Sopenharmony_ci
107333d722a9Sopenharmony_ci#ifndef CXXBRIDGE1_RELOCATABLE
107433d722a9Sopenharmony_ci#define CXXBRIDGE1_RELOCATABLE
107533d722a9Sopenharmony_cinamespace detail {
107633d722a9Sopenharmony_citemplate <typename... Ts>
107733d722a9Sopenharmony_cistruct make_void {
107833d722a9Sopenharmony_ci  using type = void;
107933d722a9Sopenharmony_ci};
108033d722a9Sopenharmony_ci
108133d722a9Sopenharmony_citemplate <typename... Ts>
108233d722a9Sopenharmony_ciusing void_t = typename make_void<Ts...>::type;
108333d722a9Sopenharmony_ci
108433d722a9Sopenharmony_citemplate <typename Void, template <typename...> class, typename...>
108533d722a9Sopenharmony_cistruct detect : std::false_type {};
108633d722a9Sopenharmony_citemplate <template <typename...> class T, typename... A>
108733d722a9Sopenharmony_cistruct detect<void_t<T<A...>>, T, A...> : std::true_type {};
108833d722a9Sopenharmony_ci
108933d722a9Sopenharmony_citemplate <template <typename...> class T, typename... A>
109033d722a9Sopenharmony_ciusing is_detected = detect<void, T, A...>;
109133d722a9Sopenharmony_ci
109233d722a9Sopenharmony_citemplate <typename T>
109333d722a9Sopenharmony_ciusing detect_IsRelocatable = typename T::IsRelocatable;
109433d722a9Sopenharmony_ci
109533d722a9Sopenharmony_citemplate <typename T>
109633d722a9Sopenharmony_cistruct get_IsRelocatable
109733d722a9Sopenharmony_ci    : std::is_same<typename T::IsRelocatable, std::true_type> {};
109833d722a9Sopenharmony_ci} // namespace detail
109933d722a9Sopenharmony_ci
110033d722a9Sopenharmony_citemplate <typename T>
110133d722a9Sopenharmony_cistruct IsRelocatable
110233d722a9Sopenharmony_ci    : std::conditional<
110333d722a9Sopenharmony_ci          detail::is_detected<detail::detect_IsRelocatable, T>::value,
110433d722a9Sopenharmony_ci          detail::get_IsRelocatable<T>,
110533d722a9Sopenharmony_ci          std::integral_constant<
110633d722a9Sopenharmony_ci              bool, std::is_trivially_move_constructible<T>::value &&
110733d722a9Sopenharmony_ci                        std::is_trivially_destructible<T>::value>>::type {};
110833d722a9Sopenharmony_ci#endif // CXXBRIDGE1_RELOCATABLE
110933d722a9Sopenharmony_ci
111033d722a9Sopenharmony_ci} // namespace cxxbridge1
111133d722a9Sopenharmony_ci} // namespace rust
1112