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