[
  {
    "path": "Cargo.toml",
    "content": "[package]\nname = \"miniffi\"\nversion = \"0.1.0\"\nedition = \"2021\"\nlicense = \"MIT\"\nrepository = \"https://github.com/evanw/miniffi\"\ndescription = \"A simple but opinionated FFI system\"\nexclude = [\"src/tests\"]\n\n[dependencies]\nproc-macro2 = { version = \"1.0.60\", features = [\"span-locations\"] }\nsyn = { version = \"2.0.0\", default-features = false, features = [\"full\", \"parsing\", \"printing\"] }\n"
  },
  {
    "path": "LICENSE.md",
    "content": "Copyright 2025 Evan Wallace\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# miniffi\n\n> [!WARNING]\n> This project is on its first release. I'm still trying out the idea. It has\n> not been used in production.\n\nThis is a simple but opinionated FFI system for Rust. It allows you to call Rust code from other\nlanguages, and vice versa. Some design principles:\n\n- Intended for writing platform-agnostic Rust with platform-specific details in the host language\n- FFI support is split into data (structs passed by copy) and code (traits passed by reference)\n- Rather than have a separate schema language, the public API in your `lib.rs` is your schema\n- The generated binding code is compact, dependency-free, and straightforward to integrate with\n\n## Supported Features\n\n- Primitive types (`bool`, `i32`, `f64`, `String`, etc.)\n- Tuples\n- Structs\n- Enums\n- Top-level constants\n- Top-level functions\n- Traits (must be either `Box<dyn T>` or `Rc<dyn T>`)\n- `Vec<T>`\n- `Option<T>`\n- `Box<T>`\n\n## Available Targets\n\n- JavaScript/TypeScript (WASM)\n- Swift\n- C++\n\n## Example\n\nAfter setting everything up, using miniffi looks something like this. The\nfollowing example Rust code (in `lib.rs`) demonstrates passing code and\ndata back and forth between Rust and the host language:\n\n```rs\npub enum Level {\n    Warning,\n    Error,\n}\n\npub trait Logger {\n    fn log(&self, level: Level, text: &str);\n}\n\npub trait Demo {\n    fn run(&self, logger: Box<dyn Logger>);\n}\n\npub fn get_demo() -> Box<dyn Demo> {\n    struct DemoImpl;\n    impl Demo for DemoImpl {\n        fn run(&self, logger: Box<dyn Logger>) {\n            logger.log(Level::Warning, \"example\");\n        }\n    }\n    Box::new(DemoImpl)\n}\n\n// This includes the binding code generated by miniffi\ninclude!(concat!(env!(\"OUT_DIR\"), \"/miniffi.rs\"));\n```\n\nUnlike other FFI systems, there are no annotations required to expose something\nfrom `lib.rs` to the host language other than using `pub` to mark things public.\nThe miniffi build script parses `lib.rs`, extracts the supported parts of the\npublic API, and generates FFI binding code both for Rust (the `miniffi.rs` file\nreferenced above) and for the host language. Calling that example Rust code\nmight look like this:\n\nIn JavaScript/TypeScript:\n\n```js\nimport * as rust from \"./miniffi.js\"\nimport fs from \"fs\"\n\nawait rust.instantiate(fs.readFileSync(\n    \"./target/wasm32-unknown-unknown/debug/example.wasm\"))\n\nrust.get_demo().run({\n    log(level, text) {\n        if (level === rust.Level.Error)\n            console.error(\"ERROR:\", text)\n        else if (level === rust.Level.Warning)\n            console.warn(\"WARNING:\", text)\n    }\n})\n```\n\nIn Swift:\n\n```swift\nclass LoggerImpl : Logger {\n    func log(_ level: Level, _ text: String) {\n        if level == .Error {\n            print(\"ERROR:\", text)\n        } else if level == .Warning {\n            print(\"WARNING:\", text)\n        }\n    }\n}\n\nget_demo().run(LoggerImpl())\n```\n\nIn C++:\n\n```c++\n#include <iostream>\n#include \"ffi.h\"\n\nstruct LoggerImpl : rust::Logger {\n    void log(rust::Level level, std::string text) {\n        if (level == rust::Level::Error)\n            std::cout << \"ERROR: \" << text << std::endl;\n        else if (level == rust::Level::Warning)\n            std::cout << \"WARNING: \" << text << std::endl;\n    }\n};\n\nint main() {\n    rust::get_demo()->run(std::make_unique<LoggerImpl>());\n    return 0;\n}\n```\n\nMore information about how to use miniffi can be found in the [documentation](https://docs.rs/miniffi/latest/miniffi/).\n\n## Similar Projects\n\nThese projects are much further along, and you may want to use them instead:\n\n- [UniFFI](https://github.com/mozilla/uniffi-rs)\n- [Diplomat](https://github.com/rust-diplomat/diplomat)\n- [Interoptopus](https://github.com/ralfbiedert/interoptopus)\n"
  },
  {
    "path": "src/ast.rs",
    "content": "use super::*;\nuse std::collections::HashSet;\nuse std::fmt::Write;\n\npub struct AST {\n    pub structs: Vec<RustStruct>,\n    pub enums: Vec<RustEnum>,\n    pub traits: Vec<RustTrait>,\n    pub consts: Vec<RustConst>,\n    pub fns: Vec<RustFn>,\n}\n\nimpl AST {\n    pub fn rename_keywords(&mut self, keywords: &[&str]) {\n        let keywords: HashSet<_> = keywords.iter().map(|x| *x).collect();\n        let mut names = NameSet::default();\n        for k in &keywords {\n            names.add(k.to_string());\n        }\n\n        // Avoid the \"_\" symbol in Rust\n        names.add(\"_\".to_string());\n\n        let rename_keywords_in_fn = move |f: &mut RustFn| {\n            // Avoid cloning the set in the common case\n            if !f\n                .args\n                .iter()\n                .chain(f.returns.iter())\n                .any(|x| names.contains(x.name.as_str()))\n            {\n                return;\n            }\n\n            // Rename all relevant local identifiers\n            let mut names = names.clone();\n            for arg in &mut f.args {\n                arg.name = names.create(&arg.name);\n            }\n            if let Some(ret) = &mut f.returns {\n                ret.name = names.create(&ret.name);\n            }\n        };\n\n        for f in &mut self.fns {\n            rename_keywords_in_fn(f);\n        }\n\n        for t in &mut self.traits {\n            for f in &mut t.fns {\n                rename_keywords_in_fn(f);\n            }\n        }\n    }\n}\n\npub struct RustStruct {\n    pub name: String,\n    pub fields: Vec<RustField>,\n    pub derives_partial_eq: bool,\n}\n\npub struct RustEnum {\n    pub name: String,\n    pub variants: Vec<RustVariant>,\n    pub derives_partial_eq: bool,\n}\n\nimpl RustEnum {\n    pub fn has_fields(&self) -> bool {\n        self.variants.iter().any(|v| !v.fields.is_empty())\n    }\n}\n\npub struct RustVariant {\n    pub name: String,\n    pub discriminant: i32,\n    pub fields: Vec<RustField>,\n}\n\npub struct RustTrait {\n    pub name: String,\n    pub fns: Vec<RustFn>,\n}\n\n#[derive(Clone)]\npub struct RustField {\n    pub name: String,\n    pub ty: RustType,\n}\n\npub struct RustConst {\n    pub name: String,\n    pub ty: RustType,\n    pub val: RustVal,\n}\n\npub struct RustFn {\n    pub name: String,\n    pub args: Vec<RustArg>,\n    pub returns: Option<RustArg>,\n}\n\n#[derive(Clone)]\npub struct RustArg {\n    pub name: String,\n    pub ty: RustType,\n}\n\n#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]\npub enum RustPtr {\n    Box,\n    Rc,\n}\n\nimpl RustPtr {\n    pub fn path(&self) -> &'static str {\n        match self {\n            RustPtr::Box => \"Box\",\n            RustPtr::Rc => \"std::rc::Rc\",\n        }\n    }\n}\n\n#[derive(Clone, Debug, Eq, Hash, PartialEq)]\npub enum RustType {\n    Pair {\n        rust: Box<RustType>,\n        other: Box<RustType>,\n    },\n    Verbatim(String),\n    Bool,\n\n    U8,\n    U16,\n    U32,\n    Usize,\n    U64,\n\n    I8,\n    I16,\n    I32,\n    Isize,\n    I64,\n\n    F32,\n    F64,\n\n    RefStr,\n    OwnStr,\n\n    Struct(usize),\n    Enum(usize),\n    DynTrait(usize),\n    Ptr(RustPtr, Box<RustType>),\n    Vector(Box<RustType>),\n    Tuple(Vec<RustType>),\n    Optional(Box<RustType>),\n\n    ForeignHandle,\n}\n\n#[derive(Clone, Debug, PartialEq)]\npub enum RustVal {\n    Bool(bool),\n\n    U8(u8),\n    U16(u16),\n    U32(u32),\n    U64(u64),\n\n    I8(i8),\n    I16(i16),\n    I32(i32),\n    I64(i64),\n\n    F32(f32),\n    F64(f64),\n\n    Str(String),\n}\n\npub fn append_type_name_hint(out: &mut String, ast: &AST, ty: &RustType) {\n    use RustType::*;\n    match ty {\n        Pair { rust, .. } => append_type_name_hint(out, ast, rust),\n        Verbatim(text) => out.push_str(text),\n        Bool => out.push_str(\"bool\"),\n\n        U8 => out.push_str(\"u8\"),\n        U16 => out.push_str(\"u16\"),\n        U32 => out.push_str(\"u32\"),\n        Usize => out.push_str(\"usize\"),\n        U64 => out.push_str(\"u64\"),\n\n        I8 => out.push_str(\"i8\"),\n        I16 => out.push_str(\"i16\"),\n        I32 => out.push_str(\"i32\"),\n        Isize => out.push_str(\"isize\"),\n        I64 => out.push_str(\"i64\"),\n\n        F32 => out.push_str(\"f32\"),\n        F64 => out.push_str(\"f64\"),\n\n        RefStr => out.push_str(\"str\"),\n        OwnStr => out.push_str(\"string\"),\n\n        Struct(index) => out.push_str(&ast.structs[*index].name),\n        Enum(index) => out.push_str(&ast.enums[*index].name),\n\n        DynTrait(index) => {\n            out.push_str(\"dyn_\");\n            out.push_str(&ast.traits[*index].name);\n        }\n\n        Ptr(kind, inner) => {\n            out.push_str(match kind {\n                RustPtr::Box => \"box_\",\n                RustPtr::Rc => \"rc_\",\n            });\n            append_type_name_hint(out, ast, &inner);\n        }\n\n        Vector(inner) => {\n            out.push_str(\"vec_\");\n            append_type_name_hint(out, ast, &inner);\n        }\n\n        Tuple(types) => {\n            for (i, ty) in types.iter().enumerate() {\n                if i > 0 {\n                    out.push_str(\"_\");\n                }\n                append_type_name_hint(out, ast, ty);\n            }\n        }\n\n        Optional(inner) => {\n            out.push_str(\"option_\");\n            append_type_name_hint(out, ast, &inner);\n        }\n\n        ForeignHandle => out.push_str(\"ptr\"),\n    }\n}\n\npub fn append_type_name_hints(out: &mut String, ast: &AST, types: &[RustType]) {\n    let mut i = 0;\n    while i < types.len() {\n        if i > 0 {\n            out.push('_');\n        }\n        let ty = &types[i];\n        let mut counter = 1;\n        i += 1;\n        while i < types.len() && ty == &types[i] {\n            counter += 1;\n            i += 1;\n        }\n        if counter > 1 {\n            _ = write!(out, \"{counter}_\");\n        }\n        append_type_name_hint(out, ast, ty);\n    }\n}\n"
  },
  {
    "path": "src/cpp.rs",
    "content": "use super::*;\nuse std::borrow::Cow;\nuse std::collections::{HashMap, HashSet};\nuse std::hash::Hash;\nuse std::rc::Rc;\n\n/// Use this target when the host language is C++.\n///\n/// This needs to generate a source file (`.cpp`, `.cc`, etc.) and a header\n/// file (`.hpp`, `.h`, etc.). By default, the files will be named\n/// `miniffi.cpp` and `miniffi.h` and will be written to the directory\n/// containing your `Cargo.toml` file. You can customize these paths before\n/// calling [`build`](Target::build):\n///\n/// ```no_run\n/// use miniffi::*;\n///\n/// fn main() {\n///     CppTarget::new()\n///         .write_source_to(\"../app/rust.cpp\")\n///         .write_header_to(\"../app/rust.h\")\n///         .build();\n/// }\n/// ```\n///\n/// Generated bindings for calling your Rust code from C++ will be placed in\n/// the `rust` namespace. For example, if your `src/lib.rs` looks like this:\n///\n/// ```no_run\n/// pub fn add(left: u64, right: u64) -> u64 {\n///     left + right\n/// }\n///\n/// # macro_rules! env { ($a:expr) => { $a } }\n/// # macro_rules! include { ($a:expr) => { $a } }\n/// include!(concat!(env!(\"OUT_DIR\"), \"/miniffi.rs\"));\n/// ```\n///\n/// You can call that from C++ like this:\n///\n/// ```c++\n/// #include <iostream>\n/// #include \"miniffi.h\"\n///\n/// int main() {\n///     std::cout << \"1 + 2 = \" << rust::add(1, 2) << std::endl;\n///     return 0;\n/// }\n/// ```\n///\n/// The generated code tries to map Rust types into the corresponding types\n/// from the C++ standard template library:\n///\n/// | Rust type   | C++ type                             |\n/// |-------------|--------------------------------------|\n/// | `String`    | `std::string`                        |\n/// | `Vec<T>`    | `std::vector<T>`                     |\n/// | `(A, B)`    | `std::tuple<A, B>` *(since C++11)*   |\n/// | `Box<T>`    | `std::unique_ptr<T>` *(since C++11)* |\n/// | `Rc<T>`     | `std::shared_ptr<T>` *(since C++11)* |\n/// | `Option<T>` | `std::optional<T>` *(since C++17)*   |\n///\n/// Enums without fields are turned into a C++ enum struct:\n///\n/// <table>\n/// <tr><th>Rust</th><th>C++</th></tr>\n/// <tr><td valign=top>\n///\n/// ```\n/// // Exported enum in Rust\n/// pub enum Color {\n///     Window,\n///     Text,\n/// }\n///\n/// // Example usage\n/// let color = Color::Text;\n/// let hex = match color {\n///     Color::Window => 0x353535,\n///     Color::Text => 0xD2991D,\n/// };\n/// ```\n///\n/// </td><td valign=top>\n///\n/// ```c++\n/// // Generated enum in C++\n/// enum struct Color : int32_t {\n///     Window = 0,\n///     Text = 1,\n/// };\n///\n/// // Example usage\n/// auto color = Color::Text;\n/// int hex;\n/// if (color == Color::Window)\n///     hex = 0x353535;\n/// else if (color == Color::Text)\n///     hex = 0xD2991D;\n/// else\n///     std::abort();\n/// ```\n///\n/// </td></tr>\n/// </table>\n///\n/// Enums with fields use `std::variant` from C++17:\n///\n/// <table>\n/// <tr><th>Rust</th><th>C++</th></tr>\n/// <tr><td valign=top>\n///\n/// ```\n/// // Exported enum in Rust\n/// pub enum Color {\n///     Window,\n///     Text,\n///     RGB(u8, u8, u8),\n/// }\n///\n/// // Example usage\n/// let color = Color::RGB(255, 0, 0);\n/// let hex = match color {\n///     Color::Window => 0x353535,\n///     Color::Text => 0xD2991D,\n///     Color::RGB(r, g, b) =>\n///         u32::from_le_bytes([b, g, r, 0]),\n/// };\n/// ```\n///\n/// </td><td valign=top>\n///\n/// ```c++\n/// // Generated enum in C++ (approximately)\n/// struct Color : std::variant<...> {\n///     struct Window {};\n///     struct Text {};\n///     struct RGB { uint8_t _0, _1, _2; };\n///     template <typename T> bool is();\n///     template <typename T> T* as();\n/// };\n///\n/// // Example usage\n/// Color color{ Color::RGB{ 255, 0, 0 } };\n/// int hex;\n/// if (color.is<Color::Window>())\n///     hex = 0x353535;\n/// else if (color.is<Color::Text>())\n///     hex = 0xD2991D;\n/// else if (auto x = color.as<Color::RGB>())\n///     hex = (x->_0 << 16) | (x->_1 << 8) | x->_2;\n/// else\n///     std::abort();\n/// ```\n///\n/// </td></tr>\n/// </table>\n///\n/// ## Using the command line\n///\n/// If you are using C++ from the command line, then you can call Rust from\n/// C++ by compiling the generated `.cpp` file and linking that along with the\n/// compiled Rust code to the rest of your C++. For example:\n///\n/// ```text\n/// # Build the Rust code\n/// cargo rustc --crate-type=staticlib\n///\n/// # Build the C++ code\n/// c++ -std=c++17 main.cpp miniffi.cpp ./target/debug/libexample.a\n/// ```\npub struct CppTarget {\n    common_options: CommonOptions,\n    namespace: String,\n    source_path: PathBuf,\n    header_path: PathBuf,\n}\n\nimpl CppTarget {\n    pub fn new() -> CppTarget {\n        CppTarget {\n            common_options: CommonOptions::default(),\n            namespace: \"rust\".to_string(),\n            source_path: \"miniffi.cpp\".into(),\n            header_path: \"miniffi.h\".into(),\n        }\n    }\n\n    pub fn write_source_to<T: Into<PathBuf>>(mut self, path: T) -> Self {\n        self.source_path = path.into();\n        self\n    }\n\n    pub fn write_header_to<T: Into<PathBuf>>(mut self, path: T) -> Self {\n        self.header_path = path.into();\n        self\n    }\n}\n\npub const CPP_KEYWORDS: &[&str] = &[\n    \"alignas\",\n    \"alignof\",\n    \"and\",\n    \"and_eq\",\n    \"asm\",\n    \"atomic_cancel\",\n    \"atomic_commit\",\n    \"atomic_noexcept\",\n    \"auto\",\n    \"bitand\",\n    \"bitor\",\n    \"bool\",\n    \"break\",\n    \"case\",\n    \"catch\",\n    \"char\",\n    \"char8_t\",\n    \"char16_t\",\n    \"char32_t\",\n    \"class\",\n    \"compl\",\n    \"concept\",\n    \"const\",\n    \"consteval\",\n    \"constexpr\",\n    \"constinit\",\n    \"const_cast\",\n    \"continue\",\n    \"contract_assert\",\n    \"co_await\",\n    \"co_return\",\n    \"co_yield\",\n    \"decltype\",\n    \"default\",\n    \"delete\",\n    \"do\",\n    \"double\",\n    \"dynamic_cast\",\n    \"else\",\n    \"enum\",\n    \"explicit\",\n    \"export\",\n    \"extern\",\n    \"false\",\n    \"float\",\n    \"for\",\n    \"friend\",\n    \"goto\",\n    \"if\",\n    \"inline\",\n    \"int\",\n    \"long\",\n    \"mutable\",\n    \"namespace\",\n    \"new\",\n    \"noexcept\",\n    \"not\",\n    \"not_eq\",\n    \"nullptr\",\n    \"operator\",\n    \"or\",\n    \"or_eq\",\n    \"private\",\n    \"protected\",\n    \"public\",\n    \"reflexpr\",\n    \"register\",\n    \"reinterpret_cast\",\n    \"requires\",\n    \"return\",\n    \"short\",\n    \"signed\",\n    \"sizeof\",\n    \"static\",\n    \"static_assert\",\n    \"static_cast\",\n    \"struct\",\n    \"switch\",\n    \"synchronized\",\n    \"template\",\n    \"this\",\n    \"thread_local\",\n    \"throw\",\n    \"true\",\n    \"try\",\n    \"typedef\",\n    \"typeid\",\n    \"typename\",\n    \"union\",\n    \"unsigned\",\n    \"using\",\n    \"virtual\",\n    \"void\",\n    \"volatile\",\n    \"wchar_t\",\n    \"while\",\n    \"xor\",\n    \"xor_eq\",\n];\n\n#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]\nenum HeaderGroup {\n    Include,\n    ForwardDecl,\n    Other,\n    Constants,\n}\n\n#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]\nenum SourceGroup {\n    Include,\n    MultiRet,\n    ExternCDecl,\n    ExternCImpl,\n    Anonymous,\n    Other,\n}\n\nimpl Compile for CppTarget {\n    fn common_options(&mut self) -> &mut CommonOptions {\n        &mut self.common_options\n    }\n\n    fn compile(&self, mut ast: AST, rust_path: PathBuf) -> Vec<FileData> {\n        let syntax = RustSyntax::with_edition(self.common_options.edition);\n        let mut rust_helpers = HelperSet::<(), String>::default();\n        let mut source_helpers = HelperSet::<SourceGroup, String>::default();\n        let mut header_helpers = HelperSet::<HeaderGroup, String>::default();\n\n        add_common_rust_helpers(&syntax, &mut rust_helpers);\n        ast.rename_keywords(CPP_KEYWORDS);\n\n        for (name, code) in [\n            (\"<algorithm>\", \"#include <algorithm>\\n\"),\n            (\"<memory>\", \"#include <memory>\\n\"),\n            (\"<optional>\", \"#include <optional>\\n\"),\n            (\"<stdint.h>\", \"#include <stdint.h>\\n\"),\n            (\"<stdlib.h>\", \"#include <stdlib.h>\\n\"),\n            (\"<string_view>\", \"#include <string_view>\\n\"),\n            (\"<string>\", \"#include <string>\\n\"),\n            (\"<tuple>\", \"#include <tuple>\\n\"),\n            (\"<variant>\", \"#include <variant>\\n\"),\n            (\"<vector>\", \"#include <vector>\\n\"),\n        ] {\n            source_helpers.add_group(SourceGroup::Include, name, code);\n            header_helpers.add_group(HeaderGroup::Include, name, code);\n        }\n\n        source_helpers\n            .add_group(\n                SourceGroup::ExternCDecl,\n                \"_ffi_alloc\",\n                \"void* _ffi_alloc(uintptr_t len);\\n\",\n            )\n            .add_dep_group(SourceGroup::Include, \"<stdint.h>\");\n\n        source_helpers\n            .add_group(\n                SourceGroup::ExternCDecl,\n                \"_ffi_dealloc\",\n                \"void _ffi_dealloc(const void* ptr, uintptr_t capacity);\\n\",\n            )\n            .add_dep_group(SourceGroup::Include, \"<stdint.h>\");\n\n        source_helpers\n            .add_group(\n                SourceGroup::Anonymous,\n                \"_ffi_read\",\n                r#\"\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\"#,\n            )\n            .add_dep_group(SourceGroup::Include, \"<stdint.h>\");\n\n        source_helpers\n            .add_group(\n                SourceGroup::Anonymous,\n                \"_ffi_write\",\n                r#\"\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\"#,\n            )\n            .add_dep_group(SourceGroup::Include, \"<stdint.h>\")\n            .add_dep_group(SourceGroup::Include, \"<vector>\");\n\n        source_helpers\n            .add_group(\n                SourceGroup::Anonymous,\n                \"_ffi_vec_to_rust\",\n                r\"\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\",\n            )\n            .add_dep_group(SourceGroup::Include, \"<stdint.h>\")\n            .add_dep_group(SourceGroup::Include, \"<vector>\")\n            .add_dep_group(SourceGroup::ExternCDecl, \"_ffi_alloc\");\n\n        source_helpers\n            .add_group(\n                SourceGroup::Anonymous,\n                \"_ffi_string_to_rust\",\n                r\"\nconst void* _ffi_string_to_rust(const std::string& str, uintptr_t &len) {\n    len = str.size();\n    return memcpy(_ffi_alloc(len), str.data(), len);\n}\n\",\n            )\n            .add_dep_group(SourceGroup::Include, \"<stdint.h>\")\n            .add_dep_group(SourceGroup::Include, \"<string>\")\n            .add_dep_group(SourceGroup::ExternCDecl, \"_ffi_alloc\");\n\n        source_helpers\n            .add_group(\n                SourceGroup::Anonymous,\n                \"_ffi_string_from_rust\",\n                r\"\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\",\n            )\n            .add_dep_group(SourceGroup::Include, \"<stdint.h>\")\n            .add_dep_group(SourceGroup::Include, \"<string>\")\n            .add_dep_group(SourceGroup::ExternCDecl, \"_ffi_dealloc\");\n\n        // Forward declarations\n        for t in &ast.traits {\n            header_helpers\n                .add_group(\n                    HeaderGroup::ForwardDecl,\n                    &t.name,\n                    format!(\"struct {};\\n\", t.name),\n                )\n                .set_is_forward_decl();\n        }\n        for s in &ast.structs {\n            header_helpers\n                .add_group(\n                    HeaderGroup::ForwardDecl,\n                    &s.name,\n                    format!(\"struct {};\\n\", s.name),\n                )\n                .set_is_forward_decl();\n        }\n        for e in &ast.enums {\n            header_helpers\n                .add_group(\n                    HeaderGroup::ForwardDecl,\n                    &e.name,\n                    format!(\"struct {};\\n\", e.name),\n                )\n                .set_is_forward_decl();\n        }\n\n        // Traits\n        for t in &ast.traits {\n            let mut deps = HashSet::new();\n            let mut code = String::new();\n            _ = write!(code, \"\\nstruct {} {{\\n\", t.name);\n            _ = write!(code, \"    virtual ~{}() {{}}\\n\", t.name);\n            for f in &t.fns {\n                code.push_str(\"    virtual \");\n                CppTypeCtx {\n                    cpp: &mut code,\n                    ast: &ast,\n                    deps: &mut deps,\n                    include_group: HeaderGroup::Include,\n                    decl_groups: Some(DeclGroups {\n                        forward: HeaderGroup::ForwardDecl,\n                        full: HeaderGroup::Other,\n                    }),\n                    loc: TypeLoc::InsideRustNamespace,\n                    ns: &self.namespace,\n                }\n                .append_cpp_signature(\n                    f.returns.as_ref().map(|r| &r.ty),\n                    &f.name,\n                    None,\n                    &f.args,\n                );\n                code.push_str(\" = 0;\\n\");\n            }\n            code.push_str(\"};\\n\");\n            header_helpers\n                .add_group(HeaderGroup::Other, &t.name, code)\n                .add_forward_decl_group(HeaderGroup::ForwardDecl, &t.name)\n                .add_deps_group(deps)\n                .mark_used();\n        }\n\n        // Enums\n        for e in &ast.enums {\n            let mut code = String::new();\n            let mut enum_deps = HashSet::new();\n            if !e.has_fields() {\n                // Enums without fields are just integers\n                _ = write!(code, \"\\nenum struct {} : int32_t\", e.name);\n                code.push_str(\" {\\n\");\n                for v in &e.variants {\n                    if v.discriminant == std::i32::MIN {\n                        // Avoid a Visual C++ warning\n                        _ = write!(code, \"    {} = {} - 1,\\n\", v.name, v.discriminant + 1);\n                    } else {\n                        _ = write!(code, \"    {} = {},\\n\", v.name, v.discriminant);\n                    }\n                }\n                code.push_str(\"};\\n\");\n            } else {\n                // Enums with fields map to \"std::variant\"\n                _ = write!(code, \"\\nstruct {} : std::variant<std::monostate\", e.name);\n                for v in &e.variants {\n                    _ = write!(code, \", detail::{}__{}\", e.name, v.name);\n                }\n                code.push_str(\"> {\\n\");\n                for v in &e.variants {\n                    _ = write!(\n                        code,\n                        \"    using {} = detail::{}__{};\\n\",\n                        v.name, e.name, v.name\n                    );\n                }\n                _ = write!(code, \"    using std::variant<std::monostate\");\n                for v in &e.variants {\n                    _ = write!(code, \", {}\", v.name);\n                }\n                code.push_str(\">::operator =;\\n\");\n                code.push_str(\n                    \"    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\\n\",\n                );\n                code.push_str(\n                    \"    template <typename T> const T* as() const { return std::get_if<T>(this); }\\n\",\n                );\n                code.push_str(\n                    \"    template <typename T> T* as() { return std::get_if<T>(this); }\\n\",\n                );\n                code.push_str(\"};\\n\");\n                enum_deps.insert((HeaderGroup::Include, \"<variant>\".to_string()));\n\n                // Declarations for the variants need to be written out separately\n                let mut detail = String::new();\n                let mut detail_deps = HashSet::new();\n                let detail_name = format!(\"detail::{}\", e.name);\n                _ = write!(detail, \"\\nnamespace detail {{\\n\");\n                for v in &e.variants {\n                    _ = write!(detail, \"\\nstruct {}__{} {{\\n\", e.name, v.name);\n                    for f in &v.fields {\n                        detail.push_str(\"    \");\n                        CppTypeCtx {\n                            cpp: &mut detail,\n                            ast: &ast,\n                            deps: &mut detail_deps,\n                            include_group: HeaderGroup::Include,\n                            decl_groups: Some(DeclGroups {\n                                forward: HeaderGroup::ForwardDecl,\n                                full: HeaderGroup::Other,\n                            }),\n                            loc: TypeLoc::InsideRustNamespace,\n                            ns: &self.namespace,\n                        }\n                        .append_cpp_type(&f.ty, CppDecl::Full);\n                        _ = write!(\n                            detail,\n                            \" {}{};\\n\",\n                            with_digit_prefix(&f.name),\n                            cpp_struct_field_init(&ast, &f.ty)\n                        );\n                    }\n                    if e.derives_partial_eq {\n                        generate_operator_eq(\n                            &mut source_helpers,\n                            &format!(\"{}::detail\", self.namespace),\n                            &format!(\"{}__{}\", e.name, v.name),\n                            &v.fields,\n                            &mut detail,\n                        );\n                    }\n                    detail.push_str(\"};\\n\");\n                }\n                _ = write!(detail, \"\\n}} // namespace detail\\n\");\n                header_helpers\n                    .add_group(HeaderGroup::Other, &detail_name, detail)\n                    .add_deps_group(detail_deps);\n                enum_deps.insert((HeaderGroup::Other, detail_name));\n            }\n            header_helpers\n                .add_group(HeaderGroup::Other, &e.name, code)\n                .add_deps_group(enum_deps)\n                .mark_used();\n        }\n\n        // Structs\n        for s in &ast.structs {\n            let mut deps = HashSet::new();\n            let mut code = String::new();\n            _ = write!(code, \"\\nstruct {}\", s.name);\n            code.push_str(\" {\\n\");\n            for f in &s.fields {\n                code.push_str(\"    \");\n                CppTypeCtx {\n                    cpp: &mut code,\n                    ast: &ast,\n                    deps: &mut deps,\n                    include_group: HeaderGroup::Include,\n                    decl_groups: Some(DeclGroups {\n                        forward: HeaderGroup::ForwardDecl,\n                        full: HeaderGroup::Other,\n                    }),\n                    loc: TypeLoc::InsideRustNamespace,\n                    ns: &self.namespace,\n                }\n                .append_cpp_type(&f.ty, CppDecl::Full);\n                _ = write!(\n                    code,\n                    \" {}{};\\n\",\n                    with_digit_prefix(&f.name),\n                    cpp_struct_field_init(&ast, &f.ty)\n                );\n            }\n            if s.derives_partial_eq {\n                generate_operator_eq(\n                    &mut source_helpers,\n                    &self.namespace,\n                    &s.name,\n                    &s.fields,\n                    &mut code,\n                );\n            }\n            code.push_str(\"};\\n\");\n            header_helpers\n                .add_group(HeaderGroup::Other, &s.name, code)\n                .add_forward_decl_group(HeaderGroup::ForwardDecl, &s.name)\n                .add_deps_group(deps)\n                .mark_used();\n        }\n\n        // Constants\n        for c in &ast.consts {\n            let mut deps = HashSet::new();\n            let mut code = String::new();\n            CppTypeCtx {\n                cpp: &mut code,\n                ast: &ast,\n                deps: &mut deps,\n                include_group: HeaderGroup::Include,\n                decl_groups: Some(DeclGroups {\n                    forward: HeaderGroup::ForwardDecl,\n                    full: HeaderGroup::Other,\n                }),\n                loc: TypeLoc::ForConstant,\n                ns: &self.namespace,\n            }\n            .append_cpp_type(&c.ty, CppDecl::Full);\n            _ = write!(code, \" const {} = \", c.name);\n            append_cpp_val(&mut code, &c.val);\n            code.push_str(\";\\n\");\n            header_helpers\n                .add_group(HeaderGroup::Constants, &c.name, code)\n                .add_deps_group(deps)\n                .mark_used();\n        }\n\n        let mut ctx = CppCtx {\n            syntax,\n            namespace: self.namespace.clone(),\n            rust_helpers,\n            source_helpers,\n            header_helpers,\n            ..CppCtx::default()\n        };\n        let mut header_fn_decls = String::new();\n\n        // Functions\n        for f in &ast.fns {\n            generate_cpp_to_rust_fn(&ast, &mut ctx, f, &mut header_fn_decls, None);\n        }\n\n        // Determine the path from the source to the header\n        let path_to_header = path_relative_from(\n            &self.header_path,\n            &self.source_path.parent().unwrap_or(Path::new(\"\")),\n        );\n        let path_to_header = path_to_header.as_ref().unwrap_or(&self.header_path);\n        let path_to_header = format!(\"{:?}\", path_to_header.display());\n\n        // Assemble the Rust code\n        let mut rust = format!(\"// {DO_NOT_EDIT_COMMENT}\\n\");\n        for it in ctx.rust_helpers.code_in_order() {\n            rust.push_str(it);\n        }\n\n        // Assemble the C++ header\n        let mut includes = HashSet::new();\n        let mut header = format!(\"// {DO_NOT_EDIT_COMMENT}\\n\");\n        let header_code = ctx.header_helpers.code_by_group_in_order();\n        header.push_str(\"\\n#pragma once\\n\");\n        if let Some(code) = header_code.get(&HeaderGroup::Include) {\n            header.push('\\n');\n            for it in code {\n                includes.insert(it);\n                header.push_str(it);\n            }\n        }\n        header.push_str(\"\\nnamespace rust {\\n\");\n        if let Some(code) = header_code.get(&HeaderGroup::ForwardDecl) {\n            header.push('\\n');\n            for it in code {\n                header.push_str(it);\n            }\n        }\n        if let Some(code) = header_code.get(&HeaderGroup::Other) {\n            for it in code {\n                header.push_str(it);\n            }\n        }\n        if let Some(code) = header_code.get(&HeaderGroup::Constants) {\n            header.push('\\n');\n            for it in code {\n                header.push_str(it);\n            }\n        }\n        header.push_str(&header_fn_decls);\n        header.push_str(\"\\n} // namespace rust\\n\");\n\n        // Assemble the C++ source\n        let mut source = format!(\"// {DO_NOT_EDIT_COMMENT}\\n\");\n        let source_code = ctx.source_helpers.code_by_group_in_order();\n        _ = write!(source, \"\\n#include {path_to_header}\\n\");\n        if let Some(code) = source_code.get(&SourceGroup::Include) {\n            for it in code {\n                if !includes.contains(it) {\n                    source.push_str(it);\n                }\n            }\n        }\n        if let Some(code) = source_code.get(&SourceGroup::MultiRet) {\n            for it in code {\n                source.push_str(it);\n            }\n        }\n        if let Some(code) = source_code.get(&SourceGroup::ExternCDecl) {\n            source.push_str(\"\\nextern \\\"C\\\" {\\n\\n\");\n            for it in code {\n                source.push_str(it);\n            }\n            source.push_str(\"\\n} // extern \\\"C\\\"\\n\");\n        }\n        if let Some(code) = source_code.get(&SourceGroup::Anonymous) {\n            source.push_str(\"\\nnamespace {\\n\");\n            for it in code {\n                source.push_str(it);\n            }\n            source.push_str(\"\\n} // namespace\\n\");\n        }\n        if let Some(code) = source_code.get(&SourceGroup::ExternCImpl) {\n            source.push_str(\"\\nextern \\\"C\\\" {\\n\");\n            for it in code {\n                source.push_str(it);\n            }\n            source.push_str(\"\\n} // extern \\\"C\\\"\\n\");\n        }\n        if let Some(code) = source_code.get(&SourceGroup::Other) {\n            for it in code {\n                source.push_str(it);\n            }\n        }\n\n        vec![\n            FileData {\n                path: rust_path,\n                contents: rust,\n            },\n            FileData {\n                path: self.source_path.clone(),\n                contents: source,\n            },\n            FileData {\n                path: self.header_path.clone(),\n                contents: header,\n            },\n        ]\n    }\n}\n\n// C++ struct fields without an initializer are uninitialized, which means they\n// start off being random garbage. This can lead to undefined behavior and\n// security vulnerabilities. Always initialize all struct fields to avoid that.\nfn cpp_struct_field_init(ast: &AST, ty: &RustType) -> &'static str {\n    use RustType::*;\n    match ty {\n        Bool => \" = false\",\n        U8 | U16 | U32 | Usize | U64 | I8 | I16 | I32 | Isize | I64 => \" = 0\",\n        F32 => \" = 0.0f\",\n        F64 => \" = 0.0\",\n        Enum(enum_index) if !ast.enums[*enum_index].has_fields() => \"{}\",\n        _ => \"\",\n    }\n}\n\n#[derive(Default)]\nstruct CppCtx {\n    syntax: RustSyntax,\n    namespace: String,\n    helper_names: NameSet,\n    rust_helpers: HelperSet<(), String>,\n    header_helpers: HelperSet<HeaderGroup, String>,\n    source_helpers: HelperSet<SourceGroup, String>,\n    multi_ret_helpers: HashMap<Vec<RustType>, String>,\n    trait_to_rust_helpers: HashMap<(RustPtr, usize), String>,\n    trait_to_cpp_helpers: HashMap<(RustPtr, usize), String>,\n    vec_to_rust_helpers: HashMap<RustType, (String, String)>,\n    vec_to_cpp_helpers: HashMap<RustType, (String, String)>,\n    box_to_rust_helpers: HashMap<RustType, (String, String)>,\n    box_to_cpp_helpers: HashMap<RustType, (String, String)>,\n    enum_to_rust_helpers: HashMap<usize, (String, String)>,\n    enum_to_cpp_helpers: HashMap<usize, (String, String)>,\n}\n\n#[derive(Default)]\nstruct Transform {\n    cpp: FnBuilder,\n    rust: FnBuilder,\n    ffi_args: Vec<RustArg>,\n    buf: Option<Rc<SharedBuf>>,\n    buf_status: BufStatus,\n    buf_ref: &'static str,\n}\n\nstruct TraitInfo<'a> {\n    t: &'a RustTrait,\n    kind: RustPtr,\n}\n\nimpl TraitInfo<'_> {\n    fn self_type(&self, ns: &str) -> RustType {\n        RustType::Verbatim(match self.kind {\n            RustPtr::Box => format!(\"{ns}::{}*\", self.t.name),\n            RustPtr::Rc => format!(\"std::shared_ptr<{ns}::{}>*\", self.t.name),\n        })\n    }\n\n    fn cpp_name(&self) -> String {\n        format!(\"_ffi_{:?}_{}\", self.kind, self.t.name)\n    }\n}\n\nfn generate_cpp_to_rust_fn(\n    ast: &AST,\n    ctx: &mut CppCtx,\n    f: &RustFn,\n    header: &mut String,\n    trait_info: Option<TraitInfo>,\n) {\n    let ffi_name = ctx.helper_names.create(&match &trait_info {\n        None => format!(\"_ffi_fn_{}\", f.name),\n        Some(info) => format!(\"_ffi_{:?}_{}__{}\", info.kind, info.t.name, f.name),\n    });\n    let mut names = NameSet::default();\n    for arg in &f.args {\n        names.add(arg.name.clone());\n    }\n    if let Some(ret) = &f.returns {\n        names.add(ret.name.clone());\n    }\n    let mut source_deps = HashSet::new();\n\n    // Transform the arguments\n    let mut arg_tfm = Transform::default();\n    if let Some(info) = &trait_info {\n        arg_tfm.rust.line(format!(\n            \"let _self = unsafe {{ &*(_self as *const {}<dyn {}>) }};\",\n            info.kind.path(),\n            info.t.name\n        ));\n    }\n    for arg in &f.args {\n        arg_tfm.cpp.mark_pure(&arg.name);\n        transform_to_rust(\n            ast,\n            ctx,\n            &mut names,\n            &mut arg_tfm,\n            &arg.name,\n            &arg.ty,\n            &mut source_deps,\n        );\n    }\n    arg_tfm.cpp.insert_deferred_lines_here();\n\n    // Generate the Rust call to the FFI function\n    let mut rust_call = String::new();\n    if trait_info.is_some() {\n        rust_call.push_str(\"_self.\");\n    }\n    _ = write!(rust_call, \"{}(\", f.name);\n    rust_call.push_str(&arg_tfm.rust.find_args(&f.args, RefInline));\n    rust_call.push(')');\n\n    // Transform the result\n    let mut ret_tfm = Transform::default();\n    if let Some(ret) = &f.returns {\n        ret_tfm.rust.decl(&ret.name, rust_call);\n        transform_to_cpp(\n            ast,\n            ctx,\n            &mut names,\n            &mut ret_tfm,\n            &ret.name,\n            &ret.ty,\n            &mut source_deps,\n        );\n    } else {\n        rust_call.push(';');\n        ret_tfm.rust.line(rust_call);\n    }\n\n    // Generate the C++ call to the FFI function\n    let mut cpp_call = format!(\"{ffi_name}(\");\n    if trait_info.is_some() {\n        cpp_call.push_str(\"_self\");\n        if !arg_tfm.ffi_args.is_empty() {\n            cpp_call.push_str(\", \");\n        }\n    }\n    cpp_call.push_str(&arg_tfm.cpp.find_args(&arg_tfm.ffi_args, RefStdMove));\n    cpp_call.push(')');\n\n    // Header\n    {\n        let mut header_deps = HashSet::new();\n        if trait_info.is_none() {\n            header.push('\\n');\n        }\n        CppTypeCtx {\n            cpp: header,\n            ast,\n            deps: &mut header_deps,\n            include_group: HeaderGroup::Include,\n            decl_groups: None,\n            loc: match trait_info {\n                None => TypeLoc::InsideRustNamespace,\n                Some(_) => TypeLoc::OutsideRustNamespace,\n            },\n            ns: &ctx.namespace,\n        }\n        .append_cpp_signature(f.returns.as_ref().map(|r| &r.ty), &f.name, None, &f.args);\n        header.push_str(\";\\n\");\n        ctx.header_helpers.mark_all_used_group(header_deps);\n    }\n\n    // Source: Other\n    {\n        // Handle the return values\n        let mut fb = arg_tfm.cpp;\n        match &ret_tfm.ffi_args[..] {\n            [] => {\n                cpp_call.push(';');\n                fb.line(cpp_call);\n            }\n            [arg] => fb.decl(&arg.name, cpp_call),\n            _ => {\n                let ret = names.create(\"multi_ret\");\n                fb.decl(&ret, cpp_call);\n                for (i, arg) in ret_tfm.ffi_args.iter().enumerate() {\n                    fb.decl(&arg.name, format!(\"{ret}._{i}\"));\n                }\n            }\n        };\n        fb.extend(ret_tfm.cpp);\n        fb.insert_deferred_lines_here();\n        if let Some(ret) = &f.returns {\n            let code = fb.find(&ret.name, &ret.ty, RefInline).code;\n            fb.line(format!(\"return {code};\"));\n        }\n\n        // Write out the final function\n        let mut source = String::new();\n        let fn_name = &match &trait_info {\n            None => format!(\"{}::{}\", ctx.namespace, f.name),\n            Some(info) => format!(\"{}::{}\", info.cpp_name(), f.name),\n        };\n        source.push('\\n');\n        CppTypeCtx {\n            cpp: &mut source,\n            ast,\n            deps: &mut source_deps,\n            include_group: SourceGroup::Include,\n            decl_groups: None,\n            loc: TypeLoc::OutsideRustNamespace,\n            ns: &ctx.namespace,\n        }\n        .append_cpp_signature(f.returns.as_ref().map(|r| &r.ty), fn_name, None, &f.args);\n        source.push_str(\" {\\n\");\n        fb.write_to_cpp(ctx, ast, &mut source_deps, &mut source, \"    \");\n        source.push_str(\"}\\n\");\n        source_deps.insert((SourceGroup::ExternCDecl, ffi_name.clone()));\n        ctx.source_helpers\n            .add_group(SourceGroup::Other, &fn_name, source)\n            .add_deps_group(source_deps)\n            .mark_used();\n    }\n\n    // Source: ExternCDecl\n    {\n        let mut source_deps = HashSet::new();\n        let mut source = String::new();\n        let return_ty = match &ret_tfm.ffi_args[..] {\n            [] => None,\n            [arg] => Some(Cow::Borrowed(&arg.ty)),\n            _ => {\n                let ty_name = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n                source_deps.insert((SourceGroup::MultiRet, ty_name.clone()));\n                Some(Cow::Owned(RustType::Verbatim(ty_name)))\n            }\n        };\n        CppTypeCtx {\n            cpp: &mut source,\n            ast,\n            deps: &mut source_deps,\n            include_group: SourceGroup::Include,\n            decl_groups: None,\n            loc: TypeLoc::OutsideRustNamespace,\n            ns: &ctx.namespace,\n        }\n        .append_cpp_signature(\n            return_ty.as_deref(),\n            &ffi_name,\n            trait_info\n                .as_ref()\n                .map(|_| RustArg {\n                    name: \"_self\".into(),\n                    ty: RustType::ForeignHandle,\n                })\n                .as_ref(),\n            &arg_tfm.ffi_args,\n        );\n        source.push_str(\";\\n\");\n        ctx.source_helpers\n            .add_group(SourceGroup::ExternCDecl, &ffi_name, source)\n            .add_deps_group(source_deps);\n    }\n\n    // Rust\n    {\n        // Handle the return values\n        let mut fb = arg_tfm.rust;\n        fb.extend(ret_tfm.rust);\n        fb.insert_deferred_lines_here();\n        match &ret_tfm.ffi_args[..] {\n            [] => {}\n            [arg] => {\n                let code = fb.find(&arg.name, &arg.ty, RefInline).code;\n                fb.line(code);\n            }\n            _ => {\n                let ty_name = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n                let args = fb.find_args(&ret_tfm.ffi_args, RefInline);\n                fb.line(format!(\"{ty_name}({args})\"));\n            }\n        }\n\n        // Write out the final function\n        let mut rust = String::new();\n        _ = write!(rust, \"\\n{}\\n\", ctx.syntax.unsafe_no_mangle());\n        _ = write!(rust, \"extern \\\"C\\\" fn {ffi_name}(\");\n        if trait_info.is_some() {\n            rust.push_str(\"_self: *const u8\");\n        }\n        for (i, arg) in arg_tfm.ffi_args.iter().enumerate() {\n            if trait_info.is_some() || i > 0 {\n                rust.push_str(\", \");\n            }\n            _ = write!(rust, \"{}: \", arg.name);\n            append_rust_type(&mut rust, ast, &arg.ty);\n        }\n        rust.push(')');\n        match &ret_tfm.ffi_args[..] {\n            [] => {}\n            [arg] => {\n                rust.push_str(\" -> \");\n                append_rust_type(&mut rust, ast, &arg.ty);\n            }\n            _ => {\n                let ty_name = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n                _ = write!(rust, \" -> {ty_name}\");\n            }\n        }\n        rust.push_str(\" {\\n\");\n        fb.write_to_rust(ast, &mut rust, \"    \");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&ffi_name, rust).mark_used();\n    }\n}\n\nfn generate_rust_to_cpp_fn(\n    ast: &AST,\n    ctx: &mut CppCtx,\n    kind: RustPtr,\n    t: &RustTrait,\n    f: &RustFn,\n    rust: &mut String,\n) {\n    let ffi_name = ctx\n        .helper_names\n        .create(&format!(\"_ffi_cpp_{kind:?}_{}__{}\", t.name, f.name));\n    let mut names = NameSet::default();\n    for arg in &f.args {\n        names.add(arg.name.clone());\n    }\n    if let Some(ret) = &f.returns {\n        names.add(ret.name.clone());\n    }\n    let mut source_deps = HashSet::new();\n\n    // Transform the arguments\n    let mut arg_tfm = Transform::default();\n    for arg in &f.args {\n        arg_tfm.rust.mark_pure(&arg.name);\n        transform_to_cpp(\n            ast,\n            ctx,\n            &mut names,\n            &mut arg_tfm,\n            &arg.name,\n            &arg.ty,\n            &mut source_deps,\n        );\n    }\n    arg_tfm.rust.insert_deferred_lines_here();\n\n    // Generate the C++ call to the API function\n    let mut cpp_call = String::new();\n    cpp_call.push_str(match kind {\n        RustPtr::Box => \"_self\",\n        RustPtr::Rc => \"_self->get()\",\n    });\n    _ = write!(cpp_call, \"->{}(\", f.name);\n    cpp_call.push_str(&arg_tfm.cpp.find_args(&f.args, RefStdMove));\n    cpp_call.push(')');\n\n    // Transform the result\n    let mut ret_tfm = Transform::default();\n    if let Some(ret) = &f.returns {\n        ret_tfm.cpp.decl(&ret.name, cpp_call);\n        transform_to_rust(\n            ast,\n            ctx,\n            &mut names,\n            &mut ret_tfm,\n            &ret.name,\n            &ret.ty,\n            &mut source_deps,\n        );\n    } else {\n        cpp_call.push(';');\n        ret_tfm.cpp.line(cpp_call);\n    }\n\n    // Generate the Rust call to the FFI function\n    let mut rust_call = format!(\"unsafe {{ {ffi_name}(self.0\");\n    if !arg_tfm.ffi_args.is_empty() {\n        rust_call.push_str(\", \");\n    }\n    rust_call.push_str(&arg_tfm.rust.find_args(&arg_tfm.ffi_args, RefInline));\n    rust_call.push_str(\") }\");\n\n    // Rust\n    {\n        // Handle the return values\n        let mut fb = arg_tfm.rust;\n        match &ret_tfm.ffi_args[..] {\n            [] => {\n                rust_call.push(';');\n                fb.line(rust_call);\n            }\n            [arg] => fb.decl(&arg.name, rust_call),\n            _ => {\n                let ret = names.create(\"multi_ret\");\n                fb.decl(&ret, rust_call);\n                for (i, arg) in ret_tfm.ffi_args.iter().enumerate() {\n                    fb.decl(&arg.name, format!(\"{ret}.{i}\"));\n                }\n            }\n        };\n        fb.extend(ret_tfm.rust);\n        fb.insert_deferred_lines_here();\n        if let Some(ret) = &f.returns {\n            let code = fb.find(&ret.name, &ret.ty, RefInline).code;\n            fb.line(code);\n        }\n\n        // Write out the final function\n        _ = write!(rust, \"\\n    fn {}(&self\", f.name);\n        for arg in &f.args {\n            _ = write!(rust, \", {}: \", arg.name);\n            append_rust_type(rust, ast, &arg.ty);\n        }\n        rust.push(')');\n        if let Some(returns) = &f.returns {\n            rust.push_str(\" -> \");\n            append_rust_type(rust, ast, &returns.ty);\n        }\n        rust.push_str(\" {\\n\");\n        _ = write!(\n            rust,\n            \"        {} \\\"C\\\" {{ fn {ffi_name}(_: *const u8\",\n            ctx.syntax.unsafe_extern()\n        );\n        for arg in &arg_tfm.ffi_args {\n            _ = write!(rust, \", {}: \", arg.name);\n            append_rust_type(rust, ast, &arg.ty);\n        }\n        match &ret_tfm.ffi_args[..] {\n            [] => rust.push(')'),\n            [arg] => {\n                rust.push_str(\") -> \");\n                append_rust_type(rust, ast, &arg.ty);\n            }\n            _ => {\n                let ty_name = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n                _ = write!(rust, \") -> {ty_name}\");\n            }\n        }\n        rust.push_str(\"; }\\n\");\n        fb.write_to_rust(ast, rust, \"        \");\n        rust.push_str(\"    }\\n\");\n    }\n\n    // Source: ExternCImpl\n    {\n        // Handle the return values\n        let mut fb = arg_tfm.cpp;\n        fb.extend(ret_tfm.cpp);\n        fb.insert_deferred_lines_here();\n        let return_ty = match &ret_tfm.ffi_args[..] {\n            [] => None,\n            [arg] => {\n                let code = fb.find(&arg.name, &arg.ty, RefInline).code;\n                fb.line(format!(\"return {code};\"));\n                Some(Cow::Borrowed(&arg.ty))\n            }\n            _ => {\n                let ty_name = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n                let args = fb.find_args(&ret_tfm.ffi_args, RefStdMove);\n                fb.line(format!(\"return {ty_name}{{{args}}};\"));\n                source_deps.insert((SourceGroup::MultiRet, ty_name.clone()));\n                Some(Cow::Owned(RustType::Verbatim(ty_name)))\n            }\n        };\n\n        // Write out the final function\n        let mut source = String::new();\n        source.push('\\n');\n        CppTypeCtx {\n            cpp: &mut source,\n            ast,\n            deps: &mut source_deps,\n            include_group: SourceGroup::Include,\n            decl_groups: None,\n            loc: TypeLoc::OutsideRustNamespace,\n            ns: &ctx.namespace,\n        }\n        .append_cpp_signature(\n            return_ty.as_deref(),\n            &ffi_name,\n            Some(&RustArg {\n                name: \"_self\".into(),\n                ty: TraitInfo { t, kind }.self_type(&ctx.namespace),\n            }),\n            &arg_tfm.ffi_args,\n        );\n        source.push_str(\" {\\n\");\n        fb.write_to_cpp(ctx, ast, &mut source_deps, &mut source, \"    \");\n        source.push_str(\"}\\n\");\n        ctx.source_helpers\n            .add_group(SourceGroup::ExternCImpl, &ffi_name, source)\n            .add_deps_group(source_deps)\n            .mark_used();\n    }\n}\n\nfn generate_operator_eq(\n    source_helpers: &mut HelperSet<SourceGroup, String>,\n    ns: &str,\n    name: &str,\n    fields: &[RustField],\n    header: &mut String,\n) {\n    use RustType::*;\n\n    fn cpp_type_contains_box(ty: &RustType) -> bool {\n        match ty {\n            Pair { other, .. } => cpp_type_contains_box(other),\n            Vector(inner_ty) => cpp_type_contains_box(inner_ty),\n            Optional(inner_ty) => cpp_type_contains_box(inner_ty),\n            Ptr(kind, inner_ty) if *kind == RustPtr::Box => match &**inner_ty {\n                DynTrait(_) => false,\n                _ => true,\n            },\n            Tuple(types) => types.iter().any(cpp_type_contains_box),\n            _ => false,\n        }\n    }\n\n    fn emit_eq(\n        parts: &mut Vec<String>,\n        ty: &RustType,\n        a: &str,\n        b: &str,\n        source_deps: &mut HashSet<(SourceGroup, String)>,\n    ) {\n        if !cpp_type_contains_box(ty) {\n            parts.push(format!(\"{a} == {b}\"));\n            return;\n        }\n\n        match ty {\n            Pair { other, .. } => emit_eq(parts, other, a, b, source_deps),\n\n            Tuple(types) => {\n                for (i, item_ty) in types.iter().enumerate() {\n                    let a = format!(\"std::get<{i}>({a})\");\n                    let b = format!(\"std::get<{i}>({b})\");\n                    emit_eq(parts, item_ty, &a, &b, source_deps);\n                }\n            }\n\n            Ptr(_, inner_ty) => {\n                let a = format!(\"*{a}\");\n                let b = format!(\"*{b}\");\n                emit_eq(parts, inner_ty, &a, &b, source_deps);\n            }\n\n            Optional(inner_ty) => {\n                let mut inner_parts = Vec::new();\n                let inner_a = format!(\"*{a}\");\n                let inner_b = format!(\"*{b}\");\n                emit_eq(&mut inner_parts, inner_ty, &inner_a, &inner_b, source_deps);\n                parts.push(if inner_parts.is_empty() {\n                    format!(\"!{a} == !{b}\")\n                } else {\n                    format!(\"({a} && {b} ? {} : !{a} && !{b})\", inner_parts.join(\" && \"))\n                });\n            }\n\n            Vector(inner_ty) => {\n                let mut inner_parts = Vec::new();\n                emit_eq(&mut inner_parts, inner_ty, \"a\", \"b\", source_deps);\n                parts.push(if inner_parts.is_empty() {\n                    format!(\"{a}.size() == {b}.size()\")\n                } else {\n                    source_deps.insert((SourceGroup::Include, \"<algorithm>\".into())); // For \"std::equal\"\n                    let a = if a.starts_with('*') {\n                        Cow::Owned(format!(\"({a})\"))\n                    } else {\n                        Cow::Borrowed(a)\n                    };\n                    let b = if b.starts_with('*') {\n                        Cow::Owned(format!(\"({b})\"))\n                    } else {\n                        Cow::Borrowed(b)\n                    };\n                    format!(\n                        \"std::equal({a}.begin(), {a}.end(), {b}.begin(), {b}.end(), \\\n                        [](const auto& a, const auto& b) {{ return {}; }})\",\n                        inner_parts.join(\" && \")\n                    )\n                });\n            }\n\n            _ => parts.push(format!(\"{a} == {b}\")),\n        }\n    }\n\n    let mut names = NameSet::default();\n    for f in fields {\n        names.add(with_digit_prefix(&f.name).to_string());\n    }\n    let other = names.create(\n        &name\n            .chars()\n            .next()\n            .unwrap()\n            .to_ascii_lowercase()\n            .to_string(),\n    );\n    let mut parts = Vec::new();\n    let mut source_deps = HashSet::new();\n\n    for f in fields {\n        let a = with_digit_prefix(&f.name);\n        let b = format!(\"{other}.{a}\");\n        emit_eq(&mut parts, &f.ty, &a, &b, &mut source_deps);\n    }\n\n    if parts.is_empty() {\n        _ = write!(\n            header,\n            \"    bool operator == (const {name}&) const {{ return true; }}\\n\"\n        );\n    } else {\n        let mut source =\n            format!(\"\\nbool {ns}::{name}::operator == (const {ns}::{name}& {other}) const {{\\n\");\n        if parts.len() == 1 || parts.iter().map(|x| x.len()).sum::<usize>() < 100 {\n            _ = write!(source, \"    return {};\\n\", parts.join(\" && \"));\n        } else {\n            source.push_str(\"    return (\");\n            for (i, part) in parts.iter().enumerate() {\n                if i > 0 {\n                    source.push_str(\" &&\");\n                }\n                source.push_str(\"\\n        \");\n                source.push_str(part);\n            }\n            source.push_str(\"\\n    );\\n\");\n        }\n        source.push_str(\"}\\n\");\n        _ = write!(header, \"    bool operator == (const {name}&) const;\\n\");\n        source_helpers\n            .add_group(SourceGroup::Other, &format!(\"{name}::operator ==\"), source)\n            .add_deps_group(source_deps)\n            .mark_used();\n    }\n\n    _ = write!(\n        header,\n        \"    bool operator != (const {name}& {other}) const {{ return !(*this == {other}); }}\\n\"\n    );\n}\n\nfn transform_to_rust(\n    ast: &AST,\n    ctx: &mut CppCtx,\n    names: &mut NameSet,\n    tfm: &mut Transform,\n    name: &str,\n    ty: &RustType,\n    source_deps: &mut HashSet<(SourceGroup, String)>,\n) {\n    use RustType::*;\n\n    fn add_ffi_arg(\n        ast: &AST,\n        ctx: &mut CppCtx,\n        tfm: &mut Transform,\n        source_deps: &mut HashSet<(SourceGroup, String)>,\n        name: &str,\n        ty: &RustType,\n    ) {\n        match tfm.buf_status {\n            BufStatus::Outside => tfm.ffi_args.push(RustArg {\n                name: name.to_string(),\n                ty: ty.clone(),\n            }),\n            BufStatus::Inside => {\n                let buf = tfm.buf.as_ref().unwrap();\n\n                // C++ (write)\n                let code = tfm.cpp.find(name, ty, RefStdMove).code;\n                tfm.cpp\n                    .line(format!(\"_ffi_write({code}, {});\", buf.buf_name()));\n                source_deps.insert((SourceGroup::Anonymous, \"_ffi_write\".into()));\n\n                // Rust (read)\n                let mut rust = \"_ffi_read::<\".to_string();\n                append_rust_type(&mut rust, ast, ty);\n                _ = write!(rust, \">({}{})\", tfm.buf_ref, buf.end_name());\n                tfm.rust.decl(name, rust);\n                ctx.rust_helpers.mark_used(\"_ffi_read\");\n            }\n        }\n    }\n\n    match ty {\n        Bool | U8 | U16 | U32 | Usize | U64 | I8 | I16 | I32 | Isize | I64 | F32 | F64\n        | ForeignHandle => add_ffi_arg(ast, ctx, tfm, source_deps, name, ty),\n\n        RefStr | OwnStr => {\n            let cpp_code = tfm.cpp.find(name, ty, RefInline).code;\n            let ptr_name = names.create(&format!(\"{name}_ptr\"));\n            let len_name = names.create(&format!(\"{name}_len\"));\n            let opt_ref = match ty {\n                RefStr => \"&\",\n                _ => \"\",\n            };\n            tfm.cpp.line(format!(\"uintptr_t {len_name};\"));\n            tfm.cpp.line(format!(\n                \"const void* {ptr_name} = _ffi_string_to_rust({cpp_code}, {len_name});\"\n            ));\n            ctx.source_helpers\n                .mark_used_group(SourceGroup::Anonymous, \"_ffi_string_to_rust\");\n            add_ffi_arg(ast, ctx, tfm, source_deps, &ptr_name, &ForeignHandle);\n            add_ffi_arg(ast, ctx, tfm, source_deps, &len_name, &Usize);\n            let len_code = tfm.rust.find(&len_name, &Usize, RefInline).code;\n            let ptr_code = tfm.rust.find(&ptr_name, &ForeignHandle, RefInline).code;\n            tfm.rust.decl(\n                name,\n                format!(\"{opt_ref}_ffi_string_from_host({ptr_code}, {len_code})\"),\n            );\n            ctx.rust_helpers.mark_used(\"_ffi_string_from_host\");\n        }\n\n        Enum(enum_index) => {\n            let e = &ast.enums[*enum_index];\n            let (cpp_helper, rust_helper) = enum_to_rust_helper(ast, ctx, *enum_index);\n            if !e.has_fields() {\n                let cpp = tfm.cpp.find(name, ty, RefInline);\n                let raw_name = names.create(&format!(\"{name}_raw\"));\n                tfm.cpp\n                    .maybe_pure_decl(cpp.pure, &raw_name, format!(\"int32_t({})\", cpp.code));\n                add_ffi_arg(ast, ctx, tfm, source_deps, &raw_name, &I32);\n                tfm.rust.decl(name, format!(\"{rust_helper}({raw_name})\"));\n            } else {\n                let cpp = tfm.cpp.find(name, ty, RefStdMove);\n                let buf = ensure_cpp_buf(ctx, names, tfm, source_deps);\n                tfm.cpp\n                    .line(format!(\"{cpp_helper}({}, {});\", cpp.code, buf.buf_name()));\n                source_deps.insert((SourceGroup::Anonymous, cpp_helper));\n                tfm.rust.decl(\n                    name,\n                    format!(\"{rust_helper}({}{})\", tfm.buf_ref, buf.end_name()),\n                );\n            }\n        }\n\n        Struct(struct_index) => {\n            let cpp = tfm.cpp.find(name, ty, RefMany);\n            let s = &ast.structs[*struct_index];\n            let mut item_names = Vec::new();\n            for f in &s.fields {\n                let item_name = names.create(&format!(\"{name}_{}\", f.name));\n                tfm.cpp.maybe_pure_decl(\n                    cpp.pure,\n                    &item_name,\n                    format!(\"{}.{}\", cpp.code, with_digit_prefix(&f.name)),\n                );\n                transform_to_rust(ast, ctx, names, tfm, &item_name, &f.ty, source_deps);\n                item_names.push(item_name.into());\n            }\n            if s.fields.is_empty() {\n                // Avoid an unused variable warning in C++\n                let code = tfm.cpp.find(name, ty, RefInline).code;\n                tfm.cpp.line(format!(\"(void){code};\"));\n            }\n            rust_decl_ctor(&mut tfm.rust, name, &s.name, &s.fields, item_names);\n        }\n\n        Tuple(types) => {\n            let cpp = tfm.cpp.find(name, ty, RefMany);\n            let mut item_args = Vec::new();\n            for (i, item_ty) in types.iter().enumerate() {\n                let item_name = names.create(&format!(\"{name}_{i}\"));\n                tfm.cpp.maybe_pure_decl(\n                    cpp.pure,\n                    &item_name,\n                    format!(\"std::get<{i}>({})\", cpp.code),\n                );\n                transform_to_rust(ast, ctx, names, tfm, &item_name, &item_ty, source_deps);\n                item_args.push(RustArg {\n                    name: item_name,\n                    ty: item_ty.clone(),\n                });\n            }\n            if types.is_empty() {\n                // Avoid an unused variable warning in C++\n                let code = tfm.cpp.find(name, ty, RefInline).code;\n                tfm.cpp.line(format!(\"(void){code};\"));\n            }\n            let mut rust_code = tfm.rust.find_args(&item_args, RefInline);\n            if types.len() == 1 {\n                rust_code.push(',');\n            }\n            tfm.rust.decl(name, format!(\"({rust_code})\"));\n        }\n\n        Ptr(kind, inner_ty) => {\n            if let DynTrait(trait_index) = &**inner_ty {\n                let cpp_code = tfm.cpp.find(name, ty, RefInline).code;\n                let ptr_name = names.create(&format!(\"{name}_ptr\"));\n                let rust_helper = trait_to_rust_helper(ast, ctx, *trait_index, *kind);\n                let cpp_code = match kind {\n                    RustPtr::Box => format!(\"{cpp_code}.release()\"),\n                    RustPtr::Rc => format!(\n                        \"new std::shared_ptr<{}::{}>({cpp_code})\",\n                        ctx.namespace, ast.traits[*trait_index].name\n                    ),\n                };\n                tfm.cpp.decl(&ptr_name, cpp_code);\n                add_ffi_arg(ast, ctx, tfm, source_deps, &ptr_name, &ForeignHandle);\n                let ptr_code = tfm.rust.find(&ptr_name, &ForeignHandle, RefInline).code;\n                tfm.rust.decl(\n                    name,\n                    format!(\"{}::new({rust_helper}({ptr_code}))\", kind.path()),\n                );\n            } else if *kind == RustPtr::Box {\n                let cpp_code = tfm.cpp.find(name, ty, RefMany).code;\n                let (cpp_helper, rust_helper) = box_to_rust_helper(ast, ctx, inner_ty);\n                let buf = ensure_cpp_buf(ctx, names, tfm, source_deps);\n                tfm.cpp.line(format!(\n                    \"{cpp_helper}(std::move(*{cpp_code}), {});\",\n                    buf.buf_name()\n                ));\n                source_deps.insert((SourceGroup::Anonymous, cpp_helper));\n                tfm.rust.decl(\n                    name,\n                    format!(\"{rust_helper}({}{})\", tfm.buf_ref, buf.end_name()),\n                );\n            } else {\n                unreachable!()\n            }\n        }\n\n        Vector(inner_ty) => {\n            let cpp_code = tfm.cpp.find(name, ty, RefMany).code;\n            let len_name = names.create(&format!(\"{name}_len\"));\n            let (cpp_helper, rust_helper) = vec_to_rust_helper(ast, ctx, inner_ty);\n            let buf = ensure_cpp_buf(ctx, names, tfm, source_deps);\n            tfm.cpp.decl(&len_name, format!(\"{cpp_code}.size()\"));\n            add_ffi_arg(ast, ctx, tfm, source_deps, &len_name, &Usize);\n            tfm.cpp.line(format!(\n                \"{cpp_helper}(std::move({cpp_code}), {});\",\n                buf.buf_name()\n            ));\n            source_deps.insert((SourceGroup::Anonymous, cpp_helper));\n            let len_code = tfm.rust.find(&len_name, ty, RefInline).code;\n            tfm.rust.decl(\n                name,\n                format!(\n                    \"{rust_helper}({len_code}, {}{})\",\n                    tfm.buf_ref,\n                    buf.end_name()\n                ),\n            );\n        }\n\n        Optional(inner_ty) => {\n            let cpp_code = tfm.cpp.find(name, ty, RefMany).code;\n            let has_name = names.create(&format!(\"has_{name}\"));\n            let val_name = names.create(&format!(\"{name}_val\"));\n            ensure_cpp_buf(ctx, names, tfm, source_deps);\n\n            tfm.cpp.decl(&has_name, format!(\"{cpp_code}.has_value()\"));\n            add_ffi_arg(ast, ctx, tfm, source_deps, &has_name, &Bool);\n\n            let mut rust = FnBuilder::default();\n            tfm.cpp.line(format!(\"if ({has_name}) {{\"));\n            tfm.cpp.pure_decl(&val_name, format!(\"{cpp_code}.value()\"));\n            {\n                let old = tfm.buf_status;\n                tfm.buf_status = BufStatus::Inside;\n                std::mem::swap(&mut tfm.rust, &mut rust);\n                transform_to_rust(ast, ctx, names, tfm, &val_name, inner_ty, source_deps);\n                std::mem::swap(&mut tfm.rust, &mut rust);\n                tfm.buf_status = old;\n            }\n            tfm.cpp.line(\"}\".into());\n\n            let has_code = tfm.rust.find(&has_name, ty, RefInline).code;\n            let val_code = rust.find(&val_name, ty, RefInline).code;\n            if rust.is_empty() {\n                tfm.rust\n                    .decl(name, format!(\"{has_code}.then(|| {val_code})\"));\n            } else {\n                rust.insert_deferred_lines_here();\n                rust.line(val_code);\n                tfm.rust.line(format!(\"let {name} = {has_code}.then(|| {{\"));\n                tfm.rust.extend(rust);\n                tfm.rust.line(\"});\".to_string());\n            }\n        }\n\n        Pair { .. } | Verbatim(_) | DynTrait(_) => unreachable!(),\n    }\n}\n\nfn transform_to_cpp(\n    ast: &AST,\n    ctx: &mut CppCtx,\n    names: &mut NameSet,\n    tfm: &mut Transform,\n    name: &str,\n    ty: &RustType,\n    source_deps: &mut HashSet<(SourceGroup, String)>,\n) {\n    use RustType::*;\n\n    fn add_ffi_arg(\n        ast: &AST,\n        ctx: &mut CppCtx,\n        tfm: &mut Transform,\n        source_deps: &mut HashSet<(SourceGroup, String)>,\n        name: &str,\n        ty: &RustType,\n    ) {\n        match tfm.buf_status {\n            BufStatus::Outside => tfm.ffi_args.push(RustArg {\n                name: name.to_string(),\n                ty: ty.clone(),\n            }),\n            BufStatus::Inside => {\n                let buf = tfm.buf.as_ref().unwrap();\n\n                // Rust (write)\n                let code = tfm.rust.find(name, ty, RefInline).code;\n                tfm.rust.line(format!(\n                    \"_ffi_write({code}, {}{});\",\n                    tfm.buf_ref,\n                    buf.buf_name()\n                ));\n                ctx.rust_helpers.mark_used(\"_ffi_write\");\n\n                // C++ (read)\n                let mut source = \"_ffi_read<\".to_string();\n                CppTypeCtx {\n                    cpp: &mut source,\n                    ast,\n                    deps: source_deps,\n                    include_group: SourceGroup::Include,\n                    decl_groups: None,\n                    loc: TypeLoc::OutsideRustNamespace,\n                    ns: &ctx.namespace,\n                }\n                .append_cpp_type(ty, CppDecl::Full);\n                _ = write!(source, \">({})\", buf.end_name());\n                tfm.cpp.decl(name, source);\n                source_deps.insert((SourceGroup::Anonymous, \"_ffi_read\".into()));\n            }\n        }\n    }\n\n    match ty {\n        Bool | U8 | U16 | U32 | Usize | U64 | I8 | I16 | I32 | Isize | I64 | F32 | F64\n        | ForeignHandle => add_ffi_arg(ast, ctx, tfm, source_deps, name, ty),\n\n        RefStr | OwnStr => {\n            let mut rust_code = tfm.rust.find(name, ty, RefInline).code;\n            let ptr_name = names.create(&format!(\"{name}_ptr\"));\n            let len_name = names.create(&format!(\"{name}_len\"));\n            let cap_name = names.create(&format!(\"{name}_cap\"));\n            let ptr_ty = Pair {\n                rust: ForeignHandle.into(),\n                other: Verbatim(\"const char*\".into()).into(),\n            };\n            if let RefStr = ty {\n                rust_code.push_str(\".into()\");\n            }\n            tfm.rust.line(format!(\n                \"let ({ptr_name}, {len_name}, {cap_name}) = _ffi_string_to_host({rust_code});\"\n            ));\n            ctx.rust_helpers.mark_used(\"_ffi_string_to_host\");\n            add_ffi_arg(ast, ctx, tfm, source_deps, &ptr_name, &ptr_ty);\n            add_ffi_arg(ast, ctx, tfm, source_deps, &len_name, &Usize);\n            add_ffi_arg(ast, ctx, tfm, source_deps, &cap_name, &Usize);\n            tfm.cpp.decl(\n                name,\n                format!(\"_ffi_string_from_rust({ptr_name}, {len_name}, {cap_name})\"),\n            );\n            source_deps.insert((SourceGroup::Anonymous, \"_ffi_string_from_rust\".into()));\n        }\n\n        Enum(enum_index) => {\n            let rust = tfm.rust.find(name, ty, RefInline);\n            let e = &ast.enums[*enum_index];\n            if !e.has_fields() {\n                let raw_name = names.create(&format!(\"{name}_raw\"));\n                tfm.rust\n                    .maybe_pure_decl(rust.pure, &raw_name, format!(\"{} as i32\", rust.code));\n                add_ffi_arg(ast, ctx, tfm, source_deps, &raw_name, &I32);\n                tfm.cpp\n                    .decl(name, format!(\"{}::{}({raw_name})\", ctx.namespace, e.name));\n            } else {\n                let (cpp_helper, rust_helper) = enum_to_cpp_helper(ast, ctx, *enum_index);\n                let buf = ensure_rust_buf(ctx, names, tfm, source_deps);\n                tfm.rust.line(format!(\n                    \"{rust_helper}({}, {}{});\",\n                    rust.code,\n                    tfm.buf_ref,\n                    buf.buf_name()\n                ));\n                tfm.cpp\n                    .decl(name, format!(\"{cpp_helper}({})\", buf.end_name()));\n                source_deps.insert((SourceGroup::Anonymous, cpp_helper));\n            }\n        }\n\n        Struct(struct_index) => {\n            let rust = tfm.rust.find(name, ty, RefMany);\n            let s = &ast.structs[*struct_index];\n            let mut item_args = Vec::new();\n            for f in &s.fields {\n                let item_name = names.create(&format!(\"{name}_{}\", f.name));\n                tfm.rust.maybe_pure_decl(\n                    rust.pure,\n                    &item_name,\n                    format!(\"{}.{}\", rust.code, f.name),\n                );\n                transform_to_cpp(ast, ctx, names, tfm, &item_name, &f.ty, source_deps);\n                item_args.push(RustArg {\n                    name: item_name,\n                    ty: f.ty.clone(),\n                });\n            }\n            if s.fields.is_empty() {\n                // Avoid an unused variable warning in Rust\n                let code = tfm.rust.find(name, ty, RefInline).code;\n                tfm.rust.line(format!(\"_ = {code};\"));\n            }\n            let fields = tfm.cpp.find_args(&item_args, RefStdMove);\n            tfm.cpp\n                .decl(name, format!(\"{}::{}{{{fields}}}\", ctx.namespace, s.name));\n        }\n\n        Tuple(types) => {\n            let rust = tfm.rust.find(name, ty, RefMany);\n            let mut item_args = Vec::new();\n            for (i, item_ty) in types.iter().enumerate() {\n                let item_name = names.create(&format!(\"{name}_{i}\"));\n                tfm.rust\n                    .maybe_pure_decl(rust.pure, &item_name, format!(\"{}.{i}\", rust.code));\n                transform_to_cpp(ast, ctx, names, tfm, &item_name, &item_ty, source_deps);\n                item_args.push(RustArg {\n                    name: item_name,\n                    ty: item_ty.clone(),\n                });\n            }\n            if types.is_empty() {\n                tfm.cpp.decl(name, \"std::tuple<>()\".to_string());\n\n                // Avoid an unused variable warning in Rust\n                let code = tfm.rust.find(name, ty, RefInline).code;\n                tfm.rust.line(format!(\"_ = {code};\"));\n            } else {\n                let cpp_code = tfm.cpp.find_args(&item_args, RefStdMove);\n                tfm.cpp.decl(\n                    name,\n                    match types.len() {\n                        1 => cpp_code,\n                        _ => format!(\"std::make_tuple({cpp_code})\"),\n                    },\n                );\n            }\n        }\n\n        Ptr(kind, inner_ty) => {\n            if let DynTrait(trait_index) = &**inner_ty {\n                let rust_code = tfm.rust.find(name, ty, RefInline).code;\n                let ptr_name = names.create(&format!(\"{name}_ptr\"));\n                let cpp_helper = trait_to_cpp_helper(ast, ctx, *trait_index, *kind);\n                tfm.rust.decl(\n                    &ptr_name,\n                    format!(\"Box::into_raw(Box::new({rust_code})) as *const u8\"),\n                );\n                add_ffi_arg(ast, ctx, tfm, source_deps, &ptr_name, &ForeignHandle);\n                tfm.cpp.decl(\n                    name,\n                    match kind {\n                        RustPtr::Box => {\n                            let mut cpp_type = String::new();\n                            CppTypeCtx {\n                                cpp: &mut cpp_type,\n                                ast,\n                                deps: source_deps,\n                                include_group: SourceGroup::Include,\n                                decl_groups: None,\n                                loc: TypeLoc::OutsideRustNamespace,\n                                ns: &ctx.namespace,\n                            }\n                            .append_cpp_type(inner_ty, CppDecl::Forward);\n                            format!(\"std::unique_ptr<{cpp_type}>(new {cpp_helper}({ptr_name}))\")\n                        }\n                        RustPtr::Rc => format!(\"std::make_shared<{cpp_helper}>({ptr_name})\"),\n                    },\n                );\n            } else if *kind == RustPtr::Box {\n                let rust_code = tfm.rust.find(name, ty, RefMany).code;\n                let (cpp_helper, rust_helper) = box_to_cpp_helper(ast, ctx, inner_ty);\n                let buf = ensure_rust_buf(ctx, names, tfm, source_deps);\n                tfm.rust.line(format!(\n                    \"{rust_helper}(*{rust_code}, {}{});\",\n                    tfm.buf_ref,\n                    buf.buf_name()\n                ));\n                tfm.cpp\n                    .decl(name, format!(\"{cpp_helper}({})\", buf.end_name()));\n                source_deps.insert((SourceGroup::Anonymous, cpp_helper));\n            } else {\n                unreachable!()\n            }\n        }\n\n        Vector(inner_ty) => {\n            let rust_code = tfm.rust.find(name, ty, RefMany).code;\n            let len_name = names.create(&format!(\"{name}_len\"));\n            let (cpp_helper, rust_helper) = vec_to_cpp_helper(ast, ctx, inner_ty);\n            let buf = ensure_rust_buf(ctx, names, tfm, source_deps);\n            tfm.rust.decl(&len_name, format!(\"{rust_code}.len()\"));\n            add_ffi_arg(ast, ctx, tfm, source_deps, &len_name, &Usize);\n            tfm.rust.line(format!(\n                \"{rust_helper}({rust_code}, {}{});\",\n                tfm.buf_ref,\n                buf.buf_name()\n            ));\n            let len_code = tfm.cpp.find(&len_name, ty, RefMany).code;\n            tfm.cpp.decl(\n                name,\n                format!(\"{cpp_helper}({len_code}, {})\", buf.end_name()),\n            );\n            source_deps.insert((SourceGroup::Anonymous, cpp_helper));\n        }\n\n        Optional(inner_ty) => {\n            let rust_code = tfm.rust.find(name, ty, RefMany).code;\n            let has_name = names.create(&format!(\"has_{name}\"));\n            let val_name = names.create(&format!(\"{name}_val\"));\n            ensure_rust_buf(ctx, names, tfm, source_deps);\n\n            tfm.rust.decl(&has_name, format!(\"{rust_code}.is_some()\"));\n            add_ffi_arg(ast, ctx, tfm, source_deps, &has_name, &Bool);\n\n            let mut cpp = FnBuilder::default();\n            tfm.rust\n                .line(format!(\"if let Some({val_name}) = {rust_code} {{\"));\n            {\n                let old = tfm.buf_status;\n                tfm.buf_status = BufStatus::Inside;\n                std::mem::swap(&mut tfm.cpp, &mut cpp);\n                transform_to_cpp(ast, ctx, names, tfm, &val_name, inner_ty, source_deps);\n                std::mem::swap(&mut tfm.cpp, &mut cpp);\n                tfm.buf_status = old;\n            }\n            tfm.rust.line(\"}\".into());\n\n            let has_code = tfm.cpp.find(&has_name, ty, RefInline).code;\n            let mut val_code = cpp.find(&val_name, ty, RefInline).code;\n            val_code = format!(\"std::make_optional({val_code})\");\n            if cpp.is_empty() {\n                tfm.cpp\n                    .decl(name, format!(\"{has_code} ? {val_code} : std::nullopt\"));\n            } else {\n                let mut cpp_ty = String::new();\n                CppTypeCtx {\n                    cpp: &mut cpp_ty,\n                    ast,\n                    deps: source_deps,\n                    include_group: SourceGroup::Include,\n                    decl_groups: None,\n                    loc: TypeLoc::OutsideRustNamespace,\n                    ns: &ctx.namespace,\n                }\n                .append_cpp_type(ty, CppDecl::Full);\n                cpp.insert_deferred_lines_here();\n                cpp.line(format!(\"{name} = {val_code};\"));\n                tfm.cpp.line(format!(\"{cpp_ty} {name};\"));\n                tfm.cpp.line(format!(\"if ({has_code}) {{\"));\n                tfm.cpp.extend(cpp);\n                tfm.cpp.line(\"}\".to_string());\n            }\n        }\n\n        Pair { .. } | Verbatim(_) | DynTrait(_) => unreachable!(),\n    }\n}\n\nfn ensure_cpp_buf(\n    ctx: &mut CppCtx,\n    names: &mut NameSet,\n    tfm: &mut Transform,\n    source_deps: &mut HashSet<(SourceGroup, String)>,\n) -> Rc<SharedBuf> {\n    if let Some(buf) = &tfm.buf {\n        return buf.clone();\n    }\n\n    let buf_name = names.create(\"buf\");\n    let ptr_name = names.create(\"buf_ptr\");\n    let end_name = names.create(\"buf_end\");\n    let buf = SharedBuf::new(&buf_name, &end_name);\n\n    // C++ (write)\n    tfm.cpp.line(format!(\"std::vector<uint8_t> {buf_name};\"));\n    tfm.cpp\n        .defer_decl(&ptr_name, format!(\"_ffi_vec_to_rust({buf_name})\"));\n    source_deps.insert((SourceGroup::Anonymous, \"_ffi_vec_to_rust\".into()));\n\n    // Rust (read)\n    tfm.rust.line_alt(\n        // Avoid a warning about an unnecessarily mutable variable\n        format!(\"let {end_name} = {ptr_name};\"),\n        format!(\"let mut {end_name} = {ptr_name};\"),\n        buf.is_buf_name_used_flag(),\n    );\n    tfm.rust\n        .defer_line(format!(\"_ffi_buf_from_host({ptr_name}, {end_name});\"));\n    ctx.rust_helpers.mark_used(\"_ffi_buf_from_host\");\n\n    // FFI\n    tfm.buf = Some(buf.clone());\n    tfm.buf_ref = \"&mut \";\n    tfm.ffi_args.push(RustArg {\n        name: ptr_name,\n        ty: RustType::ForeignHandle,\n    });\n    buf\n}\n\nfn ensure_rust_buf(\n    ctx: &mut CppCtx,\n    names: &mut NameSet,\n    tfm: &mut Transform,\n    source_deps: &mut HashSet<(SourceGroup, String)>,\n) -> Rc<SharedBuf> {\n    if let Some(buf) = &tfm.buf {\n        return buf.clone();\n    }\n\n    let buf_name = names.create(\"buf\");\n    let ptr_name = names.create(\"buf_ptr\");\n    let end_name = names.create(\"buf_end\");\n    let cap_name = names.create(\"buf_cap\");\n    let buf = SharedBuf::new(&buf_name, &end_name);\n\n    // Rust (write)\n    tfm.rust.line_alt(\n        // Avoid a warning about an unnecessarily mutable variable\n        format!(\"let {buf_name} = Vec::<u8>::new();\"),\n        format!(\"let mut {buf_name} = Vec::<u8>::new();\"),\n        buf.is_buf_name_used_flag(),\n    );\n    tfm.rust.defer_line(format!(\n        \"let ({ptr_name}, {cap_name}) = _ffi_buf_to_host({buf_name});\"\n    ));\n    ctx.rust_helpers.mark_used(\"_ffi_buf_to_host\");\n\n    // C++ (read)\n    tfm.cpp.line_alt(\n        \"\".to_string(),\n        format!(\"auto {end_name} = (const uint8_t*){ptr_name};\"),\n        buf.is_end_name_used_flag(),\n    );\n    tfm.cpp\n        .defer_line(format!(\"_ffi_dealloc({ptr_name}, {cap_name});\"));\n    source_deps.insert((SourceGroup::ExternCDecl, \"_ffi_dealloc\".into()));\n\n    // FFI\n    tfm.buf = Some(buf.clone());\n    tfm.buf_ref = \"&mut \";\n    tfm.ffi_args.push(RustArg {\n        name: ptr_name,\n        ty: RustType::ForeignHandle,\n    });\n    tfm.ffi_args.push(RustArg {\n        name: cap_name,\n        ty: RustType::Usize,\n    });\n    buf\n}\n\nfn vec_to_rust_helper(ast: &AST, ctx: &mut CppCtx, inner_ty: &RustType) -> (String, String) {\n    if let Some(result) = ctx.vec_to_rust_helpers.get(inner_ty) {\n        return result.clone();\n    }\n\n    let mut base_name = \"_ffi_vec_\".to_string();\n    append_type_name_hint(&mut base_name, ast, inner_ty);\n    let cpp_name = ctx.helper_names.create(&format!(\"{base_name}_to_rust\"));\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_from_cpp\"));\n    let cpp_name_decl = format!(\"{cpp_name}[decl]\");\n\n    // This must be done first to avoid a stack overflow\n    ctx.vec_to_rust_helpers\n        .insert(inner_ty.clone(), (cpp_name.clone(), rust_name.clone()));\n\n    let mut locals = NameSet::default();\n    let vec_name = locals.create(\"items\");\n    let item_name = locals.create(\"item\");\n    let end_name = locals.create(\"end\");\n    let len_name = locals.create(\"len\");\n    let buf_name = locals.create(\"buf\");\n\n    // Transform the items\n    let mut tfm = Transform::default();\n    let mut source_deps = HashSet::new();\n    let buf = SharedBuf::new(&buf_name, &end_name);\n    tfm.buf = Some(buf.clone());\n    tfm.buf_status = BufStatus::Inside;\n    tfm.cpp.mark_pure(&item_name);\n    transform_to_rust(\n        ast,\n        ctx,\n        &mut locals,\n        &mut tfm,\n        &item_name,\n        &inner_ty,\n        &mut source_deps,\n    );\n    let item_code = tfm.rust.find(&item_name, inner_ty, RefInline).code;\n    tfm.rust.line(format!(\"{vec_name}.push({item_code});\"));\n\n    // Source (forward declaration)\n    let mut cpp_ty = String::new();\n    {\n        let mut source_deps = HashSet::new();\n        CppTypeCtx {\n            cpp: &mut cpp_ty,\n            ast,\n            deps: &mut source_deps,\n            include_group: SourceGroup::Include,\n            decl_groups: None,\n            loc: TypeLoc::OutsideRustNamespace,\n            ns: &ctx.namespace,\n        }\n        .append_cpp_type(inner_ty, CppDecl::Full);\n        let source = format!(\n            \"\\nvoid {cpp_name}(std::vector<{cpp_ty}>&& {vec_name}, std::vector<uint8_t>& {buf_name});\\n\"\n        );\n        ctx.source_helpers\n            .add_group(SourceGroup::Anonymous, &cpp_name_decl, source)\n            .set_is_forward_decl();\n    }\n\n    // Source\n    {\n        let mut source = format!(\n            \"\\nvoid {cpp_name}(std::vector<{cpp_ty}>&& {vec_name}, std::vector<uint8_t>& {buf_name}) {{\\n\"\n        );\n        if !tfm.cpp.is_empty() {\n            _ = write!(source, \"    for (auto&& {item_name} : {vec_name}) {{\\n\");\n            tfm.cpp\n                .write_to_cpp(ctx, ast, &mut source_deps, &mut source, \"        \");\n            source.push_str(\"    }\\n\");\n        }\n        source.push_str(\"}\\n\");\n        ctx.source_helpers\n            .add_group(SourceGroup::Anonymous, &cpp_name, source)\n            .add_forward_decl_group(SourceGroup::Anonymous, &cpp_name_decl)\n            .add_deps_group(source_deps);\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        let mut item_ty = String::new();\n        let end_name = buf.final_end_name_for_rust();\n        append_rust_type(&mut item_ty, ast, inner_ty);\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(\n            rust,\n            \"\\nfn {rust_name}({len_name}: usize, {end_name}: &mut *const u8) -> Vec<{item_ty}> {{\\n\"\n        );\n        _ = write!(\n            rust,\n            \"    let mut {vec_name} = Vec::<{item_ty}>::with_capacity({len_name});\\n\"\n        );\n        _ = write!(rust, \"    for _ in 0..{len_name} {{\\n\");\n        tfm.rust.write_to_rust(ast, &mut rust, \"        \");\n        rust.push_str(\"    }\\n\");\n        _ = write!(rust, \"    {vec_name}\\n\");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n    }\n\n    (cpp_name, rust_name)\n}\n\nfn vec_to_cpp_helper(ast: &AST, ctx: &mut CppCtx, inner_ty: &RustType) -> (String, String) {\n    if let Some(result) = ctx.vec_to_cpp_helpers.get(inner_ty) {\n        return result.clone();\n    }\n\n    let mut base_name = \"_ffi_vec_\".to_string();\n    append_type_name_hint(&mut base_name, ast, inner_ty);\n    let cpp_name = ctx.helper_names.create(&format!(\"{base_name}_from_rust\"));\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_to_cpp\"));\n    let cpp_name_decl = format!(\"{cpp_name}[decl]\");\n\n    // This must be done first to avoid a stack overflow\n    ctx.vec_to_cpp_helpers\n        .insert(inner_ty.clone(), (cpp_name.clone(), rust_name.clone()));\n\n    let mut locals = NameSet::default();\n    let vec_name = locals.create(\"items\");\n    let item_name = locals.create(\"item\");\n    let end_name = locals.create(\"end\");\n    let len_name = locals.create(\"len\");\n    let buf_name = locals.create(\"buf\");\n\n    // Transform the items\n    let mut tfm = Transform::default();\n    let mut source_deps = HashSet::new();\n    let buf = SharedBuf::new(&buf_name, &end_name);\n    tfm.buf = Some(buf.clone());\n    tfm.buf_status = BufStatus::Inside;\n    tfm.rust.mark_pure(&item_name);\n    transform_to_cpp(\n        ast,\n        ctx,\n        &mut locals,\n        &mut tfm,\n        &item_name,\n        &inner_ty,\n        &mut source_deps,\n    );\n    let item_code = tfm.cpp.find(&item_name, inner_ty, RefStdMove).code;\n    tfm.cpp\n        .line(format!(\"{vec_name}.emplace_back({item_code});\"));\n\n    // Rust\n    {\n        let mut rust = String::new();\n        let buf_name = buf.final_buf_name_for_rust();\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(rust, \"\\nfn {rust_name}({vec_name}: Vec<\");\n        append_rust_type(&mut rust, ast, inner_ty);\n        _ = write!(rust, \">, {buf_name}: &mut Vec<u8>) {{\\n\");\n        if !tfm.rust.is_empty() {\n            _ = write!(rust, \"    for {item_name} in {vec_name} {{\\n\");\n            tfm.rust.write_to_rust(ast, &mut rust, \"        \");\n            rust.push_str(\"    }\\n\");\n        }\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n    }\n\n    // Source (forward declaration)\n    let mut cpp_ty = String::new();\n    {\n        let mut source_deps = HashSet::new();\n        CppTypeCtx {\n            cpp: &mut cpp_ty,\n            ast,\n            deps: &mut source_deps,\n            include_group: SourceGroup::Include,\n            decl_groups: None,\n            loc: TypeLoc::OutsideRustNamespace,\n            ns: &ctx.namespace,\n        }\n        .append_cpp_type(inner_ty, CppDecl::Full);\n        let source = format!(\n            \"\\nstd::vector<{cpp_ty}> {cpp_name}(uintptr_t {len_name}, const uint8_t*& {end_name});\\n\"\n        );\n        ctx.source_helpers\n            .add_group(SourceGroup::Anonymous, &cpp_name_decl, source)\n            .set_is_forward_decl();\n    }\n\n    // Source\n    {\n        let mut source = String::new();\n        _ = write!(\n            source,\n            \"\nstd::vector<{cpp_ty}> {cpp_name}(uintptr_t {len_name}, const uint8_t*& {end_name}) {{\n    std::vector<{cpp_ty}> {vec_name};\n    {vec_name}.reserve({len_name});\n    while ({vec_name}.size() < {len_name}) {{\n\"\n        );\n        tfm.cpp\n            .write_to_cpp(ctx, ast, &mut source_deps, &mut source, \"        \");\n        source.push_str(\"    }\\n\");\n        _ = write!(source, \"    return {vec_name};\\n\");\n        source.push_str(\"}\\n\");\n        ctx.source_helpers\n            .add_group(SourceGroup::Anonymous, &cpp_name, source)\n            .add_forward_decl_group(SourceGroup::Anonymous, &cpp_name_decl)\n            .add_deps_group(source_deps);\n    }\n\n    (cpp_name, rust_name)\n}\n\nfn trait_to_rust_helper(ast: &AST, ctx: &mut CppCtx, trait_index: usize, kind: RustPtr) -> String {\n    if let Some(result) = ctx.trait_to_rust_helpers.get(&(kind, trait_index)) {\n        return result.clone();\n    }\n\n    let t = &ast.traits[trait_index];\n    let rust_name = format!(\"_ffi_rs_{kind:?}_{}\", t.name);\n    let drop_name = format!(\"_ffi_cpp_drop_{kind:?}_{}\", t.name);\n\n    // This must be done first to avoid a stack overflow\n    ctx.trait_to_rust_helpers\n        .insert((kind, trait_index), rust_name.clone());\n\n    // Source: ExternCImpl\n    {\n        let mut source = String::new();\n        let mut source_deps = HashSet::new();\n        source.push('\\n');\n        CppTypeCtx {\n            cpp: &mut source,\n            ast,\n            deps: &mut source_deps,\n            include_group: SourceGroup::Include,\n            decl_groups: None,\n            loc: TypeLoc::OutsideRustNamespace,\n            ns: &ctx.namespace,\n        }\n        .append_cpp_signature(\n            None,\n            &drop_name,\n            None,\n            &[RustArg {\n                name: \"self\".to_string(),\n                ty: TraitInfo { t, kind }.self_type(&ctx.namespace),\n            }],\n        );\n        source.push_str(\" {\\n\");\n        source.push_str(\"    delete self;\\n\");\n        source.push_str(\"}\\n\");\n        ctx.source_helpers\n            .add_group(SourceGroup::ExternCImpl, &drop_name, source)\n            .add_deps_group(source_deps)\n            .mark_used();\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        allow_non_camel_case_types(&mut rust, &rust_name);\n        _ = write!(rust, \"\\nstruct {rust_name}(*const u8);\\n\");\n        _ = write!(rust, \"\\nimpl Drop for {rust_name} {{\\n\");\n        rust.push_str(\"    fn drop(&mut self) {\\n\");\n        _ = write!(\n            rust,\n            \"        {} \\\"C\\\" {{ fn {drop_name}(_: *const u8); }}\\n\",\n            ctx.syntax.unsafe_extern()\n        );\n        _ = write!(rust, \"        unsafe {{ {drop_name}(self.0) }};\\n\");\n        rust.push_str(\"    }\\n\");\n        rust.push_str(\"}\\n\");\n        _ = write!(rust, \"\\nimpl {} for {rust_name} {{\", t.name);\n        for f in &t.fns {\n            generate_rust_to_cpp_fn(ast, ctx, kind, t, f, &mut rust);\n        }\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n    }\n\n    rust_name\n}\n\nfn trait_to_cpp_helper(ast: &AST, ctx: &mut CppCtx, trait_index: usize, kind: RustPtr) -> String {\n    if let Some(result) = ctx.trait_to_cpp_helpers.get(&(kind, trait_index)) {\n        return result.clone();\n    }\n\n    let t = &ast.traits[trait_index];\n    let drop_name = format!(\"_ffi_drop_{kind:?}_{}\", t.name);\n    let cpp_name = TraitInfo { t, kind }.cpp_name();\n\n    // This must be done first to avoid a stack overflow\n    ctx.trait_to_cpp_helpers\n        .insert((kind, trait_index), cpp_name.clone());\n\n    // Source: ExternCDecl\n    {\n        let mut source = String::new();\n        let mut source_deps = HashSet::new();\n        CppTypeCtx {\n            cpp: &mut source,\n            ast,\n            deps: &mut source_deps,\n            include_group: SourceGroup::Include,\n            decl_groups: None,\n            loc: TypeLoc::OutsideRustNamespace,\n            ns: &ctx.namespace,\n        }\n        .append_cpp_signature(\n            None,\n            &drop_name,\n            None,\n            &[RustArg {\n                name: \"ptr\".to_string(),\n                ty: RustType::ForeignHandle,\n            }],\n        );\n        source.push_str(\";\\n\");\n        ctx.source_helpers\n            .add_group(SourceGroup::ExternCDecl, &drop_name, source)\n            .add_deps_group(source_deps);\n    }\n\n    // Source: Anonymous\n    {\n        let mut source = String::new();\n        _ = write!(\n            source,\n            \"\\nstruct {cpp_name} final : {}::{} {{\\n\",\n            ctx.namespace, t.name\n        );\n        _ = write!(\n            source,\n            \"    {cpp_name}(const void* ptr) : _self(ptr) {{}}\\n\"\n        );\n        _ = write!(\n            source,\n            \"    virtual ~{cpp_name}() {{ {drop_name}(_self); }}\\n\"\n        );\n        for f in &t.fns {\n            let info = Some(TraitInfo { t, kind });\n            source.push_str(\"    virtual \");\n            generate_cpp_to_rust_fn(ast, ctx, f, &mut source, info);\n        }\n        source.push_str(\"    const void* _self;\\n\");\n        source.push_str(\"};\\n\");\n        ctx.source_helpers\n            .add_group(SourceGroup::Anonymous, &cpp_name, source)\n            .add_dep_group(SourceGroup::ExternCDecl, &drop_name)\n            .mark_used();\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        _ = write!(rust, \"\\n{}\\n\", ctx.syntax.unsafe_no_mangle());\n        _ = write!(rust, \"extern \\\"C\\\" fn {drop_name}(ptr: *const u8) {{\\n\");\n        _ = write!(\n            rust,\n            \"    drop(unsafe {{ Box::from_raw(ptr as *mut {}<dyn {}>) }});\\n\",\n            kind.path(),\n            t.name\n        );\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&drop_name, rust).mark_used();\n    }\n\n    cpp_name\n}\n\nfn box_to_rust_helper(ast: &AST, ctx: &mut CppCtx, inner_ty: &RustType) -> (String, String) {\n    if let Some(result) = ctx.box_to_rust_helpers.get(inner_ty) {\n        return result.clone();\n    }\n\n    let mut base_name = \"_ffi_box_\".to_string();\n    append_type_name_hint(&mut base_name, ast, inner_ty);\n    let cpp_name = ctx.helper_names.create(&format!(\"{base_name}_to_rust\"));\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_from_cpp\"));\n    let cpp_name_decl = format!(\"{cpp_name}[decl]\");\n\n    // This must be done first to avoid a stack overflow\n    ctx.box_to_rust_helpers\n        .insert(inner_ty.clone(), (cpp_name.clone(), rust_name.clone()));\n\n    let mut locals = NameSet::default();\n    let val_name = locals.create(\"val\");\n    let end_name = locals.create(\"end\");\n    let buf_name = locals.create(\"buf\");\n\n    // Transform the value\n    let mut tfm = Transform::default();\n    let mut source_deps = HashSet::new();\n    let buf = SharedBuf::new(&buf_name, &end_name);\n    tfm.buf = Some(buf.clone());\n    tfm.buf_status = BufStatus::Inside;\n    tfm.cpp.mark_pure(&val_name);\n    transform_to_rust(\n        ast,\n        ctx,\n        &mut locals,\n        &mut tfm,\n        &val_name,\n        &inner_ty,\n        &mut source_deps,\n    );\n    let val_code = tfm.rust.find(&val_name, inner_ty, RefInline).code;\n    tfm.rust.line(format!(\"Box::new({val_code})\"));\n\n    // Source (forward declaration)\n    let mut cpp_ty = String::new();\n    {\n        CppTypeCtx {\n            cpp: &mut cpp_ty,\n            ast,\n            deps: &mut source_deps,\n            include_group: SourceGroup::Include,\n            decl_groups: None,\n            loc: TypeLoc::OutsideRustNamespace,\n            ns: &ctx.namespace,\n        }\n        .append_cpp_type(inner_ty, CppDecl::Full);\n        ctx.source_helpers\n            .add_group(\n                SourceGroup::Anonymous,\n                &cpp_name_decl,\n                format!(\n                    \"\\nvoid {cpp_name}({cpp_ty} {val_name}, std::vector<uint8_t>& {buf_name});\\n\"\n                ),\n            )\n            .set_is_forward_decl();\n    }\n\n    // Source\n    {\n        let mut source = String::new();\n        _ = write!(\n            source,\n            \"\\nvoid {cpp_name}({cpp_ty} {val_name}, std::vector<uint8_t>& {buf_name}) {{\\n\"\n        );\n        tfm.cpp\n            .write_to_cpp(ctx, ast, &mut source_deps, &mut source, \"    \");\n        source.push_str(\"}\\n\");\n        ctx.source_helpers\n            .add_group(SourceGroup::Anonymous, &cpp_name, source)\n            .add_forward_decl_group(SourceGroup::Anonymous, &cpp_name_decl)\n            .add_deps_group(source_deps);\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        let mut item_ty = String::new();\n        let end_name = buf.final_end_name_for_rust();\n        append_rust_type(&mut item_ty, ast, inner_ty);\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(\n            rust,\n            \"\\nfn {rust_name}({end_name}: &mut *const u8) -> Box<{item_ty}> {{\\n\"\n        );\n        tfm.rust.write_to_rust(ast, &mut rust, \"    \");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n    }\n\n    (cpp_name, rust_name)\n}\n\nfn box_to_cpp_helper(ast: &AST, ctx: &mut CppCtx, inner_ty: &RustType) -> (String, String) {\n    if let Some(result) = ctx.box_to_cpp_helpers.get(inner_ty) {\n        return result.clone();\n    }\n\n    let mut base_name = \"_ffi_box_\".to_string();\n    append_type_name_hint(&mut base_name, ast, inner_ty);\n    let cpp_name = ctx.helper_names.create(&format!(\"{base_name}_from_rust\"));\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_to_cpp\"));\n    let cpp_name_decl = format!(\"{cpp_name}[decl]\");\n\n    // This must be done first to avoid a stack overflow\n    ctx.box_to_cpp_helpers\n        .insert(inner_ty.clone(), (cpp_name.clone(), rust_name.clone()));\n\n    let mut locals = NameSet::default();\n    let val_name = locals.create(\"val\");\n    let end_name = locals.create(\"end\");\n    let buf_name = locals.create(\"buf\");\n\n    // Transform the items\n    let mut tfm = Transform::default();\n    let mut source_deps = HashSet::new();\n    let buf = SharedBuf::new(&buf_name, &end_name);\n    tfm.buf = Some(buf.clone());\n    tfm.buf_status = BufStatus::Inside;\n    tfm.rust.mark_pure(&val_name);\n    transform_to_cpp(\n        ast,\n        ctx,\n        &mut locals,\n        &mut tfm,\n        &val_name,\n        &inner_ty,\n        &mut source_deps,\n    );\n    let val_code = tfm.cpp.find(&val_name, inner_ty, RefStdMove).code;\n\n    // Rust\n    {\n        let mut rust = String::new();\n        let buf_name = buf.final_buf_name_for_rust();\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(rust, \"\\nfn {rust_name}({val_name}: \");\n        append_rust_type(&mut rust, ast, inner_ty);\n        _ = write!(rust, \", {buf_name}: &mut Vec<u8>) {{\\n\");\n        tfm.rust.write_to_rust(ast, &mut rust, \"    \");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n    }\n\n    // Source (forward declaration)\n    let mut cpp_ty = String::new();\n    {\n        CppTypeCtx {\n            cpp: &mut cpp_ty,\n            ast,\n            deps: &mut source_deps,\n            include_group: SourceGroup::Include,\n            decl_groups: None,\n            loc: TypeLoc::OutsideRustNamespace,\n            ns: &ctx.namespace,\n        }\n        .append_cpp_type(inner_ty, CppDecl::Full);\n        ctx.source_helpers\n            .add_group(\n                SourceGroup::Anonymous,\n                &cpp_name_decl,\n                format!(\"\\nstd::unique_ptr<{cpp_ty}> {cpp_name}(const uint8_t*& {end_name});\\n\"),\n            )\n            .set_is_forward_decl();\n    }\n\n    // Source\n    {\n        let mut source = String::new();\n        _ = write!(\n            source,\n            \"\\nstd::unique_ptr<{cpp_ty}> {cpp_name}(const uint8_t*& {end_name}) {{\\n\"\n        );\n        tfm.cpp\n            .write_to_cpp(ctx, ast, &mut source_deps, &mut source, \"    \");\n        _ = write!(\n            source,\n            \"    return std::make_unique<{cpp_ty}>({val_code});\\n\"\n        );\n        source.push_str(\"}\\n\");\n        ctx.source_helpers\n            .add_group(SourceGroup::Anonymous, &cpp_name, source)\n            .add_forward_decl_group(SourceGroup::Anonymous, &cpp_name_decl)\n            .add_deps_group(source_deps);\n    }\n\n    (cpp_name, rust_name)\n}\n\nfn enum_to_rust_helper(ast: &AST, ctx: &mut CppCtx, enum_index: usize) -> (String, String) {\n    if let Some(result) = ctx.enum_to_rust_helpers.get(&enum_index) {\n        return result.clone();\n    }\n\n    let e = &ast.enums[enum_index];\n    let base_name = format!(\"_ffi_enum_{}\", e.name);\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_from_cpp\"));\n    let cpp_name = ctx.helper_names.create(&format!(\"{base_name}_to_rust\"));\n    let cpp_name_decl = format!(\"{cpp_name}[decl]\");\n\n    // This must be done first to avoid a stack overflow\n    ctx.enum_to_rust_helpers\n        .insert(enum_index, (cpp_name.clone(), rust_name.clone()));\n\n    let mut locals = NameSet::default();\n    let val_name = locals.create(\"val\");\n    let buf_name = locals.create(\"buf\");\n    let end_name = locals.create(\"end\");\n    let it_name = locals.create(\"it\");\n    let mut branches = Vec::new();\n    let mut source_deps = HashSet::new();\n\n    // Enums without fields are just integers\n    if !e.has_fields() {\n        let mut rust = String::new();\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(rust, \"\\nfn {rust_name}({val_name}: i32) -> {} {{\\n\", e.name);\n        _ = write!(rust, \"    match {val_name} {{\\n\");\n        for v in &e.variants {\n            _ = write!(\n                rust,\n                \"        {} => {}::{},\\n\",\n                v.discriminant, e.name, v.name\n            );\n        }\n        rust.push_str(\"        _ => panic!(),\\n\");\n        rust.push_str(\"    }\\n\");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n        return (cpp_name, rust_name);\n    }\n\n    struct Branch {\n        tfm: Transform,\n        fields: Vec<String>,\n    }\n\n    // Transform all fields for each variant in a separate branch\n    for v in &e.variants {\n        let mut branch_locals = locals.clone();\n        let mut fields = Vec::new();\n        let mut tfm = Transform::default();\n        let buf = SharedBuf::new(&buf_name, &end_name);\n        tfm.buf = Some(buf.clone());\n        tfm.buf_status = BufStatus::Inside;\n        for f in &v.fields {\n            let field_name = branch_locals.create(&name_for_match(&f.name, v.fields.len()));\n            tfm.cpp.pure_decl(\n                &field_name,\n                format!(\"{it_name}->{}\", with_digit_prefix(&f.name)),\n            );\n            transform_to_rust(\n                ast,\n                ctx,\n                &mut branch_locals,\n                &mut tfm,\n                &field_name,\n                &f.ty,\n                &mut source_deps,\n            );\n            fields.push(field_name);\n        }\n        rust_decl_ctor(\n            &mut tfm.rust,\n            &val_name,\n            &format!(\"{}::{}\", e.name, v.name),\n            &v.fields,\n            fields.iter().map(|x| Cow::Borrowed(x.as_str())).collect(),\n        );\n        branches.push(Branch { tfm, fields });\n    }\n\n    // Source (forward declaration)\n    {\n        ctx.source_helpers\n            .add_group(\n                SourceGroup::Anonymous,\n                &cpp_name_decl,\n                format!(\n                    \"\\nvoid {cpp_name}({}::{} {val_name}, std::vector<uint8_t>& {buf_name});\\n\",\n                    ctx.namespace, e.name\n                ),\n            )\n            .set_is_forward_decl();\n    }\n\n    // Source\n    {\n        let mut source = String::new();\n        let mut is_first = true;\n        _ = write!(\n            source,\n            \"\\nvoid {cpp_name}({}::{} {val_name}, std::vector<uint8_t>& {buf_name}) {{\",\n            ctx.namespace, e.name\n        );\n        for (v, branch) in e.variants.iter().zip(&mut branches) {\n            source.push_str(if is_first { \"\\n    \" } else { \" else \" });\n            is_first = false;\n            if branch.fields.is_empty() {\n                _ = write!(\n                    source,\n                    \"if ({val_name}.is<{}::{}::{}>()) {{\\n\",\n                    ctx.namespace, e.name, v.name\n                );\n            } else {\n                _ = write!(\n                    source,\n                    \"if (auto {it_name} = {val_name}.as<{}::{}::{}>()) {{\\n\",\n                    ctx.namespace, e.name, v.name\n                );\n            }\n            _ = write!(\n                source,\n                \"        _ffi_write(int32_t({}), {buf_name});\\n\",\n                v.discriminant\n            );\n            source_deps.insert((SourceGroup::Anonymous, \"_ffi_write\".into()));\n            branch\n                .tfm\n                .cpp\n                .write_to_cpp(ctx, ast, &mut source_deps, &mut source, \"        \");\n            source.push_str(\"    }\");\n        }\n        if is_first {\n            source.push_str(\"    abort();\\n\");\n        } else {\n            source.push_str(\" else {\\n        abort();\\n    }\");\n        }\n        source_deps.insert((SourceGroup::Include, \"<stdlib.h>\".into())); // For \"abort\"\n        source.push_str(\"\\n}\\n\");\n        ctx.source_helpers\n            .add_group(SourceGroup::Anonymous, &cpp_name, source)\n            .add_forward_decl_group(SourceGroup::Anonymous, &cpp_name_decl)\n            .add_deps_group(source_deps)\n            .mark_used();\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(\n            rust,\n            \"\\nfn {rust_name}({end_name}: &mut *const u8) -> {} {{\\n\",\n            e.name\n        );\n        _ = write!(rust, \"    match _ffi_read::<i32>({end_name}) {{\\n\");\n        for (v, branch) in e.variants.iter().zip(&mut branches) {\n            let val_code = branch\n                .tfm\n                .rust\n                .find(&val_name, &RustType::Enum(enum_index), RefInline)\n                .code;\n            if branch.tfm.rust.is_empty() {\n                let val_code = format!(\"{} => {val_code},\", v.discriminant);\n                branch.tfm.rust.line(val_code);\n                branch.tfm.rust.write_to_rust(ast, &mut rust, \"        \");\n            } else {\n                _ = write!(rust, \"        {} => {{\", v.discriminant);\n                branch.tfm.rust.line(val_code);\n                branch\n                    .tfm\n                    .rust\n                    .write_to_rust(ast, &mut rust, \"            \");\n                rust.push_str(\"        }\\n\");\n            }\n        }\n        rust.push_str(\"        _ => panic!(),\\n\");\n        rust.push_str(\"    }\\n\");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers\n            .add(&rust_name, rust)\n            .add_dep(\"_ffi_read\")\n            .mark_used();\n    }\n\n    (cpp_name, rust_name)\n}\n\nfn enum_to_cpp_helper(ast: &AST, ctx: &mut CppCtx, enum_index: usize) -> (String, String) {\n    if let Some(result) = ctx.enum_to_cpp_helpers.get(&enum_index) {\n        return result.clone();\n    }\n\n    let e = &ast.enums[enum_index];\n    let base_name = format!(\"_ffi_enum_{}\", e.name);\n    let cpp_name = ctx.helper_names.create(&format!(\"{base_name}_from_rust\"));\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_to_cpp\"));\n    let cpp_name_decl = format!(\"{cpp_name}[decl]\");\n\n    // This must be done first to avoid a stack overflow\n    ctx.enum_to_cpp_helpers\n        .insert(enum_index, (cpp_name.clone(), rust_name.clone()));\n\n    struct Branch {\n        tfm: Transform,\n        fields: Vec<String>,\n    }\n\n    let mut locals = NameSet::default();\n    let val_name = locals.create(\"val\");\n    let buf_name = locals.create(\"buf\");\n    let end_name = locals.create(\"end\");\n    let mut branches = Vec::new();\n    let mut source_deps = HashSet::new();\n\n    // Transform all fields for each variant in a separate branch\n    for v in &e.variants {\n        let mut branch_locals = locals.clone();\n        let mut fields = Vec::new();\n        let mut tfm = Transform::default();\n        let buf = SharedBuf::new(&buf_name, &end_name);\n        tfm.buf = Some(buf.clone());\n        tfm.buf_status = BufStatus::Inside;\n        for f in &v.fields {\n            let field_name = branch_locals.create(&name_for_match(&f.name, v.fields.len()));\n            tfm.rust.mark_pure(&field_name);\n            transform_to_cpp(\n                ast,\n                ctx,\n                &mut branch_locals,\n                &mut tfm,\n                &field_name,\n                &f.ty,\n                &mut source_deps,\n            );\n            fields.push(field_name);\n        }\n        let args = tfm.cpp.find_args(\n            &v.fields\n                .iter()\n                .zip(&fields)\n                .map(|(f, name)| RustArg {\n                    name: name.clone(),\n                    ty: f.ty.clone(),\n                })\n                .collect(),\n            RefStdMove,\n        );\n        tfm.cpp.decl(\n            &val_name,\n            format!(\n                \"{}::{}{{{}::{}::{}{{{args}}}}}\",\n                ctx.namespace, e.name, ctx.namespace, e.name, v.name\n            ),\n        );\n        branches.push(Branch { tfm, fields });\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(\n            rust,\n            \"\\nfn {rust_name}({val_name}: {}, {buf_name}: &mut Vec<u8>) {{\\n\",\n            e.name\n        );\n        _ = write!(rust, \"    match {val_name} {{\\n\");\n        for (v, branch) in e.variants.iter().zip(&mut branches) {\n            _ = write!(rust, \"        {}::{}\", e.name, v.name);\n            if v.fields.iter().any(|f| starts_with_digit(&f.name)) {\n                rust.push_str(\"(\");\n                for (i, name) in branch.fields.iter().enumerate() {\n                    rust.push_str(if i > 0 { \", \" } else { \"\" });\n                    rust.push_str(name);\n                }\n                rust.push_str(\")\");\n            } else if !v.fields.is_empty() {\n                rust.push_str(\" {\");\n                for (i, (f, name)) in v.fields.iter().zip(&branch.fields).enumerate() {\n                    rust.push_str(if i > 0 { \", \" } else { \" \" });\n                    if f.name != *name {\n                        _ = write!(rust, \"{}: \", f.name);\n                    }\n                    rust.push_str(name);\n                }\n                rust.push_str(\" }\");\n            }\n            if branch.tfm.rust.is_empty() {\n                _ = write!(\n                    rust,\n                    \" => _ffi_write({} as i32, {buf_name}),\\n\",\n                    v.discriminant\n                );\n            } else {\n                rust.push_str(\" => {\\n\");\n                _ = write!(\n                    rust,\n                    \"            _ffi_write({} as i32, {buf_name});\\n\",\n                    v.discriminant\n                );\n                branch\n                    .tfm\n                    .rust\n                    .write_to_rust(ast, &mut rust, \"            \");\n                rust.push_str(\"        }\\n\");\n            }\n        }\n        rust.push_str(\"    }\\n\");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers\n            .add(&rust_name, rust)\n            .add_dep(\"_ffi_write\")\n            .mark_used();\n    }\n\n    // Source (forward declaration)\n    {\n        ctx.source_helpers\n            .add_group(\n                SourceGroup::Anonymous,\n                &cpp_name_decl,\n                format!(\n                    \"\\n{}::{} {cpp_name}(const uint8_t*& {end_name});\\n\",\n                    ctx.namespace, e.name\n                ),\n            )\n            .set_is_forward_decl();\n    }\n\n    // Source\n    {\n        let mut source = String::new();\n        _ = write!(\n            source,\n            \"\\n{}::{} {cpp_name}(const uint8_t*& {end_name}) {{\\n\",\n            ctx.namespace, e.name\n        );\n        _ = write!(source, \"    switch (_ffi_read<int32_t>({end_name})) {{\\n\",);\n        for (v, branch) in e.variants.iter().zip(&mut branches) {\n            let val_code = branch\n                .tfm\n                .cpp\n                .find(&val_name, &RustType::Enum(enum_index), RefInline)\n                .code;\n            let needs_block = !branch.tfm.cpp.is_empty();\n            branch.tfm.cpp.line(format!(\"return {val_code};\"));\n            if needs_block {\n                _ = write!(source, \"    case {}: {{\\n\", v.discriminant);\n            } else {\n                _ = write!(source, \"    case {}:\\n\", v.discriminant);\n            }\n            branch\n                .tfm\n                .cpp\n                .write_to_cpp(ctx, ast, &mut source_deps, &mut source, \"        \");\n            if needs_block {\n                source.push_str(\"    }\\n\");\n            }\n        }\n        source.push_str(\"    default:\\n        abort();\\n\");\n        source_deps.insert((SourceGroup::Include, \"<stdlib.h>\".into())); // For \"abort\"\n        source.push_str(\"    }\\n\");\n        source.push_str(\"}\\n\");\n        source_deps.insert((SourceGroup::Anonymous, \"_ffi_read\".into()));\n        ctx.source_helpers\n            .add_group(SourceGroup::Anonymous, &cpp_name, source)\n            .add_forward_decl_group(SourceGroup::Anonymous, &cpp_name_decl)\n            .add_deps_group(source_deps)\n            .mark_used();\n    }\n\n    (cpp_name, rust_name)\n}\n\nfn multi_ret_helper(ast: &AST, ctx: &mut CppCtx, args: &[RustArg]) -> String {\n    let types: Vec<_> = args.iter().map(|arg| arg.ty.clone()).collect();\n    if let Some(result) = ctx.multi_ret_helpers.get(&types) {\n        return result.clone();\n    }\n\n    let mut ty_name = \"_ffi_ret_\".to_string();\n    append_type_name_hints(&mut ty_name, ast, &types);\n    let ty_name = ctx.helper_names.create(&ty_name);\n\n    // Source\n    {\n        let mut source = String::new();\n        let mut source_deps = HashSet::new();\n        _ = write!(source, \"\\nstruct {ty_name} {{\\n\");\n        for (i, ty) in types.iter().enumerate() {\n            source.push_str(\"    \");\n            CppTypeCtx {\n                cpp: &mut source,\n                ast,\n                deps: &mut source_deps,\n                include_group: SourceGroup::Include,\n                decl_groups: None,\n                loc: TypeLoc::OutsideRustNamespace,\n                ns: &ctx.namespace,\n            }\n            .append_cpp_type(ty, CppDecl::Full);\n            _ = write!(source, \" _{i};\\n\");\n        }\n        source.push_str(\"};\\n\");\n        ctx.source_helpers\n            .add_group(SourceGroup::MultiRet, &ty_name, source)\n            .add_deps_group(source_deps)\n            .mark_used();\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        _ = write!(rust, \"\\n#[repr(C)]\\nstruct {ty_name}(\");\n        for (i, ty) in types.iter().enumerate() {\n            if i > 0 {\n                rust.push_str(\", \");\n            }\n            append_rust_type(&mut rust, ast, ty);\n        }\n        rust.push_str(\");\\n\");\n        ctx.rust_helpers.add(&ty_name, rust).mark_used();\n    }\n\n    ctx.multi_ret_helpers.insert(types, ty_name.clone());\n    ty_name\n}\n\n// For something like \"std::vector<Foo> foo;\" C++ just needs a forward\n// declaration. The reason is something like this: The member \"foo\" only holds\n// a pointer to \"Foo\", so the compiler doesn't need detailed information about\n// \"Foo\" such as its size and alignment. We use \"CppDecl::Forward\" to model\n// this, which we switch to when we're inside of \"std::vector\".\n//\n// However, for something like \"Foo foo;\" C++ needs a full declaration. The\n// reason is something like this: The member \"foo\" is stored inline, so the\n// compiler needs detailed information about \"Foo\" such as its size and\n// alignment. We use \"CppDecl::Full\" to model this, which we use for top-level\n// struct member declarations.\n//\n// This distinction can matter for mutually-recursive types. Consider the\n// following types \"Foo\" and \"Bar\":\n//\n//     struct Foo {\n//          Bar bar;\n//     };\n//\n//     struct Bar {\n//          std::vector<Foo> foo;\n//     };\n//\n// We can't compile this by picking a declaration order. We also can't compile\n// this by having each one just depend on the forward declaration of the other,\n// \"Foo\" actually depends on the full declaration of \"Bar\". The end result\n// needs to at least have the following things, in order:\n//\n//     struct Foo;\n//\n//     struct Bar {\n//          std::vector<Foo> foo;\n//     };\n//\n//     struct Foo {\n//          Bar bar;\n//     };\n//\n// Isn't C++ great?\n#[derive(Clone, Copy)]\nenum CppDecl {\n    Forward,\n    Full,\n}\n\nstruct DeclGroups<G: Clone + Copy> {\n    forward: G,\n    full: G,\n}\n\nimpl<G: Clone + Copy> DeclGroups<G> {\n    fn select(&self, decl: CppDecl) -> G {\n        match decl {\n            CppDecl::Forward => self.forward,\n            CppDecl::Full => self.full,\n        }\n    }\n}\n\n#[derive(Eq, PartialEq)]\nenum TypeLoc {\n    OutsideRustNamespace,\n    InsideRustNamespace,\n    ForConstant,\n}\n\nstruct CppTypeCtx<'a, G: Clone + Copy + Eq + Hash> {\n    cpp: &'a mut String,\n    ast: &'a AST,\n    deps: &'a mut HashSet<(G, String)>,\n    include_group: G,\n    decl_groups: Option<DeclGroups<G>>,\n    loc: TypeLoc,\n    ns: &'a str,\n}\n\nimpl<G: Clone + Copy + Eq + Hash> CppTypeCtx<'_, G> {\n    fn append_cpp_signature(\n        &mut self,\n        returns: Option<&RustType>,\n        name: &str,\n        receiver: Option<&RustArg>,\n        args: &[RustArg],\n    ) {\n        // Emit the return type\n        if let Some(returns) = returns {\n            self.append_cpp_type(returns, CppDecl::Full);\n            self.cpp.push(' ');\n        } else {\n            self.cpp.push_str(\"void \");\n        }\n\n        // The function name goes in the middle in C\n        self.cpp.push_str(name);\n\n        // Emit the arguments\n        self.cpp.push('(');\n        if let Some(receiver) = receiver {\n            self.append_cpp_type(&receiver.ty, CppDecl::Full);\n            self.cpp.push(' ');\n            self.cpp.push_str(&receiver.name);\n        }\n        for (i, arg) in args.iter().enumerate() {\n            if receiver.is_some() || i > 0 {\n                self.cpp.push_str(\", \");\n            }\n            self.append_cpp_type(&arg.ty, CppDecl::Full);\n            self.cpp.push(' ');\n            self.cpp.push_str(&arg.name);\n        }\n        self.cpp.push(')');\n    }\n\n    fn append_cpp_type(&mut self, ty: &RustType, decl: CppDecl) {\n        use RustType::*;\n        match ty {\n            Pair { other, .. } => self.append_cpp_type(other, decl),\n            Verbatim(text) => self.cpp.push_str(text),\n            Bool => self.cpp.push_str(\"bool\"),\n\n            U8 => {\n                self.deps.insert((self.include_group, \"<stdint.h>\".into()));\n                self.cpp.push_str(\"uint8_t\");\n            }\n            U16 => {\n                self.deps.insert((self.include_group, \"<stdint.h>\".into()));\n                self.cpp.push_str(\"uint16_t\");\n            }\n            U32 => {\n                self.deps.insert((self.include_group, \"<stdint.h>\".into()));\n                self.cpp.push_str(\"uint32_t\");\n            }\n            Usize => {\n                self.deps.insert((self.include_group, \"<stdint.h>\".into()));\n                self.cpp.push_str(\"uintptr_t\");\n            }\n            U64 => {\n                self.deps.insert((self.include_group, \"<stdint.h>\".into()));\n                self.cpp.push_str(\"uint64_t\");\n            }\n\n            I8 => {\n                self.deps.insert((self.include_group, \"<stdint.h>\".into()));\n                self.cpp.push_str(\"int8_t\");\n            }\n            I16 => {\n                self.deps.insert((self.include_group, \"<stdint.h>\".into()));\n                self.cpp.push_str(\"int16_t\");\n            }\n            I32 => {\n                self.deps.insert((self.include_group, \"<stdint.h>\".into()));\n                self.cpp.push_str(\"int32_t\");\n            }\n            Isize => {\n                self.deps.insert((self.include_group, \"<stdint.h>\".into()));\n                self.cpp.push_str(\"intptr_t\");\n            }\n            I64 => {\n                self.deps.insert((self.include_group, \"<stdint.h>\".into()));\n                self.cpp.push_str(\"int64_t\");\n            }\n\n            F32 => self.cpp.push_str(\"float\"),\n            F64 => self.cpp.push_str(\"double\"),\n            ForeignHandle => self.cpp.push_str(\"const void*\"),\n            RefStr | OwnStr => {\n                if self.loc == TypeLoc::ForConstant {\n                    self.deps\n                        .insert((self.include_group, \"<string_view>\".into()));\n                    self.cpp.push_str(\"std::string_view\");\n                } else {\n                    self.deps.insert((self.include_group, \"<string>\".into()));\n                    self.cpp.push_str(\"std::string\");\n                }\n            }\n\n            Struct(index) => {\n                let name = &self.ast.structs[*index].name;\n                if let Some(groups) = &self.decl_groups {\n                    self.deps.insert((groups.select(decl), name.into()));\n                }\n                if self.loc == TypeLoc::OutsideRustNamespace {\n                    _ = write!(self.cpp, \"{}::\", self.ns);\n                }\n                self.cpp.push_str(name);\n            }\n            Enum(index) => {\n                let name = &self.ast.enums[*index].name;\n                if let Some(groups) = &self.decl_groups {\n                    self.deps.insert((groups.select(decl), name.into()));\n                }\n                if self.loc == TypeLoc::OutsideRustNamespace {\n                    _ = write!(self.cpp, \"{}::\", self.ns);\n                }\n                self.cpp.push_str(name);\n            }\n            DynTrait(index) => {\n                let name = &self.ast.traits[*index].name;\n                if let Some(groups) = &self.decl_groups {\n                    self.deps.insert((groups.select(decl), name.into()));\n                }\n                if self.loc == TypeLoc::OutsideRustNamespace {\n                    _ = write!(self.cpp, \"{}::\", self.ns);\n                }\n                self.cpp.push_str(name);\n            }\n\n            Tuple(types) => {\n                self.deps.insert((self.include_group, \"<tuple>\".into()));\n                self.cpp.push_str(\"std::tuple<\");\n                for (i, ty) in types.iter().enumerate() {\n                    if i > 0 {\n                        self.cpp.push_str(\", \");\n                    }\n                    self.append_cpp_type(ty, CppDecl::Full);\n                }\n                self.cpp.push('>');\n            }\n\n            Ptr(kind, inner) => match kind {\n                RustPtr::Box => {\n                    self.deps.insert((self.include_group, \"<memory>\".into()));\n                    self.cpp.push_str(\"std::unique_ptr<\");\n                    self.append_cpp_type(inner, CppDecl::Forward);\n                    self.cpp.push('>');\n                }\n                RustPtr::Rc => {\n                    self.deps.insert((self.include_group, \"<memory>\".into()));\n                    self.cpp.push_str(\"std::shared_ptr<\");\n                    self.append_cpp_type(inner, CppDecl::Forward);\n                    self.cpp.push('>');\n                }\n            },\n\n            Vector(inner) => {\n                self.deps.insert((self.include_group, \"<vector>\".into()));\n                self.cpp.push_str(\"std::vector<\");\n                self.append_cpp_type(inner, CppDecl::Forward);\n                self.cpp.push('>');\n            }\n\n            Optional(inner) => {\n                self.deps.insert((self.include_group, \"<optional>\".into()));\n                self.cpp.push_str(\"std::optional<\");\n                self.append_cpp_type(inner, CppDecl::Full);\n                self.cpp.push('>');\n            }\n        }\n    }\n}\n\nfn append_cpp_val(cpp: &mut String, val: &RustVal) {\n    use RustVal::*;\n    match val {\n        Bool(x) => _ = write!(cpp, \"{x}\"),\n\n        U8(x) => _ = write!(cpp, \"{x}u\"),\n        U16(x) => _ = write!(cpp, \"{x}u\"),\n        U32(x) => _ = write!(cpp, \"{x}u\"),\n        U64(x) => _ = write!(cpp, \"{x}ull\"),\n\n        I8(x) => _ = write!(cpp, \"{x}\"),\n        I16(x) => _ = write!(cpp, \"{x}\"),\n        I32(x) => {\n            if *x == std::i32::MIN {\n                // Avoid a Visual C++ warning\n                _ = write!(cpp, \"{} - 1\", x + 1);\n            } else {\n                _ = write!(cpp, \"{x}\");\n            }\n        }\n        I64(x) => {\n            if *x == std::i64::MIN {\n                // Avoid a clang warning\n                _ = write!(cpp, \"{}ll - 1\", x + 1);\n            } else {\n                _ = write!(cpp, \"{x}ll\");\n            }\n        }\n\n        F32(x) => _ = write!(cpp, \"{x:?}f\"),\n        F64(x) => _ = write!(cpp, \"{x:?}\"),\n\n        Str(x) => {\n            cpp.push_str(\"std::string_view(\");\n            append_cpp_quoted(cpp, x);\n            _ = write!(cpp, \", {})\", x.len());\n        }\n    }\n}\n\nfn append_cpp_quoted(cpp: &mut String, text: &str) {\n    cpp.push('\"');\n    for c in text.chars() {\n        match c {\n            '\\t' => cpp.push_str(\"\\\\t\"),\n            '\\n' => cpp.push_str(\"\\\\n\"),\n            '\\r' => cpp.push_str(\"\\\\r\"),\n            '\\\\' => cpp.push_str(\"\\\\\\\\\"),\n            '\\\"' => cpp.push_str(\"\\\\\\\"\"),\n            c if (c as u32) < 0x20 => {\n                _ = write!(cpp, \"\\\\{:03o}\", c as u32);\n            }\n            _ => cpp.push(c),\n        }\n    }\n    cpp.push('\"');\n}\n\nimpl FnBuilder {\n    fn write_to_cpp(\n        &mut self,\n        ctx: &CppCtx,\n        ast: &AST,\n        source_deps: &mut HashSet<(SourceGroup, String)>,\n        out: &mut String,\n        base_indent: &str,\n    ) {\n        let mut indent = 0;\n        let mut callback = |line: &str| {\n            if line.starts_with(&['}', ']', ')']) {\n                indent -= 1;\n            }\n            _ = write!(out, \"{base_indent}{}{line}\\n\", \"    \".repeat(indent));\n            if line.ends_with(&['{', '[', '(']) {\n                indent += 1;\n            }\n        };\n        for line in self.take_lines() {\n            match line {\n                Line::Plain(text) => {\n                    text.split('\\n').for_each(&mut callback);\n                }\n                Line::PlainAlt(when_false, when_true, flag) => match flag.get() {\n                    false if when_false.is_empty() => continue,\n                    false => when_false.split('\\n').for_each(&mut callback),\n                    true => when_true.split('\\n').for_each(&mut callback),\n                },\n                Line::Decl(name, ty, text) => {\n                    let mut decl_ty = String::new();\n                    match ty {\n                        None => decl_ty.push_str(\"auto\"),\n                        Some(ty) => CppTypeCtx {\n                            cpp: &mut decl_ty,\n                            ast,\n                            deps: source_deps,\n                            include_group: SourceGroup::Include,\n                            decl_groups: None,\n                            loc: TypeLoc::OutsideRustNamespace,\n                            ns: &ctx.namespace,\n                        }\n                        .append_cpp_type(&ty, CppDecl::Full),\n                    }\n                    let text = format!(\"{decl_ty} {name} = {text};\");\n                    text.split('\\n').for_each(&mut callback);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/lib.rs",
    "content": "//! This is a simple but opinionated FFI system for Rust. It allows you to call\n//! Rust code from other languages, and vice versa. Some design principles:\n//!\n//! - Intended for writing platform-agnostic Rust with platform-specific details in the host language\n//! - FFI support is split into data (structs passed by copy) and code (traits passed by reference)\n//! - Rather than have a separate schema language, the public API in your `lib.rs` is your schema\n//! - The generated binding code is compact, dependency-free, and straightforward to integrate with\n//!\n//! ## Supported Features\n//!\n//! - Primitive types (`bool`, `i32`, `f64`, `String`, etc.)\n//! - Tuples\n//! - Structs\n//! - Enums\n//! - Top-level constants\n//! - Top-level functions\n//! - Traits (must be either `Box<dyn T>` or `Rc<dyn T>`)\n//! - `Vec<T>`\n//! - `Option<T>`\n//! - `Box<T>`\n//!\n//! ## Simple Usage\n//!\n//! To get up and running:\n//!\n//! 1. Add `miniffi` to your `[build-dependencies]` in `Cargo.toml`:\n//!\n//!     ```text\n//!     cargo add --build miniffi\n//!     ```\n//!\n//! 2. Add the following code to the end of your `src/lib.rs` file:\n//!\n//!     ```\n//!     # macro_rules! env { ($a:expr) => { $a } }\n//!     # macro_rules! include { ($a:expr) => { $a } }\n//!     include!(concat!(env!(\"OUT_DIR\"), \"/miniffi.rs\"));\n//!     ```\n//!\n//! 3. Add a `build.rs` script that calls [`build`](Target::build) on at least one [`Target`]:\n//!\n//!     ```no_run\n//!     use miniffi::*;\n//!\n//!     fn main() {\n//!         CppTarget::new().build();\n//!     }\n//!     ```\n//!\n//! 4. Import the generated bindings from the host language (see each target for details)\n//!\n//! ## Advanced Usage\n//!\n//! You can only build for one target at a time. However, the flexibility of\n//! build scripts means you can use the same build script for different targets\n//! in different situations using your own custom logic.\n//!\n//! For example, you may want to build for different host languages depending\n//! on the value of cargo's `--target` flag:\n//!\n//! ```no_run\n//! use miniffi::*;\n//!\n//! fn main() {\n//!     let target = std::env::var(\"TARGET\").unwrap();\n//!     if target == \"wasm32-unknown-unknown\" {\n//!         WasmTarget::new()\n//!             .write_ts_to(\"../web/rust.ts\")\n//!             .set_panic_hook()\n//!             .build();\n//!     } else if target == \"aarch64-apple-darwin\" {\n//!         SwiftTarget::new()\n//!             .write_swift_to(\"../macos/rust.swift\")\n//!             .write_header_to(\"../macos/rust.h\")\n//!             .build();\n//!     } else if target == \"x86_64-pc-windows-msvc\" {\n//!         CppTarget::new()\n//!             .write_source_to(\"../windows/rust.cpp\")\n//!             .write_header_to(\"../windows/rust.h\")\n//!             .build();\n//!     } else {\n//!         NullTarget::new().build();\n//!     }\n//! }\n//! ```\n\nmod ast;\nmod cpp;\nmod rust;\nmod scan;\nmod swift;\nmod util;\nmod wasm;\n\nuse ast::*;\nuse rust::*;\nuse std::fmt::Write;\nuse std::path::{Path, PathBuf};\nuse syn::spanned::Spanned;\nuse util::*;\n\npub use cpp::CppTarget;\npub use swift::SwiftTarget;\npub use wasm::WasmTarget;\n\nuse crate::scan::make_warning;\n\n#[cfg(test)]\nmod tests;\n\nconst DO_NOT_EDIT_COMMENT: &str = concat!(\n    \"This file was generated by miniffi v\",\n    env!(\"CARGO_PKG_VERSION\"),\n    \". Do not edit.\"\n);\n\n/// The common trait for all language-specific targets.\n///\n/// The following targets are available:\n///\n/// - [`CppTarget`] for C++\n/// - [`SwiftTarget`] for Swift\n/// - [`WasmTarget`] for JavaScript/TypeScript\n/// - [`NullTarget`] otherwise\n///\n/// Typical usage involves creating a target with `new()`, chaining some\n/// methods to configure it, and then calling [`build`](Target::build).\npub trait Target {\n    /// Call this on the desired target from your `build.rs` script to generate\n    /// the FFI bindings. It automatically locates your `src/lib.rs` file using\n    /// the directory containing your `Cargo.toml` manifest, parses it to\n    /// determine your packages public API, and then generates FFI bindings for\n    /// that API.\n    ///\n    /// This will always generate the file `miniffi.rs` along with some\n    /// additional files that are target-dependent. For example, the\n    /// [`SwiftTarget`] additionally generates a `.swift` file and a `.h` file.\n    /// The `miniffi.rs` file will be written inside of cargo's `target`\n    /// directory, and is normally not something you'll need to think about too\n    /// much (other than referencing it via `include!` in your `lib.rs` file).\n    /// The other target-dependent files are intended to be included by you\n    /// into the host language project. For example, you might add the `.swift`\n    /// and `.h` files from the [`SwiftTarget`] to your Xcode project. You\n    /// should probably also add all generated files to your `.gitignore` so\n    /// they are not checked into source control as they are automatically\n    /// generated.\n    ///\n    /// The returned [`BuildResult`] will be configured to automatically print\n    /// some instructions for cargo when it is dropped. Typical usage involves\n    /// just calling `build()` on the target without storing the return value.\n    /// But you can use the return value to inspect the results of the build.\n    /// You can also modify the return value to disable the printing of cargo\n    /// instructions on drop if you need different behavior instead.\n    fn build(&self) -> BuildResult {\n        fn fail(error: &str) -> BuildResult {\n            let mut result = BuildResult::default();\n            result.errors.push(error.into());\n            return result;\n        }\n\n        let Ok(input_dir) = std::env::var(\"CARGO_MANIFEST_DIR\") else {\n            return fail(\"missing environment variable: CARGO_MANIFEST_DIR\");\n        };\n        let Ok(output_dir) = std::env::var(\"OUT_DIR\") else {\n            return fail(\"missing environment variable: OUT_DIR\");\n        };\n        let input_path = PathBuf::from(input_dir).join(\"src\").join(\"lib.rs\");\n        let output_path = PathBuf::from(output_dir).join(\"miniffi.rs\");\n\n        match std::fs::read_to_string(&input_path) {\n            Err(err) => BuildResult {\n                errors: vec![format!(\"Failed to read from {input_path:?}: {err}\")],\n                warnings: Vec::new(),\n                input_path,\n                output_files: Vec::new(),\n                finish_on_drop: true,\n            },\n            Ok(contents) => {\n                let input_file = FileData {\n                    path: input_path,\n                    contents,\n                };\n                let mut result = self.build_custom(input_file, output_path);\n                result.finish_on_drop = true;\n                result\n            }\n        }\n    }\n\n    /// This is the same as [`build`](Target::build) but without any of the\n    /// cargo-specific logic (automatically locating and reading `src/lib.rs`\n    /// and automatically printing out instructions for cargo). This can be\n    /// useful for running miniffi outside of a cargo build script. If you're\n    /// writing a cargo build script, you likely want to call\n    /// [`build`](Target::build) instead.\n    fn build_custom(&self, input_file: FileData, output_path: PathBuf) -> BuildResult;\n\n    /// Set the edition for the generated Rust code. This can be necessary\n    /// because different editions of Rust use different syntax.\n    fn rust_edition(self, year: usize) -> Self;\n}\n\n/// Holds the result of calling [`build`](Target::build) or\n/// [`build_custom`](Target::build_custom). May print out cargo\n/// instructions and/or write files when dropped.\n///\n/// Typically you can just call `.build()` on a target and not use the return\n/// value. But the return value is available if you need to inspect or modify\n/// the build results.\n///\n/// The result returned from [`build`](Target::build) has `finish_on_drop` set\n/// to true which means it will print out cargo instructions and write output\n/// files when dropped. If you don't want this behavior (perhaps you need\n/// something else to happen instead), then you should set `finish_on_drop` to\n/// false before dropping the build result.\n#[derive(Clone, Debug, Default, Eq, PartialEq)]\npub struct BuildResult {\n    pub input_path: PathBuf,\n    pub output_files: Vec<FileData>,\n    pub errors: Vec<String>,\n    pub warnings: Vec<Warning>,\n    pub finish_on_drop: bool,\n}\n\nimpl BuildResult {\n    /// Certain Rust features are not supported by miniffi. Using those\n    /// features will generate a warning and cause the relevant code to be\n    /// omitted from the FFI bindings. If you would like for these warnings\n    /// to be errors instead (perhaps you want CI to fail when this happens),\n    /// you can chain this method off of [`build`](Target::build):\n    ///\n    /// ```no_run\n    /// use miniffi::*;\n    ///\n    /// fn main() {\n    ///     CppTarget::new()\n    ///         .build()\n    ///         .convert_warnings_to_errors();\n    /// }\n    /// ```\n    ///\n    /// Doing this can have undesirable side effects. Because cargo build\n    /// scripts run before your crate builds, a build script error stops the\n    /// build before your crate is built. This can cause IDE features to stop\n    /// working without an obvious cause since some Rust IDE plugins don't\n    /// surface build script errors.\n    pub fn convert_warnings_to_errors(mut self) -> Self {\n        self.errors\n            .extend(self.warnings.drain(..).map(|w| w.to_human_string()));\n        self\n    }\n\n    /// This does the following:\n    ///\n    /// - Write all output files to the file system\n    /// - Print `cargo:rerun-if-changed` lines for all files relevant to the build\n    /// - Print `cargo::error` lines for everything in `errors`\n    /// - Print `cargo:warning` lines for everything in `warnings`\n    /// - Set `self.finish_on_drop` to `false` to avoid finishing on [`drop`](BuildResult::drop)\n    pub fn finish(&mut self) {\n        // Note: Cargo changed the directive prefix syntax from \"cargo:\" to\n        // \"cargo::\" in version 0.78.0. The older syntax is mostly still\n        // respected, so use it instead for better compatibility. The one\n        // exception is that \"cargo::error\" was added after this but support\n        // for \"cargo:error\" was not added. So this deliberately uses\n        // \"cargo::error\" for errors. Older versions of rust will print an\n        // error message when encountering \"cargo::\" at all so these will\n        // still print an error.\n        // https://github.com/rust-lang/cargo/commit/d45969a781a78e95215aba19898f397235c36b7c\n        // https://github.com/rust-lang/cargo/commit/4f744776795eb3ccaf46530b0e37056c23641323\n        println!(\"cargo:rerun-if-changed={}\", self.input_path.display());\n\n        for file in &mut self.output_files {\n            println!(\"cargo:rerun-if-changed={}\", file.path.display());\n            write_file(&file.path, &file.contents, &mut self.errors);\n        }\n\n        for error in &self.errors {\n            println!(\n                \"cargo::error=[miniffi] {}\",\n                error\n                    .split('\\n')\n                    .collect::<Vec<_>>()\n                    .join(\"\\ncargo::error=\")\n            );\n        }\n\n        for warning in &self.warnings {\n            println!(\n                \"cargo:warning=[miniffi] {}\",\n                warning\n                    .to_human_string()\n                    .split('\\n')\n                    .collect::<Vec<_>>()\n                    .join(\"\\ncargo:warning=\")\n            );\n        }\n\n        self.finish_on_drop = false;\n    }\n}\n\nimpl Drop for BuildResult {\n    /// If `finish_on_drop` is true, dropping a `BuildResult` runs `finish()`\n    /// before the drop. If `finish_on_drop` is false, then dropping a\n    /// `BuildResult` does nothing.\n    fn drop(&mut self) {\n        if self.finish_on_drop {\n            self.finish();\n        }\n    }\n}\n\n/// Part of a [`BuildResult`].\n#[derive(Clone, Debug, Default, Eq, PartialEq)]\npub struct Warning {\n    pub path: PathBuf,\n    pub line: usize,\n    pub column: usize,\n    pub len: usize,\n    pub message: String,\n    pub code: String,\n    pub note: String,\n}\n\nimpl Warning {\n    /// Returns a single-line string containing the file location and message.\n    /// Similar to Rust's \"short\" message format. For example:\n    ///\n    /// ```text\n    /// /home/user/foo/src/lib.rs:42:11: unsupported type `AtomicBool` for field `flag`\n    /// ```\n    pub fn to_short_string(&self) -> String {\n        format!(\n            \"{}:{}:{}: {}{}\",\n            self.path.display(),\n            self.line,\n            self.column,\n            self.message,\n            match self.note.as_str() {\n                \"\" => String::new(),\n                note => format!(\" ({note})\"),\n            }\n        )\n    }\n\n    /// Returns a multi-line string containing the file location, message, and\n    /// the relevant line of code. Similar to Rust's \"human\" message format.\n    /// For example:\n    ///\n    /// ```text\n    /// unsupported type `AtomicBool` for field `flag`\n    ///   --> /home/user/foo/src/lib.rs:42:11\n    ///    |\n    /// 42 |     flag: AtomicBool,\n    ///    |           ^^^^^^^^^^\n    /// ```\n    pub fn to_human_string(&self) -> String {\n        let line = self.line.to_string();\n        let indent = \" \".repeat(line.len());\n        format!(\n            \"{}\\n{indent}--> {}:{}:{}\\n{indent} |\\n{line} | {}\\n{indent} |{}{}{}{}\\n\",\n            self.message,\n            self.path.display(),\n            self.line,\n            self.column,\n            self.code,\n            \" \".repeat(self.column),\n            \"^\".repeat(self.len.max(1)),\n            if self.note.is_empty() { \"\" } else { \" \" },\n            self.note\n        )\n    }\n}\n\n/// Part of a [`BuildResult`].\n#[derive(Clone, Debug, Default, Eq, PartialEq)]\npub struct FileData {\n    pub path: PathBuf,\n    pub contents: String,\n}\n\nstruct CommonOptions {\n    edition: usize,\n}\n\nimpl Default for CommonOptions {\n    fn default() -> CommonOptions {\n        CommonOptions { edition: 2024 }\n    }\n}\n\ntrait Compile {\n    fn common_options(&mut self) -> &mut CommonOptions;\n    fn compile(&self, ast: AST, rust_path: PathBuf) -> Vec<FileData>;\n}\n\nimpl<T: Compile> Target for T {\n    fn rust_edition(mut self, year: usize) -> Self {\n        self.common_options().edition = year;\n        self\n    }\n\n    fn build_custom(&self, input_file: FileData, output_path: PathBuf) -> BuildResult {\n        let mut output_files = Vec::new();\n        let mut errors = Vec::new();\n        let mut warnings = Vec::new();\n\n        if !input_file.contents.contains(\"miniffi.rs\") {\n            let code = r#\"include!(concat!(env!(\"OUT_DIR\"), \"/miniffi.rs\"));\"#;\n            let file = input_file\n                .path\n                .file_name()\n                .unwrap_or(input_file.path.as_os_str());\n            errors.push(format!(\"Please add this to the end of {file:?}: {code}\"));\n        }\n\n        match syn::parse_file(&input_file.contents) {\n            Err(err) => {\n                let message = format!(\"{err}\");\n                warnings.push(make_warning(&input_file, message, \"\", err.span()));\n            }\n            Ok(ast) => {\n                let ast = scan::scan_ast(&input_file, &ast, &mut warnings);\n                output_files = self.compile(ast, output_path);\n            }\n        }\n\n        BuildResult {\n            input_path: input_file.path,\n            output_files,\n            errors,\n            warnings,\n            finish_on_drop: false,\n        }\n    }\n}\n\n/// Use this target when there is no host language.\n///\n/// The null target creates an empty `miniffi.rs` file. That can be useful if\n/// you want to build FFI support for some configurations and not others.\n///\n/// For example, the following `build.rs` script only builds FFI support when\n/// targeting WASM (such as with `cargo build --target=wasm32-unknown-unknown`)\n/// and not otherwise (such as running tests with `cargo test`):\n///\n/// ```no_run\n/// use miniffi::*;\n///\n/// fn main() {\n///     let target = std::env::var(\"TARGET\").unwrap();\n///     if target == \"wasm32-unknown-unknown\" {\n///         WasmTarget::new().build();\n///     } else {\n///         NullTarget::new().build();\n///     }\n/// }\n/// ```\npub struct NullTarget {\n    common_options: CommonOptions,\n}\n\nimpl NullTarget {\n    pub fn new() -> NullTarget {\n        NullTarget {\n            common_options: CommonOptions::default(),\n        }\n    }\n}\n\nimpl Compile for NullTarget {\n    fn common_options(&mut self) -> &mut CommonOptions {\n        &mut self.common_options\n    }\n\n    fn compile(&self, _ast: AST, rust_path: PathBuf) -> Vec<FileData> {\n        vec![FileData {\n            path: rust_path,\n            contents: String::new(),\n        }]\n    }\n}\n\nfn write_file(path: &Path, contents: &str, errors: &mut Vec<String>) {\n    if let Some(parent) = path.parent() {\n        if let Err(err) = std::fs::create_dir_all(parent) {\n            errors.push(format!(\"Failed to create directory {parent:?}: {err}\"));\n        }\n    }\n\n    if let Ok(existing) = std::fs::read(&path) {\n        if existing == contents.as_bytes() {\n            return; // Avoid unnecessary rebuilds\n        }\n    }\n\n    if let Err(err) = std::fs::write(&path, contents) {\n        errors.push(format!(\"Failed to write to {path:?}: {err}\"));\n    }\n}\n"
  },
  {
    "path": "src/rust.rs",
    "content": "use super::*;\nuse std::borrow::Cow;\n\n#[derive(Default)]\npub struct RustSyntax {\n    edition: usize,\n}\n\nimpl RustSyntax {\n    pub fn with_edition(edition: usize) -> RustSyntax {\n        RustSyntax { edition }\n    }\n\n    pub fn unsafe_no_mangle(&self) -> &'static str {\n        if self.edition >= 2024 {\n            \"#[unsafe(no_mangle)]\"\n        } else {\n            \"#[no_mangle]\"\n        }\n    }\n\n    pub fn unsafe_extern(&self) -> &'static str {\n        if self.edition >= 2024 {\n            \"unsafe extern\"\n        } else {\n            \"extern\"\n        }\n    }\n}\n\npub fn append_rust_type(rust: &mut String, ast: &AST, ty: &RustType) {\n    use RustType::*;\n    match ty {\n        Pair { rust: inner, .. } => append_rust_type(rust, ast, inner),\n        Verbatim(text) => rust.push_str(text),\n        Bool => rust.push_str(\"bool\"),\n\n        U8 => rust.push_str(\"u8\"),\n        U16 => rust.push_str(\"u16\"),\n        U32 => rust.push_str(\"u32\"),\n        Usize => rust.push_str(\"usize\"),\n        U64 => rust.push_str(\"u64\"),\n\n        I8 => rust.push_str(\"i8\"),\n        I16 => rust.push_str(\"i16\"),\n        I32 => rust.push_str(\"i32\"),\n        Isize => rust.push_str(\"isize\"),\n        I64 => rust.push_str(\"i64\"),\n\n        F32 => rust.push_str(\"f32\"),\n        F64 => rust.push_str(\"f64\"),\n\n        RefStr => rust.push_str(\"&str\"),\n        OwnStr => rust.push_str(\"String\"),\n\n        Struct(index) => rust.push_str(&ast.structs[*index].name),\n        Enum(index) => rust.push_str(&ast.enums[*index].name),\n\n        DynTrait(index) => {\n            rust.push_str(\"dyn \");\n            rust.push_str(&ast.traits[*index].name);\n        }\n\n        Ptr(kind, inner) => {\n            rust.push_str(kind.path());\n            rust.push('<');\n            append_rust_type(rust, ast, &inner);\n            rust.push('>');\n        }\n\n        Vector(inner) => {\n            rust.push_str(\"Vec<\");\n            append_rust_type(rust, ast, &inner);\n            rust.push('>');\n        }\n\n        Tuple(types) => {\n            rust.push('(');\n            for (i, ty) in types.iter().enumerate() {\n                append_rust_type(rust, ast, ty);\n                if i + 1 < types.len() {\n                    rust.push_str(\", \");\n                } else if types.len() == 1 {\n                    rust.push(',');\n                }\n            }\n            rust.push(')');\n        }\n\n        Optional(inner) => {\n            rust.push_str(\"Option<\");\n            append_rust_type(rust, ast, &inner);\n            rust.push('>');\n        }\n\n        ForeignHandle => rust.push_str(\"*const u8\"),\n    }\n}\n\npub fn append_rust_default_val(rust: &mut String, ast: &AST, ty: &RustType) {\n    use RustType::*;\n    match ty {\n        Bool => rust.push_str(\"false\"),\n\n        U8 | U16 | U32 | Usize | U64 | I8 | I16 | I32 | Isize | I64 => rust.push_str(\"0\"),\n\n        F32 | F64 => rust.push_str(\"0.0\"),\n\n        RefStr => rust.push_str(\"\\\"\\\"\"),\n        OwnStr => rust.push_str(\"String::new()\"),\n\n        Struct(index) => {\n            let s = &ast.structs[*index];\n            rust.push_str(&s.name);\n            if s.fields.is_empty() {\n                rust.push_str(\" {}\");\n            } else {\n                rust.push_str(\" { \");\n                for (i, f) in s.fields.iter().enumerate() {\n                    if i > 0 {\n                        rust.push_str(\", \");\n                    }\n                    rust.push_str(&f.name);\n                    rust.push_str(\": \");\n                    append_rust_default_val(rust, ast, &f.ty);\n                }\n                rust.push_str(\" }\");\n            }\n        }\n\n        Tuple(types) => {\n            rust.push('(');\n            for (i, ty) in types.iter().enumerate() {\n                append_rust_default_val(rust, ast, ty);\n                if i + 1 < types.len() {\n                    rust.push_str(\", \");\n                } else if types.len() == 1 {\n                    rust.push(',');\n                }\n            }\n            rust.push(')');\n        }\n\n        ForeignHandle => rust.push_str(\"std::ptr::null()\"),\n\n        _ => rust.push_str(\"unreachable!()\"),\n    }\n}\n\nimpl FnBuilder {\n    pub fn write_to_rust(&mut self, ast: &AST, out: &mut String, base_indent: &str) {\n        let mut indent = 0;\n        let mut callback = |line: &str| {\n            if line.starts_with(&['}', ']', ')']) {\n                indent -= 1;\n            }\n            _ = write!(out, \"{base_indent}{}{line}\\n\", \"    \".repeat(indent));\n            if line.ends_with(&['{', '[', '(']) {\n                indent += 1;\n            }\n        };\n        for line in self.take_lines() {\n            match line {\n                Line::Plain(text) => {\n                    text.split('\\n').for_each(&mut callback);\n                }\n                Line::PlainAlt(when_false, when_true, flag) => match flag.get() {\n                    false if when_false.is_empty() => continue,\n                    false => when_false.split('\\n').for_each(&mut callback),\n                    true => when_true.split('\\n').for_each(&mut callback),\n                },\n                Line::Decl(name, ty, text) => {\n                    let mut decl_ty = String::new();\n                    if let Some(ty) = ty {\n                        decl_ty.push_str(\": \");\n                        append_rust_type(&mut decl_ty, ast, &ty);\n                    }\n                    let text = format!(\"let {name}{decl_ty} = {text};\");\n                    text.split('\\n').for_each(&mut callback);\n                }\n            }\n        }\n    }\n}\n\npub fn is_snake_case(name: &str) -> bool {\n    let name = name.trim_matches('_');\n    !name.contains(\"__\") && !name.chars().any(char::is_uppercase)\n}\n\npub fn is_camel_case(name: &str) -> bool {\n    let name = name.trim_matches('_');\n    let mut chars = name.chars();\n    !chars.next().map(char::is_lowercase).unwrap_or(false)\n        && !name.contains(\"__\")\n        && !name.chars().zip(chars).any(|(a, b)| {\n            let has_case = |c: char| c.to_uppercase().next() != c.to_lowercase().next();\n            (has_case(a) && b == '_') || (a == '_' && has_case(b))\n        })\n}\n\npub fn allow_non_snake_case(rust: &mut String, name: &str) {\n    if !is_snake_case(name) {\n        rust.push_str(\"\\n#[allow(non_snake_case)]\");\n    }\n}\n\npub fn allow_non_camel_case_types(rust: &mut String, name: &str) {\n    if !is_camel_case(name) {\n        rust.push_str(\"\\n#[allow(non_camel_case_types)]\");\n    }\n}\n\npub fn rust_decl_ctor(\n    rust: &mut FnBuilder,\n    var_name: &str,\n    ctor_name: &str,\n    fields: &Vec<RustField>,\n    item_names: Vec<Cow<'_, str>>,\n) {\n    if fields.is_empty() {\n        rust.decl(var_name, ctor_name.to_string());\n    } else if fields.iter().any(|arg| starts_with_digit(&arg.name)) {\n        let args = rust.find_args(\n            &fields\n                .iter()\n                .zip(item_names)\n                .map(|(f, name)| RustArg {\n                    name: name.to_string(),\n                    ty: f.ty.clone(),\n                })\n                .collect(),\n            RefInline,\n        );\n        rust.decl(var_name, format!(\"{ctor_name}({args})\"));\n    } else {\n        let fields = rust.find_fields(\n            fields,\n            item_names,\n            RefInline,\n            &format!(\"{ctor_name} {{ \"),\n            \" }\",\n        );\n        rust.decl(var_name, fields);\n    }\n}\n\npub fn add_common_rust_helpers(syntax: &RustSyntax, helpers: &mut HelperSet<(), String>) {\n    helpers.add(\n        \"_ffi_read\",\n        r\"\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\",\n    );\n\n    helpers.add(\n        \"_ffi_write\",\n        r\"\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\",\n    );\n\n    helpers.add(\n        \"_ffi_alloc\",\n        format!(\n            r#\"\n{}\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {{\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}}\n\"#,\n            syntax.unsafe_no_mangle()\n        ),\n    );\n\n    helpers.add(\n        \"_ffi_dealloc\",\n        format!(\n            r#\"\n{}\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {{\n    drop(unsafe {{ Vec::from_raw_parts(ptr, 0, capacity) }});\n}}\n\"#,\n            syntax.unsafe_no_mangle()\n        ),\n    );\n\n    helpers\n        .add(\n            \"_ffi_string_from_host\",\n            r\"\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\",\n        )\n        .add_dep(\"_ffi_alloc\");\n\n    helpers\n        .add(\n            \"_ffi_string_to_host\",\n            r\"\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\",\n        )\n        .add_dep(\"_ffi_dealloc\");\n\n    helpers\n        .add(\n            \"_ffi_buf_from_host\",\n            r\"\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\",\n        )\n        .add_dep(\"_ffi_alloc\");\n\n    helpers\n        .add(\n            \"_ffi_buf_to_host\",\n            r\"\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\",\n        )\n        .add_dep(\"_ffi_dealloc\");\n}\n"
  },
  {
    "path": "src/scan.rs",
    "content": "use super::*;\nuse std::collections::HashSet;\nuse syn::{Attribute, Fields, ext::IdentExt};\n\npub fn scan_ast(file: &FileData, parsed: &syn::File, warnings: &mut Vec<Warning>) -> AST {\n    use syn::{Item, Visibility::Public};\n\n    let mut ast = AST {\n        structs: Vec::new(),\n        enums: Vec::new(),\n        traits: Vec::new(),\n        consts: Vec::new(),\n        fns: Vec::new(),\n    };\n\n    // Pass 1: Scan for type names\n    for item in &parsed.items {\n        match item {\n            Item::Struct(item) => {\n                let Public(_) = item.vis else { continue };\n                ast.structs.push(RustStruct {\n                    name: item.ident.unraw().to_string(),\n                    fields: Vec::new(),\n                    derives_partial_eq: derives_partial_eq(&item.attrs),\n                });\n            }\n\n            Item::Enum(item) => {\n                let Public(_) = item.vis else { continue };\n                ast.enums.push(RustEnum {\n                    name: item.ident.unraw().to_string(),\n                    variants: Vec::new(),\n                    derives_partial_eq: derives_partial_eq(&item.attrs),\n                });\n            }\n\n            Item::Trait(item) => {\n                let Public(_) = item.vis else { continue };\n                ast.traits.push(RustTrait {\n                    name: item.ident.unraw().to_string(),\n                    fns: Vec::new(),\n                });\n            }\n\n            _ => continue,\n        }\n    }\n\n    // Pass 2: Scan for type contents\n    'next_item: for item in &parsed.items {\n        match item {\n            Item::Struct(item) => {\n                let Public(_) = item.vis else { continue };\n                let name = item.ident.unraw().to_string();\n                let fields = match parse_fields(file, &ast, &item.fields, (\"struct\", &name)) {\n                    Ok(fields) => fields,\n                    Err(warning) => {\n                        warnings.push(warning);\n                        continue;\n                    }\n                };\n                for s in &mut ast.structs {\n                    if s.name == name {\n                        s.fields = fields;\n                        break;\n                    }\n                }\n            }\n\n            Item::Enum(item) => {\n                let Public(_) = item.vis else { continue };\n                let enum_name = item.ident.unraw().to_string();\n                let mut variants = Vec::new();\n                let mut discriminant = 0;\n\n                for v in &item.variants {\n                    let name = v.ident.unraw().to_string();\n                    let full_name = format!(\"{enum_name}::{name}\");\n                    let fields = match parse_fields(file, &ast, &v.fields, (\"variant\", &full_name))\n                    {\n                        Ok(fields) => fields,\n                        Err(warning) => {\n                            warnings.push(warning);\n                            continue 'next_item;\n                        }\n                    };\n                    if let Some((_, expr)) = &v.discriminant {\n                        if let Some(value) = expr_to_numeric_literal(expr) {\n                            discriminant = value;\n                        } else {\n                            warnings.push(unsupported(\n                                file,\n                                \"discriminant\",\n                                expr.span(),\n                                (\"variant\", &name),\n                                Some((\"enum\", &enum_name)),\n                                \"must be an integer literal\",\n                            ));\n                        }\n                    }\n                    variants.push(RustVariant {\n                        name,\n                        discriminant,\n                        fields,\n                    });\n                    discriminant = discriminant.wrapping_add(1);\n                }\n\n                for e in &mut ast.enums {\n                    if e.name == enum_name {\n                        e.variants = variants;\n                        break;\n                    }\n                }\n            }\n\n            _ => continue,\n        }\n    }\n\n    // Prune infinitely-sized types so the code generators don't stack overflow\n    for i in 0..ast.structs.len() {\n        for j in 0..ast.structs[i].fields.len() {\n            if is_infinite_size(&ast, &ast.structs[i].fields[j].ty) {\n                ast.structs[i].fields[j].ty = RustType::Tuple(Vec::new());\n            }\n        }\n    }\n\n    // Pass 3: Scan for code\n    'next_item: for item in &parsed.items {\n        match item {\n            Item::Const(item) => {\n                let Public(_) = item.vis else { continue };\n                let name = item.ident.unraw().to_string();\n                let Some(ty) = to_rust_type(&ast, &item.ty) else {\n                    warnings.push(unsupported(\n                        file,\n                        \"type\",\n                        item.ty.span(),\n                        (\"constant\", &name),\n                        None,\n                        \"\",\n                    ));\n                    continue;\n                };\n                let Some(val) = to_rust_val(&item.expr, &ty) else {\n                    warnings.push(unsupported(\n                        file,\n                        \"value\",\n                        item.expr.span(),\n                        (\"constant\", &name),\n                        None,\n                        \"only literals are supported\",\n                    ));\n                    continue;\n                };\n                ast.consts.push(RustConst { name, ty, val });\n            }\n\n            Item::Fn(item) => {\n                let Public(_) = item.vis else { continue };\n                let f = match to_rust_fn(file, &ast, &item.sig, None) {\n                    Ok(f) => f,\n                    Err(warning) => {\n                        warnings.push(warning);\n                        continue 'next_item;\n                    }\n                };\n                ast.fns.push(f);\n            }\n\n            Item::Trait(item) => {\n                let Public(_) = item.vis else { continue };\n                let name = item.ident.unraw().to_string();\n                let mut fns = Vec::new();\n\n                for item in &item.items {\n                    let syn::TraitItem::Fn(item) = item else {\n                        warnings.push(unsupported(\n                            file,\n                            \"item\",\n                            item.span(),\n                            (\"trait\", &name),\n                            None,\n                            \"only functions are supported\",\n                        ));\n                        continue 'next_item;\n                    };\n                    let f = match to_rust_fn(file, &ast, &item.sig, Some(&name)) {\n                        Ok(f) => f,\n                        Err(warning) => {\n                            warnings.push(warning);\n                            continue 'next_item;\n                        }\n                    };\n                    fns.push(f);\n                }\n\n                for t in &mut ast.traits {\n                    if t.name == name {\n                        t.fns = fns;\n                        break;\n                    }\n                }\n            }\n\n            _ => continue,\n        }\n    }\n\n    ast\n}\n\n// Detect \"#[derive(PartialEq)]\"\nfn derives_partial_eq(attrs: &[Attribute]) -> bool {\n    for attr in attrs {\n        if let syn::Meta::List(syn::MetaList { path, .. }) = &attr.meta {\n            if path.is_ident(\"derive\") {\n                let mut found = false;\n                _ = attr.parse_nested_meta(|meta| {\n                    if meta.path.is_ident(\"PartialEq\") {\n                        found = true;\n                    }\n                    Ok(())\n                });\n                if found {\n                    return true;\n                }\n            }\n        }\n    }\n    false\n}\n\nfn parse_fields(\n    file: &FileData,\n    ast: &AST,\n    fields: &Fields,\n    extra: (&str, &str),\n) -> Result<Vec<RustField>, Warning> {\n    let mut result = Vec::new();\n\n    match fields {\n        syn::Fields::Unit => {}\n\n        syn::Fields::Unnamed(item) => {\n            for (i, field) in item.unnamed.iter().enumerate() {\n                let name = format!(\"{i}\");\n                let Some(ty) = to_rust_type(&ast, &field.ty) else {\n                    return Err(unsupported(\n                        file,\n                        \"type\",\n                        field.ty.span(),\n                        (\"field\", &name),\n                        Some(extra),\n                        \"\",\n                    ));\n                };\n                result.push(RustField { name, ty });\n            }\n        }\n\n        syn::Fields::Named(item) => {\n            for field in &item.named {\n                let name = field.ident.as_ref().unwrap().to_string();\n                let Some(ty) = to_rust_type(&ast, &field.ty) else {\n                    return Err(unsupported(\n                        file,\n                        \"type\",\n                        field.ty.span(),\n                        (\"field\", &name),\n                        Some(extra),\n                        \"\",\n                    ));\n                };\n                result.push(RustField { name, ty });\n            }\n        }\n    }\n\n    Ok(result)\n}\n\nfn to_rust_fn(\n    file: &FileData,\n    ast: &AST,\n    sig: &syn::Signature,\n    trait_name: Option<&str>,\n) -> Result<RustFn, Warning> {\n    let name = sig.ident.unraw().to_string();\n    let mut args = Vec::new();\n    let mut self_span = None;\n    let extra = trait_name.map(|name| (\"trait\", name));\n\n    for arg in &sig.inputs {\n        match arg {\n            syn::FnArg::Typed(arg) => {\n                let Some(name) = pat_to_single_ident(&arg.pat) else {\n                    return Err(unsupported(\n                        file,\n                        \"pattern\",\n                        arg.pat.span(),\n                        (\"function\", &name),\n                        None,\n                        \"only identifiers are supported\",\n                    ));\n                };\n                let Some(ty) = to_rust_type(ast, &arg.ty) else {\n                    return Err(unsupported(\n                        file,\n                        \"type\",\n                        arg.ty.span(),\n                        (\"argument\", &name),\n                        extra,\n                        \"\",\n                    ));\n                };\n                args.push(RustArg { name, ty });\n            }\n\n            syn::FnArg::Receiver(arg) => {\n                if arg.reference.is_none() || arg.colon_token.is_some() || arg.mutability.is_some()\n                {\n                    return Err(unsupported(\n                        file,\n                        \"receiver\",\n                        arg.span(),\n                        (\"argument\", &name),\n                        extra,\n                        \"use `&self` instead\",\n                    ));\n                }\n                self_span = Some(arg.self_token.span());\n            }\n        }\n    }\n\n    // All trait methods must have a \"self\" receiver\n    match (trait_name, self_span) {\n        (Some(trait_name), None) => {\n            return Err(unsupported(\n                file,\n                \"function\",\n                sig.ident.span(),\n                (\"trait\", trait_name),\n                None,\n                \"methods on public traits must use `&self`\",\n            ));\n        }\n        (None, Some(self_span)) => {\n            return Err(unsupported(\n                file,\n                \"argument\",\n                self_span,\n                (\"function\", &name),\n                extra,\n                \"\",\n            ));\n        }\n        _ => {}\n    }\n\n    let returns = match &sig.output {\n        syn::ReturnType::Default => None,\n        syn::ReturnType::Type(_, ty) => {\n            let Some(ty) = to_rust_type(ast, &ty) else {\n                return Err(unsupported(\n                    file,\n                    \"return type\",\n                    ty.span(),\n                    (\"function\", &name),\n                    extra,\n                    \"\",\n                ));\n            };\n            let mut names = NameSet::default();\n            for arg in &args {\n                names.add(arg.name.clone());\n            }\n            let name = names.create(\"ret\");\n            Some(RustArg { name, ty })\n        }\n    };\n\n    Ok(RustFn {\n        name,\n        args,\n        returns,\n    })\n}\n\nfn to_rust_type(ast: &AST, ty: &syn::Type) -> Option<RustType> {\n    if let Some(ident) = type_to_single_ident(ty) {\n        return match () {\n            () if ident == \"bool\" => Some(RustType::Bool),\n\n            () if ident == \"u8\" => Some(RustType::U8),\n            () if ident == \"u16\" => Some(RustType::U16),\n            () if ident == \"u32\" => Some(RustType::U32),\n            () if ident == \"usize\" => Some(RustType::Usize),\n            () if ident == \"u64\" => Some(RustType::U64),\n\n            () if ident == \"i8\" => Some(RustType::I8),\n            () if ident == \"i16\" => Some(RustType::I16),\n            () if ident == \"i32\" => Some(RustType::I32),\n            () if ident == \"isize\" => Some(RustType::Isize),\n            () if ident == \"i64\" => Some(RustType::I64),\n\n            () if ident == \"f32\" => Some(RustType::F32),\n            () if ident == \"f64\" => Some(RustType::F64),\n\n            () if ident == \"String\" => Some(RustType::OwnStr),\n\n            _ => {\n                if let Some((i, _)) = ast\n                    .structs\n                    .iter()\n                    .enumerate()\n                    .find(|(_, s)| ident == &s.name)\n                {\n                    Some(RustType::Struct(i))\n                } else if let Some((i, _)) =\n                    ast.enums.iter().enumerate().find(|(_, e)| ident == &e.name)\n                {\n                    Some(RustType::Enum(i))\n                } else {\n                    None\n                }\n            }\n        };\n    }\n\n    if let Some((name, inner)) = type_to_single_ident_with_argument(ast, ty) {\n        return if name == \"Rc\" || name == \"rc::Rc\" || name == \"std::rc::Rc\" {\n            match &inner {\n                RustType::DynTrait(_) => Some(RustType::Ptr(RustPtr::Rc, inner.into())),\n                _ => None,\n            }\n        } else if name == \"Box\" || name == \"boxed::Box\" || name == \"std::boxed::Box\" {\n            Some(RustType::Ptr(RustPtr::Box, inner.into()))\n        } else if name == \"Vec\" || name == \"vec::Vec\" || name == \"std::vec::Vec\" {\n            Some(RustType::Vector(inner.into()))\n        } else if name == \"Option\" || name == \"option::Option\" || name == \"std::option::Option\" {\n            Some(RustType::Optional(inner.into()))\n        } else {\n            None\n        };\n    }\n\n    match ty {\n        syn::Type::Tuple(syn::TypeTuple { elems, .. }) => {\n            let mut types = Vec::new();\n            for elem in elems {\n                types.push(to_rust_type(ast, elem)?);\n            }\n            Some(RustType::Tuple(types))\n        }\n\n        syn::Type::Reference(syn::TypeReference {\n            mutability: None,\n            elem,\n            ..\n        }) => {\n            if let Some(ident) = type_to_single_ident(elem) {\n                match () {\n                    () if ident == \"str\" => Some(RustType::RefStr),\n                    _ => None,\n                }\n            } else {\n                None\n            }\n        }\n\n        syn::Type::TraitObject(syn::TypeTraitObject { bounds, .. }) if bounds.len() == 1 => {\n            if let syn::TypeParamBound::Trait(syn::TraitBound { path, .. }) = &bounds[0] {\n                if let Some(ident) = path.get_ident() {\n                    if let Some((i, _)) = ast\n                        .traits\n                        .iter()\n                        .enumerate()\n                        .find(|(_, t)| ident == &t.name)\n                    {\n                        Some(RustType::DynTrait(i))\n                    } else {\n                        None\n                    }\n                } else {\n                    None\n                }\n            } else {\n                None\n            }\n        }\n\n        _ => None,\n    }\n}\n\nfn to_rust_val(expr: &syn::Expr, ty: &RustType) -> Option<RustVal> {\n    match expr {\n        syn::Expr::Lit(syn::ExprLit {\n            lit: syn::Lit::Bool(lit),\n            ..\n        }) => match ty {\n            RustType::Bool => Some(RustVal::Bool(lit.value())),\n            _ => None,\n        },\n\n        syn::Expr::Lit(syn::ExprLit {\n            lit: syn::Lit::Int(lit),\n            ..\n        }) => match ty {\n            RustType::U8 => Some(RustVal::U8(lit.base10_parse().ok()?)),\n            RustType::U16 => Some(RustVal::U16(lit.base10_parse().ok()?)),\n            RustType::U32 => Some(RustVal::U32(lit.base10_parse().ok()?)),\n            RustType::U64 => Some(RustVal::U64(lit.base10_parse().ok()?)),\n\n            RustType::I8 => Some(RustVal::I8(lit.base10_parse().ok()?)),\n            RustType::I16 => Some(RustVal::I16(lit.base10_parse().ok()?)),\n            RustType::I32 => Some(RustVal::I32(lit.base10_parse().ok()?)),\n            RustType::I64 => Some(RustVal::I64(lit.base10_parse().ok()?)),\n\n            _ => None,\n        },\n\n        syn::Expr::Lit(syn::ExprLit {\n            lit: syn::Lit::Float(lit),\n            ..\n        }) => match ty {\n            RustType::F32 => Some(RustVal::F32(lit.base10_parse().ok()?)),\n            RustType::F64 => Some(RustVal::F64(lit.base10_parse().ok()?)),\n            _ => None,\n        },\n\n        syn::Expr::Lit(syn::ExprLit {\n            lit: syn::Lit::Str(lit),\n            ..\n        }) => match ty {\n            RustType::RefStr => Some(RustVal::Str(lit.value())),\n            _ => None,\n        },\n\n        syn::Expr::Unary(syn::ExprUnary {\n            op: syn::UnOp::Neg(_),\n            expr,\n            ..\n        }) => match &**expr {\n            syn::Expr::Lit(syn::ExprLit {\n                lit: syn::Lit::Int(lit),\n                ..\n            }) => match ty {\n                RustType::I8 => Some(RustVal::I8(\n                    format!(\"-{}\", lit.base10_digits()).parse().ok()?,\n                )),\n                RustType::I16 => Some(RustVal::I16(\n                    format!(\"-{}\", lit.base10_digits()).parse().ok()?,\n                )),\n                RustType::I32 => Some(RustVal::I32(\n                    format!(\"-{}\", lit.base10_digits()).parse().ok()?,\n                )),\n                RustType::I64 => Some(RustVal::I64(\n                    format!(\"-{}\", lit.base10_digits()).parse().ok()?,\n                )),\n                _ => None,\n            },\n\n            syn::Expr::Lit(syn::ExprLit {\n                lit: syn::Lit::Float(lit),\n                ..\n            }) => match ty {\n                RustType::F32 => Some(RustVal::F32(\n                    format!(\"-{}\", lit.base10_digits()).parse().ok()?,\n                )),\n                RustType::F64 => Some(RustVal::F64(\n                    format!(\"-{}\", lit.base10_digits()).parse().ok()?,\n                )),\n                _ => None,\n            },\n\n            _ => None,\n        },\n\n        _ => None,\n    }\n}\n\nfn expr_to_numeric_literal<T>(expr: &syn::Expr) -> Option<T>\nwhere\n    T: std::str::FromStr,\n    <T as std::str::FromStr>::Err: std::fmt::Display,\n{\n    match expr {\n        // Positive\n        syn::Expr::Lit(syn::ExprLit {\n            lit: syn::Lit::Int(lit),\n            ..\n        }) => lit.base10_parse().ok(),\n\n        // Negative\n        syn::Expr::Unary(syn::ExprUnary {\n            op: syn::UnOp::Neg(_),\n            expr,\n            ..\n        }) => match &**expr {\n            syn::Expr::Lit(syn::ExprLit {\n                lit: syn::Lit::Int(lit),\n                ..\n            }) => format!(\"-{}\", lit.base10_digits()).parse().ok(),\n            _ => None,\n        },\n\n        _ => None,\n    }\n}\n\nfn path_to_string_with_argument(ast: &AST, path: &syn::Path) -> Option<(String, RustType)> {\n    let last = path.segments.last()?;\n    let syn::PathArguments::AngleBracketed(inner) = &last.arguments else {\n        return None;\n    };\n    if inner.args.len() == 1 {\n        if let syn::GenericArgument::Type(ty) = &inner.args[0] {\n            if let Some(inner) = to_rust_type(ast, ty) {\n                let mut name = String::new();\n                for (i, segment) in path.segments.iter().enumerate() {\n                    if i + 1 < path.segments.len() {\n                        let syn::PathArguments::None = segment.arguments else {\n                            return None;\n                        };\n                    }\n                    if i > 0 {\n                        name.push_str(\"::\");\n                    }\n                    name.push_str(&segment.ident.unraw().to_string());\n                }\n                return Some((name, inner));\n            }\n        }\n    }\n    None\n}\n\nfn type_to_single_ident(ty: &syn::Type) -> Option<&syn::Ident> {\n    if let syn::Type::Path(syn::TypePath { qself: None, path }) = ty {\n        return path.get_ident();\n    }\n    None\n}\n\nfn type_to_single_ident_with_argument(ast: &AST, ty: &syn::Type) -> Option<(String, RustType)> {\n    if let syn::Type::Path(syn::TypePath { qself: None, path }) = ty {\n        return path_to_string_with_argument(ast, path);\n    }\n    None\n}\n\nfn pat_to_single_ident(pat: &syn::Pat) -> Option<String> {\n    match pat {\n        syn::Pat::Ident(syn::PatIdent { ident, .. }) => Some(ident.unraw().to_string()),\n        syn::Pat::Wild(_) => Some(\"_\".to_string()),\n        _ => None,\n    }\n}\n\nfn unsupported(\n    file: &FileData,\n    what: &str,\n    span: proc_macro2::Span,\n    outer: (&str, &str),\n    extra: Option<(&str, &str)>,\n    note: &str,\n) -> Warning {\n    let text = match span.source_text() {\n        None => what.into(),\n        Some(text) => format!(\"{what} `{text}`\"),\n    };\n    let mut message = format!(\"unsupported {text} for {} `{}`\", outer.0, outer.1);\n    if let Some((what, name)) = extra {\n        _ = write!(message, \" in {what} `{name}`\");\n    }\n    make_warning(file, message, note, span)\n}\n\npub fn make_warning(\n    file: &FileData,\n    message: String,\n    note: &str,\n    span: proc_macro2::Span,\n) -> Warning {\n    let start = span.start();\n    let end = span.end();\n    let line = start.line;\n    let column = start.column + 1;\n    let code = file\n        .contents\n        .lines()\n        .skip(line.saturating_sub(1))\n        .next()\n        .unwrap_or(\"\")\n        .to_string();\n    let len = if end.line == start.line {\n        code.len().min(end.column)\n    } else {\n        code.len()\n    }\n    .saturating_sub(start.column);\n    Warning {\n        path: file.path.clone(),\n        line,\n        column,\n        len,\n        message,\n        code,\n        note: note.to_string(),\n    }\n}\n\nfn is_infinite_size(ast: &AST, ty: &RustType) -> bool {\n    fn visit(ast: &AST, ty: &RustType, visited: &mut HashSet<RustType>) -> bool {\n        use RustType::*;\n        match ty {\n            Struct(struct_index) => {\n                if visited.contains(ty) {\n                    return true;\n                }\n                visited.insert(ty.clone());\n                ast.structs[*struct_index]\n                    .fields\n                    .iter()\n                    .any(|f| visit(ast, &f.ty, visited))\n            }\n            Tuple(types) => types.iter().any(|ty| visit(ast, ty, visited)),\n            Optional(inner) => visit(ast, inner, visited),\n            _ => false,\n        }\n    }\n    visit(ast, ty, &mut HashSet::new())\n}\n"
  },
  {
    "path": "src/swift.rs",
    "content": "use super::*;\nuse std::borrow::Cow;\nuse std::collections::{HashMap, HashSet};\nuse std::rc::Rc;\n\n/// Use this target when the host language is Swift.\n///\n/// This needs to generate a `.swift` file and a `.h` file. By default, the\n/// files will be named `miniffi.swift` and `miniffi.h` and will be written to\n/// the directory containing your `Cargo.toml` file. You can customize these\n/// paths before calling [`build`](Target::build):\n///\n/// ```no_run\n/// use miniffi::*;\n///\n/// fn main() {\n///     SwiftTarget::new()\n///         .write_swift_to(\"../app/rust.swift\")\n///         .write_header_to(\"../app/rust.h\")\n///         .build();\n/// }\n/// ```\n///\n/// If your `src/lib.rs` looks like this:\n///\n/// ```no_run\n/// pub fn add(left: u64, right: u64) -> u64 {\n///     left + right\n/// }\n///\n/// # macro_rules! env { ($a:expr) => { $a } }\n/// # macro_rules! include { ($a:expr) => { $a } }\n/// include!(concat!(env!(\"OUT_DIR\"), \"/miniffi.rs\"));\n/// ```\n///\n/// You can call that from Swift like this:\n///\n/// ```text\n/// print(\"1 + 2 =\", add(1, 2))\n/// ```\n///\n/// Even though Swift is the host language, the `.h` file is necessary because\n/// Swift lacks syntax for specifying certain interactions with the C ABI that\n/// Rust uses. Instead of building those features into Swift itself, Apple has\n/// decided to make those features work by passing a C header to the Swift\n/// compiler instead. This is called using an \"Objective-C bridging header\"\n/// even though it has nothing to do with Objective-C in this case.\n///\n/// ## Using the command line\n///\n/// If you are using Swift from the command line, then you can call Rust from\n/// Swift by adding the generated `.swift` file, passing the generated `.h`\n/// file as the Objective-C bridging header, and also linking to the compiled\n/// Rust code. For example:\n///\n/// ```text\n/// # Build the Rust code\n/// cargo rustc --crate-type=staticlib\n///\n/// # Build the Swift code\n/// swiftc main.swift miniffi.swift -import-objc-header miniffi.h ./target/debug/libexample.a\n/// ```\n///\n/// ## Using Xcode\n///\n/// If you're using Swift from Xcode, then the process is more complicated.\n/// There are also various ways to do this. Here's the process I use:\n///\n/// 1. Create a `Makefile` to build your Rust code\n///\n///     Put the following in a file called `Makefile` in your Rust crate:\n///\n///     ```makefile\n///     Debug:\n///     \tcargo rustc --crate-type=staticlib\n///\n///     Release:\n///     \tcargo rustc --crate-type=staticlib --release\n///     ```\n///\n///     Using an additional script like this makes our life easier later since\n///     we can reference it from the `xcodeproj` settings. Note that these\n///     indents are intentionally tab characters, not spaces (`make` requires\n///     tab characters).\n///\n/// 2. Tell Xcode to compile the generated code\n///\n///     Run `make` to cause the build script to run, which will generate\n///     `miniffi.swift` and `miniffi.h`. Then in Xcode, add `miniffi.swift` and\n///     `miniffi.h` to your project (make sure they are referenced, not copied).\n///\n///     Include `miniffi.h` in your Objective-C Bridging Header. If you already\n///     have a bridging header, use `#include` to include `miniffi.h` there.\n///     Otherwise you can go to the **Build Settings** tab in your `xcodeproj`\n///     settings and set **Objective-C Bridging Header** directly to `miniffi.h`.\n///\n/// 3. Tell Xcode to link with the compiled Rust code\n///\n///     In the **Build Settings** tab of your `xcodeproj` settings, expand\n///     **Library Search Paths** into separate **Debug** and **Release** rows.\n///     Set the **Debug** path to `./target/debug` and the **Release** path to\n///     `./target/release`.\n///\n///     Go to the **Build Phases** tab of your `xcodeproj` settings. Expand\n///     **Link Binary With Libraries**, click the `+` button, click\n///     **Add Other...** > **Add Files...**, and select the\n///     `./target/debug/libexample.a` file that you built earlier.\n///\n///     At this point, you should now be able to compile and run your Xcode\n///     project and call Rust from Swift! But there's one more step you'll\n///     likely want to do...\n///\n/// 4. Tell Xcode to rebuild your Rust code automatically\n///\n///     In the **Build Settings** tab of your `xcodeproj` settings, set\n///     **User Scripts Sandboxing** to No. We will be building your Rust code\n///     which exists on the file system, so we need file system access.\n///\n///     Go to the **Build Phases** tab of your `xcodeproj` settings. Use the `+`\n///     button to add a **New Run Script Phase** and drag it before the\n///     **Compile Sources** phase. Expand it and use the following shell script:\n///\n///     ```sh\n///     export PATH=\"$HOME/.cargo/bin:$PATH\"\n///     make \"$CONFIGURATION\"\n///     ```\n///\n///     You can also uncheck the **Based on dependency analysis** checkbox to\n///     disable an Xcode warning.\n///\n///     Using `$CONFIGURATION` in combination with the `Makefile` means the\n///     **Debug** build configuration in Xcode will build your Rust code in debug\n///     mode (without the `--release` flag), and the **Release** build\n///     configuration in Xcode will build your rust code in release mode (with\n///     the `--release` flag). The `export PATH` is necessary because Xcode\n///     doesn't use your `$PATH` and won't be able to find the `cargo` binary\n///     otherwise.\npub struct SwiftTarget {\n    common_options: CommonOptions,\n    swift_path: PathBuf,\n    header_path: PathBuf,\n}\n\nimpl SwiftTarget {\n    pub fn new() -> SwiftTarget {\n        SwiftTarget {\n            common_options: CommonOptions::default(),\n            swift_path: \"miniffi.swift\".into(),\n            header_path: \"miniffi.h\".into(),\n        }\n    }\n\n    pub fn write_swift_to<T: Into<PathBuf>>(mut self, path: T) -> Self {\n        self.swift_path = path.into();\n        self\n    }\n\n    pub fn write_header_to<T: Into<PathBuf>>(mut self, path: T) -> Self {\n        self.header_path = path.into();\n        self\n    }\n}\n\npub const SWIFT_KEYWORDS: &[&str] = &[\n    \"Any\",\n    \"as\",\n    \"associatedtype\",\n    \"associativity\",\n    \"async\",\n    \"await\",\n    \"borrowing\",\n    \"break\",\n    \"case\",\n    \"catch\",\n    \"catch\",\n    \"class\",\n    \"consuming\",\n    \"continue\",\n    \"convenience\",\n    \"default\",\n    \"defer\",\n    \"deinit\",\n    \"didSet\",\n    \"do\",\n    \"dynamic\",\n    \"else\",\n    \"enum\",\n    \"extension\",\n    \"fallthrough\",\n    \"false\",\n    \"fileprivate\",\n    \"final\",\n    \"for\",\n    \"func\",\n    \"get\",\n    \"guard\",\n    \"if\",\n    \"import\",\n    \"in\",\n    \"indirect\",\n    \"infix\",\n    \"init\",\n    \"inout\",\n    \"internal\",\n    \"is\",\n    \"lazy\",\n    \"left\",\n    \"let\",\n    \"mutating\",\n    \"nil\",\n    \"none\",\n    \"nonisolated\",\n    \"nonmutating\",\n    \"open\",\n    \"operator\",\n    \"optional\",\n    \"override\",\n    \"package\",\n    \"postfix\",\n    \"precedence\",\n    \"precedencegroup\",\n    \"prefix\",\n    \"private\",\n    \"protocol\",\n    \"Protocol\",\n    \"public\",\n    \"repeat\",\n    \"required\",\n    \"rethrows\",\n    \"rethrows\",\n    \"return\",\n    \"right\",\n    \"self\",\n    \"Self\",\n    \"set\",\n    \"some\",\n    \"static\",\n    \"struct\",\n    \"subscript\",\n    \"super\",\n    \"switch\",\n    \"throw\",\n    \"throw\",\n    \"throws\",\n    \"true\",\n    \"try\",\n    \"Type\",\n    \"typealias\",\n    \"unowned\",\n    \"var\",\n    \"weak\",\n    \"where\",\n    \"while\",\n    \"willSet\",\n];\n\n#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]\nenum HeaderGroup {\n    Include,\n    Other,\n}\n\nimpl Compile for SwiftTarget {\n    fn common_options(&mut self) -> &mut CommonOptions {\n        &mut self.common_options\n    }\n\n    fn compile(&self, mut ast: AST, rust_path: PathBuf) -> Vec<FileData> {\n        let syntax = RustSyntax::with_edition(self.common_options.edition);\n        let mut rust_helpers = HelperSet::<(), String>::default();\n        let mut swift_helpers = HelperSet::<(), String>::default();\n        let mut header_helpers = HelperSet::<HeaderGroup, String>::default();\n\n        // Also need to escape C++ keywords for the Objective-C bridging header\n        let all_keywords: Vec<_> = SWIFT_KEYWORDS\n            .iter()\n            .chain(cpp::CPP_KEYWORDS.iter())\n            .map(|x| *x)\n            .collect();\n\n        add_common_rust_helpers(&syntax, &mut rust_helpers);\n        ast.rename_keywords(&all_keywords);\n\n        header_helpers.add_group(\n            HeaderGroup::Include,\n            \"<stdint.h>\",\n            \"\\n#include <stdint.h>\\n\",\n        );\n\n        header_helpers\n            .add_group(\n                HeaderGroup::Other,\n                \"_ffi_alloc\",\n                \"\\nvoid* _ffi_alloc(intptr_t len);\\n\",\n            )\n            .add_dep_group(HeaderGroup::Include, \"<stdint.h>\");\n\n        header_helpers\n            .add_group(\n                HeaderGroup::Other,\n                \"_ffi_dealloc\",\n                \"\\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\\n\",\n            )\n            .add_dep_group(HeaderGroup::Include, \"<stdint.h>\");\n\n        swift_helpers.add(\n            \"_ffi_read\",\n            r#\"\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\"#,\n        );\n\n        swift_helpers.add(\n            \"_ffi_write\",\n            r#\"\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n\"#,\n        );\n\n        swift_helpers.add(\n            \"_ffi_swift_drop\",\n            r#\"\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n\"#,\n        );\n\n        swift_helpers.add(\n            \"_ffi_vec_to_rust\",\n            r\"\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\",\n        );\n\n        swift_helpers.add(\n            \"_ffi_string_to_rust\",\n            r\"\nprivate func _ffi_string_to_rust(_ str: String) -> (UnsafeRawPointer?, UInt) {\n    var str = str\n    return str.withUTF8 { str in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(str.count), count: str.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: str.baseAddress, count: str.count))\n        return (UnsafeRawPointer(buf.baseAddress), UInt(buf.count))\n    }\n}\n\",\n        );\n\n        swift_helpers.add(\n            \"_ffi_string_from_rust\",\n            r\"\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\",\n        );\n\n        let mut rust = format!(\"// {DO_NOT_EDIT_COMMENT}\\n\");\n        let mut swift = format!(\"// {DO_NOT_EDIT_COMMENT}\\n\");\n\n        // Traits\n        for t in &ast.traits {\n            _ = write!(swift, \"\\nprotocol {}: AnyObject {{\\n\", t.name);\n            for f in &t.fns {\n                _ = write!(swift, \"    func {}(\", f.name);\n                for (i, arg) in f.args.iter().enumerate() {\n                    if i > 0 {\n                        swift.push_str(\", \");\n                    }\n                    _ = write!(swift, \"_ {}: \", arg.name);\n                    append_swift_type(&mut swift, &ast, &arg.ty);\n                }\n                swift.push(')');\n                if let Some(returns) = &f.returns {\n                    swift.push_str(\" -> \");\n                    append_swift_type(&mut swift, &ast, &returns.ty);\n                }\n                swift.push('\\n');\n            }\n            swift.push_str(\"}\\n\");\n        }\n\n        // Enums\n        for (i, e) in ast.enums.iter().enumerate() {\n            if !e.has_fields() {\n                // Enums without fields are just integers\n                _ = write!(swift, \"\\nenum {}: Int32\", e.name);\n                swift.push_str(\" {\\n\");\n                for v in &e.variants {\n                    _ = write!(swift, \"    case {} = {}\\n\", v.name, v.discriminant);\n                }\n                swift.push_str(\"}\\n\");\n            } else {\n                // Enums with fields map directly to Swift enums\n                _ = write!(swift, \"\\nenum {}\", e.name);\n                if e.derives_partial_eq {\n                    swift.push_str(\" : Equatable\");\n                }\n                swift.push_str(\" {\\n\");\n                for v in &e.variants {\n                    let indirect = match swift_variant_needs_indirect(&ast, i, v) {\n                        false => \"\",\n                        true => \"indirect \",\n                    };\n                    _ = write!(swift, \"    {indirect}case {}\", v.name);\n                    if !v.fields.is_empty() {\n                        swift.push('(');\n                        for (j, f) in v.fields.iter().enumerate() {\n                            if j > 0 {\n                                swift.push_str(\", \");\n                            }\n                            if !starts_with_digit(&f.name) {\n                                _ = write!(swift, \"{}: \", f.name);\n                            }\n                            append_swift_type(&mut swift, &ast, &f.ty);\n                        }\n                        swift.push(')');\n                    }\n                    swift.push('\\n');\n                }\n                if e.derives_partial_eq\n                    && e.variants\n                        .iter()\n                        .any(|v| v.fields.iter().any(|f| swift_type_contains_tuple(&f.ty)))\n                {\n                    swift.push_str(&generate_operator_eq_enum(e));\n                }\n                swift.push_str(\"}\\n\");\n            }\n        }\n\n        // Structs\n        for (i, s) in ast.structs.iter().enumerate() {\n            let use_class = swift_type_is_infinite_size(&ast, &RustType::Struct(i));\n            let keyword = if use_class { \"class\" } else { \"struct\" };\n            _ = write!(swift, \"\\n{keyword} {}\", s.name);\n            if s.derives_partial_eq {\n                swift.push_str(\" : Equatable\");\n            }\n            swift.push_str(\" {\\n\");\n            for f in &s.fields {\n                _ = write!(swift, \"    var {}: \", with_digit_prefix(&f.name));\n                append_swift_type(&mut swift, &ast, &f.ty);\n                swift.push('\\n');\n            }\n            if use_class {\n                swift.push_str(&generate_init(&ast, s));\n            }\n            if s.derives_partial_eq\n                && (use_class || s.fields.iter().any(|f| swift_type_contains_tuple(&f.ty)))\n            {\n                swift.push_str(&generate_operator_eq_struct(s));\n            }\n            swift.push_str(\"}\\n\");\n        }\n\n        // Constants\n        if !ast.consts.is_empty() {\n            swift.push('\\n');\n            for c in &ast.consts {\n                _ = write!(swift, \"let {}: \", c.name);\n                append_swift_type(&mut swift, &ast, &c.ty);\n                swift.push_str(\" = \");\n                append_swift_val(&mut swift, &c.val);\n                swift.push('\\n');\n            }\n        }\n\n        let mut ctx = SwiftCtx {\n            syntax,\n            rust_helpers,\n            swift_helpers,\n            header_helpers,\n            ..SwiftCtx::default()\n        };\n\n        // Functions\n        for f in &ast.fns {\n            generate_swift_to_rust_fn(&ast, &mut ctx, f, &mut swift, None);\n        }\n\n        for it in ctx.rust_helpers.code_in_order() {\n            rust.push_str(it);\n        }\n\n        for it in ctx.swift_helpers.code_in_order() {\n            swift.push_str(it);\n        }\n\n        let header_code = ctx.header_helpers.code_by_group_in_order();\n        let mut header = format!(\"// {DO_NOT_EDIT_COMMENT}\\n\");\n        header.push_str(\"\\n#pragma once\\n\");\n\n        if let Some(code) = header_code.get(&HeaderGroup::Include) {\n            for it in code {\n                header.push_str(it);\n            }\n        }\n\n        header.push_str(\"\\n#ifdef __cplusplus\\n\");\n        header.push_str(\"extern \\\"C\\\" {\\n\");\n        header.push_str(\"#endif\\n\");\n\n        if let Some(code) = header_code.get(&HeaderGroup::Other) {\n            for it in code {\n                header.push_str(it);\n            }\n        }\n\n        header.push_str(\"\\n#ifdef __cplusplus\\n\");\n        header.push_str(\"}\\n\");\n        header.push_str(\"#endif\\n\");\n\n        vec![\n            FileData {\n                path: rust_path,\n                contents: rust,\n            },\n            FileData {\n                path: self.swift_path.clone(),\n                contents: swift,\n            },\n            FileData {\n                path: self.header_path.clone(),\n                contents: header,\n            },\n        ]\n    }\n}\n\nfn swift_type_contains_tuple(ty: &RustType) -> bool {\n    use RustType::*;\n    match ty {\n        Pair { other, .. } => swift_type_contains_tuple(other),\n        Vector(inner_ty) => swift_type_contains_tuple(inner_ty),\n        Optional(inner_ty) => swift_type_contains_tuple(inner_ty),\n        Ptr(_, inner_ty) => swift_type_contains_tuple(inner_ty),\n        Tuple(types) => types.len() != 1,\n        _ => false,\n    }\n}\n\nfn generate_init(ast: &AST, s: &RustStruct) -> String {\n    let mut swift = \"\\n    init(\".to_string();\n    for (i, f) in s.fields.iter().enumerate() {\n        if i > 0 {\n            swift.push_str(\", \");\n        }\n        swift.push_str(&f.name);\n        swift.push_str(\": \");\n        append_swift_type(&mut swift, ast, &f.ty);\n    }\n    swift.push_str(\") {\\n\");\n    for f in &s.fields {\n        _ = write!(swift, \"        self.{} = {}\\n\", f.name, f.name);\n    }\n    swift.push_str(\"    }\\n\");\n    swift\n}\n\nfn emit_eq(parts: &mut Vec<String>, ty: &RustType, a: &str, b: &str) {\n    use RustType::*;\n\n    if !swift_type_contains_tuple(ty) {\n        parts.push(format!(\"{a} == {b}\"));\n        return;\n    }\n\n    match ty {\n        Pair { other, .. } => emit_eq(parts, other, a, b),\n        Ptr(_, inner_ty) => emit_eq(parts, inner_ty, a, b),\n\n        // Unfortunately tuples in Swift don't currently implement\n        // \"Equatable\", so structs containing tuples cannot automatically\n        // derive \"Equatable\". There have been many attempts to fix this\n        // but somehow it's still broken? Works fine in other languages.\n        // Gotta work around it ourselves...\n        Tuple(types) if types.len() != 1 => {\n            for (i, ty) in types.iter().enumerate() {\n                let a = format!(\"{a}.{i}\");\n                let b = format!(\"{b}.{i}\");\n                emit_eq(parts, ty, &a, &b);\n            }\n        }\n\n        Optional(inner_ty) => {\n            let mut inner_parts = Vec::new();\n            emit_eq(&mut inner_parts, inner_ty, \"a\", \"b\");\n            parts.push(if inner_parts.is_empty() {\n                    format!(\"({a} != nil) == ({b} != nil)\")\n                } else {\n                    format!(\n                        \"{{ if let a = {a}, let b = {b} {{ {} }} else {{ {a} == nil && {b} == nil }} }}()\",\n                        inner_parts.join(\" && \")\n                    )\n                });\n        }\n\n        Vector(inner_ty) => {\n            let mut inner_parts = Vec::new();\n            emit_eq(&mut inner_parts, inner_ty, \"a\", \"b\");\n            parts.push(if inner_parts.is_empty() {\n                format!(\"{a}.count == {b}.count\")\n            } else {\n                format!(\n                    \"{a}.elementsEqual({b}, by: {{ a, b in {} }})\",\n                    inner_parts.join(\" && \")\n                )\n            });\n        }\n\n        _ => parts.push(format!(\"{a} == {b}\")),\n    }\n}\n\nfn emit_eq_return(parts: &[String], base_indent: &str) -> String {\n    if parts.is_empty() {\n        \"return true\".to_string()\n    } else if parts.len() == 1 || parts.iter().map(|x| x.len()).sum::<usize>() < 100 {\n        format!(\"return {}\", parts.join(\" && \"))\n    } else {\n        let mut swift = \"return (\".to_string();\n        for (i, part) in parts.iter().enumerate() {\n            if i > 0 {\n                swift.push_str(\" &&\");\n            }\n            _ = write!(swift, \"\\n{base_indent}    {part}\");\n        }\n        _ = write!(swift, \"\\n{base_indent})\");\n        swift\n    }\n}\n\nfn generate_operator_eq_struct(s: &RustStruct) -> String {\n    let mut swift = String::new();\n    let mut parts = Vec::new();\n\n    for f in &s.fields {\n        let name = with_digit_prefix(&f.name);\n        let a = format!(\"a.{}\", name);\n        let b = format!(\"b.{}\", name);\n        emit_eq(&mut parts, &f.ty, &a, &b);\n    }\n\n    _ = write!(\n        swift,\n        \"\\n    static func == (a: {}, b: {}) -> Bool {{\\n\",\n        s.name, s.name\n    );\n    _ = write!(swift, \"        {}\\n\", emit_eq_return(&parts, \"        \"));\n\n    swift.push_str(\"    }\\n\");\n    swift\n}\n\nfn generate_operator_eq_enum(e: &RustEnum) -> String {\n    let mut locals = NameSet::default();\n    let mut swift = String::new();\n\n    locals.add(\"a\".to_string());\n    locals.add(\"b\".to_string());\n    _ = write!(\n        swift,\n        \"\\n    static func == (a: {}, b: {}) -> Bool {{\\n\",\n        e.name, e.name\n    );\n    swift.push_str(\"        switch (a, b) {\\n\");\n\n    for v in &e.variants {\n        if v.fields.is_empty() {\n            _ = write!(swift, \"        case (.{}, .{}):\\n\", v.name, v.name);\n            swift.push_str(\"            return true\\n\");\n            continue;\n        }\n\n        let mut branch_locals = locals.clone();\n        let mut a_names = Vec::new();\n        let mut b_names = Vec::new();\n        let mut parts = Vec::new();\n\n        _ = write!(swift, \"        case let (.{}(\", v.name);\n        for (i, f) in v.fields.iter().enumerate() {\n            if i > 0 {\n                swift.push_str(\", \");\n            }\n            if !starts_with_digit(&f.name) {\n                _ = write!(swift, \"{}: \", f.name);\n            }\n            let name = branch_locals.create(&format!(\"a{}\", f.name));\n            swift.push_str(&name);\n            a_names.push(name);\n        }\n\n        _ = write!(swift, \"), .{}(\", v.name);\n        for (i, f) in v.fields.iter().enumerate() {\n            if i > 0 {\n                swift.push_str(\", \");\n            }\n            if !starts_with_digit(&f.name) {\n                _ = write!(swift, \"{}: \", f.name);\n            }\n            let name = branch_locals.create(&format!(\"b{}\", f.name));\n            swift.push_str(&name);\n            b_names.push(name);\n        }\n\n        for ((a, b), f) in a_names.iter().zip(&b_names).zip(&v.fields) {\n            emit_eq(&mut parts, &f.ty, a, b);\n        }\n        swift.push_str(\")):\\n\");\n        _ = write!(\n            swift,\n            \"            {}\\n\",\n            emit_eq_return(&parts, \"            \")\n        );\n    }\n\n    swift.push_str(\"        default:\\n\");\n    swift.push_str(\"            return false\\n\");\n    swift.push_str(\"        }\\n\");\n    swift.push_str(\"    }\\n\");\n    swift\n}\n\n#[derive(Default)]\nstruct SwiftCtx {\n    syntax: RustSyntax,\n    helper_names: NameSet,\n    rust_helpers: HelperSet<(), String>,\n    swift_helpers: HelperSet<(), String>,\n    header_helpers: HelperSet<HeaderGroup, String>,\n    multi_ret_helpers: HashMap<Vec<RustType>, String>,\n    trait_to_rust_helpers: HashMap<usize, String>,\n    trait_to_swift_helpers: HashMap<(RustPtr, usize), String>,\n    vec_to_rust_helpers: HashMap<RustType, (String, String)>,\n    vec_to_swift_helpers: HashMap<RustType, (String, String)>,\n    box_to_rust_helpers: HashMap<RustType, (String, String)>,\n    box_to_swift_helpers: HashMap<RustType, (String, String)>,\n    enum_to_rust_helpers: HashMap<usize, (String, String)>,\n    enum_to_swift_helpers: HashMap<usize, (String, String)>,\n}\n\n#[derive(Default)]\nstruct Transform {\n    swift: FnBuilder,\n    rust: FnBuilder,\n    ffi_args: Vec<RustArg>,\n    buf: Option<Rc<SharedBuf>>,\n    buf_status: BufStatus,\n    buf_ref: &'static str,\n}\n\nstruct TraitInfo<'a> {\n    t: &'a RustTrait,\n    kind: RustPtr,\n}\n\nfn generate_swift_to_rust_fn(\n    ast: &AST,\n    ctx: &mut SwiftCtx,\n    f: &RustFn,\n    swift: &mut String,\n    trait_info: Option<TraitInfo>,\n) {\n    let ffi_name = ctx.helper_names.create(&match &trait_info {\n        None => format!(\"_ffi_fn_{}\", f.name),\n        Some(info) => format!(\"_ffi_{:?}_{}__{}\", info.kind, info.t.name, f.name),\n    });\n    let mut names = NameSet::default();\n    for arg in &f.args {\n        names.add(arg.name.clone());\n    }\n    if let Some(ret) = &f.returns {\n        names.add(ret.name.clone());\n    }\n\n    // Transform the arguments\n    let mut arg_tfm = Transform::default();\n    if let Some(info) = &trait_info {\n        arg_tfm.rust.line(format!(\n            \"let _self = unsafe {{ &*(_self as *const {}<dyn {}>) }};\",\n            info.kind.path(),\n            info.t.name\n        ));\n    }\n    for arg in &f.args {\n        arg_tfm.swift.mark_pure(&arg.name);\n        transform_to_rust(ast, ctx, &mut names, &mut arg_tfm, &arg.name, &arg.ty);\n    }\n    arg_tfm.swift.insert_deferred_lines_here();\n\n    // Generate the Rust call to the FFI function\n    let mut rust_call = String::new();\n    if trait_info.is_some() {\n        rust_call.push_str(\"_self.\");\n    }\n    _ = write!(rust_call, \"{}(\", f.name);\n    rust_call.push_str(&arg_tfm.rust.find_args(&f.args, RefInline));\n    rust_call.push(')');\n\n    // Transform the result\n    let mut ret_tfm = Transform::default();\n    if let Some(ret) = &f.returns {\n        ret_tfm.rust.decl(&ret.name, rust_call);\n        transform_to_swift(ast, ctx, &mut names, &mut ret_tfm, &ret.name, &ret.ty);\n    } else {\n        rust_call.push(';');\n        ret_tfm.rust.line(rust_call);\n    }\n\n    // Generate the Swift call to the FFI function\n    let mut swift_call = format!(\"{ffi_name}(\");\n    if trait_info.is_some() {\n        swift_call.push_str(\"_ffi\");\n        if !arg_tfm.ffi_args.is_empty() {\n            swift_call.push_str(\", \");\n        }\n    }\n    swift_call.push_str(&arg_tfm.swift.find_args(&arg_tfm.ffi_args, RefInline));\n    swift_call.push(')');\n\n    // Header\n    {\n        let mut header = String::new();\n        let mut header_deps = HashSet::new();\n        let return_ty = match &ret_tfm.ffi_args[..] {\n            [] => None,\n            [value] => Some(Cow::Borrowed(&value.ty)),\n            _ => {\n                let ty_name = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n                header_deps.insert((HeaderGroup::Other, ty_name.clone()));\n                Some(Cow::Owned(RustType::Verbatim(ty_name)))\n            }\n        };\n        header.push('\\n');\n        append_c_signature(\n            &mut header,\n            &mut header_deps,\n            return_ty.as_deref(),\n            &ffi_name,\n            trait_info.as_ref().map(|_| &RustType::ForeignHandle),\n            &arg_tfm.ffi_args,\n        );\n        header.push_str(\";\\n\");\n        ctx.header_helpers\n            .add_group(HeaderGroup::Other, &ffi_name, header)\n            .add_deps_group(header_deps)\n            .mark_used();\n    }\n\n    // Swift\n    {\n        // Handle the return values\n        let mut fb = arg_tfm.swift;\n        match &ret_tfm.ffi_args[..] {\n            [] => fb.line(swift_call),\n            [arg] => fb.decl(&arg.name, swift_call),\n            _ => {\n                let ret = names.create(\"multi_ret\");\n                fb.decl(&ret, swift_call);\n                for (i, arg) in ret_tfm.ffi_args.iter().enumerate() {\n                    fb.decl(&arg.name, format!(\"{ret}._{i}\"));\n                }\n            }\n        };\n\n        // Return from the function\n        fb.extend(ret_tfm.swift);\n        fb.insert_deferred_lines_here();\n        if let Some(ret) = &f.returns {\n            let code = fb.find(&ret.name, &ret.ty, RefInline).code;\n            fb.line(format!(\"return {code}\"));\n        }\n\n        // Write out the final function\n        let indent = match &trait_info {\n            None => \"    \",\n            Some(_) => \"        \",\n        };\n        _ = write!(swift, \"\\n{}func {}(\", &indent[4..], f.name);\n        for (i, arg) in f.args.iter().enumerate() {\n            if i > 0 {\n                swift.push_str(\", \");\n            }\n            _ = write!(swift, \"_ {}: \", arg.name);\n            append_swift_type(swift, ast, &arg.ty);\n        }\n        swift.push(')');\n        if let Some(returns) = &f.returns {\n            swift.push_str(\" -> \");\n            append_swift_type(swift, ast, &returns.ty);\n        }\n        swift.push_str(\" {\\n\");\n        fb.write_to_swift(ast, swift, indent);\n        _ = write!(swift, \"{}}}\\n\", &indent[4..]);\n    }\n\n    // Rust\n    {\n        // Return from the function\n        let mut fb = arg_tfm.rust;\n        fb.extend(ret_tfm.rust);\n        fb.insert_deferred_lines_here();\n        match &ret_tfm.ffi_args[..] {\n            [] => {}\n            [arg] => {\n                let code = fb.find(&arg.name, &arg.ty, RefInline).code;\n                fb.line(code);\n            }\n            _ => {\n                let ty_name = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n                let args = fb.find_args(&ret_tfm.ffi_args, RefInline);\n                fb.line(format!(\"{ty_name}({args})\"));\n            }\n        }\n\n        // Write out the final function\n        let mut rust = String::new();\n        _ = write!(rust, \"\\n{}\\n\", ctx.syntax.unsafe_no_mangle());\n        _ = write!(rust, \"extern \\\"C\\\" fn {ffi_name}(\");\n        if trait_info.is_some() {\n            rust.push_str(\"_self: *const u8\");\n        }\n        for (i, arg) in arg_tfm.ffi_args.iter().enumerate() {\n            if trait_info.is_some() || i > 0 {\n                rust.push_str(\", \");\n            }\n            _ = write!(rust, \"{}: \", arg.name);\n            append_rust_type(&mut rust, ast, &arg.ty);\n        }\n        rust.push(')');\n        match &ret_tfm.ffi_args[..] {\n            [] => {}\n            [arg] => {\n                rust.push_str(\" -> \");\n                append_rust_type(&mut rust, ast, &arg.ty);\n            }\n            _ => {\n                let ty_name = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n                _ = write!(rust, \" -> {ty_name}\");\n            }\n        }\n        rust.push_str(\" {\\n\");\n        fb.write_to_rust(ast, &mut rust, \"    \");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&ffi_name, rust).mark_used();\n    }\n}\n\nfn generate_rust_to_swift_fn(\n    ast: &AST,\n    ctx: &mut SwiftCtx,\n    t: &RustTrait,\n    f: &RustFn,\n    rust: &mut String,\n) {\n    let ffi_name = ctx\n        .helper_names\n        .create(&format!(\"_ffi_swift_{}__{}\", t.name, f.name));\n    let mut names = NameSet::default();\n    for arg in &f.args {\n        names.add(arg.name.clone());\n    }\n    if let Some(ret) = &f.returns {\n        names.add(ret.name.clone());\n    }\n\n    // Transform the arguments\n    let mut arg_tfm = Transform::default();\n    let self_code = format!(\n        \"Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! {}\",\n        t.name\n    );\n    arg_tfm.swift.line(format!(\"let _self = {self_code}\"));\n    for arg in &f.args {\n        arg_tfm.rust.mark_pure(&arg.name);\n        transform_to_swift(ast, ctx, &mut names, &mut arg_tfm, &arg.name, &arg.ty);\n    }\n    arg_tfm.rust.insert_deferred_lines_here();\n\n    // Generate the Swift call to the FFI function\n    let mut swift_call = format!(\"_self.{}(\", f.name);\n    swift_call.push_str(&arg_tfm.swift.find_args(&f.args, RefInline));\n    swift_call.push(')');\n\n    // Transform the result\n    let mut ret_tfm = Transform::default();\n    if let Some(ret) = &f.returns {\n        ret_tfm.swift.decl(&ret.name, swift_call);\n        transform_to_rust(ast, ctx, &mut names, &mut ret_tfm, &ret.name, &ret.ty);\n    } else {\n        ret_tfm.swift.line(swift_call);\n    }\n\n    // Generate the Rust call to the FFI function\n    let mut rust_call = format!(\"unsafe {{ {ffi_name}(self.0\");\n    if !arg_tfm.ffi_args.is_empty() {\n        rust_call.push_str(\", \");\n    }\n    rust_call.push_str(&arg_tfm.rust.find_args(&arg_tfm.ffi_args, RefInline));\n    rust_call.push_str(\") }\");\n\n    // Rust\n    {\n        // Handle the return values\n        let mut fb = arg_tfm.rust;\n        match &ret_tfm.ffi_args[..] {\n            [] => {\n                rust_call.push(';');\n                fb.line(rust_call);\n            }\n            [arg] => fb.decl(&arg.name, rust_call),\n            _ => {\n                let ret = names.create(\"multi_ret\");\n                fb.decl(&ret, rust_call);\n                for (i, arg) in ret_tfm.ffi_args.iter().enumerate() {\n                    fb.decl(&arg.name, format!(\"{ret}.{i}\"));\n                }\n            }\n        };\n\n        // Return from the function\n        fb.extend(ret_tfm.rust);\n        fb.insert_deferred_lines_here();\n        if let Some(ret) = &f.returns {\n            let code = fb.find(&ret.name, &ret.ty, RefInline).code;\n            fb.line(code);\n        }\n\n        // Write out the final function\n        _ = write!(rust, \"\\n    fn {}(&self\", f.name);\n        for arg in &f.args {\n            _ = write!(rust, \", {}: \", arg.name);\n            append_rust_type(rust, ast, &arg.ty);\n        }\n        rust.push(')');\n        if let Some(returns) = &f.returns {\n            rust.push_str(\" -> \");\n            append_rust_type(rust, ast, &returns.ty);\n        }\n        rust.push_str(\" {\\n\");\n        _ = write!(\n            rust,\n            \"        {} \\\"C\\\" {{ fn {ffi_name}(_: *const u8\",\n            ctx.syntax.unsafe_extern()\n        );\n        for arg in &arg_tfm.ffi_args {\n            _ = write!(rust, \", {}: \", arg.name);\n            append_rust_type(rust, ast, &arg.ty);\n        }\n        match &ret_tfm.ffi_args[..] {\n            [] => rust.push(')'),\n            [arg] => {\n                rust.push_str(\") -> \");\n                append_rust_type(rust, ast, &arg.ty);\n            }\n            _ => {\n                let ty_name = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n                _ = write!(rust, \") -> {ty_name}\");\n            }\n        }\n        rust.push_str(\"; }\\n\");\n        fb.write_to_rust(ast, rust, \"        \");\n        rust.push_str(\"    }\\n\");\n    }\n\n    // Swift\n    {\n        // Return from the function\n        let mut fb = arg_tfm.swift;\n        fb.extend(ret_tfm.swift);\n        fb.insert_deferred_lines_here();\n        match &ret_tfm.ffi_args[..] {\n            [] => {}\n            [arg] => {\n                let code = fb.find(&arg.name, &arg.ty, RefInline).code;\n                fb.line(format!(\"return {code}\"));\n            }\n            _ => {\n                let ty_name = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n                let args = fb.find_fields(\n                    &ret_tfm\n                        .ffi_args\n                        .iter()\n                        .enumerate()\n                        .map(|(i, arg)| RustField {\n                            name: format!(\"_{i}\"),\n                            ty: arg.ty.clone(),\n                        })\n                        .collect(),\n                    ret_tfm\n                        .ffi_args\n                        .iter()\n                        .map(|arg| arg.name.as_str().into())\n                        .collect(),\n                    RefInline,\n                    &format!(\"return {ty_name}(\"),\n                    \")\",\n                );\n                fb.line(args);\n            }\n        }\n\n        // Write out the final function\n        let mut swift = \"\\n@_cdecl(\".to_string();\n        append_swift_quoted(&mut swift, &ffi_name);\n        _ = write!(swift, \")\\nfunc {ffi_name}(_self: UnsafeRawPointer?\");\n        for arg in &arg_tfm.ffi_args {\n            _ = write!(swift, \", {}: \", arg.name);\n            append_swift_type(&mut swift, ast, &arg.ty);\n        }\n        swift.push(')');\n        match &ret_tfm.ffi_args[..] {\n            [] => {}\n            [arg] => {\n                swift.push_str(\" -> \");\n                append_swift_type(&mut swift, ast, &arg.ty);\n            }\n            _ => {\n                let ty_name = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n                _ = write!(swift, \" -> {ty_name}\");\n            }\n        }\n        swift.push_str(\" {\\n\");\n        fb.write_to_swift(ast, &mut swift, \"    \");\n        swift.push_str(\"}\\n\");\n        ctx.swift_helpers.add(&ffi_name, swift).mark_used();\n    }\n}\n\nfn transform_to_rust(\n    ast: &AST,\n    ctx: &mut SwiftCtx,\n    names: &mut NameSet,\n    tfm: &mut Transform,\n    name: &str,\n    ty: &RustType,\n) {\n    use RustType::*;\n\n    fn add_ffi_arg(ast: &AST, ctx: &mut SwiftCtx, tfm: &mut Transform, name: &str, ty: &RustType) {\n        match tfm.buf_status {\n            BufStatus::Outside => tfm.ffi_args.push(RustArg {\n                name: name.to_string(),\n                ty: ty.clone(),\n            }),\n            BufStatus::Inside => {\n                let buf = tfm.buf.as_ref().unwrap();\n\n                // Swift (write)\n                let code = tfm.swift.find(name, ty, RefInline).code;\n                tfm.swift\n                    .line(format!(\"_ffi_write({code}, &{})\", buf.buf_name()));\n                ctx.swift_helpers.mark_used(\"_ffi_write\");\n\n                // Rust (read)\n                let mut rust = \"_ffi_read::<\".to_string();\n                append_rust_type(&mut rust, ast, ty);\n                _ = write!(rust, \">({}{})\", tfm.buf_ref, buf.end_name());\n                tfm.rust.decl(name, rust);\n                ctx.rust_helpers.mark_used(\"_ffi_read\");\n            }\n        }\n    }\n\n    match ty {\n        Bool | U8 | U16 | U32 | Usize | U64 | I8 | I16 | I32 | Isize | I64 | F32 | F64\n        | ForeignHandle => add_ffi_arg(ast, ctx, tfm, name, ty),\n\n        RefStr | OwnStr => {\n            let swift_code = tfm.swift.find(name, ty, RefInline).code;\n            let ptr_name = names.create(&format!(\"{name}_ptr\"));\n            let len_name = names.create(&format!(\"{name}_len\"));\n            let opt_ref = match ty {\n                RefStr => \"&\",\n                _ => \"\",\n            };\n            tfm.swift.line(format!(\n                \"let ({ptr_name}, {len_name}) = _ffi_string_to_rust({swift_code});\"\n            ));\n            ctx.header_helpers\n                .mark_used_group(HeaderGroup::Other, \"_ffi_alloc\");\n            ctx.swift_helpers.mark_used(\"_ffi_string_to_rust\");\n            add_ffi_arg(ast, ctx, tfm, &ptr_name, &ForeignHandle);\n            add_ffi_arg(ast, ctx, tfm, &len_name, &Usize);\n            let len_code = tfm.rust.find(&len_name, &Usize, RefInline).code;\n            let ptr_code = tfm.rust.find(&ptr_name, &ForeignHandle, RefInline).code;\n            tfm.rust.decl(\n                name,\n                format!(\"{opt_ref}_ffi_string_from_host({ptr_code}, {len_code})\"),\n            );\n            ctx.rust_helpers.mark_used(\"_ffi_string_from_host\");\n        }\n\n        Enum(enum_index) => {\n            let swift = tfm.swift.find(name, ty, RefInline);\n            let e = &ast.enums[*enum_index];\n            let (swift_helper, rust_helper) = enum_to_rust_helper(ast, ctx, *enum_index);\n            if !e.has_fields() {\n                let raw_name = names.create(&format!(\"{name}_raw\"));\n                tfm.swift.maybe_pure_decl(\n                    swift.pure,\n                    &raw_name,\n                    format!(\"{}.rawValue\", swift.code),\n                );\n                add_ffi_arg(ast, ctx, tfm, &raw_name, &I32);\n                tfm.rust.decl(name, format!(\"{rust_helper}({raw_name})\"));\n            } else {\n                let buf = ensure_swift_buf(ctx, names, tfm);\n                tfm.swift.line(format!(\n                    \"{swift_helper}({}, &{})\",\n                    swift.code,\n                    buf.buf_name()\n                ));\n                tfm.rust.decl(\n                    name,\n                    format!(\"{rust_helper}({}{})\", tfm.buf_ref, buf.end_name()),\n                );\n            }\n        }\n\n        Struct(struct_index) => {\n            let swift = tfm.swift.find(name, ty, RefMany);\n            let s = &ast.structs[*struct_index];\n            let mut item_names = Vec::new();\n            for f in &s.fields {\n                let item_name = names.create(&format!(\"{name}_{}\", f.name));\n                tfm.swift.maybe_pure_decl(\n                    swift.pure,\n                    &item_name,\n                    format!(\"{}.{}\", swift.code, with_digit_prefix(&f.name)),\n                );\n                transform_to_rust(ast, ctx, names, tfm, &item_name, &f.ty);\n                item_names.push(item_name.into());\n            }\n            rust_decl_ctor(&mut tfm.rust, name, &s.name, &s.fields, item_names);\n        }\n\n        Tuple(types) => {\n            let swift = tfm.swift.find(name, ty, RefMany);\n            let mut item_args = Vec::new();\n            for (i, item_ty) in types.iter().enumerate() {\n                let item_name = names.create(&format!(\"{name}_{i}\"));\n                let swift_code = match types.len() {\n                    1 => tfm.swift.find(name, item_ty, RefInline).code,\n                    _ => format!(\"{}.{i}\", swift.code),\n                };\n                tfm.swift\n                    .maybe_pure_decl(swift.pure, &item_name, swift_code);\n                transform_to_rust(ast, ctx, names, tfm, &item_name, &item_ty);\n                item_args.push(RustArg {\n                    name: item_name,\n                    ty: item_ty.clone(),\n                });\n            }\n            let mut rust_code = tfm.rust.find_args(&item_args, RefInline);\n            if types.len() == 1 {\n                rust_code.push(',');\n            }\n            tfm.rust.decl(name, format!(\"({rust_code})\"));\n        }\n\n        Ptr(kind, inner_ty) => {\n            if let DynTrait(trait_index) = &**inner_ty {\n                let swift_code = tfm.swift.find(name, ty, RefInline).code;\n                let ptr_name = names.create(&format!(\"{name}_ptr\"));\n                let rust_helper = trait_to_rust_helper(ast, ctx, *trait_index);\n                let swift_code = format!(\n                    \"UnsafeRawPointer(Unmanaged.passRetained({swift_code} as AnyObject).toOpaque())\"\n                );\n                tfm.swift.decl(&ptr_name, swift_code);\n                add_ffi_arg(ast, ctx, tfm, &ptr_name, &ForeignHandle);\n                let ptr_code = tfm.rust.find(&ptr_name, &ForeignHandle, RefInline).code;\n                tfm.rust.decl(\n                    name,\n                    format!(\"{}::new({rust_helper}({ptr_code}))\", kind.path()),\n                );\n            } else if *kind == RustPtr::Box {\n                let swift_code = tfm.swift.find(name, ty, RefMany).code;\n                let (swift_helper, rust_helper) = box_to_rust_helper(ast, ctx, inner_ty);\n                let buf = ensure_swift_buf(ctx, names, tfm);\n                tfm.swift\n                    .line(format!(\"{swift_helper}({swift_code}, &{})\", buf.buf_name()));\n                tfm.rust.decl(\n                    name,\n                    format!(\"{rust_helper}({}{})\", tfm.buf_ref, buf.end_name()),\n                );\n            } else {\n                unreachable!()\n            }\n        }\n\n        Vector(inner_ty) => {\n            let swift_code = tfm.swift.find(name, ty, RefMany).code;\n            let len_name = names.create(&format!(\"{name}_len\"));\n            let (swift_helper, rust_helper) = vec_to_rust_helper(ast, ctx, inner_ty);\n            let buf = ensure_swift_buf(ctx, names, tfm);\n            tfm.swift\n                .decl(&len_name, format!(\"UInt({swift_code}.count)\"));\n            add_ffi_arg(ast, ctx, tfm, &len_name, &Usize);\n            tfm.swift\n                .line(format!(\"{swift_helper}({swift_code}, &{})\", buf.buf_name()));\n            let len_code = tfm.rust.find(&len_name, ty, RefInline).code;\n            tfm.rust.decl(\n                name,\n                format!(\n                    \"{rust_helper}({len_code}, {}{})\",\n                    tfm.buf_ref,\n                    buf.end_name()\n                ),\n            );\n        }\n\n        Optional(inner_ty) => {\n            let swift_code = tfm.swift.find(name, ty, RefMany).code;\n            let has_name = names.create(&format!(\"has_{name}\"));\n            let val_name = names.create(&format!(\"{name}_val\"));\n            ensure_swift_buf(ctx, names, tfm);\n\n            tfm.swift.decl(&has_name, format!(\"{swift_code} != nil\"));\n            add_ffi_arg(ast, ctx, tfm, &has_name, &Bool);\n\n            let mut rust = FnBuilder::default();\n            let branch = format!(\"if let {val_name} = {swift_code} {{\");\n            tfm.swift.line(branch.clone());\n            {\n                let old = tfm.buf_status;\n                tfm.buf_status = BufStatus::Inside;\n                std::mem::swap(&mut tfm.rust, &mut rust);\n                transform_to_rust(ast, ctx, names, tfm, &val_name, inner_ty);\n                std::mem::swap(&mut tfm.rust, &mut rust);\n                tfm.buf_status = old;\n            }\n            match tfm.swift.pop_line_if(|x| x == &Line::Plain(branch)) {\n                None => tfm.swift.line(\"}\".into()),\n                Some(_) => {} // Avoid an unused variable warning in Swift\n            }\n\n            let has_code = tfm.rust.find(&has_name, ty, RefInline).code;\n            let val_code = rust.find(&val_name, ty, RefInline).code;\n            if rust.is_empty() {\n                tfm.rust\n                    .decl(name, format!(\"{has_code}.then(|| {val_code})\"));\n            } else {\n                rust.insert_deferred_lines_here();\n                rust.line(val_code);\n                tfm.rust.line(format!(\"let {name} = {has_code}.then(|| {{\"));\n                tfm.rust.extend(rust);\n                tfm.rust.line(\"});\".to_string());\n            }\n        }\n\n        Pair { .. } | Verbatim(_) | DynTrait(_) => unreachable!(),\n    }\n}\n\nfn transform_to_swift(\n    ast: &AST,\n    ctx: &mut SwiftCtx,\n    names: &mut NameSet,\n    tfm: &mut Transform,\n    name: &str,\n    ty: &RustType,\n) {\n    use RustType::*;\n\n    fn add_ffi_arg(ast: &AST, ctx: &mut SwiftCtx, tfm: &mut Transform, name: &str, ty: &RustType) {\n        match tfm.buf_status {\n            BufStatus::Outside => tfm.ffi_args.push(RustArg {\n                name: name.to_string(),\n                ty: ty.clone(),\n            }),\n            BufStatus::Inside => {\n                let buf = tfm.buf.as_ref().unwrap();\n\n                // Rust (write)\n                let code = tfm.rust.find(name, ty, RefInline).code;\n                tfm.rust.line(format!(\n                    \"_ffi_write({code}, {}{});\",\n                    tfm.buf_ref,\n                    buf.buf_name()\n                ));\n                ctx.rust_helpers.mark_used(\"_ffi_write\");\n\n                // Swift (read)\n                let mut swift = String::new();\n                _ = write!(swift, \"_ffi_read(&{}) as \", buf.end_name());\n                append_swift_type(&mut swift, ast, ty);\n                tfm.swift.decl(name, swift);\n                ctx.swift_helpers.mark_used(\"_ffi_read\");\n            }\n        }\n    }\n\n    match ty {\n        Bool | U8 | U16 | U32 | Usize | U64 | I8 | I16 | I32 | Isize | I64 | F32 | F64\n        | ForeignHandle => add_ffi_arg(ast, ctx, tfm, name, ty),\n\n        RefStr | OwnStr => {\n            let mut rust_code = tfm.rust.find(name, ty, RefInline).code;\n            let ptr_name = names.create(&format!(\"{name}_ptr\"));\n            let len_name = names.create(&format!(\"{name}_len\"));\n            let cap_name = names.create(&format!(\"{name}_cap\"));\n            if let RefStr = ty {\n                rust_code.push_str(\".into()\");\n            }\n            tfm.rust.line(format!(\n                \"let ({ptr_name}, {len_name}, {cap_name}) = _ffi_string_to_host({rust_code});\"\n            ));\n            ctx.rust_helpers.mark_used(\"_ffi_string_to_host\");\n            add_ffi_arg(ast, ctx, tfm, &ptr_name, &ForeignHandle);\n            add_ffi_arg(ast, ctx, tfm, &len_name, &Usize);\n            add_ffi_arg(ast, ctx, tfm, &cap_name, &Usize);\n            let cap_code = tfm.swift.find(&cap_name, &Usize, RefInline).code;\n            let len_code = tfm.swift.find(&len_name, &Usize, RefInline).code;\n            let ptr_code = tfm.swift.find(&ptr_name, &ForeignHandle, RefInline).code;\n            tfm.swift.decl(\n                name,\n                format!(\"_ffi_string_from_rust({ptr_code}, Int({len_code}), {cap_code})\"),\n            );\n            ctx.swift_helpers.mark_used(\"_ffi_string_from_rust\");\n            ctx.header_helpers\n                .mark_used_group(HeaderGroup::Other, \"_ffi_dealloc\");\n        }\n\n        Enum(enum_index) => {\n            let rust = tfm.rust.find(name, ty, RefInline);\n            let e = &ast.enums[*enum_index];\n            if !e.has_fields() {\n                let raw_name = names.create(&format!(\"{name}_raw\"));\n                tfm.rust\n                    .maybe_pure_decl(rust.pure, &raw_name, format!(\"{} as i32\", rust.code));\n                add_ffi_arg(ast, ctx, tfm, &raw_name, &I32);\n                tfm.swift\n                    .decl(name, format!(\"{}(rawValue: {raw_name})!\", e.name));\n            } else {\n                let (swift_helper, rust_helper) = enum_to_swift_helper(ast, ctx, *enum_index);\n                let buf = ensure_rust_buf(ctx, names, tfm);\n                tfm.rust.line(format!(\n                    \"{rust_helper}({}, {}{});\",\n                    rust.code,\n                    tfm.buf_ref,\n                    buf.buf_name()\n                ));\n                tfm.swift\n                    .decl(name, format!(\"{swift_helper}(&{})\", buf.end_name()));\n            }\n        }\n\n        Struct(struct_index) => {\n            let rust = tfm.rust.find(name, ty, RefMany);\n            let s = &ast.structs[*struct_index];\n            let mut item_names = Vec::new();\n            for f in &s.fields {\n                let item_name = names.create(&format!(\"{name}_{}\", f.name));\n                tfm.rust.maybe_pure_decl(\n                    rust.pure,\n                    &item_name,\n                    format!(\"{}.{}\", rust.code, f.name),\n                );\n                transform_to_swift(ast, ctx, names, tfm, &item_name, &f.ty);\n                item_names.push(item_name.into());\n            }\n            if s.fields.is_empty() {\n                // Avoid an unused variable warning in Rust\n                let code = tfm.rust.find(name, ty, RefInline).code;\n                tfm.rust.line(format!(\"_ = {code};\"));\n            }\n            let fields = tfm.swift.find_fields(\n                &s.fields\n                    .iter()\n                    .map(|f| RustField {\n                        name: with_digit_prefix(&f.name).into_owned(),\n                        ty: f.ty.clone(),\n                    })\n                    .collect(),\n                item_names,\n                RefInline,\n                &format!(\"{}(\", s.name),\n                \")\",\n            );\n            tfm.swift.decl(name, fields);\n        }\n\n        Tuple(types) => {\n            let rust = tfm.rust.find(name, ty, RefMany);\n            let mut item_args = Vec::new();\n            for (i, item_ty) in types.iter().enumerate() {\n                let item_name = names.create(&format!(\"{name}_{i}\"));\n                tfm.rust\n                    .maybe_pure_decl(rust.pure, &item_name, format!(\"{}.{i}\", rust.code));\n                transform_to_swift(ast, ctx, names, tfm, &item_name, &item_ty);\n                item_args.push(RustArg {\n                    name: item_name,\n                    ty: item_ty.clone(),\n                });\n            }\n            if types.is_empty() {\n                tfm.swift.pure_decl(name, \"()\".to_string());\n\n                // Avoid an unused variable warning in Rust\n                let code = tfm.rust.find(name, ty, RefInline).code;\n                tfm.rust.line(format!(\"_ = {code};\"));\n            } else {\n                let swift_code = tfm.swift.find_args(&item_args, RefInline);\n                tfm.swift.decl(\n                    name,\n                    match types.len() {\n                        1 => swift_code,\n                        _ => format!(\"({swift_code})\"),\n                    },\n                );\n            }\n        }\n\n        Ptr(kind, inner_ty) => {\n            if let DynTrait(trait_index) = &**inner_ty {\n                let rust_code = tfm.rust.find(name, ty, RefInline).code;\n                let ptr_name = names.create(&format!(\"{name}_ptr\"));\n                let swift_helper = trait_to_swift_helper(ast, ctx, *trait_index, *kind);\n                tfm.rust.decl(\n                    &ptr_name,\n                    format!(\"Box::into_raw(Box::new({rust_code})) as *const u8\"),\n                );\n                add_ffi_arg(ast, ctx, tfm, &ptr_name, &ForeignHandle);\n                let ptr_code = tfm.swift.find(&ptr_name, &ForeignHandle, RefInline).code;\n                tfm.swift.decl(name, format!(\"{swift_helper}({ptr_code})\"));\n            } else if *kind == RustPtr::Box {\n                let rust_code = tfm.rust.find(name, ty, RefMany).code;\n                let (swift_helper, rust_helper) = box_to_swift_helper(ast, ctx, inner_ty);\n                let buf = ensure_rust_buf(ctx, names, tfm);\n                tfm.rust.line(format!(\n                    \"{rust_helper}(*{rust_code}, {}{});\",\n                    tfm.buf_ref,\n                    buf.buf_name()\n                ));\n                tfm.swift\n                    .decl(name, format!(\"{swift_helper}(&{})\", buf.end_name()));\n            } else {\n                unreachable!()\n            }\n        }\n\n        Vector(inner_ty) => {\n            let rust_code = tfm.rust.find(name, ty, RefMany).code;\n            let len_name = names.create(&format!(\"{name}_len\"));\n            let (swift_helper, rust_helper) = vec_to_swift_helper(ast, ctx, inner_ty);\n            let buf = ensure_rust_buf(ctx, names, tfm);\n            tfm.rust.decl(&len_name, format!(\"{rust_code}.len()\"));\n            add_ffi_arg(ast, ctx, tfm, &len_name, &Usize);\n            tfm.rust.line(format!(\n                \"{rust_helper}({rust_code}, {}{});\",\n                tfm.buf_ref,\n                buf.buf_name()\n            ));\n            let len_code = tfm.swift.find(&len_name, ty, RefInline).code;\n            tfm.swift.decl(\n                name,\n                format!(\"{swift_helper}(Int({len_code}), &{})\", buf.end_name()),\n            );\n        }\n\n        Optional(inner_ty) => {\n            let rust_code = tfm.rust.find(name, ty, RefMany).code;\n            let has_name = names.create(&format!(\"has_{name}\"));\n            let val_name = names.create(&format!(\"{name}_val\"));\n            ensure_rust_buf(ctx, names, tfm);\n\n            tfm.rust.decl(&has_name, format!(\"{rust_code}.is_some()\"));\n            add_ffi_arg(ast, ctx, tfm, &has_name, &Bool);\n\n            let mut swift = FnBuilder::default();\n            tfm.rust\n                .line(format!(\"if let Some({val_name}) = {rust_code} {{\"));\n            {\n                let old = tfm.buf_status;\n                tfm.buf_status = BufStatus::Inside;\n                std::mem::swap(&mut tfm.swift, &mut swift);\n                transform_to_swift(ast, ctx, names, tfm, &val_name, inner_ty);\n                std::mem::swap(&mut tfm.swift, &mut swift);\n                tfm.buf_status = old;\n            }\n            tfm.rust.line(\"}\".into());\n\n            let has_code = tfm.swift.find(&has_name, ty, RefInline).code;\n            let mut val_code = swift.find(&val_name, ty, RefInline).code;\n            if let Optional(_) = &**inner_ty {\n                val_code = format!(\"Optional.some({val_code})\");\n            }\n            if swift.is_empty() {\n                tfm.swift\n                    .decl(name, format!(\"{has_code} ? {val_code} : nil\"));\n            } else {\n                let mut swift_ty = String::new();\n                append_swift_type(&mut swift_ty, ast, ty);\n                swift.insert_deferred_lines_here();\n                swift.line(format!(\"{name} = {val_code}\"));\n                tfm.swift.line(format!(\"var {name}: {swift_ty} = nil\"));\n                tfm.swift.line(format!(\"if {has_code} {{\"));\n                tfm.swift.extend(swift);\n                tfm.swift.line(\"}\".to_string());\n            }\n        }\n\n        Pair { .. } | Verbatim(_) | DynTrait(_) => unreachable!(),\n    }\n}\n\nfn ensure_swift_buf(ctx: &mut SwiftCtx, names: &mut NameSet, tfm: &mut Transform) -> Rc<SharedBuf> {\n    if let Some(buf) = &tfm.buf {\n        return buf.clone();\n    }\n\n    let buf_name = names.create(\"buf\");\n    let ptr_name = names.create(\"buf_ptr\");\n    let end_name = names.create(\"buf_end\");\n    let buf = SharedBuf::new(&buf_name, &end_name);\n\n    // Swift (write)\n    tfm.swift.line_alt(\n        format!(\"let {buf_name} = ContiguousArray<UInt8>()\"),\n        format!(\"var {buf_name} = ContiguousArray<UInt8>()\"),\n        buf.is_buf_name_used_flag(),\n    );\n    tfm.swift\n        .defer_decl(&ptr_name, format!(\"_ffi_vec_to_rust({buf_name})\"));\n    ctx.swift_helpers.mark_used(\"_ffi_vec_to_rust\");\n    ctx.header_helpers\n        .mark_used_group(HeaderGroup::Other, \"_ffi_alloc\");\n\n    // Rust (read)\n    tfm.rust.line_alt(\n        // Avoid a warning about an unnecessarily mutable variable\n        format!(\"let {end_name} = {ptr_name};\"),\n        format!(\"let mut {end_name} = {ptr_name};\"),\n        buf.is_buf_name_used_flag(),\n    );\n    tfm.rust\n        .defer_line(format!(\"_ffi_buf_from_host({ptr_name}, {end_name});\"));\n    ctx.rust_helpers.mark_used(\"_ffi_buf_from_host\");\n\n    // FFI\n    tfm.buf = Some(buf.clone());\n    tfm.buf_ref = \"&mut \";\n    tfm.ffi_args.push(RustArg {\n        name: ptr_name,\n        ty: RustType::ForeignHandle,\n    });\n    buf\n}\n\nfn ensure_rust_buf(ctx: &mut SwiftCtx, names: &mut NameSet, tfm: &mut Transform) -> Rc<SharedBuf> {\n    if let Some(buf) = &tfm.buf {\n        return buf.clone();\n    }\n\n    let buf_name = names.create(\"buf\");\n    let ptr_name = names.create(\"buf_ptr\");\n    let end_name = names.create(\"buf_end\");\n    let cap_name = names.create(\"buf_cap\");\n    let buf = SharedBuf::new(&buf_name, &end_name);\n\n    // Rust (write)\n    tfm.rust.line_alt(\n        // Avoid a warning about an unnecessarily mutable variable\n        format!(\"let {buf_name} = Vec::<u8>::new();\"),\n        format!(\"let mut {buf_name} = Vec::<u8>::new();\"),\n        buf.is_buf_name_used_flag(),\n    );\n    tfm.rust.defer_line(format!(\n        \"let ({ptr_name}, {cap_name}) = _ffi_buf_to_host({buf_name});\"\n    ));\n    ctx.rust_helpers.mark_used(\"_ffi_buf_to_host\");\n\n    // Swift (read)\n    tfm.swift.line_alt(\n        \"\".to_string(),\n        format!(\"var {end_name} = {ptr_name}!\"),\n        buf.is_end_name_used_flag(),\n    );\n    tfm.swift\n        .defer_line(format!(\"_ffi_dealloc({ptr_name}, {cap_name})\"));\n    ctx.header_helpers\n        .mark_used_group(HeaderGroup::Other, \"_ffi_dealloc\");\n\n    // FFI\n    tfm.buf = Some(buf.clone());\n    tfm.buf_ref = \"&mut \";\n    tfm.ffi_args.push(RustArg {\n        name: ptr_name,\n        ty: RustType::ForeignHandle,\n    });\n    tfm.ffi_args.push(RustArg {\n        name: cap_name,\n        ty: RustType::Usize,\n    });\n    buf\n}\n\nfn vec_to_rust_helper(ast: &AST, ctx: &mut SwiftCtx, inner_ty: &RustType) -> (String, String) {\n    if let Some(result) = ctx.vec_to_rust_helpers.get(inner_ty) {\n        return result.clone();\n    }\n\n    let mut base_name = \"_ffi_vec_\".to_string();\n    append_type_name_hint(&mut base_name, ast, inner_ty);\n    let swift_name = ctx.helper_names.create(&format!(\"{base_name}_to_rust\"));\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_from_swift\"));\n\n    // This must be done first to avoid a stack overflow\n    ctx.vec_to_rust_helpers\n        .insert(inner_ty.clone(), (swift_name.clone(), rust_name.clone()));\n\n    let mut locals = NameSet::default();\n    let vec_name = locals.create(\"items\");\n    let item_name = locals.create(\"item\");\n    let end_name = locals.create(\"end\");\n    let len_name = locals.create(\"len\");\n    let buf_name = locals.create(\"buf\");\n\n    // Transform the items\n    let mut tfm = Transform::default();\n    let buf = SharedBuf::new(&buf_name, &end_name);\n    tfm.buf = Some(buf.clone());\n    tfm.buf_status = BufStatus::Inside;\n    tfm.swift.mark_pure(&item_name);\n    transform_to_rust(ast, ctx, &mut locals, &mut tfm, &item_name, &inner_ty);\n    let item_code = tfm.rust.find(&item_name, inner_ty, RefInline).code;\n    tfm.rust.line(format!(\"{vec_name}.push({item_code});\"));\n\n    // Swift\n    {\n        let mut swift = String::new();\n        _ = write!(swift, \"\\nprivate func {swift_name}(_ {vec_name}: [\");\n        append_swift_type(&mut swift, ast, inner_ty);\n        _ = write!(swift, \"], _ {buf_name}: inout ContiguousArray<UInt8>) {{\\n\");\n        if !tfm.swift.is_empty() {\n            _ = write!(swift, \"    for {item_name} in {vec_name} {{\\n\");\n            tfm.swift.write_to_swift(ast, &mut swift, \"        \");\n            swift.push_str(\"    }\\n\");\n        }\n        swift.push_str(\"}\\n\");\n        ctx.swift_helpers.add(&swift_name, swift).mark_used();\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        let mut item_ty = String::new();\n        let end_name = buf.final_end_name_for_rust();\n        append_rust_type(&mut item_ty, ast, inner_ty);\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(\n            rust,\n            \"\\nfn {rust_name}({len_name}: usize, {end_name}: &mut *const u8) -> Vec<{item_ty}> {{\\n\"\n        );\n        _ = write!(\n            rust,\n            \"    let mut {vec_name} = Vec::<{item_ty}>::with_capacity({len_name});\\n\"\n        );\n        _ = write!(rust, \"    for _ in 0..{len_name} {{\\n\");\n        tfm.rust.write_to_rust(ast, &mut rust, \"        \");\n        rust.push_str(\"    }\\n\");\n        _ = write!(rust, \"    {vec_name}\\n\");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n    }\n\n    (swift_name, rust_name)\n}\n\nfn vec_to_swift_helper(ast: &AST, ctx: &mut SwiftCtx, inner_ty: &RustType) -> (String, String) {\n    if let Some(result) = ctx.vec_to_swift_helpers.get(inner_ty) {\n        return result.clone();\n    }\n\n    let mut base_name = \"_ffi_vec_\".to_string();\n    append_type_name_hint(&mut base_name, ast, inner_ty);\n    let swift_name = ctx.helper_names.create(&format!(\"{base_name}_from_rust\"));\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_to_swift\"));\n\n    // This must be done first to avoid a stack overflow\n    ctx.vec_to_swift_helpers\n        .insert(inner_ty.clone(), (swift_name.clone(), rust_name.clone()));\n\n    let mut locals = NameSet::default();\n    let vec_name = locals.create(\"items\");\n    let item_name = locals.create(\"item\");\n    let end_name = locals.create(\"end\");\n    let len_name = locals.create(\"len\");\n    let buf_name = locals.create(\"buf\");\n\n    // Transform the items\n    let mut tfm = Transform::default();\n    let buf = SharedBuf::new(&buf_name, &end_name);\n    tfm.buf = Some(buf.clone());\n    tfm.buf_status = BufStatus::Inside;\n    tfm.rust.mark_pure(&item_name);\n    transform_to_swift(ast, ctx, &mut locals, &mut tfm, &item_name, &inner_ty);\n    let item_code = tfm.swift.find(&item_name, inner_ty, RefInline).code;\n    tfm.swift.line(format!(\"{vec_name}.append({item_code})\"));\n\n    // Rust\n    {\n        let mut rust = String::new();\n        let buf_name = buf.final_buf_name_for_rust();\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(rust, \"\\nfn {rust_name}({vec_name}: Vec<\");\n        append_rust_type(&mut rust, ast, inner_ty);\n        _ = write!(rust, \">, {buf_name}: &mut Vec<u8>) {{\\n\");\n        if !tfm.rust.is_empty() {\n            _ = write!(rust, \"    for {item_name} in {vec_name} {{\\n\");\n            tfm.rust.write_to_rust(ast, &mut rust, \"        \");\n            rust.push_str(\"    }\\n\");\n        }\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n    }\n\n    // Swift\n    {\n        let mut swift = String::new();\n        _ = write!(\n            swift,\n            \"\\nprivate func {swift_name}(_ {len_name}: Int, _ {end_name}: inout UnsafeRawPointer) -> [\"\n        );\n        append_swift_type(&mut swift, ast, inner_ty);\n        swift.push_str(\"] {\\n\");\n        _ = write!(swift, \"    var {vec_name}: [\");\n        append_swift_type(&mut swift, ast, inner_ty);\n        swift.push_str(\"] = []\\n\");\n        _ = write!(swift, \"    {vec_name}.reserveCapacity({len_name})\\n\");\n        _ = write!(swift, \"    while {vec_name}.count < {len_name} {{\\n\");\n        tfm.swift.write_to_swift(ast, &mut swift, \"        \");\n        swift.push_str(\"    }\\n\");\n        _ = write!(swift, \"    return {vec_name}\\n\");\n        swift.push_str(\"}\\n\");\n        ctx.swift_helpers.add(&swift_name, swift).mark_used();\n    }\n\n    (swift_name, rust_name)\n}\n\nfn trait_to_rust_helper(ast: &AST, ctx: &mut SwiftCtx, trait_index: usize) -> String {\n    if let Some(result) = ctx.trait_to_rust_helpers.get(&trait_index) {\n        return result.clone();\n    }\n\n    let t = &ast.traits[trait_index];\n    let rust_name = format!(\"_ffi_rs_{}\", t.name);\n\n    // This must be done first to avoid a stack overflow\n    ctx.trait_to_rust_helpers\n        .insert(trait_index, rust_name.clone());\n\n    // Rust\n    {\n        let mut rust = String::new();\n        allow_non_camel_case_types(&mut rust, &rust_name);\n        _ = write!(rust, \"\\nstruct {rust_name}(*const u8);\\n\");\n        _ = write!(rust, \"\\nimpl Drop for {rust_name} {{\\n\");\n        rust.push_str(\"    fn drop(&mut self) {\\n\");\n        _ = write!(\n            rust,\n            \"        {} \\\"C\\\" {{ fn _ffi_swift_drop(_: *const u8); }}\\n\",\n            ctx.syntax.unsafe_extern()\n        );\n        _ = write!(rust, \"        unsafe {{ _ffi_swift_drop(self.0) }};\\n\");\n        rust.push_str(\"    }\\n\");\n        rust.push_str(\"}\\n\");\n        _ = write!(rust, \"\\nimpl {} for {rust_name} {{\", t.name);\n        for f in &t.fns {\n            generate_rust_to_swift_fn(ast, ctx, t, f, &mut rust);\n        }\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n        ctx.swift_helpers.mark_used(\"_ffi_swift_drop\");\n    }\n\n    rust_name\n}\n\nfn trait_to_swift_helper(\n    ast: &AST,\n    ctx: &mut SwiftCtx,\n    trait_index: usize,\n    kind: RustPtr,\n) -> String {\n    if let Some(result) = ctx.trait_to_swift_helpers.get(&(kind, trait_index)) {\n        return result.clone();\n    }\n\n    let t = &ast.traits[trait_index];\n    let drop_name = format!(\"_ffi_rs_drop_{kind:?}_{}\", t.name);\n    let swift_name = format!(\"_ffi_{kind:?}_{}\", t.name);\n\n    // This must be done first to avoid a stack overflow\n    ctx.trait_to_swift_helpers\n        .insert((kind, trait_index), swift_name.clone());\n\n    // Swift\n    {\n        let mut swift = String::new();\n        _ = write!(swift, \"\\nprivate class {swift_name} : {} {{\\n\", t.name);\n        swift.push_str(\"    private var _ffi: UnsafeRawPointer?\\n\");\n        swift.push_str(\"\\n    init(_ ptr: UnsafeRawPointer?) {\\n\");\n        swift.push_str(\"        _ffi = ptr\\n\");\n        swift.push_str(\"    }\\n\");\n        swift.push_str(\"\\n    deinit {\\n\");\n        _ = write!(swift, \"        {drop_name}(_ffi)\\n\");\n        swift.push_str(\"    }\\n\");\n        for f in &t.fns {\n            let info = Some(TraitInfo { t, kind });\n            generate_swift_to_rust_fn(ast, ctx, f, &mut swift, info);\n        }\n        swift.push_str(\"}\\n\");\n        ctx.swift_helpers.add(&swift_name, swift).mark_used();\n    }\n\n    // Header\n    {\n        let mut header = String::new();\n        let mut header_deps = HashSet::new();\n        header.push('\\n');\n        append_c_signature(\n            &mut header,\n            &mut header_deps,\n            None,\n            &drop_name,\n            None,\n            &[RustArg {\n                name: \"ptr\".to_string(),\n                ty: RustType::ForeignHandle,\n            }],\n        );\n        header.push_str(\";\\n\");\n        ctx.header_helpers\n            .add_group(HeaderGroup::Other, &drop_name, header)\n            .add_deps_group(header_deps)\n            .mark_used();\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        _ = write!(rust, \"\\n{}\\n\", ctx.syntax.unsafe_no_mangle());\n        _ = write!(rust, \"extern \\\"C\\\" fn {drop_name}(ptr: *const u8) {{\\n\");\n        _ = write!(\n            rust,\n            \"    drop(unsafe {{ Box::from_raw(ptr as *mut {}<dyn {}>) }});\\n\",\n            kind.path(),\n            t.name\n        );\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&drop_name, rust).mark_used();\n    }\n\n    swift_name\n}\n\nfn box_to_rust_helper(ast: &AST, ctx: &mut SwiftCtx, inner_ty: &RustType) -> (String, String) {\n    if let Some(result) = ctx.box_to_rust_helpers.get(inner_ty) {\n        return result.clone();\n    }\n\n    let mut base_name = \"_ffi_box_\".to_string();\n    append_type_name_hint(&mut base_name, ast, inner_ty);\n    let swift_name = ctx.helper_names.create(&format!(\"{base_name}_to_rust\"));\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_from_swift\"));\n\n    // This must be done first to avoid a stack overflow\n    ctx.box_to_rust_helpers\n        .insert(inner_ty.clone(), (swift_name.clone(), rust_name.clone()));\n\n    let mut locals = NameSet::default();\n    let val_name = locals.create(\"val\");\n    let end_name = locals.create(\"end\");\n    let buf_name = locals.create(\"buf\");\n\n    // Transform the value\n    let mut tfm = Transform::default();\n    let buf = SharedBuf::new(&buf_name, &end_name);\n    tfm.buf = Some(buf.clone());\n    tfm.buf_status = BufStatus::Inside;\n    tfm.swift.mark_pure(&val_name);\n    transform_to_rust(ast, ctx, &mut locals, &mut tfm, &val_name, &inner_ty);\n    let val_code = tfm.rust.find(&val_name, inner_ty, RefInline).code;\n    tfm.rust.line(format!(\"Box::new({val_code})\"));\n\n    // Swift\n    {\n        let mut swift = String::new();\n        _ = write!(swift, \"\\nprivate func {swift_name}(_ {val_name}: \");\n        append_swift_type(&mut swift, ast, inner_ty);\n        _ = write!(swift, \", _ {buf_name}: inout ContiguousArray<UInt8>) {{\\n\");\n        tfm.swift.write_to_swift(ast, &mut swift, \"    \");\n        swift.push_str(\"}\\n\");\n        ctx.swift_helpers.add(&swift_name, swift).mark_used();\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        let mut item_ty = String::new();\n        let end_name = buf.final_end_name_for_rust();\n        append_rust_type(&mut item_ty, ast, inner_ty);\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(\n            rust,\n            \"\\nfn {rust_name}({end_name}: &mut *const u8) -> Box<{item_ty}> {{\\n\"\n        );\n        tfm.rust.write_to_rust(ast, &mut rust, \"    \");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n    }\n\n    (swift_name, rust_name)\n}\n\nfn box_to_swift_helper(ast: &AST, ctx: &mut SwiftCtx, inner_ty: &RustType) -> (String, String) {\n    if let Some(result) = ctx.box_to_swift_helpers.get(inner_ty) {\n        return result.clone();\n    }\n\n    let mut base_name = \"_ffi_box_\".to_string();\n    append_type_name_hint(&mut base_name, ast, inner_ty);\n    let swift_name = ctx.helper_names.create(&format!(\"{base_name}_from_rust\"));\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_to_swift\"));\n\n    // This must be done first to avoid a stack overflow\n    ctx.box_to_swift_helpers\n        .insert(inner_ty.clone(), (swift_name.clone(), rust_name.clone()));\n\n    let mut locals = NameSet::default();\n    let val_name = locals.create(\"val\");\n    let end_name = locals.create(\"end\");\n    let buf_name = locals.create(\"buf\");\n\n    // Transform the value\n    let mut tfm = Transform::default();\n    let buf = SharedBuf::new(&buf_name, &end_name);\n    tfm.buf = Some(buf.clone());\n    tfm.buf_status = BufStatus::Inside;\n    tfm.rust.mark_pure(&val_name);\n    transform_to_swift(ast, ctx, &mut locals, &mut tfm, &val_name, &inner_ty);\n    let val_code = tfm.swift.find(&val_name, inner_ty, RefInline).code;\n    tfm.swift.line(format!(\"return {val_code}\"));\n\n    // Rust\n    {\n        let mut rust = String::new();\n        let buf_name = buf.final_buf_name_for_rust();\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(rust, \"\\nfn {rust_name}({val_name}: \");\n        append_rust_type(&mut rust, ast, inner_ty);\n        _ = write!(rust, \", {buf_name}: &mut Vec<u8>) {{\\n\");\n        tfm.rust.write_to_rust(ast, &mut rust, \"    \");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n    }\n\n    // Swift\n    {\n        let mut swift = String::new();\n        _ = write!(\n            swift,\n            \"\\nprivate func {swift_name}(_ {end_name}: inout UnsafeRawPointer) -> \"\n        );\n        append_swift_type(&mut swift, ast, inner_ty);\n        swift.push_str(\" {\\n\");\n        tfm.swift.write_to_swift(ast, &mut swift, \"    \");\n        swift.push_str(\"}\\n\");\n        ctx.swift_helpers.add(&swift_name, swift).mark_used();\n    }\n\n    (swift_name, rust_name)\n}\n\nfn enum_to_rust_helper(ast: &AST, ctx: &mut SwiftCtx, enum_index: usize) -> (String, String) {\n    if let Some(result) = ctx.enum_to_rust_helpers.get(&enum_index) {\n        return result.clone();\n    }\n\n    let e = &ast.enums[enum_index];\n    let base_name = format!(\"_ffi_enum_{}\", e.name);\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_from_swift\"));\n    let swift_name = ctx.helper_names.create(&format!(\"{base_name}_to_rust\"));\n\n    // This must be done first to avoid a stack overflow\n    ctx.enum_to_rust_helpers\n        .insert(enum_index, (swift_name.clone(), rust_name.clone()));\n\n    let mut locals = NameSet::default();\n    let val_name = locals.create(\"val\");\n    let buf_name = locals.create(\"buf\");\n    let end_name = locals.create(\"end\");\n    let mut branches = Vec::new();\n\n    // Enums without fields are just integers\n    if !e.has_fields() {\n        let mut rust = String::new();\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(rust, \"\\nfn {rust_name}({val_name}: i32) -> {} {{\\n\", e.name);\n        _ = write!(rust, \"    match {val_name} {{\\n\");\n        for v in &e.variants {\n            _ = write!(\n                rust,\n                \"        {} => {}::{},\\n\",\n                v.discriminant, e.name, v.name\n            );\n        }\n        rust.push_str(\"        _ => panic!(),\\n\");\n        rust.push_str(\"    }\\n\");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n        return (swift_name, rust_name);\n    }\n\n    struct Branch {\n        tfm: Transform,\n        fields: Vec<String>,\n    }\n\n    // Transform all fields for each variant in a separate branch\n    for v in &e.variants {\n        let mut branch_locals = locals.clone();\n        let mut fields = Vec::new();\n        let mut tfm = Transform::default();\n        let buf = SharedBuf::new(&buf_name, &end_name);\n        tfm.buf = Some(buf.clone());\n        tfm.buf_status = BufStatus::Inside;\n        for f in &v.fields {\n            let field_name = branch_locals.create(&name_for_match(&f.name, v.fields.len()));\n            tfm.swift.mark_pure(&field_name);\n            transform_to_rust(ast, ctx, &mut branch_locals, &mut tfm, &field_name, &f.ty);\n            fields.push(field_name);\n        }\n        rust_decl_ctor(\n            &mut tfm.rust,\n            &val_name,\n            &format!(\"{}::{}\", e.name, v.name),\n            &v.fields,\n            fields.iter().map(|x| Cow::Borrowed(x.as_str())).collect(),\n        );\n        branches.push(Branch { tfm, fields });\n    }\n\n    // Swift\n    {\n        let mut swift = String::new();\n        _ = write!(\n            swift,\n            \"\\nprivate func {swift_name}(_ {val_name}: {}, _ {buf_name}: inout ContiguousArray<UInt8>) {{\\n\",\n            e.name\n        );\n        _ = write!(swift, \"    switch {val_name} {{\\n\");\n        for (v, branch) in e.variants.iter().zip(&mut branches) {\n            if branch.fields.is_empty() {\n                _ = write!(swift, \"    case .{}:\\n\", v.name);\n            } else {\n                _ = write!(swift, \"    case let .{}(\", v.name);\n                for (i, f) in branch.fields.iter().enumerate() {\n                    if i > 0 {\n                        swift.push_str(\", \");\n                    }\n                    swift.push_str(&f);\n                }\n                swift.push_str(\"):\\n\");\n            }\n            _ = write!(\n                swift,\n                \"        _ffi_write({} as Int32, &{buf_name})\\n\",\n                v.discriminant\n            );\n            branch.tfm.swift.write_to_swift(ast, &mut swift, \"        \");\n        }\n        swift.push_str(\"    }\\n\");\n        swift.push_str(\"}\\n\");\n        ctx.swift_helpers.add(&swift_name, swift).mark_used();\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(\n            rust,\n            \"\\nfn {rust_name}({end_name}: &mut *const u8) -> {} {{\\n\",\n            e.name\n        );\n        _ = write!(rust, \"    match _ffi_read::<i32>({end_name}) {{\\n\");\n        for (v, branch) in e.variants.iter().zip(&mut branches) {\n            let val_code = branch\n                .tfm\n                .rust\n                .find(&val_name, &RustType::Enum(enum_index), RefInline)\n                .code;\n            if branch.tfm.rust.is_empty() {\n                let val_code = format!(\"{} => {val_code},\", v.discriminant);\n                branch.tfm.rust.line(val_code);\n                branch.tfm.rust.write_to_rust(ast, &mut rust, \"        \");\n            } else {\n                _ = write!(rust, \"        {} => {{\", v.discriminant);\n                branch.tfm.rust.line(val_code);\n                branch\n                    .tfm\n                    .rust\n                    .write_to_rust(ast, &mut rust, \"            \");\n                rust.push_str(\"        }\\n\");\n            }\n        }\n        rust.push_str(\"        _ => panic!(),\\n\");\n        rust.push_str(\"    }\\n\");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers\n            .add(&rust_name, rust)\n            .add_dep(\"_ffi_read\")\n            .mark_used();\n    }\n\n    (swift_name, rust_name)\n}\n\nfn enum_to_swift_helper(ast: &AST, ctx: &mut SwiftCtx, enum_index: usize) -> (String, String) {\n    if let Some(result) = ctx.enum_to_swift_helpers.get(&enum_index) {\n        return result.clone();\n    }\n\n    let e = &ast.enums[enum_index];\n    let base_name = format!(\"_ffi_enum_{}\", e.name);\n    let swift_name = ctx.helper_names.create(&format!(\"{base_name}_from_rust\"));\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_to_swift\"));\n\n    // This must be done first to avoid a stack overflow\n    ctx.enum_to_swift_helpers\n        .insert(enum_index, (swift_name.clone(), rust_name.clone()));\n\n    struct Branch {\n        tfm: Transform,\n        fields: Vec<String>,\n    }\n\n    let mut locals = NameSet::default();\n    let val_name = locals.create(\"val\");\n    let buf_name = locals.create(\"buf\");\n    let end_name = locals.create(\"end\");\n    let mut branches = Vec::new();\n\n    // Transform all fields for each variant in a separate branch\n    for v in &e.variants {\n        let mut branch_locals = locals.clone();\n        let mut fields = Vec::new();\n        let mut tfm = Transform::default();\n        let buf = SharedBuf::new(&buf_name, &end_name);\n        tfm.buf = Some(buf.clone());\n        tfm.buf_status = BufStatus::Inside;\n        for f in &v.fields {\n            let field_name = branch_locals.create(&name_for_match(&f.name, v.fields.len()));\n            tfm.rust.mark_pure(&field_name);\n            transform_to_swift(ast, ctx, &mut branch_locals, &mut tfm, &field_name, &f.ty);\n            fields.push(field_name);\n        }\n        let val_code = tfm.swift.find_fields(\n            &v.fields\n                .iter()\n                .map(|f| RustField {\n                    name: match starts_with_digit(&f.name) {\n                        false => f.name.clone(),\n                        true => \"\".to_string(),\n                    },\n                    ty: f.ty.clone(),\n                })\n                .collect(),\n            fields.iter().map(|x| Cow::Borrowed(x.as_str())).collect(),\n            RefInline,\n            \"(\",\n            \")\",\n        );\n        tfm.swift.decl(\n            &val_name,\n            match v.fields.len() {\n                0 => format!(\".{}\", v.name),\n                _ => format!(\".{}{}\", v.name, val_code),\n            },\n        );\n        branches.push(Branch { tfm, fields });\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(\n            rust,\n            \"\\nfn {rust_name}({val_name}: {}, {buf_name}: &mut Vec<u8>) {{\\n\",\n            e.name\n        );\n        _ = write!(rust, \"    match {val_name} {{\\n\");\n        for (v, branch) in e.variants.iter().zip(&mut branches) {\n            _ = write!(rust, \"        {}::{}\", e.name, v.name);\n            if v.fields.iter().any(|f| starts_with_digit(&f.name)) {\n                rust.push_str(\"(\");\n                for (i, name) in branch.fields.iter().enumerate() {\n                    rust.push_str(if i > 0 { \", \" } else { \"\" });\n                    rust.push_str(name);\n                }\n                rust.push_str(\")\");\n            } else if !v.fields.is_empty() {\n                rust.push_str(\" {\");\n                for (i, (f, name)) in v.fields.iter().zip(&branch.fields).enumerate() {\n                    rust.push_str(if i > 0 { \", \" } else { \" \" });\n                    if f.name != *name {\n                        _ = write!(rust, \"{}: \", f.name);\n                    }\n                    rust.push_str(name);\n                }\n                rust.push_str(\" }\");\n            }\n            if branch.tfm.rust.is_empty() {\n                _ = write!(\n                    rust,\n                    \" => _ffi_write({} as i32, {buf_name}),\\n\",\n                    v.discriminant\n                );\n            } else {\n                rust.push_str(\" => {\\n\");\n                _ = write!(\n                    rust,\n                    \"            _ffi_write({} as i32, {buf_name});\\n\",\n                    v.discriminant\n                );\n                branch\n                    .tfm\n                    .rust\n                    .write_to_rust(ast, &mut rust, \"            \");\n                rust.push_str(\"        }\\n\");\n            }\n        }\n        rust.push_str(\"    }\\n\");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers\n            .add(&rust_name, rust)\n            .add_dep(\"_ffi_write\")\n            .mark_used();\n    }\n\n    // Swift\n    {\n        let mut swift = String::new();\n        _ = write!(\n            swift,\n            \"\\nprivate func {swift_name}(_ {end_name}: inout UnsafeRawPointer) -> {} {{\\n\",\n            e.name\n        );\n        _ = write!(swift, \"    switch _ffi_read(&{end_name}) as Int32 {{\\n\",);\n        for (v, branch) in e.variants.iter().zip(&mut branches) {\n            let val_code = branch\n                .tfm\n                .swift\n                .find(&val_name, &RustType::Enum(enum_index), RefInline)\n                .code;\n            if branch.tfm.swift.is_empty() {\n                let val_code = format!(\"case {}: return {val_code}\", v.discriminant);\n                branch.tfm.swift.line(val_code);\n                branch.tfm.swift.write_to_swift(ast, &mut swift, \"        \");\n            } else {\n                _ = write!(swift, \"        case {}:\\n\", v.discriminant);\n                branch.tfm.swift.line(format!(\"return {val_code}\"));\n                branch\n                    .tfm\n                    .swift\n                    .write_to_swift(ast, &mut swift, \"            \");\n            }\n        }\n        swift.push_str(\"        default: fatalError()\\n\");\n        swift.push_str(\"    }\\n\");\n        swift.push_str(\"}\\n\");\n        ctx.swift_helpers\n            .add(&swift_name, swift)\n            .add_dep(\"_ffi_read\")\n            .mark_used();\n    }\n\n    (swift_name, rust_name)\n}\n\nfn multi_ret_helper(ast: &AST, ctx: &mut SwiftCtx, args: &[RustArg]) -> String {\n    let types: Vec<_> = args.iter().map(|arg| arg.ty.clone()).collect();\n    if let Some(result) = ctx.multi_ret_helpers.get(&types) {\n        return result.clone();\n    }\n\n    // Construct the name for the new type\n    let mut ty_name = \"_ffi_ret_\".to_string();\n    append_type_name_hints(&mut ty_name, ast, &types);\n    let ty_name = ctx.helper_names.create(&ty_name);\n\n    // Header\n    {\n        let mut header = String::new();\n        let mut header_deps = HashSet::new();\n        header.push_str(\"\\ntypedef struct {\\n\");\n        for (i, ty) in types.iter().enumerate() {\n            header.push_str(\"    \");\n            append_c_type(&mut header, &mut header_deps, ty);\n            _ = write!(header, \" _{i};\\n\");\n        }\n        _ = write!(header, \"}} {ty_name};\\n\");\n        ctx.header_helpers\n            .add_group(HeaderGroup::Other, &ty_name, header)\n            .add_deps_group(header_deps)\n            .mark_used();\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        _ = write!(rust, \"\\n#[repr(C)]\\nstruct {ty_name}(\");\n        for (i, ty) in types.iter().enumerate() {\n            if i > 0 {\n                rust.push_str(\", \");\n            }\n            append_rust_type(&mut rust, ast, ty);\n        }\n        rust.push_str(\");\\n\");\n        ctx.rust_helpers.add(&ty_name, rust).mark_used();\n    }\n\n    ctx.multi_ret_helpers.insert(types, ty_name.clone());\n    ty_name\n}\n\nfn append_swift_type(swift: &mut String, ast: &AST, ty: &RustType) {\n    use RustType::*;\n    match ty {\n        Pair { other, .. } => append_swift_type(swift, ast, other),\n        Verbatim(text) => swift.push_str(text),\n        Bool => swift.push_str(\"Bool\"),\n\n        U8 => swift.push_str(\"UInt8\"),\n        U16 => swift.push_str(\"UInt16\"),\n        U32 => swift.push_str(\"UInt32\"),\n        Usize => swift.push_str(\"UInt\"),\n        U64 => swift.push_str(\"UInt64\"),\n\n        I8 => swift.push_str(\"Int8\"),\n        I16 => swift.push_str(\"Int16\"),\n        I32 => swift.push_str(\"Int32\"),\n        Isize => swift.push_str(\"Int\"),\n        I64 => swift.push_str(\"Int64\"),\n\n        F32 => swift.push_str(\"Float32\"),\n        F64 => swift.push_str(\"Float64\"),\n        RefStr | OwnStr => swift.push_str(\"String\"),\n\n        Struct(index) => swift.push_str(&ast.structs[*index].name),\n        Enum(index) => swift.push_str(&ast.enums[*index].name),\n        DynTrait(index) => swift.push_str(&ast.traits[*index].name),\n        Ptr(_, inner) => append_swift_type(swift, ast, inner),\n\n        Tuple(types) if types.len() == 1 => append_swift_type(swift, ast, &types[0]),\n        Tuple(types) => {\n            swift.push('(');\n            for (i, ty) in types.iter().enumerate() {\n                if i > 0 {\n                    swift.push_str(\", \");\n                }\n                append_swift_type(swift, ast, ty);\n            }\n            swift.push(')');\n        }\n\n        Vector(inner) => {\n            swift.push('[');\n            append_swift_type(swift, ast, inner);\n            swift.push(']');\n        }\n\n        ForeignHandle => swift.push_str(\"UnsafeRawPointer?\"),\n\n        Optional(inner_ty) => {\n            append_swift_type(swift, ast, &inner_ty);\n            swift.push('?');\n        }\n    }\n}\n\nfn append_swift_val(swift: &mut String, val: &RustVal) {\n    use RustVal::*;\n    match val {\n        Bool(x) => _ = write!(swift, \"{x}\"),\n\n        U8(x) => _ = write!(swift, \"{x}\"),\n        U16(x) => _ = write!(swift, \"{x}\"),\n        U32(x) => _ = write!(swift, \"{x}\"),\n        U64(x) => _ = write!(swift, \"{x}\"),\n\n        I8(x) => _ = write!(swift, \"{x}\"),\n        I16(x) => _ = write!(swift, \"{x}\"),\n        I32(x) => _ = write!(swift, \"{x}\"),\n        I64(x) => _ = write!(swift, \"{x}\"),\n\n        F32(x) => _ = write!(swift, \"{x:?}\"),\n        F64(x) => _ = write!(swift, \"{x:?}\"),\n\n        Str(x) => append_swift_quoted(swift, x),\n    }\n}\n\nfn append_swift_quoted(swift: &mut String, text: &str) {\n    swift.push('\"');\n    for c in text.chars() {\n        match c {\n            '\\t' => swift.push_str(\"\\\\t\"),\n            '\\n' => swift.push_str(\"\\\\n\"),\n            '\\r' => swift.push_str(\"\\\\r\"),\n            '\\\\' => swift.push_str(\"\\\\\\\\\"),\n            '\\\"' => swift.push_str(\"\\\\\\\"\"),\n            c if (c as u32) < 0x20 => _ = write!(swift, \"\\\\u{{{:x}}}\", c as u32),\n            _ => swift.push(c),\n        }\n    }\n    swift.push('\"');\n}\n\nfn append_c_signature(\n    c: &mut String,\n    deps: &mut HashSet<(HeaderGroup, String)>,\n    returns: Option<&RustType>,\n    name: &str,\n    receiver: Option<&RustType>,\n    args: &[RustArg],\n) {\n    // Emit the return type\n    if let Some(returns) = returns {\n        append_c_type(c, deps, returns);\n        c.push(' ');\n    } else {\n        c.push_str(\"void \");\n    }\n\n    // The function name goes in the middle in C\n    c.push_str(name);\n\n    // Emit the arguments\n    c.push('(');\n    if let Some(receiver) = receiver {\n        append_c_type(c, deps, receiver);\n    }\n    for (i, arg) in args.iter().enumerate() {\n        if receiver.is_some() || i > 0 {\n            c.push_str(\", \");\n        }\n        append_c_type(c, deps, &arg.ty);\n        c.push(' ');\n        c.push_str(&arg.name);\n    }\n    c.push(')');\n}\n\nfn append_c_type(c: &mut String, deps: &mut HashSet<(HeaderGroup, String)>, ty: &RustType) {\n    use RustType::*;\n    let text = match ty {\n        Pair { other, .. } => return append_c_type(c, deps, &other),\n        Verbatim(text) => text,\n        Bool => \"_Bool\",\n\n        U8 => \"uint8_t\",\n        U16 => \"uint16_t\",\n        U32 => \"uint32_t\",\n        Usize => \"uintptr_t\",\n        U64 => \"uint64_t\",\n\n        I8 => \"int8_t\",\n        I16 => \"int16_t\",\n        I32 => \"int32_t\",\n        Isize => \"intptr_t\",\n        I64 => \"int64_t\",\n\n        F32 => \"float\",\n        F64 => \"double\",\n        ForeignHandle => \"const void*\",\n        _ => unreachable!(),\n    };\n    if text.ends_with(\"_t\") {\n        deps.insert((HeaderGroup::Include, \"<stdint.h>\".into()));\n    }\n    c.push_str(text);\n}\n\n// We represent \"Box<T>\" as \"T\" in Swift, so a recursive struct that uses Box\n// to refer to itself in Rust will need to be a class in Swift to avoid having\n// infinite size.\nfn swift_type_is_infinite_size(ast: &AST, ty: &RustType) -> bool {\n    fn visit(ast: &AST, ty: &RustType, visited: &mut HashSet<RustType>) -> bool {\n        use RustType::*;\n        match ty {\n            Ptr(kind, inner_ty) if *kind == RustPtr::Box => visit(ast, &inner_ty, visited),\n            Struct(struct_index) => {\n                if visited.contains(ty) {\n                    return true;\n                }\n                visited.insert(ty.clone());\n                ast.structs[*struct_index]\n                    .fields\n                    .iter()\n                    .any(|f| visit(ast, &f.ty, visited))\n            }\n            Tuple(types) => types.iter().any(|ty| visit(ast, ty, visited)),\n            Optional(inner) => visit(ast, inner, visited),\n            _ => false,\n        }\n    }\n    visit(ast, ty, &mut HashSet::new())\n}\n\n// We represent \"Box<T>\" as \"T\" in Swift, so a recursive enum that uses Box to\n// refer to itself in Rust will need to use an \"indirect case\" in Swift to\n// avoid having infinite size.\nfn swift_variant_needs_indirect(ast: &AST, query_index: usize, v: &RustVariant) -> bool {\n    use RustType::*;\n    fn visit(\n        ast: &AST,\n        ty: &RustType,\n        query_index: usize,\n        visited: &mut HashSet<RustType>,\n    ) -> bool {\n        match ty {\n            Enum(enum_index) if *enum_index == query_index => true,\n            Enum(enum_index) => {\n                if visited.contains(ty) {\n                    return true;\n                }\n                visited.insert(ty.clone());\n                ast.enums[*enum_index].variants.iter().any(|v| {\n                    v.fields\n                        .iter()\n                        .any(|f| visit(ast, &f.ty, query_index, visited))\n                })\n            }\n            Ptr(kind, inner_ty) if *kind == RustPtr::Box => {\n                visit(ast, inner_ty, query_index, visited)\n            }\n            Struct(struct_index) => {\n                if visited.contains(ty) {\n                    return true;\n                }\n                visited.insert(ty.clone());\n                ast.structs[*struct_index]\n                    .fields\n                    .iter()\n                    .any(|f| visit(ast, &f.ty, query_index, visited))\n            }\n            Tuple(types) => types.iter().any(|ty| visit(ast, ty, query_index, visited)),\n            Optional(inner) => visit(ast, inner, query_index, visited),\n            _ => false,\n        }\n    }\n    let mut visited = HashSet::new();\n    v.fields\n        .iter()\n        .any(|f| visit(ast, &f.ty, query_index, &mut visited))\n}\n\nimpl FnBuilder {\n    fn write_to_swift(&mut self, ast: &AST, out: &mut String, base_indent: &str) {\n        let mut indent = 0;\n        let mut callback = |line: &str| {\n            if line.starts_with(&['}', ']', ')']) {\n                indent -= 1;\n            }\n            _ = write!(out, \"{base_indent}{}{line}\\n\", \"    \".repeat(indent));\n            if line.ends_with(&['{', '[', '(']) {\n                indent += 1;\n            }\n        };\n        for line in self.take_lines() {\n            match line {\n                Line::Plain(text) => {\n                    text.split('\\n').for_each(&mut callback);\n                }\n                Line::PlainAlt(when_false, when_true, flag) => match flag.get() {\n                    false if when_false.is_empty() => continue,\n                    false => when_false.split('\\n').for_each(&mut callback),\n                    true => when_true.split('\\n').for_each(&mut callback),\n                },\n                Line::Decl(name, ty, text) => {\n                    let mut decl_ty = String::new();\n                    if let Some(ty) = ty {\n                        decl_ty.push_str(\": \");\n                        append_swift_type(&mut decl_ty, ast, &ty);\n                    }\n                    let text = format!(\"let {name}{decl_ty} = {text}\");\n                    text.split('\\n').for_each(&mut callback);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/tests/cases/demo_app.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        use std::rc::Rc;\n\n        pub trait Platform {\n            fn create_window(&self) -> Rc<dyn Window>;\n        }\n\n        pub trait Window {\n            fn get_title(&self) -> String;\n            fn set_title(&self, title: &str);\n\n            fn get_size(&self) -> (i32, i32);\n            fn set_size(&self, width: i32, height: i32);\n\n            fn set_handler(&self, handler: Box<dyn Handler>);\n            fn child_window(&self) -> Rc<dyn Window>;\n        }\n\n        pub trait Handler {\n            fn on_draw(&self, canvas: Box<dyn Canvas>);\n        }\n\n        pub trait Canvas {\n            fn draw_text_runs(&self, runs: Vec<TextRun>);\n        }\n\n        pub struct TextRun {\n            pub text: String,\n            pub rect: TextRect,\n        }\n\n        pub struct TextRect {\n            pub x: i32,\n            pub y: i32,\n            pub w: i32,\n            pub h: i32,\n        }\n\n        pub fn create_app(platform: Box<dyn Platform>) {\n            let window = platform.create_window();\n\n            assert_eq!(window.get_title(), \"\");\n            assert_eq!(window.get_size(), (0, 0));\n\n            window.set_title(\"Untitled\");\n            window.set_size(800, 600);\n\n            assert_eq!(window.get_title(), \"Untitled\");\n            assert_eq!(window.get_size(), (800, 600));\n\n            let app = App {\n                window: Rc::clone(&window),\n            };\n            window.set_handler(Box::new(app));\n        }\n\n        struct App {\n            window: Rc<dyn Window>,\n        }\n\n        impl Handler for App {\n            fn on_draw(&self, canvas: Box<dyn Canvas>) {\n                let (w, _) = self.window.get_size();\n                canvas.draw_text_runs(vec![\n                    TextRun {\n                        text: \"ABC\".into(),\n                        rect: TextRect { x: 10, y: 10, w: w - 20, h: 20 },\n                    },\n                    TextRun {\n                        text: \"xyz\".into(),\n                        rect: TextRect { x: 10, y: 30, w: w - 20, h: 20 },\n                    },\n                ]);\n            }\n        }\n    \"#;\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/demo_const.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        pub const CONST_FALSE: bool = false;\n        pub const CONST_TRUE: bool = true;\n\n        pub const CONST_U8_MIN: u8 = 0;\n        pub const CONST_U8_MAX: u8 = 0xff;\n        pub const CONST_U16_MIN: u16 = 0;\n        pub const CONST_U16_MAX: u16 = 0xffff;\n        pub const CONST_U32_MIN: u32 = 0;\n        pub const CONST_U32_MAX: u32 = 0xffff_ffff;\n        pub const CONST_U64_MIN: u64 = 0;\n        pub const CONST_U64_MAX: u64 = 0xffff_ffff_ffff_ffff;\n\n        pub const CONST_I8_MIN: i8 = -0x80;\n        pub const CONST_I8_MAX: i8 = 0x7f;\n        pub const CONST_I16_MIN: i16 = -0x8000;\n        pub const CONST_I16_MAX: i16 = 0x7fff;\n        pub const CONST_I32_MIN: i32 = -0x8000_0000;\n        pub const CONST_I32_MAX: i32 = 0x7fff_ffff;\n        pub const CONST_I64_MIN: i64 = -0x8000_0000_0000_0000;\n        pub const CONST_I64_MAX: i64 = 0x7fff_ffff_ffff_ffff;\n\n        pub const CONST_F32_NEG_0: f32 = -0.0;\n        pub const CONST_F64_NEG_0: f64 = -0.0;\n        pub const CONST_F32_PI: f32 = 3.141592653589793;\n        pub const CONST_F64_PI: f64 = -3.141592653589793;\n\n        pub const CONST_STRING: &str = \"\\0\\r\\n\\u{1f980}\";\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(Export(\"CONST_FALSE\").into(), Bool(false).into()),\n        AssertEqual(Export(\"CONST_TRUE\").into(), Bool(true).into()),\n        AssertEqual(Export(\"CONST_U8_MIN\").into(), U8(0).into()),\n        AssertEqual(Export(\"CONST_U8_MAX\").into(), U8(0xff).into()),\n        AssertEqual(Export(\"CONST_U16_MIN\").into(), U16(0).into()),\n        AssertEqual(Export(\"CONST_U16_MAX\").into(), U16(0xffff).into()),\n        AssertEqual(Export(\"CONST_U32_MIN\").into(), U32(0).into()),\n        AssertEqual(Export(\"CONST_U32_MAX\").into(), U32(0xffff_ffff).into()),\n        AssertEqual(Export(\"CONST_U64_MIN\").into(), U64(0).into()),\n        AssertEqual(\n            Export(\"CONST_U64_MAX\").into(),\n            U64(0xffff_ffff_ffff_ffff).into(),\n        ),\n        AssertEqual(Export(\"CONST_I8_MIN\").into(), I8(-0x80).into()),\n        AssertEqual(Export(\"CONST_I8_MAX\").into(), I8(0x7f).into()),\n        AssertEqual(Export(\"CONST_I16_MIN\").into(), I16(-0x8000).into()),\n        AssertEqual(Export(\"CONST_I16_MAX\").into(), I16(0x7fff).into()),\n        AssertEqual(Export(\"CONST_I32_MIN\").into(), I32(-0x8000_0000).into()),\n        AssertEqual(Export(\"CONST_I32_MAX\").into(), I32(0x7fff_ffff).into()),\n        AssertEqual(\n            Export(\"CONST_I64_MIN\").into(),\n            I64(-0x8000_0000_0000_0000).into(),\n        ),\n        AssertEqual(\n            Export(\"CONST_I64_MAX\").into(),\n            I64(0x7fff_ffff_ffff_ffff).into(),\n        ),\n        AssertEqual(Export(\"CONST_F32_NEG_0\").into(), F32(-0.0).into()),\n        AssertEqual(Export(\"CONST_F64_NEG_0\").into(), F64(-0.0).into()),\n        AssertEqual(\n            Export(\"CONST_F32_PI\").into(),\n            F32(std::f32::consts::PI).into(),\n        ),\n        AssertEqual(\n            Export(\"CONST_F64_PI\").into(),\n            F64(-std::f64::consts::PI).into(),\n        ),\n        AssertEqual(Export(\"CONST_STRING\").into(), Str(\"\\0\\r\\n\\u{1f980}\").into()),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/demo_derive_eq.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        #[derive(Eq, PartialEq)] pub struct EmptyStruct;\n        pub fn empty_tuple(x: ()) -> () { x }\n        pub fn empty_struct(x: EmptyStruct) -> EmptyStruct { x }\n\n        ////////////////////////////////////////\n        // Swift has trouble with tuple equality\n\n        #[derive(Eq, PartialEq)] pub struct BoxTup0(Box<()>);\n        #[derive(Eq, PartialEq)] pub struct BoxTup1(Box<(i32,)>);\n        #[derive(Eq, PartialEq)] pub struct BoxTup2(Box<(i32, i32)>);\n\n        pub fn box_tup_0(x: BoxTup0) -> BoxTup0 { x }\n        pub fn box_tup_1(x: BoxTup1) -> BoxTup1 { x }\n        pub fn box_tup_2(x: BoxTup2) -> BoxTup2 { x }\n\n        #[derive(Eq, PartialEq)] pub struct VecTup0(Vec<()>);\n        #[derive(Eq, PartialEq)] pub struct VecTup1(Vec<(i32,)>);\n        #[derive(Eq, PartialEq)] pub struct VecTup2(Vec<(i32, i32)>);\n\n        pub fn vec_tup_0(x: VecTup0) -> VecTup0 { x }\n        pub fn vec_tup_1(x: VecTup1) -> VecTup1 { x }\n        pub fn vec_tup_2(x: VecTup2) -> VecTup2 { x }\n\n        #[derive(Eq, PartialEq)] pub struct OptTup0(Option<()>);\n        #[derive(Eq, PartialEq)] pub struct OptTup1(Option<(i32,)>);\n        #[derive(Eq, PartialEq)] pub struct OptTup2(Option<(i32, i32)>);\n\n        pub fn opt_tup_0(x: OptTup0) -> OptTup0 { x }\n        pub fn opt_tup_1(x: OptTup1) -> OptTup1 { x }\n        pub fn opt_tup_2(x: OptTup2) -> OptTup2 { x }\n\n        #[derive(Eq, PartialEq)] pub enum EnumBoxTup { Foo(Box<(i32, i32)>), Bar, Baz { x: i32, y: i32 } }\n        #[derive(Eq, PartialEq)] pub enum EnumVecTup { Foo(Vec<(i32, i32)>), Bar, Baz { x: i32, y: i32 } }\n        #[derive(Eq, PartialEq)] pub enum EnumOptTup { Foo(Option<(i32, i32)>), Bar, Baz { x: i32, y: i32 } }\n\n        pub fn enum_box_tup(x: EnumBoxTup) -> EnumBoxTup { x }\n        pub fn enum_vec_tup(x: EnumVecTup) -> EnumVecTup { x }\n        pub fn enum_opt_tup(x: EnumOptTup) -> EnumOptTup { x }\n\n        ////////////////////////////////////////\n        // C++ has trouble with box equality\n\n        #[derive(Eq, PartialEq)] pub struct TupBox((Box<i32>, Box<bool>));\n\n        #[derive(Eq, PartialEq)] pub struct VecBox(Vec<Box<i32>>);\n        #[derive(Eq, PartialEq)] pub struct BoxVec(Box<Vec<i32>>);\n        #[derive(Eq, PartialEq)] pub struct OptBox(Option<Box<i32>>);\n        #[derive(Eq, PartialEq)] pub struct BoxOpt(Box<Option<i32>>);\n\n        #[derive(Eq, PartialEq)] pub struct VecBoxVec(Vec<Box<Vec<i32>>>);\n        #[derive(Eq, PartialEq)] pub struct BoxVecBox(Box<Vec<Box<i32>>>);\n        #[derive(Eq, PartialEq)] pub struct OptBoxOpt(Option<Box<Option<i32>>>);\n        #[derive(Eq, PartialEq)] pub struct BoxOptBox(Box<Option<Box<i32>>>);\n\n        pub fn tup_box(x: TupBox) -> TupBox { x }\n\n        pub fn vec_box(x: VecBox) -> VecBox { x }\n        pub fn box_vec(x: BoxVec) -> BoxVec { x }\n        pub fn opt_box(x: OptBox) -> OptBox { x }\n        pub fn box_opt(x: BoxOpt) -> BoxOpt { x }\n\n        pub fn vec_box_vec(x: VecBoxVec) -> VecBoxVec { x }\n        pub fn box_vec_box(x: BoxVecBox) -> BoxVecBox { x }\n        pub fn opt_box_opt(x: OptBoxOpt) -> OptBoxOpt { x }\n        pub fn box_opt_box(x: BoxOptBox) -> BoxOptBox { x }\n    \"#;\n\n    // Empty tuple, EmptyStruct\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"empty_tuple\").into(),\n                [Tuple([].into()).into()].into(),\n            )\n            .into(),\n            Tuple([].into()).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"empty_struct\").into(),\n                [Struct(\"EmptyStruct\", [].into()).into()].into(),\n            )\n            .into(),\n            Struct(\"EmptyStruct\", [].into()).into(),\n        ),\n    ]);\n\n    // BoxTup0\n    case.checks.extend_from_slice(&[AssertEqual(\n        Call(\n            Export(\"box_tup_0\").into(),\n            [Struct(\n                \"BoxTup0\",\n                [(\"0\", Boxed(TyTuple([].into()), Tuple([].into()).into()))].into(),\n            )]\n            .into(),\n        )\n        .into(),\n        Struct(\n            \"BoxTup0\",\n            [(\"0\", Boxed(TyTuple([].into()), Tuple([].into()).into()))].into(),\n        )\n        .into(),\n    )]);\n\n    // BoxTup1\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"box_tup_1\").into(),\n                [Struct(\n                    \"BoxTup1\",\n                    [(\n                        \"0\",\n                        Boxed(TyTuple([TyI32].into()), Tuple([I32(10)].into()).into()),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"BoxTup1\",\n                [(\n                    \"0\",\n                    Boxed(TyTuple([TyI32].into()), Tuple([I32(10)].into()).into()),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"box_tup_1\").into(),\n                [Struct(\n                    \"BoxTup1\",\n                    [(\n                        \"0\",\n                        Boxed(TyTuple([TyI32].into()), Tuple([I32(10)].into()).into()),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"BoxTup1\",\n                [(\n                    \"0\",\n                    Boxed(TyTuple([TyI32].into()), Tuple([I32(20)].into()).into()),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n    ]);\n\n    // BoxTup2\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"box_tup_2\").into(),\n                [Struct(\n                    \"BoxTup2\",\n                    [(\n                        \"0\",\n                        Boxed(\n                            TyTuple([TyI32, TyI32].into()),\n                            Tuple([I32(20), I32(30)].into()).into(),\n                        ),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"BoxTup2\",\n                [(\n                    \"0\",\n                    Boxed(\n                        TyTuple([TyI32, TyI32].into()),\n                        Tuple([I32(20), I32(30)].into()).into(),\n                    ),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"box_tup_2\").into(),\n                [Struct(\n                    \"BoxTup2\",\n                    [(\n                        \"0\",\n                        Boxed(\n                            TyTuple([TyI32, TyI32].into()),\n                            Tuple([I32(20), I32(30)].into()).into(),\n                        ),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"BoxTup2\",\n                [(\n                    \"0\",\n                    Boxed(\n                        TyTuple([TyI32, TyI32].into()),\n                        Tuple([I32(30), I32(20)].into()).into(),\n                    ),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n    ]);\n\n    // VecTup0\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"vec_tup_0\").into(),\n                [Struct(\n                    \"VecTup0\",\n                    [(\"0\", EmptyVector(TyTuple([].into())))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\"VecTup0\", [(\"0\", EmptyVector(TyTuple([].into())))].into()).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"vec_tup_0\").into(),\n                [Struct(\n                    \"VecTup0\",\n                    [(\"0\", Vector([Tuple([].into()), Tuple([].into())].into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"VecTup0\",\n                [(\"0\", Vector([Tuple([].into()), Tuple([].into())].into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"vec_tup_0\").into(),\n                [Struct(\n                    \"VecTup0\",\n                    [(\"0\", Vector([Tuple([].into()), Tuple([].into())].into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\"VecTup0\", [(\"0\", Vector([Tuple([].into())].into()))].into()).into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"vec_tup_0\").into(),\n                [Struct(\n                    \"VecTup0\",\n                    [(\"0\", Vector([Tuple([].into())].into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"VecTup0\",\n                [(\"0\", Vector([Tuple([].into()), Tuple([].into())].into()))].into(),\n            )\n            .into(),\n        ),\n    ]);\n\n    // VecTup1\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"vec_tup_1\").into(),\n                [Struct(\n                    \"VecTup1\",\n                    [(\"0\", EmptyVector(TyTuple([TyI32].into())))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"VecTup1\",\n                [(\"0\", EmptyVector(TyTuple([TyI32].into())))].into(),\n            )\n            .into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"vec_tup_1\").into(),\n                [Struct(\n                    \"VecTup1\",\n                    [(\n                        \"0\",\n                        Vector([Tuple([I32(10)].into()), Tuple([I32(20)].into())].into()),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"VecTup1\",\n                [(\n                    \"0\",\n                    Vector([Tuple([I32(10)].into()), Tuple([I32(20)].into())].into()),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"vec_tup_1\").into(),\n                [Struct(\n                    \"VecTup1\",\n                    [(\n                        \"0\",\n                        Vector([Tuple([I32(10)].into()), Tuple([I32(20)].into())].into()),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"VecTup1\",\n                [(\n                    \"0\",\n                    Vector([Tuple([I32(20)].into()), Tuple([I32(10)].into())].into()),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"vec_tup_1\").into(),\n                [Struct(\n                    \"VecTup1\",\n                    [(\n                        \"0\",\n                        Vector([Tuple([I32(1)].into()), Tuple([I32(1)].into())].into()),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"VecTup1\",\n                [(\"0\", Vector([Tuple([I32(1)].into())].into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"vec_tup_1\").into(),\n                [Struct(\n                    \"VecTup1\",\n                    [(\"0\", Vector([Tuple([I32(1)].into())].into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"VecTup1\",\n                [(\n                    \"0\",\n                    Vector([Tuple([I32(1)].into()), Tuple([I32(1)].into())].into()),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n    ]);\n\n    // VecTup2\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"vec_tup_2\").into(),\n                [Struct(\n                    \"VecTup2\",\n                    [(\"0\", EmptyVector(TyTuple([TyI32, TyI32].into())))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"VecTup2\",\n                [(\"0\", EmptyVector(TyTuple([TyI32, TyI32].into())))].into(),\n            )\n            .into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"vec_tup_2\").into(),\n                [Struct(\n                    \"VecTup2\",\n                    [(\n                        \"0\",\n                        Vector(\n                            [\n                                Tuple([I32(1), I32(2)].into()),\n                                Tuple([I32(3), I32(4)].into()),\n                            ]\n                            .into(),\n                        ),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"VecTup2\",\n                [(\n                    \"0\",\n                    Vector(\n                        [\n                            Tuple([I32(1), I32(2)].into()),\n                            Tuple([I32(3), I32(4)].into()),\n                        ]\n                        .into(),\n                    ),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"vec_tup_2\").into(),\n                [Struct(\n                    \"VecTup2\",\n                    [(\n                        \"0\",\n                        Vector(\n                            [\n                                Tuple([I32(1), I32(2)].into()),\n                                Tuple([I32(3), I32(4)].into()),\n                            ]\n                            .into(),\n                        ),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"VecTup2\",\n                [(\n                    \"0\",\n                    Vector(\n                        [\n                            Tuple([I32(1), I32(4)].into()),\n                            Tuple([I32(3), I32(2)].into()),\n                        ]\n                        .into(),\n                    ),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"vec_tup_2\").into(),\n                [Struct(\n                    \"VecTup2\",\n                    [(\n                        \"0\",\n                        Vector(\n                            [\n                                Tuple([I32(1), I32(1)].into()),\n                                Tuple([I32(1), I32(1)].into()),\n                            ]\n                            .into(),\n                        ),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"VecTup2\",\n                [(\"0\", Vector([Tuple([I32(1), I32(1)].into())].into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"vec_tup_2\").into(),\n                [Struct(\n                    \"VecTup2\",\n                    [(\"0\", Vector([Tuple([I32(1), I32(1)].into())].into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"VecTup2\",\n                [(\n                    \"0\",\n                    Vector(\n                        [\n                            Tuple([I32(1), I32(1)].into()),\n                            Tuple([I32(1), I32(1)].into()),\n                        ]\n                        .into(),\n                    ),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n    ]);\n\n    // OptTup0\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"opt_tup_0\").into(),\n                [Struct(\n                    \"OptTup0\",\n                    [(\"0\", OptNone(TyTuple([].into())))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\"OptTup0\", [(\"0\", OptNone(TyTuple([].into())))].into()).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"opt_tup_0\").into(),\n                [Struct(\n                    \"OptTup0\",\n                    [(\"0\", OptSome(Tuple([].into()).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\"OptTup0\", [(\"0\", OptSome(Tuple([].into()).into()))].into()).into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"opt_tup_0\").into(),\n                [Struct(\n                    \"OptTup0\",\n                    [(\"0\", OptSome(Tuple([].into()).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\"OptTup0\", [(\"0\", OptNone(TyTuple([].into())))].into()).into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"opt_tup_0\").into(),\n                [Struct(\n                    \"OptTup0\",\n                    [(\"0\", OptNone(TyTuple([].into())))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\"OptTup0\", [(\"0\", OptSome(Tuple([].into()).into()))].into()).into(),\n        ),\n    ]);\n\n    // OptTup1\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"opt_tup_1\").into(),\n                [Struct(\n                    \"OptTup1\",\n                    [(\"0\", OptNone(TyTuple([TyI32].into())))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\"OptTup1\", [(\"0\", OptNone(TyTuple([TyI32].into())))].into()).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"opt_tup_1\").into(),\n                [Struct(\n                    \"OptTup1\",\n                    [(\"0\", OptSome(Tuple([I32(1)].into()).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"OptTup1\",\n                [(\"0\", OptSome(Tuple([I32(1)].into()).into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"opt_tup_1\").into(),\n                [Struct(\n                    \"OptTup1\",\n                    [(\"0\", OptSome(Tuple([I32(1)].into()).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\"OptTup1\", [(\"0\", OptNone(TyTuple([TyI32].into())))].into()).into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"opt_tup_1\").into(),\n                [Struct(\n                    \"OptTup1\",\n                    [(\"0\", OptNone(TyTuple([TyI32].into())))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"OptTup1\",\n                [(\"0\", OptSome(Tuple([I32(1)].into()).into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"opt_tup_1\").into(),\n                [Struct(\n                    \"OptTup1\",\n                    [(\"0\", OptSome(Tuple([I32(1)].into()).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"OptTup1\",\n                [(\"0\", OptSome(Tuple([I32(2)].into()).into()))].into(),\n            )\n            .into(),\n        ),\n    ]);\n\n    // OptTup2\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"opt_tup_2\").into(),\n                [Struct(\n                    \"OptTup2\",\n                    [(\"0\", OptNone(TyTuple([TyI32, TyI32].into())))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"OptTup2\",\n                [(\"0\", OptNone(TyTuple([TyI32, TyI32].into())))].into(),\n            )\n            .into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"opt_tup_2\").into(),\n                [Struct(\n                    \"OptTup2\",\n                    [(\"0\", OptSome(Tuple([I32(1), I32(2)].into()).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"OptTup2\",\n                [(\"0\", OptSome(Tuple([I32(1), I32(2)].into()).into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"opt_tup_2\").into(),\n                [Struct(\n                    \"OptTup2\",\n                    [(\"0\", OptSome(Tuple([I32(1), I32(2)].into()).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"OptTup2\",\n                [(\"0\", OptSome(Tuple([I32(2), I32(1)].into()).into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"opt_tup_2\").into(),\n                [Struct(\n                    \"OptTup2\",\n                    [(\"0\", OptNone(TyTuple([TyI32, TyI32].into()).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"OptTup2\",\n                [(\"0\", OptSome(Tuple([I32(1), I32(2)].into()).into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"opt_tup_2\").into(),\n                [Struct(\n                    \"OptTup2\",\n                    [(\"0\", OptSome(Tuple([I32(1), I32(2)].into()).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"OptTup2\",\n                [(\"0\", OptNone(TyTuple([TyI32, TyI32].into()).into()))].into(),\n            )\n            .into(),\n        ),\n    ]);\n\n    // EnumBoxTup\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"enum_box_tup\").into(),\n                [EnumPayload(\n                    \"EnumBoxTup\",\n                    \"Foo\",\n                    [(\n                        \"0\",\n                        Boxed(\n                            TyTuple([TyI32, TyI32].into()),\n                            Tuple([I32(1), I32(2)].into()).into(),\n                        ),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            EnumPayload(\n                \"EnumBoxTup\",\n                \"Foo\",\n                [(\n                    \"0\",\n                    Boxed(\n                        TyTuple([TyI32, TyI32].into()),\n                        Tuple([I32(1), I32(2)].into()).into(),\n                    ),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"enum_box_tup\").into(),\n                [EnumPayload(\n                    \"EnumBoxTup\",\n                    \"Foo\",\n                    [(\n                        \"0\",\n                        Boxed(\n                            TyTuple([TyI32, TyI32].into()),\n                            Tuple([I32(1), I32(2)].into()).into(),\n                        ),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            EnumPayload(\n                \"EnumBoxTup\",\n                \"Foo\",\n                [(\n                    \"0\",\n                    Boxed(\n                        TyTuple([TyI32, TyI32].into()),\n                        Tuple([I32(1), I32(3)].into()).into(),\n                    ),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"enum_box_tup\").into(),\n                [EnumPayload(\"EnumBoxTup\", \"Bar\", [].into())].into(),\n            )\n            .into(),\n            EnumPayload(\"EnumBoxTup\", \"Bar\", [].into()).into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"enum_box_tup\").into(),\n                [EnumPayload(\n                    \"EnumBoxTup\",\n                    \"Foo\",\n                    [(\n                        \"0\",\n                        Boxed(\n                            TyTuple([TyI32, TyI32].into()),\n                            Tuple([I32(1), I32(2)].into()).into(),\n                        ),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            EnumPayload(\"EnumBoxTup\", \"Bar\", [].into()).into(),\n        ),\n    ]);\n\n    // EnumVecTup\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"enum_vec_tup\").into(),\n                [EnumPayload(\n                    \"EnumVecTup\",\n                    \"Foo\",\n                    [(\"0\", EmptyVector(TyTuple([TyI32, TyI32].into())))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            EnumPayload(\n                \"EnumVecTup\",\n                \"Foo\",\n                [(\"0\", EmptyVector(TyTuple([TyI32, TyI32].into())))].into(),\n            )\n            .into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"enum_vec_tup\").into(),\n                [EnumPayload(\n                    \"EnumVecTup\",\n                    \"Foo\",\n                    [(\"0\", Vector([Tuple([I32(1), I32(2)].into())].into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            EnumPayload(\n                \"EnumVecTup\",\n                \"Foo\",\n                [(\"0\", Vector([Tuple([I32(1), I32(2)].into())].into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"enum_vec_tup\").into(),\n                [EnumPayload(\n                    \"EnumVecTup\",\n                    \"Foo\",\n                    [(\"0\", Vector([Tuple([I32(1), I32(2)].into())].into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            EnumPayload(\n                \"EnumVecTup\",\n                \"Foo\",\n                [(\"0\", Vector([Tuple([I32(1), I32(3)].into())].into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"enum_vec_tup\").into(),\n                [EnumPayload(\n                    \"EnumVecTup\",\n                    \"Foo\",\n                    [(\"0\", EmptyVector(TyTuple([TyI32, TyI32].into())))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            EnumPayload(\n                \"EnumVecTup\",\n                \"Foo\",\n                [(\"0\", Vector([Tuple([I32(1), I32(2)].into())].into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"enum_vec_tup\").into(),\n                [EnumPayload(\n                    \"EnumVecTup\",\n                    \"Foo\",\n                    [(\"0\", Vector([Tuple([I32(1), I32(2)].into())].into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            EnumPayload(\n                \"EnumVecTup\",\n                \"Foo\",\n                [(\"0\", EmptyVector(TyTuple([TyI32, TyI32].into())))].into(),\n            )\n            .into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"enum_vec_tup\").into(),\n                [EnumPayload(\"EnumVecTup\", \"Bar\", [].into())].into(),\n            )\n            .into(),\n            EnumPayload(\"EnumVecTup\", \"Bar\", [].into()).into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"enum_vec_tup\").into(),\n                [EnumPayload(\"EnumVecTup\", \"Bar\", [].into())].into(),\n            )\n            .into(),\n            EnumPayload(\n                \"EnumVecTup\",\n                \"Foo\",\n                [(\"0\", EmptyVector(TyTuple([TyI32, TyI32].into())))].into(),\n            )\n            .into(),\n        ),\n    ]);\n\n    // EnumOptTup\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"enum_opt_tup\").into(),\n                [EnumPayload(\n                    \"EnumOptTup\",\n                    \"Foo\",\n                    [(\"0\", OptNone(TyTuple([TyI32, TyI32].into())))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            EnumPayload(\n                \"EnumOptTup\",\n                \"Foo\",\n                [(\"0\", OptNone(TyTuple([TyI32, TyI32].into())))].into(),\n            )\n            .into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"enum_opt_tup\").into(),\n                [EnumPayload(\n                    \"EnumOptTup\",\n                    \"Foo\",\n                    [(\"0\", OptSome(Tuple([I32(1), I32(2)].into()).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            EnumPayload(\n                \"EnumOptTup\",\n                \"Foo\",\n                [(\"0\", OptSome(Tuple([I32(1), I32(2)].into()).into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"enum_opt_tup\").into(),\n                [EnumPayload(\n                    \"EnumOptTup\",\n                    \"Foo\",\n                    [(\"0\", OptSome(Tuple([I32(1), I32(2)].into()).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            EnumPayload(\n                \"EnumOptTup\",\n                \"Foo\",\n                [(\"0\", OptSome(Tuple([I32(1), I32(3)].into()).into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"enum_opt_tup\").into(),\n                [EnumPayload(\n                    \"EnumOptTup\",\n                    \"Foo\",\n                    [(\"0\", OptSome(Tuple([I32(1), I32(2)].into()).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            EnumPayload(\n                \"EnumOptTup\",\n                \"Foo\",\n                [(\"0\", OptNone(TyTuple([TyI32, TyI32].into())))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"enum_opt_tup\").into(),\n                [EnumPayload(\n                    \"EnumOptTup\",\n                    \"Foo\",\n                    [(\"0\", OptNone(TyTuple([TyI32, TyI32].into())))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            EnumPayload(\n                \"EnumOptTup\",\n                \"Foo\",\n                [(\"0\", OptSome(Tuple([I32(1), I32(2)].into()).into()))].into(),\n            )\n            .into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"enum_opt_tup\").into(),\n                [EnumPayload(\"EnumOptTup\", \"Bar\", [].into())].into(),\n            )\n            .into(),\n            EnumPayload(\"EnumOptTup\", \"Bar\", [].into()).into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"enum_opt_tup\").into(),\n                [EnumPayload(\"EnumOptTup\", \"Bar\", [].into())].into(),\n            )\n            .into(),\n            EnumPayload(\n                \"EnumOptTup\",\n                \"Foo\",\n                [(\"0\", OptNone(TyTuple([TyI32, TyI32].into())))].into(),\n            )\n            .into(),\n        ),\n    ]);\n\n    // TupBox\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"tup_box\").into(),\n                [Struct(\n                    \"TupBox\",\n                    [(\n                        \"0\",\n                        Tuple(\n                            [\n                                Boxed(TyI32, I32(0).into()),\n                                Boxed(TyBool, Bool(true).into()),\n                            ]\n                            .into(),\n                        ),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"TupBox\",\n                [(\n                    \"0\",\n                    Tuple(\n                        [\n                            Boxed(TyI32, I32(0).into()),\n                            Boxed(TyBool, Bool(true).into()),\n                        ]\n                        .into(),\n                    ),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"tup_box\").into(),\n                [Struct(\n                    \"TupBox\",\n                    [(\n                        \"0\",\n                        Tuple(\n                            [\n                                Boxed(TyI32, I32(0).into()),\n                                Boxed(TyBool, Bool(true).into()),\n                            ]\n                            .into(),\n                        ),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"TupBox\",\n                [(\n                    \"0\",\n                    Tuple(\n                        [\n                            Boxed(TyI32, I32(0).into()),\n                            Boxed(TyBool, Bool(false).into()),\n                        ]\n                        .into(),\n                    ),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"tup_box\").into(),\n                [Struct(\n                    \"TupBox\",\n                    [(\n                        \"0\",\n                        Tuple(\n                            [\n                                Boxed(TyI32, I32(0).into()),\n                                Boxed(TyBool, Bool(true).into()),\n                            ]\n                            .into(),\n                        ),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"TupBox\",\n                [(\n                    \"0\",\n                    Tuple(\n                        [\n                            Boxed(TyI32, I32(2).into()),\n                            Boxed(TyBool, Bool(true).into()),\n                        ]\n                        .into(),\n                    ),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n    ]);\n\n    // VecBox\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"vec_box\").into(),\n                [Struct(\n                    \"VecBox\",\n                    [(\"0\", EmptyVector(TyBox(TyI32.into())))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\"VecBox\", [(\"0\", EmptyVector(TyBox(TyI32.into())))].into()).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"vec_box\").into(),\n                [Struct(\n                    \"VecBox\",\n                    [(\n                        \"0\",\n                        Vector([Boxed(TyI32, I32(10).into()), Boxed(TyI32, I32(20).into())].into()),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"VecBox\",\n                [(\n                    \"0\",\n                    Vector([Boxed(TyI32, I32(10).into()), Boxed(TyI32, I32(20).into())].into()),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"vec_box\").into(),\n                [Struct(\n                    \"VecBox\",\n                    [(\n                        \"0\",\n                        Vector([Boxed(TyI32, I32(10).into()), Boxed(TyI32, I32(20).into())].into()),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"VecBox\",\n                [(\n                    \"0\",\n                    Vector([Boxed(TyI32, I32(10).into()), Boxed(TyI32, I32(30).into())].into()),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"vec_box\").into(),\n                [Struct(\n                    \"VecBox\",\n                    [(\"0\", EmptyVector(TyBox(TyI32.into())))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"VecBox\",\n                [(\n                    \"0\",\n                    Vector([Boxed(TyI32, I32(10).into()), Boxed(TyI32, I32(20).into())].into()),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"vec_box\").into(),\n                [Struct(\n                    \"VecBox\",\n                    [(\n                        \"0\",\n                        Vector([Boxed(TyI32, I32(10).into()), Boxed(TyI32, I32(20).into())].into()),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\"VecBox\", [(\"0\", EmptyVector(TyBox(TyI32.into())))].into()).into(),\n        ),\n    ]);\n\n    // BoxVec\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"box_vec\").into(),\n                [Struct(\n                    \"BoxVec\",\n                    [(\"0\", Boxed(TyVec(TyI32.into()), EmptyVector(TyI32).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"BoxVec\",\n                [(\"0\", Boxed(TyVec(TyI32.into()), EmptyVector(TyI32).into()))].into(),\n            )\n            .into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"box_vec\").into(),\n                [Struct(\n                    \"BoxVec\",\n                    [(\n                        \"0\",\n                        Boxed(TyVec(TyI32.into()), Vector([I32(1), I32(2)].into()).into()),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"BoxVec\",\n                [(\n                    \"0\",\n                    Boxed(TyVec(TyI32.into()), Vector([I32(1), I32(2)].into()).into()),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"box_vec\").into(),\n                [Struct(\n                    \"BoxVec\",\n                    [(\n                        \"0\",\n                        Boxed(TyVec(TyI32.into()), Vector([I32(1)].into()).into()),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"BoxVec\",\n                [(\n                    \"0\",\n                    Boxed(TyVec(TyI32.into()), Vector([I32(1), I32(2)].into()).into()),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"box_vec\").into(),\n                [Struct(\n                    \"BoxVec\",\n                    [(\n                        \"0\",\n                        Boxed(TyVec(TyI32.into()), Vector([I32(1), I32(2)].into()).into()),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"BoxVec\",\n                [(\n                    \"0\",\n                    Boxed(TyVec(TyI32.into()), Vector([I32(1)].into()).into()),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n    ]);\n\n    // OptBox\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"opt_box\").into(),\n                [Struct(\n                    \"OptBox\",\n                    [(\"0\", OptNone(TyBox(TyI32.into())))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\"OptBox\", [(\"0\", OptNone(TyBox(TyI32.into())))].into()).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"opt_box\").into(),\n                [Struct(\n                    \"OptBox\",\n                    [(\"0\", OptSome(Boxed(TyI32.into(), I32(10).into()).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"OptBox\",\n                [(\"0\", OptSome(Boxed(TyI32.into(), I32(10).into()).into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"opt_box\").into(),\n                [Struct(\n                    \"OptBox\",\n                    [(\"0\", OptSome(Boxed(TyI32.into(), I32(10).into()).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"OptBox\",\n                [(\"0\", OptSome(Boxed(TyI32.into(), I32(20).into()).into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"opt_box\").into(),\n                [Struct(\n                    \"OptBox\",\n                    [(\"0\", OptNone(TyBox(TyI32.into())))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"OptBox\",\n                [(\"0\", OptSome(Boxed(TyI32.into(), I32(10).into()).into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"opt_box\").into(),\n                [Struct(\n                    \"OptBox\",\n                    [(\"0\", OptSome(Boxed(TyI32.into(), I32(10).into()).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\"OptBox\", [(\"0\", OptNone(TyBox(TyI32.into())))].into()).into(),\n        ),\n    ]);\n\n    // BoxOpt\n    case.checks.extend_from_slice(&[\n        AssertEqual(\n            Call(\n                Export(\"box_opt\").into(),\n                [Struct(\n                    \"BoxOpt\",\n                    [(\"0\", Boxed(TyOption(TyI32.into()), OptNone(TyI32).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"BoxOpt\",\n                [(\"0\", Boxed(TyOption(TyI32.into()), OptNone(TyI32).into()))].into(),\n            )\n            .into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"box_opt\").into(),\n                [Struct(\n                    \"BoxOpt\",\n                    [(\n                        \"0\",\n                        Boxed(TyOption(TyI32.into()), OptSome(I32(10).into()).into()),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"BoxOpt\",\n                [(\n                    \"0\",\n                    Boxed(TyOption(TyI32.into()), OptSome(I32(10).into()).into()),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"box_opt\").into(),\n                [Struct(\n                    \"BoxOpt\",\n                    [(\n                        \"0\",\n                        Boxed(TyOption(TyI32.into()), OptSome(I32(10).into()).into()),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"BoxOpt\",\n                [(\n                    \"0\",\n                    Boxed(TyOption(TyI32.into()), OptSome(I32(20).into()).into()),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"box_opt\").into(),\n                [Struct(\n                    \"BoxOpt\",\n                    [(\n                        \"0\",\n                        Boxed(TyOption(TyI32.into()), OptSome(I32(10).into()).into()),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"BoxOpt\",\n                [(\"0\", Boxed(TyOption(TyI32.into()), OptNone(TyI32).into()))].into(),\n            )\n            .into(),\n        ),\n        AssertNotEqual(\n            Call(\n                Export(\"box_opt\").into(),\n                [Struct(\n                    \"BoxOpt\",\n                    [(\"0\", Boxed(TyOption(TyI32.into()), OptNone(TyI32).into()))].into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Struct(\n                \"BoxOpt\",\n                [(\n                    \"0\",\n                    Boxed(TyOption(TyI32.into()), OptSome(I32(10).into()).into()),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n    ]);\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/demo_enum.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        // This tests the generation of \"indirect case\" in Swift\n\n        pub enum NestedBox {\n            Foo,\n            Bar(Box<NestedBox>),\n        }\n\n        pub enum NestedVec {\n            Foo,\n            Bar(Vec<NestedVec>),\n        }\n\n        pub enum NestedOption {\n            Foo,\n            Bar(Option<Box<NestedOption>>),\n        }\n\n        pub enum NestedTuple {\n            Foo,\n            Bar((i32, Box<NestedTuple>)),\n        }\n\n        pub enum NestedStruct {\n            Foo,\n            Bar((i32, Box<InnerStruct>)),\n        }\n\n        pub struct InnerStruct {\n            pub x: NestedStruct,\n        }\n\n        pub enum NestedEnum {\n            Foo,\n            Bar((i32, Box<InnerEnum>)),\n        }\n\n        pub enum InnerEnum {\n            Foo(NestedEnum),\n        }\n    \"#;\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/demo_keyword.rs",
    "content": "use super::*;\nuse std::collections::HashSet;\n\nconst RUST_KEYWORDS: &[&str] = &[\n    \"abstract\", \"as\", \"async\", \"await\", \"become\", \"box\", \"break\", \"const\", \"continue\", \"crate\",\n    \"do\", \"dyn\", \"else\", \"enum\", \"extern\", \"false\", \"final\", \"fn\", \"for\", \"gen\", \"if\", \"impl\",\n    \"in\", \"let\", \"loop\", \"macro\", \"match\", \"mod\", \"move\", \"mut\", \"override\", \"priv\", \"pub\", \"ref\",\n    \"return\", \"self\", \"Self\", \"static\", \"struct\", \"super\", \"trait\", \"true\", \"try\", \"type\",\n    \"typeof\", \"unsafe\", \"unsized\", \"use\", \"virtual\", \"where\", \"while\", \"yield\",\n];\n\nfn test_case() -> TestCase {\n    let mut keywords = HashSet::<&str>::new();\n    keywords.extend(crate::wasm::JS_KEYWORDS);\n    keywords.extend(crate::cpp::CPP_KEYWORDS);\n    keywords.extend(crate::swift::SWIFT_KEYWORDS);\n\n    let mut keywords = keywords.into_iter().collect::<Vec<_>>();\n    keywords.sort();\n\n    let rust_keywords: HashSet<_> = RUST_KEYWORDS.iter().collect();\n    let test_local = |k: &&&str| is_snake_case(k) && !rust_keywords.contains(k);\n    let rust = keywords\n        .iter()\n        .filter(test_local)\n        .map(|k| format!(\"pub fn test_{k}({k}: i32) -> i32 {{ {k} }}\"))\n        .collect::<Vec<_>>()\n        .join(\"\\n\");\n\n    let mut case = TestCase::default();\n    case.rust = Box::new(rust).leak();\n\n    for (i, k) in keywords.iter().filter(test_local).enumerate() {\n        case.checks.push(AssertEqual(\n            Call(\n                Export(Box::new(format!(\"test_{k}\")).leak()).into(),\n                [I32(i as i32).into()].into(),\n            )\n            .into(),\n            I32(i as i32).into(),\n        ));\n    }\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/demo_order.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        use std::rc::Rc;\n\n        // These tests are for C++ where declaration is order-dependent\n\n        // Traits that refer to each other\n        pub trait FirstTrait {\n            fn second(&self) -> Rc<dyn SecondTrait>;\n        }\n        pub trait SecondTrait {\n            fn first(&self) -> Rc<dyn FirstTrait>;\n        }\n\n        ////////////////////\n\n        // Early struct inside later struct\n        pub struct EarlyInsideStruct {\n            pub y: bool,\n        }\n        pub struct LaterOutsideStruct {\n            pub x: EarlyInsideStruct,\n        }\n\n        // Early struct outside later struct\n        pub struct EarlyOutsideStruct {\n            pub x: LaterInsideStruct,\n        }\n        pub struct LaterInsideStruct {\n            pub y: bool,\n        }\n\n        // Structs that refer to each other\n        pub struct FirstStruct {\n            pub second: Vec<SecondStruct>,\n        }\n        pub struct SecondStruct {\n            pub first: Vec<FirstStruct>,\n        }\n\n        ////////////////////\n\n        // Early enum inside later enum\n        pub enum EarlyInsideEnum {\n            Value(bool),\n        }\n        pub enum LaterOutsideEnum {\n            Value(EarlyInsideEnum),\n        }\n\n        // Early enum outside later enum\n        pub enum EarlyOutsideEnum {\n            Value(LaterInsideEnum),\n        }\n        pub enum LaterInsideEnum {\n            Value(bool),\n        }\n\n        // Enums that refer to each other\n        pub enum FirstEnum {\n            Second(Vec<SecondEnum>),\n        }\n        pub enum SecondEnum {\n            First(Vec<FirstEnum>),\n        }\n    \"#;\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/demo_trait.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        use std::rc::Rc;\n\n        pub trait Trait {\n            fn get(&self) -> i32;\n        }\n\n        pub struct Example {\n            box_ptr: Box<dyn Trait>,\n            rc_ptr: Rc<dyn Trait>,\n            text: String,\n            vec_box: Vec<Box<dyn Trait>>,\n            vec_rc: Vec<Rc<dyn Trait>>,\n        }\n\n        pub fn test(vec: Vec<Example>) -> Vec<Example> {\n            vec\n        }\n    \"#;\n\n    case.js_pre = \"\n        class TraitImpl {\n            constructor(x) {\n                this.x = x\n            }\n            get() {\n                return this.x\n            }\n        }\n    \";\n\n    case.swift_pre = \"\n        var counter = 0\n\n        class TraitImpl : Trait {\n            let x: Int32\n            init(_ x: Int32) {\n                self.x = x\n                counter += 1\n            }\n            deinit {\n                counter -= 1\n            }\n            func get() -> Int32 {\n                return x\n            }\n        }\n    \";\n\n    case.cpp_pre = \"\n        int counter = 0;\n\n        struct TraitImpl : rust::Trait {\n            int32_t x;\n            TraitImpl(int32_t x) {\n                this->x = x;\n                counter += 1;\n            }\n            ~TraitImpl() {\n                counter -= 1;\n            }\n            int32_t get() {\n                return x;\n            }\n        };\n    \";\n\n    case.checks = vec![\n        DeclareImmutableLocal(\n            \"vec\",\n            Call(\n                Export(\"test\").into(),\n                [Vector(\n                    [Struct(\n                        \"Example\",\n                        [\n                            (\n                                \"box_ptr\",\n                                NewBox(TyName(\"Trait\"), \"TraitImpl\", [I32(1)].into()).into(),\n                            ),\n                            (\n                                \"rc_ptr\",\n                                NewRc(TyName(\"Trait\"), \"TraitImpl\", [I32(4)].into()).into(),\n                            ),\n                            (\"text\", Str(\"abc\".into())),\n                            (\n                                \"vec_box\",\n                                Vector(\n                                    [\n                                        NewBox(TyName(\"Trait\"), \"TraitImpl\", [I32(2)].into())\n                                            .into(),\n                                        NewBox(TyName(\"Trait\"), \"TraitImpl\", [I32(3)].into())\n                                            .into(),\n                                    ]\n                                    .into(),\n                                ),\n                            ),\n                            (\n                                \"vec_rc\",\n                                Vector(\n                                    [\n                                        NewRc(TyName(\"Trait\"), \"TraitImpl\", [I32(5)].into()).into(),\n                                        NewRc(TyName(\"Trait\"), \"TraitImpl\", [I32(6)].into()).into(),\n                                    ]\n                                    .into(),\n                                ),\n                            ),\n                        ]\n                        .into(),\n                    )]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertEqual(\n            CallMethod(\n                StructMember(VectorMember(LoadLocal(\"vec\").into(), 0).into(), \"box_ptr\").into(),\n                \"get\",\n                [].into(),\n            )\n            .into(),\n            I32(1).into(),\n        ),\n        AssertEqual(\n            CallMethod(\n                StructMember(VectorMember(LoadLocal(\"vec\").into(), 0).into(), \"rc_ptr\").into(),\n                \"get\",\n                [].into(),\n            )\n            .into(),\n            I32(4).into(),\n        ),\n        AssertEqual(\n            StructMember(VectorMember(LoadLocal(\"vec\").into(), 0).into(), \"text\").into(),\n            Str(\"abc\".into()).into(),\n        ),\n        AssertEqual(\n            VectorLen(\n                StructMember(VectorMember(LoadLocal(\"vec\").into(), 0).into(), \"vec_box\").into(),\n            )\n            .into(),\n            I32(2).into(),\n        ),\n        AssertEqual(\n            CallMethod(\n                VectorMember(\n                    StructMember(VectorMember(LoadLocal(\"vec\").into(), 0).into(), \"vec_box\").into(),\n                    0,\n                )\n                .into(),\n                \"get\",\n                [].into(),\n            )\n            .into(),\n            I32(2).into(),\n        ),\n        AssertEqual(\n            CallMethod(\n                VectorMember(\n                    StructMember(VectorMember(LoadLocal(\"vec\").into(), 0).into(), \"vec_box\").into(),\n                    1,\n                )\n                .into(),\n                \"get\",\n                [].into(),\n            )\n            .into(),\n            I32(3).into(),\n        ),\n        AssertEqual(\n            VectorLen(\n                StructMember(VectorMember(LoadLocal(\"vec\").into(), 0).into(), \"vec_rc\").into(),\n            )\n            .into(),\n            I32(2).into(),\n        ),\n        AssertEqual(\n            CallMethod(\n                VectorMember(\n                    StructMember(VectorMember(LoadLocal(\"vec\").into(), 0).into(), \"vec_rc\").into(),\n                    0,\n                )\n                .into(),\n                \"get\",\n                [].into(),\n            )\n            .into(),\n            I32(5).into(),\n        ),\n        AssertEqual(\n            CallMethod(\n                VectorMember(\n                    StructMember(VectorMember(LoadLocal(\"vec\").into(), 0).into(), \"vec_rc\").into(),\n                    1,\n                )\n                .into(),\n                \"get\",\n                [].into(),\n            )\n            .into(),\n            I32(6).into(),\n        ),\n    ];\n\n    case.swift_post = r#\"\n        assert(counter == 0, \"\\(counter) == \\(0)\")\n    \"#;\n\n    case.cpp_post = \"\n        assert(counter == 0);\n    \";\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_basic.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        pub fn add_bool(x: bool, y: bool) -> bool { x || y }\n\n        pub fn add_u8(x: u8, y: u8) -> u8 { x + y }\n        pub fn add_u16(x: u16, y: u16) -> u16 { x + y }\n        pub fn add_u32(x: u32, y: u32) -> u32 { x + y }\n        pub fn add_usize(x: usize, y: usize) -> usize { x + y }\n        pub fn add_u64(x: u64, y: u64) -> u64 { x + y }\n\n        pub fn add_i8(x: i8, y: i8) -> i8 { x + y }\n        pub fn add_i16(x: i16, y: i16) -> i16 { x + y }\n        pub fn add_i32(x: i32, y: i32) -> i32 { x + y }\n        pub fn add_isize(x: isize, y: isize) -> isize { x + y }\n        pub fn add_i64(x: i64, y: i64) -> i64 { x + y }\n\n        pub fn add_f32(x: f32, y: f32) -> f32 { x + y }\n        pub fn add_f64(x: f64, y: f64) -> f64 { x + y }\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            Call(Export(\"add_bool\").into(), [Bool(false), Bool(false)].into()).into(),\n            Bool(false).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"add_bool\").into(), [Bool(true), Bool(false)].into()).into(),\n            Bool(true).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"add_bool\").into(), [Bool(false), Bool(true)].into()).into(),\n            Bool(true).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"add_bool\").into(), [Bool(true), Bool(true)].into()).into(),\n            Bool(true).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"add_u8\").into(), [U8(1), U8(2)].into()).into(),\n            U8(3).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"add_u16\").into(), [U16(1), U16(2)].into()).into(),\n            U16(3).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"add_u32\").into(), [U32(1), U32(2)].into()).into(),\n            U32(3).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"add_usize\").into(), [Usize(1), Usize(2)].into()).into(),\n            Usize(3).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"add_u64\").into(), [U64(1), U64(2)].into()).into(),\n            U64(3).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"add_i8\").into(), [I8(1), I8(2)].into()).into(),\n            I8(3).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"add_i16\").into(), [I16(1), I16(2)].into()).into(),\n            I16(3).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"add_i32\").into(), [I32(1), I32(2)].into()).into(),\n            I32(3).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"add_isize\").into(), [Isize(1), Isize(2)].into()).into(),\n            Isize(3).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"add_i64\").into(), [I64(1), I64(2)].into()).into(),\n            I64(3).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"add_f32\").into(), [F32(1.5), F32(-0.25)].into()).into(),\n            F32(1.25).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"add_f64\").into(), [F64(-1.5), F64(0.25)].into()).into(),\n            F64(-1.25).into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_basic_void.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        static mut RESULT: i32 = 0;\n\n        pub fn add_void(x: i32, y: i32) {\n            unsafe { RESULT = x + y; }\n        }\n\n        pub fn add_empty_tuple(x: i32, y: i32) -> () {\n            unsafe { RESULT = x + y; }\n        }\n\n        pub fn get_result() -> i32 {\n            unsafe { RESULT }\n        }\n\n        // Make sure the \"_\" wildcard pattern works as an argument\n        pub fn wild_arg(_: i32, _: (), _: i32) -> () {\n            unsafe { RESULT = 123; }\n        }\n    \"#;\n\n    case.checks = vec![\n        Call(Export(\"add_void\").into(), [I32(1), I32(2)].into()),\n        AssertEqual(\n            Call(Export(\"get_result\").into(), [].into()).into(),\n            I32(3).into(),\n        ),\n        Call(Export(\"add_empty_tuple\").into(), [I32(3), I32(4)].into()),\n        AssertEqual(\n            Call(Export(\"get_result\").into(), [].into()).into(),\n            I32(7).into(),\n        ),\n        Call(\n            Export(\"wild_arg\").into(),\n            [I32(-1), Tuple([].into()), I32(-2)].into(),\n        ),\n        AssertEqual(\n            Call(Export(\"get_result\").into(), [].into()).into(),\n            I32(123).into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_box_in.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        #[derive(Eq, PartialEq)]\n        pub struct Tree {\n            value: i32,\n            left: Option<Box<Tree>>,\n            right: Option<Box<Tree>>,\n        }\n\n        pub fn sum_tree(tree: Tree) -> i32 {\n            let mut sum = tree.value;\n            sum += tree.left.map(|x| sum_tree(*x)).unwrap_or(0);\n            sum += tree.right.map(|x| sum_tree(*x)).unwrap_or(0);\n            sum\n        }\n\n        pub fn check_nested(x: Box<Box<Box<i32>>>) -> i32 {\n            ***x\n        }\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            Call(\n                Export(\"sum_tree\").into(),\n                [Struct(\n                    \"Tree\",\n                    [\n                        (\"value\", I32(2)),\n                        (\n                            \"left\",\n                            OptSome(\n                                Boxed(\n                                    TyName(\"Tree\"),\n                                    Struct(\n                                        \"Tree\",\n                                        [\n                                            (\"value\", I32(1)),\n                                            (\"left\", OptNone(TyBox(TyName(\"Tree\").into()))),\n                                            (\"right\", OptNone(TyBox(TyName(\"Tree\").into()))),\n                                        ]\n                                        .into(),\n                                    )\n                                    .into(),\n                                )\n                                .into(),\n                            ),\n                        ),\n                        (\n                            \"right\",\n                            OptSome(\n                                Boxed(\n                                    TyName(\"Tree\"),\n                                    Struct(\n                                        \"Tree\",\n                                        [\n                                            (\"value\", I32(4)),\n                                            (\n                                                \"left\",\n                                                OptSome(\n                                                    Boxed(\n                                                        TyName(\"Tree\"),\n                                                        Struct(\n                                                            \"Tree\",\n                                                            [\n                                                                (\"value\", I32(3)),\n                                                                (\n                                                                    \"left\",\n                                                                    OptNone(TyBox(\n                                                                        TyName(\"Tree\").into(),\n                                                                    )),\n                                                                ),\n                                                                (\n                                                                    \"right\",\n                                                                    OptNone(TyBox(\n                                                                        TyName(\"Tree\").into(),\n                                                                    )),\n                                                                ),\n                                                            ]\n                                                            .into(),\n                                                        )\n                                                        .into(),\n                                                    )\n                                                    .into(),\n                                                ),\n                                            ),\n                                            (\n                                                \"right\",\n                                                OptSome(\n                                                    Boxed(\n                                                        TyName(\"Tree\"),\n                                                        Struct(\n                                                            \"Tree\",\n                                                            [\n                                                                (\"value\", I32(5)),\n                                                                (\n                                                                    \"left\",\n                                                                    OptNone(TyBox(\n                                                                        TyName(\"Tree\").into(),\n                                                                    )),\n                                                                ),\n                                                                (\n                                                                    \"right\",\n                                                                    OptNone(TyBox(\n                                                                        TyName(\"Tree\").into(),\n                                                                    )),\n                                                                ),\n                                                            ]\n                                                            .into(),\n                                                        )\n                                                        .into(),\n                                                    )\n                                                    .into(),\n                                                ),\n                                            ),\n                                        ]\n                                        .into(),\n                                    )\n                                    .into(),\n                                )\n                                .into(),\n                            ),\n                        ),\n                    ]\n                    .into(),\n                )\n                .into()]\n                .into(),\n            )\n            .into(),\n            I32(1 + 2 + 3 + 4 + 5).into(),\n        )\n        .into(),\n        AssertEqual(\n            Call(\n                Export(\"check_nested\").into(),\n                [Boxed(\n                    TyBox(TyBox(TyI32.into()).into()),\n                    Boxed(TyBox(TyI32.into()), Boxed(TyI32, I32(123).into()).into()).into(),\n                )\n                .into()]\n                .into(),\n            )\n            .into(),\n            I32(123).into(),\n        )\n        .into(),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_box_out.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        #[derive(Eq, PartialEq)]\n        pub struct Tree {\n            value: i32,\n            left: Option<Box<Tree>>,\n            right: Option<Box<Tree>>,\n        }\n\n        pub fn get_tree() -> Tree {\n            Tree {\n                value: 2,\n                left: Some(\n                    Tree {\n                        value: 1,\n                        left: None,\n                        right: None,\n                    }\n                    .into(),\n                ),\n                right: Some(\n                    Tree {\n                        value: 4,\n                        left: Some(\n                            Tree {\n                                value: 3,\n                                left: None,\n                                right: None,\n                            }\n                            .into(),\n                        ),\n                        right: Some(\n                            Tree {\n                                value: 5,\n                                left: None,\n                                right: None,\n                            }\n                            .into(),\n                        ),\n                    }\n                    .into(),\n                ),\n            }\n        }\n\n        #[derive(Eq, PartialEq)]\n        pub struct Nested(Box<Box<Box<i32>>>);\n\n        pub fn check_nested(x: i32) -> Nested {\n            Nested(Box::new(Box::new(Box::new(x))))\n        }\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            Call(Export(\"get_tree\").into(), [].into()).into(),\n            Struct(\n                \"Tree\",\n                [\n                    (\"value\", I32(2)),\n                    (\n                        \"left\",\n                        OptSome(\n                            Boxed(\n                                TyName(\"Tree\"),\n                                Struct(\n                                    \"Tree\",\n                                    [\n                                        (\"value\", I32(1)),\n                                        (\"left\", OptNone(TyBox(TyName(\"Tree\").into()))),\n                                        (\"right\", OptNone(TyBox(TyName(\"Tree\").into()))),\n                                    ]\n                                    .into(),\n                                )\n                                .into(),\n                            )\n                            .into(),\n                        ),\n                    ),\n                    (\n                        \"right\",\n                        OptSome(\n                            Boxed(\n                                TyName(\"Tree\"),\n                                Struct(\n                                    \"Tree\",\n                                    [\n                                        (\"value\", I32(4)),\n                                        (\n                                            \"left\",\n                                            OptSome(\n                                                Boxed(\n                                                    TyName(\"Tree\"),\n                                                    Struct(\n                                                        \"Tree\",\n                                                        [\n                                                            (\"value\", I32(3)),\n                                                            (\n                                                                \"left\",\n                                                                OptNone(TyBox(\n                                                                    TyName(\"Tree\").into(),\n                                                                )),\n                                                            ),\n                                                            (\n                                                                \"right\",\n                                                                OptNone(TyBox(\n                                                                    TyName(\"Tree\").into(),\n                                                                )),\n                                                            ),\n                                                        ]\n                                                        .into(),\n                                                    )\n                                                    .into(),\n                                                )\n                                                .into(),\n                                            ),\n                                        ),\n                                        (\n                                            \"right\",\n                                            OptSome(\n                                                Boxed(\n                                                    TyName(\"Tree\"),\n                                                    Struct(\n                                                        \"Tree\",\n                                                        [\n                                                            (\"value\", I32(5)),\n                                                            (\n                                                                \"left\",\n                                                                OptNone(TyBox(\n                                                                    TyName(\"Tree\").into(),\n                                                                )),\n                                                            ),\n                                                            (\n                                                                \"right\",\n                                                                OptNone(TyBox(\n                                                                    TyName(\"Tree\").into(),\n                                                                )),\n                                                            ),\n                                                        ]\n                                                        .into(),\n                                                    )\n                                                    .into(),\n                                                )\n                                                .into(),\n                                            ),\n                                        ),\n                                    ]\n                                    .into(),\n                                )\n                                .into(),\n                            )\n                            .into(),\n                        ),\n                    ),\n                ]\n                .into(),\n            )\n            .into(),\n        )\n        .into(),\n        AssertEqual(\n            Call(Export(\"check_nested\").into(), [I32(123).into()].into()).into(),\n            Struct(\n                \"Nested\",\n                [(\n                    \"0\",\n                    Boxed(\n                        TyBox(TyBox(TyI32.into()).into()),\n                        Boxed(TyBox(TyI32.into()), Boxed(TyI32, I32(123).into()).into()).into(),\n                    )\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n        )\n        .into(),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_combo_in.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        #[derive(Debug)]\n        pub struct Foo {\n            pub x: (Bar, Vec<Bar>),\n            pub y: Vec<((), (i32,), (f32, bool))>,\n        }\n\n        #[derive(Debug)]\n        pub struct Bar {\n            pub x: i32,\n            pub y: Vec<Foo>,\n        }\n\n        pub fn check_combo(foo: Foo) -> String {\n            format!(\"{foo:?}\")\n        }\n    \"#;\n\n    let mut foo = Struct(\n        \"Foo\",\n        [\n            (\n                \"x\",\n                Tuple(\n                    [\n                        Struct(\n                            \"Bar\",\n                            [(\"x\", I32(1)), (\"y\", EmptyVector(TyName(\"Foo\")))].into(),\n                        ),\n                        Vector(\n                            [Struct(\n                                \"Bar\",\n                                [(\"x\", I32(2)), (\"y\", EmptyVector(TyName(\"Foo\")))].into(),\n                            )]\n                            .into(),\n                        ),\n                    ]\n                    .into(),\n                ),\n            ),\n            (\n                \"y\",\n                Vector(\n                    [Tuple(\n                        [\n                            Tuple([].into()),\n                            Tuple([I32(3)].into()),\n                            Tuple([F32(4.0), Bool(true)].into()),\n                        ]\n                        .into(),\n                    )]\n                    .into(),\n                ),\n            ),\n        ]\n        .into(),\n    );\n\n    case.checks.push(AssertEqual(\n        Call(Export(\"check_combo\").into(), [foo.clone()].into()).into(),\n        Str(\"Foo { x: (Bar { x: 1, y: [] }, [\\\n            Bar { x: 2, y: [] }]), y: [((), (3,), (4.0, true))] }\")\n        .into(),\n    ));\n\n    foo = Struct(\n        \"Foo\",\n        [\n            (\n                \"x\",\n                Tuple(\n                    [\n                        Struct(\n                            \"Bar\",\n                            [(\"x\", I32(5)), (\"y\", Vector([foo.clone(), foo].into()))].into(),\n                        ),\n                        Vector(\n                            [Struct(\n                                \"Bar\",\n                                [(\"x\", I32(6)), (\"y\", EmptyVector(TyName(\"Foo\")))].into(),\n                            )]\n                            .into(),\n                        ),\n                    ]\n                    .into(),\n                ),\n            ),\n            (\n                \"y\",\n                Vector(\n                    [Tuple(\n                        [\n                            Tuple([].into()),\n                            Tuple([I32(7)].into()),\n                            Tuple([F32(8.0), Bool(true)].into()),\n                        ]\n                        .into(),\n                    )]\n                    .into(),\n                ),\n            ),\n        ]\n        .into(),\n    );\n\n    case.checks.push(AssertEqual(\n        Call(Export(\"check_combo\").into(), [foo].into()).into(),\n        Str(\"Foo { x: (Bar { x: 5, y: [Foo { x: (Bar { x: 1, y: [] }, \\\n        [Bar { x: 2, y: [] }]), y: [((), (3,), (4.0, true))] }, \\\n        Foo { x: (Bar { x: 1, y: [] }, [Bar { x: 2, y: [] }]), y: [((), (3,), (4.0, true))] }] }, \\\n        [Bar { x: 6, y: [] }]), y: [((), (7,), (8.0, true))] }\")\n        .into(),\n    ));\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_combo_out.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        #[derive(PartialEq)]\n        pub struct Foo {\n            // Note: One purpose of this test is to cover our manual \"Equatable\"\n            // implementation in Swift, since tuples aren't equatable in Swift.\n            pub x: (Bar, Vec<Bar>),\n            pub y: Vec<((), (i32,), (f32, bool))>,\n        }\n\n        #[derive(PartialEq)]\n        pub struct Bar {\n            pub x: i32,\n            pub y: Vec<Foo>,\n        }\n\n        pub fn check_combo1() -> Foo {\n            Foo {\n                x: (\n                    Bar { x: 1, y: vec![] },\n                    vec![Bar { x: 2, y: vec![] }],\n                ),\n                y: vec![((), (3,), (4.0, true))],\n            }\n        }\n\n        pub fn check_combo2() -> Foo {\n            Foo {\n                x: (\n                    Bar { x: 5, y: vec![check_combo1(), check_combo1()] },\n                    vec![Bar { x: 6, y: vec![] }],\n                ),\n                y: vec![((), (7,), (8.0, true))],\n            }\n        }\n        \"#;\n\n    let mut foo = Struct(\n        \"Foo\",\n        [\n            (\n                \"x\",\n                Tuple(\n                    [\n                        Struct(\n                            \"Bar\",\n                            [(\"x\", I32(1)), (\"y\", EmptyVector(TyName(\"Foo\")))].into(),\n                        ),\n                        Vector(\n                            [Struct(\n                                \"Bar\",\n                                [(\"x\", I32(2)), (\"y\", EmptyVector(TyName(\"Foo\")))].into(),\n                            )]\n                            .into(),\n                        ),\n                    ]\n                    .into(),\n                ),\n            ),\n            (\n                \"y\",\n                Vector(\n                    [Tuple(\n                        [\n                            Tuple([].into()),\n                            Tuple([I32(3)].into()),\n                            Tuple([F32(4.0), Bool(true)].into()),\n                        ]\n                        .into(),\n                    )]\n                    .into(),\n                ),\n            ),\n        ]\n        .into(),\n    );\n\n    case.checks = vec![AssertEqual(\n        Call(Export(\"check_combo1\").into(), [].into()).into(),\n        foo.clone().into(),\n    )];\n\n    foo = Struct(\n        \"Foo\",\n        [\n            (\n                \"x\",\n                Tuple(\n                    [\n                        Struct(\n                            \"Bar\",\n                            [\n                                (\"x\", I32(5)),\n                                (\"y\", Vector([foo.clone(), foo.clone()].into())),\n                            ]\n                            .into(),\n                        ),\n                        Vector(\n                            [Struct(\n                                \"Bar\",\n                                [(\"x\", I32(6)), (\"y\", EmptyVector(TyName(\"Foo\")))].into(),\n                            )]\n                            .into(),\n                        ),\n                    ]\n                    .into(),\n                ),\n            ),\n            (\n                \"y\",\n                Vector(\n                    [Tuple(\n                        [\n                            Tuple([].into()),\n                            Tuple([I32(7)].into()),\n                            Tuple([F32(8.0), Bool(true)].into()),\n                        ]\n                        .into(),\n                    )]\n                    .into(),\n                ),\n            ),\n        ]\n        .into(),\n    );\n\n    case.checks = vec![AssertEqual(\n        Call(Export(\"check_combo2\").into(), [].into()).into(),\n        foo.into(),\n    )];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_enum_in.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        pub enum Foo {\n            Zero,\n            One,\n            Hundred = 100,\n        }\n        pub fn foo_to_i32(foo: Foo) -> i32 {\n            foo as i32\n        }\n\n        pub enum Big {\n            Min = -0x8000_0000,\n            Max = 0x7fff_ffff,\n        }\n        pub fn big_to_i32(big: Big) -> i32 {\n            big as i32\n        }\n\n        // Also test code generation for enums with many members\n        pub enum LongEnum {\n            Empty,\n            ShortTuple(i32),\n            ShortStruct { a: i32, },\n            LongTuple(i32, i32, i32, i32, i32, i32, i32, i32),\n            LongStruct { a: i32, b: i32, c: i32, d: i32, e: i32, f: i32 },\n        }\n        pub fn long_in(_: LongEnum) {}\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            Call(Export(\"foo_to_i32\").into(), [Enum(\"Foo\", \"Zero\")].into()).into(),\n            I32(0).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"foo_to_i32\").into(), [Enum(\"Foo\", \"One\")].into()).into(),\n            I32(1).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"foo_to_i32\").into(), [Enum(\"Foo\", \"Hundred\")].into()).into(),\n            I32(100).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"big_to_i32\").into(), [Enum(\"Big\", \"Min\")].into()).into(),\n            I32(-0x8000_0000).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"big_to_i32\").into(), [Enum(\"Big\", \"Max\")].into()).into(),\n            I32(0x7fff_ffff).into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_enum_out.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        pub enum Foo {\n            Zero,\n            One,\n            Hundred = 100,\n        }\n        pub fn i32_to_foo(foo: i32) -> Foo {\n            match foo {\n                0 => Foo::Zero,\n                1 => Foo::One,\n                2 => Foo::Hundred,\n                _ => panic!(),\n            }\n        }\n\n        pub enum Big {\n            Min = -0x8000_0000,\n            Max = 0x7fff_ffff,\n        }\n        pub fn i32_to_big(big: i32) -> Big {\n            match big {\n                0 => Big::Min,\n                1 => Big::Max,\n                _ => panic!(),\n            }\n        }\n\n        // Also test code generation for enums with many members\n        pub enum LongEnum {\n            Empty,\n            ShortTuple(i32),\n            ShortStruct { a: i32, },\n            LongTuple(i32, i32, i32, i32, i32, i32, i32, i32),\n            LongStruct { a: i32, b: i32, c: i32, d: i32, e: i32, f: i32 },\n        }\n        pub fn long_out() -> LongEnum {\n            LongEnum::Empty\n        }\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            Call(Export(\"i32_to_foo\").into(), [I32(0)].into()).into(),\n            Enum(\"Foo\", \"Zero\").into(),\n        ),\n        AssertEqual(\n            Call(Export(\"i32_to_foo\").into(), [I32(1)].into()).into(),\n            Enum(\"Foo\", \"One\").into(),\n        ),\n        AssertEqual(\n            Call(Export(\"i32_to_foo\").into(), [I32(2)].into()).into(),\n            Enum(\"Foo\", \"Hundred\").into(),\n        ),\n        AssertEqual(\n            Call(Export(\"i32_to_big\").into(), [I32(0)].into()).into(),\n            Enum(\"Big\", \"Min\").into(),\n        ),\n        AssertEqual(\n            Call(Export(\"i32_to_big\").into(), [I32(1)].into()).into(),\n            Enum(\"Big\", \"Max\").into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_nested_in.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        use std::rc::Rc;\n\n        pub struct Foo {\n            #[allow(unused)] empty: (),\n            ptr: Rc<dyn Bar>,\n        }\n\n        pub trait Bar {\n            fn get(&self) -> i32;\n        }\n\n        pub fn test(x: (i32, Foo, Vec<(i32, Foo)>)) -> i32 {\n            let mut total = x.0 + x.1.ptr.get();\n            for y in &x.2 {\n                total += y.0 + y.1.ptr.get();\n            }\n            total\n        }\n    \"#;\n\n    case.js_pre = \"\n        class BarImpl {\n            get() {\n                return 20\n            }\n        }\n    \";\n\n    case.swift_pre = \"\n        var counter = 0\n\n        class BarImpl : Bar {\n            init() {\n                counter += 1\n            }\n            deinit {\n                counter -= 1\n            }\n            func get() -> Int32 {\n                return 20\n            }\n        }\n    \";\n\n    case.cpp_pre = \"\n        int counter = 0;\n\n        struct BarImpl : rust::Bar {\n            BarImpl() {\n                counter += 1;\n            }\n            ~BarImpl() {\n                counter -= 1;\n            }\n            int32_t get() {\n                return 20;\n            }\n        };\n    \";\n\n    case.checks = vec![\n        AssertEqual(\n            Call(\n                Export(\"test\").into(),\n                [Tuple(\n                    [\n                        I32(10),\n                        Struct(\n                            \"Foo\",\n                            [\n                                (\"empty\", Tuple([].into())),\n                                (\"ptr\", NewRc(TyName(\"Bar\"), \"BarImpl\", [].into())),\n                            ]\n                            .into(),\n                        ),\n                        EmptyVector(TyTuple([TyI32, TyName(\"Foo\")].into()).into()),\n                    ]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            I32(30).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"test\").into(),\n                [Tuple(\n                    [\n                        I32(1),\n                        Struct(\n                            \"Foo\",\n                            [\n                                (\"empty\", Tuple([].into())),\n                                (\"ptr\", NewRc(TyName(\"Bar\"), \"BarImpl\", [].into())),\n                            ]\n                            .into(),\n                        ),\n                        Vector(\n                            [\n                                Tuple(\n                                    [\n                                        I32(5),\n                                        Struct(\n                                            \"Foo\",\n                                            [\n                                                (\"empty\", Tuple([].into())),\n                                                (\"ptr\", NewRc(TyName(\"Bar\"), \"BarImpl\", [].into())),\n                                            ]\n                                            .into(),\n                                        ),\n                                    ]\n                                    .into(),\n                                ),\n                                Tuple(\n                                    [\n                                        I32(600),\n                                        Struct(\n                                            \"Foo\",\n                                            [\n                                                (\"empty\", Tuple([].into())),\n                                                (\"ptr\", NewRc(TyName(\"Bar\"), \"BarImpl\", [].into())),\n                                            ]\n                                            .into(),\n                                        ),\n                                    ]\n                                    .into(),\n                                ),\n                            ]\n                            .into(),\n                        ),\n                    ]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            I32(666).into(),\n        ),\n    ];\n\n    case.swift_post = r#\"\n        assert(counter == 0, \"\\(counter) == \\(0)\")\n    \"#;\n\n    case.cpp_post = \"\n        assert(counter == 0);\n    \";\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_nested_out.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        use std::rc::Rc;\n\n        pub struct Foo {\n            ptr: Rc<dyn Bar>,\n        }\n\n        pub trait Bar {\n            fn get(&self) -> i32;\n        }\n\n        struct BarImpl(i32);\n\n        impl Bar for BarImpl {\n            fn get(&self) -> i32 {\n                self.0\n            }\n        }\n\n        pub fn test(x: i32) -> (i32, Foo) {\n            (x, Foo { ptr: Rc::new(BarImpl(-x)) })\n        }\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            TupleMember(Call(Export(\"test\").into(), [I32(123)].into()).into(), 0).into(),\n            I32(123).into(),\n        ),\n        AssertEqual(\n            CallMethod(\n                StructMember(\n                    TupleMember(Call(Export(\"test\").into(), [I32(123)].into()).into(), 1).into(),\n                    \"ptr\",\n                )\n                .into(),\n                \"get\",\n                [].into(),\n            )\n            .into(),\n            I32(-123).into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_option_in.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        pub fn add_option(x: Option<i32>, y: Option<i32>) -> i32 {\n            x.unwrap_or(0) + y.unwrap_or(0)\n        }\n\n        pub fn add_nested(x: Option<Option<i32>>, y: Option<Option<i32>>) -> i32 {\n            x.unwrap_or(None).unwrap_or(0) + y.unwrap_or(None).unwrap_or(0)\n        }\n\n        pub fn add_all(x: Vec<Option<i32>>) -> i32 {\n            x.iter().map(|x| x.unwrap_or(0)).sum()\n        }\n\n        pub fn join_all(x: Vec<Option<String>>) -> String {\n            x.iter().map(|x| x.as_ref().map(String::as_str).unwrap_or(\"\")).collect::<Vec<_>>().join(\"\")\n        }\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            Call(\n                Export(\"add_option\").into(),\n                [OptNone(TyI32), OptNone(TyI32)].into(),\n            )\n            .into(),\n            I32(0).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"add_option\").into(),\n                [OptSome(I32(1).into()), OptNone(TyI32)].into(),\n            )\n            .into(),\n            I32(1).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"add_option\").into(),\n                [OptNone(TyI32), OptSome(I32(2).into())].into(),\n            )\n            .into(),\n            I32(2).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"add_option\").into(),\n                [OptSome(I32(1).into()), OptSome(I32(2).into())].into(),\n            )\n            .into(),\n            I32(3).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"add_all\").into(),\n                [Vector(\n                    [\n                        OptNone(TyI32),\n                        OptSome(I32(100).into()),\n                        OptNone(TyI32),\n                        OptSome(I32(20).into()),\n                        OptNone(TyI32),\n                        OptSome(I32(3).into()),\n                        OptNone(TyI32),\n                    ]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            I32(123).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"add_nested\").into(),\n                [\n                    OptNone(TyOption(TyI32.into())),\n                    OptNone(TyOption(TyI32.into())),\n                ]\n                .into(),\n            )\n            .into(),\n            I32(0).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"add_nested\").into(),\n                [\n                    OptSome(OptSome(I32(-1).into()).into()),\n                    OptSome(OptNone(TyI32).into()),\n                ]\n                .into(),\n            )\n            .into(),\n            I32(-1).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"add_nested\").into(),\n                [\n                    OptSome(OptNone(TyI32).into()),\n                    OptSome(OptSome(I32(-2).into()).into()),\n                ]\n                .into(),\n            )\n            .into(),\n            I32(-2).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"add_nested\").into(),\n                [\n                    OptSome(OptSome(I32(-1).into()).into()),\n                    OptSome(OptSome(I32(-2).into()).into()),\n                ]\n                .into(),\n            )\n            .into(),\n            I32(-3).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"join_all\").into(),\n                [Vector(\n                    [\n                        OptNone(TyString),\n                        OptSome(Str(\"abc\").into()),\n                        OptNone(TyString),\n                        OptSome(Str(\"xy\").into()),\n                        OptNone(TyString),\n                        OptSome(Str(\"z\").into()),\n                        OptNone(TyString),\n                    ]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Str(\"abcxyz\").into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_option_out.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        pub fn opt_int(x: bool, y: i32) -> Option<i32> {\n            x.then(|| y)\n        }\n\n        pub fn opt_opt_int(x: bool, y: bool, z: i32) -> Option<Option<i32>> {\n            x.then(|| y.then(|| z))\n        }\n\n        pub fn vec_opt_int(n: i32) -> Vec<Option<i32>> {\n            (0..n).map(|x| (x % 3 != 0 && x % 5 != 0).then_some(x)).collect()\n        }\n\n        pub fn opt_vec_opt_string(n: i32) -> Option<Vec<Option<String>>> {\n            if n < 1 {\n                None\n            } else {\n                Some((0..n).map(|x| (x % 3 != 0 && x % 5 != 0).then_some(x.to_string())).collect())\n            }\n        }\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            Call(Export(\"opt_int\").into(), [Bool(false), I32(10)].into()).into(),\n            OptNone(TyI32.into()).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"opt_int\").into(), [Bool(true), I32(10)].into()).into(),\n            OptSome(I32(10).into()).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"opt_opt_int\").into(),\n                [Bool(false), Bool(false), I32(30)].into(),\n            )\n            .into(),\n            OptNone(TyOption(TyI32.into())).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"opt_opt_int\").into(),\n                [Bool(true), Bool(false), I32(30)].into(),\n            )\n            .into(),\n            OptSome(OptNone(TyI32.into()).into()).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"opt_opt_int\").into(),\n                [Bool(true), Bool(true), I32(30)].into(),\n            )\n            .into(),\n            OptSome(OptSome(I32(30).into()).into()).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"vec_opt_int\").into(), [I32(10)].into()).into(),\n            Vector(\n                [\n                    OptNone(TyI32.into()),\n                    OptSome(I32(1).into()),\n                    OptSome(I32(2).into()),\n                    OptNone(TyI32.into()),\n                    OptSome(I32(4).into()),\n                    OptNone(TyI32.into()),\n                    OptNone(TyI32.into()),\n                    OptSome(I32(7).into()),\n                    OptSome(I32(8).into()),\n                    OptNone(TyI32.into()),\n                ]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertEqual(\n            Call(Export(\"opt_vec_opt_string\").into(), [I32(10)].into()).into(),\n            OptSome(\n                Vector(\n                    [\n                        OptNone(TyString.into()),\n                        OptSome(Str(\"1\").into()),\n                        OptSome(Str(\"2\").into()),\n                        OptNone(TyString.into()),\n                        OptSome(Str(\"4\").into()),\n                        OptNone(TyString.into()),\n                        OptNone(TyString.into()),\n                        OptSome(Str(\"7\").into()),\n                        OptSome(Str(\"8\").into()),\n                        OptNone(TyString.into()),\n                    ]\n                    .into(),\n                )\n                .into(),\n            )\n            .into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_payload_in.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        #[derive(Debug, Eq, PartialEq)]\n        pub enum Foo {\n            Empty,\n            Single(i32),\n            Point { x: i32, y: i32 },\n            Nested(Box<Foo>),\n        }\n\n        pub fn set_tests(tests: Vec<Foo>) -> bool {\n            assert_eq!(tests, vec![\n                Foo::Empty,\n                Foo::Single(123),\n                Foo::Point { x: 1, y: -2 },\n                Foo::Nested(Box::new(Foo::Nested(Box::new(Foo::Single(-321))))),\n            ]);\n            true\n        }\n    \"#;\n\n    case.checks = vec![AssertEqual(\n        Call(\n            Export(\"set_tests\").into(),\n            [Vector(\n                [\n                    EnumPayload(\"Foo\", \"Empty\", [].into()),\n                    EnumPayload(\"Foo\", \"Single\", [(\"0\", I32(123))].into()),\n                    EnumPayload(\"Foo\", \"Point\", [(\"x\", I32(1)), (\"y\", I32(-2))].into()),\n                    EnumPayload(\n                        \"Foo\",\n                        \"Nested\",\n                        [(\n                            \"0\",\n                            Boxed(\n                                TyName(\"Foo\"),\n                                EnumPayload(\n                                    \"Foo\",\n                                    \"Nested\",\n                                    [(\n                                        \"0\",\n                                        Boxed(\n                                            TyName(\"Foo\"),\n                                            EnumPayload(\"Foo\", \"Single\", [(\"0\", I32(-321))].into())\n                                                .into(),\n                                        )\n                                        .into(),\n                                    )]\n                                    .into(),\n                                )\n                                .into(),\n                            ),\n                        )]\n                        .into(),\n                    ),\n                ]\n                .into(),\n            )\n            .into()]\n            .into(),\n        )\n        .into(),\n        Bool(true).into(),\n    )];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_payload_out.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        #[derive(Eq, PartialEq)]\n        pub enum Foo {\n            Empty,\n            Single(i32),\n            Point { x: i32, y: i32 },\n            Nested(Box<Foo>),\n        }\n\n        pub fn get_tests() -> Vec<Foo> {\n            vec![\n                Foo::Empty,\n                Foo::Single(123),\n                Foo::Point { x: 1, y: -2 },\n                Foo::Nested(Box::new(Foo::Nested(Box::new(Foo::Single(-321))))),\n            ]\n        }\n    \"#;\n\n    case.checks = vec![AssertEqual(\n        Call(Export(\"get_tests\").into(), [].into()).into(),\n        Vector(\n            [\n                EnumPayload(\"Foo\", \"Empty\", [].into()),\n                EnumPayload(\"Foo\", \"Single\", [(\"0\", I32(123))].into()),\n                EnumPayload(\"Foo\", \"Point\", [(\"x\", I32(1)), (\"y\", I32(-2))].into()),\n                EnumPayload(\n                    \"Foo\",\n                    \"Nested\",\n                    [(\n                        \"0\",\n                        Boxed(\n                            TyName(\"Foo\"),\n                            EnumPayload(\n                                \"Foo\",\n                                \"Nested\",\n                                [(\n                                    \"0\",\n                                    Boxed(\n                                        TyName(\"Foo\"),\n                                        EnumPayload(\"Foo\", \"Single\", [(\"0\", I32(-321))].into())\n                                            .into(),\n                                    )\n                                    .into(),\n                                )]\n                                .into(),\n                            )\n                            .into(),\n                        ),\n                    )]\n                    .into(),\n                ),\n            ]\n            .into(),\n        )\n        .into(),\n    )];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_string.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        use std::cell::UnsafeCell;\n\n        // Can't use \"Mutex\" because it allocates memory and throws off our memory check\n        struct Wrapper(UnsafeCell<Option<String>>);\n        unsafe impl Sync for Wrapper {}\n        static STRING: Wrapper = Wrapper(UnsafeCell::new(None));\n\n        // This prepares for the memory leak check at the end\n        pub fn reset() {\n            unsafe { *STRING.0.get() = None; }\n        }\n\n        pub fn get_string_len() -> i32 {\n            let x = unsafe { (*STRING.0.get()).as_ref() };\n            x.map(|x| x.len()).unwrap_or(0) as i32\n        }\n\n        pub fn get_string() -> String {\n            let x = unsafe { (*STRING.0.get()).as_ref() };\n            x.map(|x| x.as_str()).unwrap_or(\"\").to_string()\n        }\n\n        pub fn set_string(x: String) {\n            unsafe { *STRING.0.get() = Some(x); }\n        }\n\n        pub fn set_str(x: &str) {\n            unsafe { *STRING.0.get() = Some(x.to_string()); }\n        }\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            Call(Export(\"get_string_len\").into(), [].into()).into(),\n            I32(0).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"get_string\").into(), [].into()).into(),\n            Str(\"\").into(),\n        ),\n        Call(Export(\"set_string\").into(), [Str(\"abc\")].into()).into(),\n        AssertEqual(\n            Call(Export(\"get_string_len\").into(), [].into()).into(),\n            I32(3).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"get_string\").into(), [].into()).into(),\n            Str(\"abc\").into(),\n        ),\n        Call(Export(\"set_string\").into(), [Str(\"\\0\\r\\n\\u{1f980}\")].into()),\n        AssertEqual(\n            Call(Export(\"get_string_len\").into(), [].into()).into(),\n            I32(7).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"get_string\").into(), [].into()).into(),\n            Str(\"\\0\\r\\n\\u{1f980}\").into(),\n        ),\n        Call(Export(\"set_str\").into(), [Str(\"<<<\\0>>>\")].into()),\n        AssertEqual(\n            Call(Export(\"get_string_len\").into(), [].into()).into(),\n            I32(7).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"get_string\").into(), [].into()).into(),\n            Str(\"<<<\\0>>>\").into(),\n        ),\n        Call(Export(\"reset\").into(), [].into()),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_struct_in.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        pub struct EmptyStruct;\n        pub struct SingleElementStruct(i32);\n        pub struct PairStruct { x: f32, y: f32 }\n\n        pub fn empty_tuple(x: i32, #[allow(unused)] foo: EmptyStruct, y: i32) -> i32 {\n            x + y\n        }\n\n        pub fn single_element_tuple(x: SingleElementStruct, y: SingleElementStruct) -> i32 {\n            x.0 + y.0\n        }\n\n        pub fn multiply_pairs(ab: PairStruct, cd: PairStruct) -> f32 {\n            let PairStruct { x: a, y: b } = ab;\n            let PairStruct { x: c, y: d } = cd;\n            a * c - b * d\n        }\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            Call(\n                Export(\"empty_tuple\").into(),\n                [I32(10), Struct(\"EmptyStruct\", [].into()), I32(20)].into(),\n            )\n            .into(),\n            I32(30).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"single_element_tuple\").into(),\n                [\n                    Struct(\"SingleElementStruct\", [(\"0\", I32(10))].into()),\n                    Struct(\"SingleElementStruct\", [(\"0\", I32(20))].into()),\n                ]\n                .into(),\n            )\n            .into(),\n            I32(30).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"multiply_pairs\").into(),\n                [\n                    Struct(\"PairStruct\", [(\"x\", F32(2.0)), (\"y\", F32(3.0))].into()),\n                    Struct(\"PairStruct\", [(\"x\", F32(5.0)), (\"y\", F32(7.0))].into()),\n                ]\n                .into(),\n            )\n            .into(),\n            F32(-11.0).into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_struct_out.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        #[derive(PartialEq)]\n        pub struct EmptyStruct;\n\n        #[derive(PartialEq)]\n        pub struct SingleElementStruct(i32);\n\n        #[derive(PartialEq)]\n        pub struct PairStruct { x: f32, y: f32 }\n\n        pub fn empty_struct() -> EmptyStruct {\n            EmptyStruct\n        }\n\n        pub fn single_element_struct(x: i32) -> SingleElementStruct {\n            SingleElementStruct(x)\n        }\n\n        pub fn make_pair(x: f32, y: f32) -> PairStruct {\n            PairStruct { x, y }\n        }\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            Call(Export(\"empty_struct\").into(), [].into()).into(),\n            Struct(\"EmptyStruct\", [].into()).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"single_element_struct\").into(), [I32(10)].into()).into(),\n            Struct(\"SingleElementStruct\", [(\"0\", I32(10))].into()).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"make_pair\").into(), [F32(2.0), F32(3.0)].into()).into(),\n            Struct(\"PairStruct\", [(\"x\", F32(2.0)), (\"y\", F32(3.0))].into()).into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_tuple_in.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        pub fn empty_tuple(x: i32, #[allow(unused)] foo: (), y: i32) -> i32 {\n            x + y\n        }\n        pub fn single_element_tuple(x: (i32,), y: (i32,)) -> i32 {\n            x.0 + y.0\n        }\n        pub fn multiply_pairs(ab: (f32, f32), cd: (f32, f32)) -> f32 {\n            let (a, b) = ab;\n            let (c, d) = cd;\n            a * c - b * d\n        }\n        pub fn nesting(x: (i32, (), (i32, (i32,)))) -> i32 {\n            x.0 + x.2.0 + x.2.1.0\n        }\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            Call(\n                Export(\"empty_tuple\").into(),\n                [I32(10), Tuple([].into()), I32(20)].into(),\n            )\n            .into(),\n            I32(30).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"single_element_tuple\").into(),\n                [Tuple([I32(10)].into()), Tuple([I32(20)].into())].into(),\n            )\n            .into(),\n            I32(30).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"multiply_pairs\").into(),\n                [\n                    Tuple([F32(2.0), F32(3.0)].into()),\n                    Tuple([F32(5.0), F32(7.0)].into()),\n                ]\n                .into(),\n            )\n            .into(),\n            F32(-11.0).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"nesting\").into(),\n                [Tuple(\n                    [\n                        I32(10),\n                        Tuple([].into()),\n                        Tuple([I32(20), Tuple([I32(30)].into())].into()),\n                    ]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            I32(60).into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_tuple_out.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        pub fn single_element_tuple(x: i32) -> (i32,) {\n            (-x,)\n        }\n        pub fn return_pair(x: f32, y: bool) -> (f32, bool) {\n            (-x, !y)\n        }\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            Call(Export(\"single_element_tuple\").into(), [I32(123)].into()).into(),\n            Tuple([I32(-123)].into()).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"return_pair\").into(), [F32(1.23), Bool(true)].into()).into(),\n            Tuple([F32(-1.23), Bool(false)].into()).into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_vec_in.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        pub fn sum_u8(values: Vec<u8>) -> u8 { values.iter().sum() }\n        pub fn sum_u16(values: Vec<u16>) -> u16 { values.iter().sum() }\n        pub fn sum_u32(values: Vec<u32>) -> u32 { values.iter().sum() }\n        pub fn sum_usize(values: Vec<usize>) -> usize { values.iter().sum() }\n        pub fn sum_u64(values: Vec<u64>) -> u64 { values.iter().sum() }\n\n        pub fn sum_i8(values: Vec<i8>) -> i8 { values.iter().sum() }\n        pub fn sum_i16(values: Vec<i16>) -> i16 { values.iter().sum() }\n        pub fn sum_i32(values: Vec<i32>) -> i32 { values.iter().sum() }\n        pub fn sum_isize(values: Vec<isize>) -> isize { values.iter().sum() }\n        pub fn sum_i64(values: Vec<i64>) -> i64 { values.iter().sum() }\n\n        // Note: Rust changed how \"sum()\" behaves in version 1.82.0. It used\n        // to return +0.0 when empty but now returns -0.0. Detect this case and\n        // deliberately always return -0.0 to make this pass with older Rust.\n        // https://github.com/rust-lang/rust/commit/490818851860fb257e23fe7aa0ee32eaffc4ba40\n        pub fn sum_f32(values: Vec<f32>) -> f32 {\n            if values.is_empty() { -0.0 } else { values.iter().sum() }\n        }\n        pub fn sum_f64(values: Vec<f64>) -> f64 {\n            if values.is_empty() { -0.0 } else { values.iter().sum() }\n        }\n\n        pub fn check_nested(values: Vec<Vec<i32>>) -> String {\n            format!(\"{values:?}\")\n        }\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            Call(Export(\"sum_u8\").into(), [EmptyVector(TyU8)].into()).into(),\n            U8(0).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"sum_u16\").into(), [EmptyVector(TyU16)].into()).into(),\n            U16(0).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"sum_u32\").into(), [EmptyVector(TyU32)].into()).into(),\n            U32(0).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"sum_usize\").into(), [EmptyVector(TyUsize)].into()).into(),\n            Usize(0).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"sum_u64\").into(), [EmptyVector(TyU64)].into()).into(),\n            U64(0).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"sum_i8\").into(), [EmptyVector(TyI8)].into()).into(),\n            I8(0).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"sum_i16\").into(), [EmptyVector(TyI16)].into()).into(),\n            I16(0).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"sum_i32\").into(), [EmptyVector(TyI32)].into()).into(),\n            I32(0).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"sum_isize\").into(), [EmptyVector(TyIsize)].into()).into(),\n            Isize(0).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"sum_i64\").into(), [EmptyVector(TyI64)].into()).into(),\n            I64(0).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"sum_f32\").into(), [EmptyVector(TyF32)].into()).into(),\n            F32(-0.0).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"sum_f64\").into(), [EmptyVector(TyF64)].into()).into(),\n            F64(-0.0).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"sum_u8\").into(),\n                [Vector([U8(10), U8(20), U8(30)].into())].into(),\n            )\n            .into(),\n            U8(60).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"sum_u16\").into(),\n                [Vector([U16(10), U16(20), U16(30)].into())].into(),\n            )\n            .into(),\n            U16(60).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"sum_u32\").into(),\n                [Vector([U32(10), U32(20), U32(30)].into())].into(),\n            )\n            .into(),\n            U32(60).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"sum_isize\").into(),\n                [Vector([Isize(10), Isize(20), Isize(30)].into())].into(),\n            )\n            .into(),\n            Isize(60).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"sum_u64\").into(),\n                [Vector([U64(10), U64(20), U64(30)].into())].into(),\n            )\n            .into(),\n            U64(60).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"sum_i8\").into(),\n                [Vector([I8(10), I8(20), I8(30)].into())].into(),\n            )\n            .into(),\n            I8(60).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"sum_i16\").into(),\n                [Vector([I16(10), I16(20), I16(30)].into())].into(),\n            )\n            .into(),\n            I16(60).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"sum_i32\").into(),\n                [Vector([I32(10), I32(20), I32(30)].into())].into(),\n            )\n            .into(),\n            I32(60).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"sum_i64\").into(),\n                [Vector([I64(10), I64(20), I64(30)].into())].into(),\n            )\n            .into(),\n            I64(60).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"sum_f32\").into(),\n                [Vector([F32(1.5), F32(2.5), F32(3.5)].into())].into(),\n            )\n            .into(),\n            F32(7.5).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"sum_f64\").into(),\n                [Vector([F64(1.5), F64(2.5), F64(3.5)].into())].into(),\n            )\n            .into(),\n            F64(7.5).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"sum_i32\").into(),\n                [Vector(\n                    [\n                        I32(1),\n                        I32(2),\n                        I32(3),\n                        I32(4),\n                        I32(5),\n                        I32(6),\n                        I32(7),\n                        I32(8),\n                        I32(9),\n                        I32(10),\n                    ]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            I32(55).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"sum_u64\").into(),\n                [Vector(\n                    [\n                        U64(1),\n                        U64(2),\n                        U64(3),\n                        U64(4),\n                        U64(5),\n                        U64(6),\n                        U64(7),\n                        U64(8),\n                        U64(9),\n                        U64(10),\n                    ]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            U64(55).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"check_nested\").into(),\n                [Vector(\n                    [\n                        EmptyVector(TyI32),\n                        Vector([I32(1)].into()),\n                        Vector([I32(2), I32(3)].into()),\n                        Vector([I32(4), I32(5), I32(6)].into()),\n                        Vector([I32(7), I32(8), I32(9), I32(10)].into()),\n                    ]\n                    .into(),\n                )]\n                .into(),\n            )\n            .into(),\n            Str(\"[[], [1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]\").into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/fn_vec_out.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        pub fn get_vec(n: i32) -> Vec<i32> {\n            let mut vec = Vec::new();\n            for i in 0..n {\n                vec.push(i * 10);\n            }\n            vec\n        }\n\n        pub fn check_nested() -> Vec<Vec<i32>> {\n            vec![vec![], vec![1], vec![2, 3], vec![4, 5, 6], vec![7, 8, 9, 10]]\n        }\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            VectorLen(Call(Export(\"get_vec\").into(), [I32(0)].into()).into()).into(),\n            Usize(0).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"get_vec\").into(), [I32(3)].into()).into(),\n            Vector([I32(0), I32(10), I32(20)].into()).into(),\n        ),\n        AssertEqual(\n            Call(Export(\"get_vec\").into(), [I32(10)].into()).into(),\n            Vector(\n                [\n                    I32(0),\n                    I32(10),\n                    I32(20),\n                    I32(30),\n                    I32(40),\n                    I32(50),\n                    I32(60),\n                    I32(70),\n                    I32(80),\n                    I32(90),\n                ]\n                .into(),\n            )\n            .into(),\n        ),\n        AssertEqual(\n            Call(Export(\"check_nested\").into(), [].into()).into(),\n            Vector(\n                [\n                    EmptyVector(TyI32),\n                    Vector([I32(1)].into()),\n                    Vector([I32(2), I32(3)].into()),\n                    Vector([I32(4), I32(5), I32(6)].into()),\n                    Vector([I32(7), I32(8), I32(9), I32(10)].into()),\n                ]\n                .into(),\n            )\n            .into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/mod.rs",
    "content": "use super::*;\n\nmod demo_app;\nmod demo_const;\nmod demo_derive_eq;\nmod demo_enum;\nmod demo_keyword;\nmod demo_order;\nmod demo_trait;\n\nmod fn_basic;\nmod fn_basic_void;\nmod fn_box_in;\nmod fn_box_out;\nmod fn_combo_in;\nmod fn_combo_out;\nmod fn_enum_in;\nmod fn_enum_out;\nmod fn_nested_in;\nmod fn_nested_out;\nmod fn_option_in;\nmod fn_option_out;\nmod fn_payload_in;\nmod fn_payload_out;\nmod fn_string;\nmod fn_struct_in;\nmod fn_struct_out;\nmod fn_tuple_in;\nmod fn_tuple_out;\nmod fn_vec_in;\nmod fn_vec_out;\n\nmod trait_enum;\nmod trait_export;\nmod trait_export_import;\nmod trait_export_nested;\nmod trait_import;\nmod trait_import_export;\nmod trait_import_nested;\nmod trait_import_struct_in;\nmod trait_import_tuple_in;\nmod trait_string;\n"
  },
  {
    "path": "src/tests/cases/trait_enum.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        pub trait Foo {\n            fn set_enum(&self, bar: Bar);\n            fn get_enum(&self) -> Bar;\n        }\n\n        pub fn get_foo() -> Box<dyn Foo> {\n            struct FooImpl;\n            impl Foo for FooImpl {\n                fn set_enum(&self, bar: Bar) {\n                    assert_eq!(bar, Bar::C);\n                }\n                fn get_enum(&self) -> Bar {\n                    Bar::B\n                }\n            }\n            Box::new(FooImpl)\n        }\n\n        #[derive(Debug, Eq, PartialEq)]\n        pub enum Bar {\n            A,\n            B,\n            C,\n        }\n    \"#;\n\n    case.checks = vec![\n        DeclareImmutableLocal(\"foo\", Call(Export(\"get_foo\").into(), [].into()).into()),\n        CallMethod(\n            LoadLocal(\"foo\").into(),\n            \"set_enum\",\n            [Enum(\"Bar\", \"C\")].into(),\n        ),\n        AssertEqual(\n            CallMethod(LoadLocal(\"foo\").into(), \"get_enum\", [].into()).into(),\n            Enum(\"Bar\", \"B\").into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/trait_export.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        use std::rc::Rc;\n\n        pub trait Adder {\n            fn add(&self, x: i32) -> i32;\n        }\n\n        struct AdderImpl(i32);\n        static mut COUNTER: u32 = 0;\n\n        pub fn get_counter() -> u32 {\n            unsafe { COUNTER }\n        }\n\n        impl Adder for AdderImpl {\n            fn add(&self, x: i32) -> i32 {\n                self.0 + x\n            }\n        }\n\n        impl Drop for AdderImpl {\n            fn drop(&mut self) {\n                unsafe { COUNTER -= 1; }\n            }\n        }\n\n        pub fn get_adder_rc(x: i32) -> Rc<dyn Adder> {\n            unsafe { COUNTER += 1; }\n            Rc::new(AdderImpl(x))\n        }\n\n        pub fn get_adder_box(x: i32) -> Box<dyn Adder> {\n            unsafe { COUNTER += 1; }\n            Box::new(AdderImpl(x))\n        }\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            CallMethod(\n                Call(Export(\"get_adder_rc\").into(), [I32(20)].into()).into(),\n                \"add\",\n                [I32(10)].into(),\n            )\n            .into(),\n            I32(30).into(),\n        ),\n        AfterGC(\n            AssertEqual(\n                Call(Export(\"get_counter\").into(), [].into()).into(),\n                U32(0).into(),\n            )\n            .into(),\n        ),\n        AssertEqual(\n            CallMethod(\n                Call(Export(\"get_adder_box\").into(), [I32(20)].into()).into(),\n                \"add\",\n                [I32(10)].into(),\n            )\n            .into(),\n            I32(30).into(),\n        ),\n        AfterGC(\n            AssertEqual(\n                Call(Export(\"get_counter\").into(), [].into()).into(),\n                U32(0).into(),\n            )\n            .into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/trait_export_import.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        use std::rc::Rc;\n\n        pub trait Imported {\n            fn add(&self, x: i32, y: i32) -> i32;\n        }\n\n        pub trait Exported {\n            fn run(&self, imported: Rc<dyn Imported>) -> i32;\n        }\n\n        struct ExportedImpl;\n\n        impl Exported for ExportedImpl {\n            fn run(&self, imported: Rc<dyn Imported>) -> i32 {\n                imported.add(1, 2)\n            }\n        }\n\n        static mut COUNTER: u32 = 0;\n\n        impl Drop for ExportedImpl {\n            fn drop(&mut self) {\n                unsafe { COUNTER -= 1; }\n            }\n        }\n\n        pub fn get_exported() -> Rc<dyn Exported> {\n            unsafe { COUNTER += 1; }\n            Rc::new(ExportedImpl)\n        }\n\n        pub fn get_counter() -> u32 {\n            unsafe { COUNTER }\n        }\n    \"#;\n\n    case.js_pre = \"\n        class ImportedImpl {\n            add(x, y) {\n                return x + y\n            }\n        }\n    \";\n\n    case.swift_pre = \"\n        var counter = 0\n        class ImportedImpl : Imported {\n            init() {\n                counter += 1\n            }\n            deinit {\n                counter -= 1\n            }\n            func add(_ x: Int32, _ y: Int32) -> Int32 {\n                return x + y\n            }\n        }\n    \";\n\n    case.cpp_pre = \"\n        int counter = 0;\n        struct ImportedImpl : rust::Imported {\n            ImportedImpl() {\n                counter += 1;\n            }\n            ~ImportedImpl() {\n                counter -= 1;\n            }\n            int32_t add(int32_t x, int32_t y) {\n                return x + y;\n            }\n        };\n    \";\n\n    case.checks = vec![\n        AssertEqual(\n            CallMethod(\n                Call(Export(\"get_exported\").into(), [].into()).into(),\n                \"run\",\n                [NewRc(TyName(\"Imported\"), \"ImportedImpl\", [].into())].into(),\n            )\n            .into(),\n            I32(3).into(),\n        ),\n        AfterGC(\n            AssertEqual(\n                Call(Export(\"get_counter\").into(), [].into()).into(),\n                U32(0).into(),\n            )\n            .into(),\n        ),\n    ];\n\n    case.swift_post = r#\"\n        assert(counter == 0, \"\\(counter) == \\(0)\")\n    \"#;\n\n    case.cpp_post = \"\n        assert(counter == 0);\n    \";\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/trait_export_nested.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        use std::rc::Rc;\n\n        pub trait Getter {\n            fn get_adder(&self) -> Rc<dyn Adder>;\n        }\n\n        struct GetterImpl;\n        static mut GETTER_COUNTER: u32 = 0;\n\n        pub fn get_getter_counter() -> u32 {\n            unsafe { GETTER_COUNTER }\n        }\n\n        impl Getter for GetterImpl {\n            fn get_adder(&self) -> Rc<dyn Adder> {\n                unsafe { ADDER_COUNTER += 1; }\n                Rc::new(AdderImpl)\n            }\n        }\n\n        impl Drop for GetterImpl {\n            fn drop(&mut self) {\n                unsafe { GETTER_COUNTER -= 1; }\n            }\n        }\n\n        pub trait Adder {\n            fn add(&self, x: i32, y: i32) -> i32;\n        }\n\n        struct AdderImpl;\n        static mut ADDER_COUNTER: u32 = 0;\n\n        pub fn get_adder_counter() -> u32 {\n            unsafe { ADDER_COUNTER }\n        }\n\n        impl Adder for AdderImpl {\n            fn add(&self, x: i32, y: i32) -> i32 {\n                x + y\n            }\n        }\n\n        impl Drop for AdderImpl {\n            fn drop(&mut self) {\n                unsafe { ADDER_COUNTER -= 1; }\n            }\n        }\n\n        pub fn get_getter() -> Rc<dyn Getter> {\n            unsafe { GETTER_COUNTER += 1; }\n            Rc::new(GetterImpl)\n        }\n    \"#;\n\n    case.checks = vec![\n        AssertEqual(\n            CallMethod(\n                CallMethod(\n                    Call(Export(\"get_getter\").into(), [].into()).into(),\n                    \"get_adder\",\n                    [].into(),\n                )\n                .into(),\n                \"add\",\n                [I32(1), I32(2)].into(),\n            )\n            .into(),\n            I32(3).into(),\n        ),\n        AfterGC(\n            AssertEqual(\n                Call(Export(\"get_getter_counter\").into(), [].into()).into(),\n                U32(0).into(),\n            )\n            .into(),\n        ),\n        AfterGC(\n            AssertEqual(\n                Call(Export(\"get_adder_counter\").into(), [].into()).into(),\n                U32(0).into(),\n            )\n            .into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/trait_import.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        use std::rc::Rc;\n\n        pub trait Adder {\n            fn add(&self, y: i32) -> i32;\n        }\n\n        pub fn set_adder_rc(adder: Rc<dyn Adder>) -> i32 {\n            adder.add(10)\n        }\n\n        pub fn set_adder_box(adder: Box<dyn Adder>) -> i32 {\n            adder.add(100)\n        }\n    \"#;\n\n    case.js_pre = \"\n        class AdderImpl {\n            constructor(x) {\n                this.x = x\n            }\n            add(y) {\n                return this.x + y\n            }\n        }\n    \";\n\n    case.swift_pre = \"\n        var counter = 0\n\n        class AdderImpl : Adder {\n            let x: Int32\n            init(_ x: Int32) {\n                self.x = x\n                counter += 1\n            }\n            deinit {\n                counter -= 1\n            }\n            func add(_ y: Int32) -> Int32 {\n                return x + y\n            }\n        }\n    \";\n\n    case.cpp_pre = \"\n        int counter = 0;\n\n        struct AdderImpl : rust::Adder {\n            int32_t x;\n            AdderImpl(int32_t x) {\n                this->x = x;\n                counter += 1;\n            }\n            ~AdderImpl() {\n                counter -= 1;\n            }\n            int32_t add(int32_t y) {\n                return x + y;\n            }\n        };\n    \";\n\n    case.checks = vec![\n        AssertEqual(\n            Call(\n                Export(\"set_adder_rc\").into(),\n                [NewRc(TyName(\"Adder\"), \"AdderImpl\", [I32(20)].into())].into(),\n            )\n            .into(),\n            I32(30).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"set_adder_box\").into(),\n                [NewBox(TyName(\"Adder\"), \"AdderImpl\", [I32(200)].into())].into(),\n            )\n            .into(),\n            I32(300).into(),\n        ),\n    ];\n\n    case.swift_post = r#\"\n        assert(counter == 0, \"\\(counter) == \\(0)\")\n    \"#;\n\n    case.cpp_post = \"\n        assert(counter == 0);\n    \";\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/trait_import_export.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        use std::rc::Rc;\n\n        pub trait Imported {\n            fn run(&self, exported: Rc<dyn Exported>) -> i32;\n        }\n\n        pub trait Exported {\n            fn add(&self, x: i32, y: i32) -> i32;\n        }\n\n        struct ExportedImpl;\n        static mut COUNTER: u32 = 0;\n\n        pub fn get_counter() -> u32 {\n            unsafe { COUNTER }\n        }\n\n        impl Exported for ExportedImpl {\n            fn add(&self, x: i32, y: i32) -> i32 {\n                x + y\n            }\n        }\n\n        impl Drop for ExportedImpl {\n            fn drop(&mut self) {\n                unsafe { COUNTER -= 1; }\n            }\n        }\n\n        pub fn set_imported(imported: Rc<dyn Imported>) -> i32 {\n            unsafe { COUNTER += 1; }\n            imported.run(Rc::new(ExportedImpl))\n        }\n    \"#;\n\n    case.js_pre = \"\n        class ImportedImpl {\n            run(exported) {\n                return exported.add(1, 2)\n            }\n        }\n    \";\n\n    case.swift_pre = \"\n        var counter = 0\n\n        class ImportedImpl : Imported {\n            init() {\n                counter += 1\n            }\n            deinit {\n                counter -= 1\n            }\n            func run(_ exported: Exported) -> Int32 {\n                return exported.add(1, 2)\n            }\n        }\n    \";\n\n    case.cpp_pre = \"\n        int counter = 0;\n\n        struct ImportedImpl : rust::Imported {\n            ImportedImpl() {\n                counter += 1;\n            }\n            ~ImportedImpl() {\n                counter -= 1;\n            }\n            int32_t run(std::shared_ptr<rust::Exported> exported) {\n                return exported->add(1, 2);\n            }\n        };\n    \";\n\n    case.checks = vec![\n        AssertEqual(\n            Call(\n                Export(\"set_imported\").into(),\n                [NewRc(TyName(\"Imported\"), \"ImportedImpl\", [].into())].into(),\n            )\n            .into(),\n            I32(3).into(),\n        ),\n        AfterGC(\n            AssertEqual(\n                Call(Export(\"get_counter\").into(), [].into()).into(),\n                U32(0).into(),\n            )\n            .into(),\n        ),\n    ];\n\n    case.swift_post = r#\"\n        assert(counter == 0, \"\\(counter) == \\(0)\")\n    \"#;\n\n    case.cpp_post = \"\n        assert(counter == 0);\n    \";\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/trait_import_nested.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        use std::rc::Rc;\n\n        pub trait Getter {\n            fn get_adder(&self) -> Rc<dyn Adder>;\n        }\n\n        pub trait Adder {\n            fn add(&self, x: i32, y: i32) -> i32;\n        }\n\n        pub fn set_getter(getter: Rc<dyn Getter>) -> i32 {\n            getter.get_adder().add(1, 2)\n        }\n    \"#;\n\n    case.js_pre = \"\n        class GetterImpl {\n            get_adder() {\n                return new AdderImpl\n            }\n        }\n\n        class AdderImpl {\n            add(x, y) {\n                return x + y\n            }\n        }\n    \";\n\n    case.swift_pre = \"\n        var getter_counter = 0\n\n        class GetterImpl : Getter {\n            init() {\n                getter_counter += 1\n            }\n            deinit {\n                getter_counter -= 1\n            }\n            func get_adder() -> Adder {\n                return AdderImpl()\n            }\n        }\n\n        var adder_counter = 0\n\n        class AdderImpl : Adder {\n            init() {\n                adder_counter += 1\n            }\n            deinit {\n                adder_counter -= 1\n            }\n            func add(_ x: Int32, _ y: Int32) -> Int32 {\n                return x + y\n            }\n        }\n    \";\n\n    case.cpp_pre = \"\n        int adder_counter = 0;\n\n        struct AdderImpl : rust::Adder {\n            AdderImpl() {\n                adder_counter += 1;\n            }\n            ~AdderImpl() {\n                adder_counter -= 1;\n            }\n            int32_t add(int32_t x, int32_t y) {\n                return x + y;\n            }\n        };\n\n        int getter_counter = 0;\n\n        struct GetterImpl : rust::Getter {\n            GetterImpl() {\n                getter_counter += 1;\n            }\n            ~GetterImpl() {\n                getter_counter -= 1;\n            }\n            std::shared_ptr<rust::Adder> get_adder() {\n                return std::make_shared<AdderImpl>();\n            }\n        };\n    \";\n\n    case.checks = vec![AssertEqual(\n        Call(\n            Export(\"set_getter\").into(),\n            [NewRc(TyName(\"Getter\"), \"GetterImpl\", [].into())].into(),\n        )\n        .into(),\n        I32(3).into(),\n    )];\n\n    case.swift_post = r#\"\n        assert(getter_counter == 0, \"\\(getter_counter) == \\(0)\")\n        assert(adder_counter == 0, \"\\(adder_counter) == \\(0)\")\n    \"#;\n\n    case.cpp_post = \"\n        assert(getter_counter == 0);\n        assert(adder_counter == 0);\n    \";\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/trait_import_struct_in.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        use std::rc::Rc;\n\n        pub struct EmptyStruct;\n        pub struct SingleElementStruct(i32);\n        pub struct PairStruct { x: f32, y: f32 }\n\n        pub trait StructIn {\n            fn empty_struct(&self, x: i32, #[allow(unused)] foo: EmptyStruct, y: i32) -> i32;\n            fn single_element_struct(&self, x: SingleElementStruct, y: SingleElementStruct) -> i32;\n            fn multiply_pairs(&self, ab: PairStruct, cd: PairStruct) -> f32;\n        }\n\n        pub fn set_empty_struct(struct_in: Rc<dyn StructIn>) -> i32 {\n            struct_in.empty_struct(10, EmptyStruct, 20)\n        }\n\n        pub fn set_single_element_struct(struct_in: Rc<dyn StructIn>) -> i32 {\n            struct_in.single_element_struct(SingleElementStruct(10), SingleElementStruct(20))\n        }\n\n        pub fn set_multiply_pairs(struct_in: Rc<dyn StructIn>) -> f32 {\n            struct_in.multiply_pairs(PairStruct { x: 2.0, y: 3.0 }, PairStruct { x: 5.0, y: 7.0 })\n        }\n    \"#;\n\n    case.js_pre = \"\n        class StructInImpl {\n            empty_struct(x, foo, y) {\n                assert.deepStrictEqual(foo, {})\n                return x + y\n            }\n            single_element_struct(x, y) {\n                return x[0] + y[0]\n            }\n            multiply_pairs({ x: a, y: b }, { x: c, y: d }) {\n                return a * c - b * d\n            }\n        }\n    \";\n\n    case.swift_pre = \"\n        class StructInImpl : StructIn {\n            func empty_struct(_ x: Int32, _ foo: EmptyStruct, _ y: Int32) -> Int32 {\n                return x + y\n            }\n            func single_element_struct(_ x: SingleElementStruct, _ y: SingleElementStruct) -> Int32 {\n                return x._0 + y._0\n            }\n            func multiply_pairs(_ ab: PairStruct, _ cd: PairStruct) -> Float32 {\n                return ab.x * cd.x - ab.y * cd.y\n            }\n        }\n    \";\n\n    case.cpp_pre = \"\n        struct StructInImpl : rust::StructIn {\n            int32_t empty_struct(int32_t x, rust::EmptyStruct, int32_t y) {\n                return x + y;\n            }\n            int32_t single_element_struct(rust::SingleElementStruct x, rust::SingleElementStruct y) {\n                return x._0 + y._0;\n            }\n            float multiply_pairs(rust::PairStruct ab, rust::PairStruct cd) {\n                return ab.x * cd.x - ab.y * cd.y;\n            }\n        };\n    \";\n\n    case.checks = vec![\n        AssertEqual(\n            Call(\n                Export(\"set_empty_struct\").into(),\n                [NewRc(TyName(\"StructIn\"), \"StructInImpl\", [].into())].into(),\n            )\n            .into(),\n            I32(30).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"set_single_element_struct\").into(),\n                [NewRc(TyName(\"StructIn\"), \"StructInImpl\", [].into())].into(),\n            )\n            .into(),\n            I32(30).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"set_multiply_pairs\").into(),\n                [NewRc(TyName(\"StructIn\"), \"StructInImpl\", [].into())].into(),\n            )\n            .into(),\n            F32(-11.0).into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/trait_import_tuple_in.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        use std::rc::Rc;\n\n        pub trait TupleIn {\n            fn empty_tuple(&self, x: i32, foo: (), y: i32) -> i32;\n            fn single_element_tuple(&self, x: (i32,), y: (i32,)) -> i32;\n            fn multiply_pairs(&self, ab: (f32, f32), cd: (f32, f32)) -> f32;\n        }\n\n        pub fn set_empty_tuple(tuple_in: Rc<dyn TupleIn>) -> i32 {\n            tuple_in.empty_tuple(10, (), 20)\n        }\n\n        pub fn set_single_element_tuple(tuple_in: Rc<dyn TupleIn>) -> i32 {\n            tuple_in.single_element_tuple((10,), (20,))\n        }\n\n        pub fn set_multiply_pairs(tuple_in: Rc<dyn TupleIn>) -> f32 {\n            tuple_in.multiply_pairs((2.0, 3.0), (5.0, 7.0))\n        }\n    \"#;\n\n    case.js_pre = \"\n        class TupleInImpl {\n            empty_tuple(x, foo, y) {\n                assert.deepStrictEqual(foo, undefined)\n                return x + y\n            }\n            single_element_tuple(x, y) {\n                return x[0] + y[0]\n            }\n            multiply_pairs([a, b], [c, d]) {\n                return a * c - b * d\n            }\n        }\n    \";\n\n    case.swift_pre = \"\n        class TupleInImpl : TupleIn {\n            func empty_tuple(_ x: Int32, _ foo: (), _ y: Int32) -> Int32 {\n                return x + y\n            }\n            func single_element_tuple(_ x: Int32, _ y: Int32) -> Int32 {\n                return x + y\n            }\n            func multiply_pairs(_ ab: (Float32, Float32), _ cd: (Float32, Float32)) -> Float32 {\n                let (a, b) = ab\n                let (c, d) = cd\n                return a * c - b * d\n            }\n        }\n    \";\n\n    case.cpp_pre = \"\n        struct TupleInImpl : rust::TupleIn {\n            int32_t empty_tuple(int32_t x, std::tuple<>, int32_t y) {\n                return x + y;\n            }\n            int32_t single_element_tuple(std::tuple<int32_t> x, std::tuple<int32_t> y) {\n                return std::get<0>(x) + std::get<0>(y);\n            }\n            float multiply_pairs(std::tuple<float, float> ab, std::tuple<float, float> cd) {\n                float a, b, c, d;\n                std::tie(a, b) = ab;\n                std::tie(c, d) = cd;\n                return a * c - b * d;\n            }\n        };\n    \";\n\n    case.checks = vec![\n        AssertEqual(\n            Call(\n                Export(\"set_empty_tuple\").into(),\n                [NewRc(TyName(\"TupleIn\"), \"TupleInImpl\", [].into())].into(),\n            )\n            .into(),\n            I32(30).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"set_single_element_tuple\").into(),\n                [NewRc(TyName(\"TupleIn\"), \"TupleInImpl\", [].into())].into(),\n            )\n            .into(),\n            I32(30).into(),\n        ),\n        AssertEqual(\n            Call(\n                Export(\"set_multiply_pairs\").into(),\n                [NewRc(TyName(\"TupleIn\"), \"TupleInImpl\", [].into())].into(),\n            )\n            .into(),\n            F32(-11.0).into(),\n        ),\n    ];\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cases/trait_string.rs",
    "content": "use super::*;\n\nfn test_case() -> TestCase {\n    let mut case = TestCase::default();\n\n    case.rust = r#\"\n        use std::rc::Rc;\n        use std::cell::RefCell;\n\n        pub trait Test {\n            fn get_string(&self) -> String;\n            fn set_string(&self, x: String);\n            fn set_str(&self, x: &str);\n        }\n\n        struct TestImpl(RefCell<String>);\n\n        impl Test for TestImpl {\n            fn get_string(&self) -> String {\n                self.0.borrow().clone()\n            }\n            fn set_string(&self, x: String) {\n                *self.0.borrow_mut() = x;\n            }\n            fn set_str(&self, x: &str) {\n                *self.0.borrow_mut() = x.to_string();\n            }\n        }\n\n        pub fn get_test() -> Rc<dyn Test> {\n            Rc::new(TestImpl(RefCell::new(String::new())))\n        }\n\n        pub fn set_test(test: Rc<dyn Test>) -> String {\n            let mut foo = test.get_string();\n            test.set_string(\"abc\".to_string());\n            foo.push_str(&test.get_string());\n            test.set_str(\"xyz\");\n            foo.push_str(&test.get_string());\n            foo\n        }\n    \"#;\n\n    case.js_pre = r#\"\n        class TestImpl {\n            x = \"\"\n            get_string() {\n                return this.x\n            }\n            set_string(x) {\n                this.x = x\n            }\n            set_str(x) {\n                this.x = x\n            }\n        }\n    \"#;\n\n    case.swift_pre = r#\"\n        var counter = 0\n\n        class TestImpl : Test {\n            var x: String = \"\"\n            init() {\n                counter += 1\n            }\n            deinit {\n                counter -= 1\n            }\n            func get_string() -> String {\n                return x\n            }\n            func set_string(_ x: String) {\n                self.x = x\n            }\n            func set_str(_ x: String) {\n                self.x = x\n            }\n        }\n    \"#;\n\n    case.cpp_pre = \"\n        int counter = 0;\n\n        struct TestImpl : rust::Test {\n            std::string x;\n            TestImpl() {\n                counter += 1;\n            }\n            ~TestImpl() {\n                counter -= 1;\n            }\n            std::string get_string() {\n                return x;\n            }\n            void set_string(std::string x) {\n                this->x = std::move(x);\n            }\n            void set_str(std::string x) {\n                this->x = std::move(x);\n            }\n        };\n    \";\n\n    case.checks = vec![\n        AssertEqual(\n            Call(\n                Export(\"set_test\").into(),\n                [NewRc(TyName(\"Test\"), \"TestImpl\", [].into())].into(),\n            )\n            .into(),\n            Str(\"abcxyz\").into(),\n        ),\n        DeclareImmutableLocal(\n            \"test_from_rust\",\n            Call(Export(\"get_test\").into(), [].into()).into(),\n        ),\n        DeclareMutableLocal(\n            \"foo\",\n            CallMethod(LoadLocal(\"test_from_rust\").into(), \"get_string\", [].into()).into(),\n        ),\n        CallMethod(\n            LoadLocal(\"test_from_rust\").into(),\n            \"set_string\",\n            [Str(\"ABC\")].into(),\n        ),\n        StoreLocal(\n            \"foo\",\n            StrConcat(\n                LoadLocal(\"foo\").into(),\n                CallMethod(LoadLocal(\"test_from_rust\").into(), \"get_string\", [].into()).into(),\n            )\n            .into(),\n        ),\n        CallMethod(\n            LoadLocal(\"test_from_rust\").into(),\n            \"set_string\",\n            [Str(\"XYZ\")].into(),\n        ),\n        StoreLocal(\n            \"foo\",\n            StrConcat(\n                LoadLocal(\"foo\").into(),\n                CallMethod(LoadLocal(\"test_from_rust\").into(), \"get_string\", [].into()).into(),\n            )\n            .into(),\n        ),\n        AssertEqual(LoadLocal(\"foo\").into(), Str(\"ABCXYZ\").into()),\n    ];\n\n    case.swift_post = r#\"\n        assert(counter == 0, \"\\(counter) == \\(0)\")\n    \"#;\n\n    case.cpp_post = \"\n        assert(counter == 0);\n    \";\n\n    case\n}\n\ntest_all!();\n"
  },
  {
    "path": "src/tests/cpp.rs",
    "content": "use super::*;\n\npub fn run_test(name: &str, case: &TestCase, edition: usize) {\n    let name = Path::new(name).file_stem().unwrap();\n    let name = &format!(\"cpp_{}_{edition}\", name.to_string_lossy());\n    let test_dir = &Path::new(\".temp\").join(name);\n    let src_dir = &test_dir.join(\"src\");\n    std::fs::create_dir_all(src_dir).expect(\"failed to create directory `src`\");\n\n    let TestCase {\n        rust,\n        cpp_pre,\n        cpp_post,\n        checks,\n        ..\n    } = case;\n    let checks = checks\n        .iter()\n        .map(|x| format!(\"{};\", to_str(x)))\n        .collect::<Vec<_>>()\n        .join(\"\\n\");\n\n    std::fs::write(\n        src_dir.join(\"lib.rs\"),\n        format!(\n            r#\"\n            #![deny(warnings)]\n            {}\n            {rust}\n            include!(concat!(env!(\"OUT_DIR\"), \"/miniffi.rs\"));\n            \"#,\n            rust_leak_check()\n        ),\n    )\n    .expect(\"failed to write file `src/lib.rs`\");\n\n    std::fs::write(\n        test_dir.join(\"build.rs\"),\n        format!(\n            r#\"\n            fn main() {{\n                use miniffi::*;\n                let mut result = CppTarget::new()\n                    .rust_edition({edition})\n                    .write_source_to(\"ffi.cpp\")\n                    .write_header_to(\"ffi.h\")\n                    .build()\n                    .convert_warnings_to_errors();\n                result.finish();\n                for output in &result.output_files {{\n                    if output.path.extension().unwrap() == \"rs\" {{\n                        std::fs::copy(&output.path, \"miniffi.rs\").unwrap();\n                    }}\n                }}\n            }}\n            \"#\n        ),\n    )\n    .expect(\"failed to write file `build.rs`\");\n\n    std::fs::write(\n        test_dir.join(\"Cargo.toml\"),\n        format!(\n            r#\"\n            [package]\n            name = \"{name}\"\n            version = \"0.1.0\"\n            edition = \"{edition}\"\n            [lib]\n            crate-type = [\"staticlib\"]\n            [build-dependencies]\n            miniffi = {{ path = \"../..\" }}\n            \"#\n        ),\n    )\n    .expect(\"failed to write file `Cargo.toml`\");\n\n    std::fs::write(\n        test_dir.join(\"main.cpp\"),\n        format!(\n            r#\"\n            #include \"ffi.h\"\n            #include <assert.h>\n            #include <math.h>\n            #include <stdlib.h>\n            #include <string>\n            #include <tuple>\n            #include <vector>\n\n            // \"std::vector\" stupidly copies the \"std::initializer_list\",\n            // which breaks with uncopyable types such as \"std::unique_ptr\"\n            template<typename T>\n            std::vector<T> make_vector(T&& arg) {{\n                std::vector<T> vec;\n                vec.emplace_back(std::forward<T>(arg));\n                return vec;\n            }}\n            template<typename T, typename... Args>\n            std::vector<T> make_vector(T&& arg, Args&&... args) {{\n                auto vec = make_vector(std::forward<Args>(args)...);\n                vec.emplace(vec.begin(), std::forward<T>(arg));\n                return vec;\n            }}\n\n            size_t cpp_mem_leaked = 0;\n            size_t cpp_mem_total = 0;\n\n            void* operator new(size_t n) {{\n                cpp_mem_leaked += n;\n                cpp_mem_total += n;\n                size_t total = n;\n                total = (n + 15) & ~15; // Align to a multiple of 16\n                total += 16; // Bump up to the next multiple of 16\n                uint8_t* ptr = (uint8_t*)malloc(total);\n                memcpy(ptr, &n, sizeof(n));\n                return ptr + 16;\n            }}\n\n            void operator delete(void* p) throw() {{\n                uint8_t* ptr = (uint8_t*)p;\n                ptr -= 16;\n                size_t n;\n                memcpy(&n, ptr, sizeof(n));\n                free(ptr);\n                cpp_mem_leaked -= n;\n            }}\n\n            {cpp_pre}\n            int main() {{\n                {{\n                    {{\n                        {checks}\n                    }}\n                    {cpp_post}\n                }}\n\n                // Make sure there are no memory leaks\n                assert(cpp_mem_leaked == 0);\n                assert(rust::rust_mem_leaked() == 0);\n            }}\n            \"#\n        ),\n    )\n    .expect(\"failed to write file `main.cpp`\");\n\n    cargo_build(test_dir, None);\n\n    copy_snapshot(name, test_dir.join(\"miniffi.rs\"));\n    copy_snapshot(name, test_dir.join(\"ffi.cpp\"));\n    copy_snapshot(name, test_dir.join(\"ffi.h\"));\n\n    if cfg!(windows) {\n        check_output(\n            Command::new(\"cl.exe\")\n                .current_dir(test_dir)\n                .arg(\"main.cpp\")\n                .arg(\"ffi.cpp\")\n                .arg(\"/std:c++17\")\n                .arg(\"/W3\")\n                .arg(\"/WX\")\n                .arg(format!(\"../target/debug/{name}.lib\"))\n                .arg(\"/EHs\")\n                .arg(\"/link\")\n                .arg(\"ntdll.lib\")\n                .arg(\"userenv.lib\")\n                .arg(\"ws2_32.lib\")\n                .arg(\"/out:main.exe\")\n                .output()\n                .expect(\"failed to run command `cl.exe`\"),\n        );\n\n        check_output(\n            Command::new(test_dir.join(\"main.exe\"))\n                .current_dir(test_dir)\n                .env(\"RUST_BACKTRACE\", \"1\")\n                .output()\n                .expect(\"failed to run command `./main.exe`\"),\n        );\n    } else {\n        check_output(\n            Command::new(\"c++\")\n                .current_dir(test_dir)\n                .arg(\"main.cpp\")\n                .arg(\"ffi.cpp\")\n                .arg(\"-std=c++17\")\n                .arg(\"-Wall\")\n                .arg(\"-Werror\")\n                .arg(format!(\"../target/debug/lib{name}.a\"))\n                .args([\"-o\", \"main\"])\n                .output()\n                .expect(\"failed to run command `c++`\"),\n        );\n\n        check_output(\n            Command::new(\"./main\")\n                .current_dir(test_dir)\n                .env(\"RUST_BACKTRACE\", \"1\")\n                .output()\n                .expect(\"failed to run command `./main`\"),\n        );\n    }\n\n    _ = std::fs::remove_dir_all(test_dir);\n}\n\nfn ty_to_str(ty: &ExprTy) -> String {\n    match ty {\n        TyBool => \"bool\".to_string(),\n        TyU8 => \"uint8_t\".to_string(),\n        TyU16 => \"uint16_t\".to_string(),\n        TyU32 => \"uint32_t\".to_string(),\n        TyUsize => \"uintptr_t\".to_string(),\n        TyU64 => \"uint64_t\".to_string(),\n        TyI8 => \"int8_t\".to_string(),\n        TyI16 => \"int16_t\".to_string(),\n        TyI32 => \"int32_t\".to_string(),\n        TyIsize => \"intptr_t\".to_string(),\n        TyI64 => \"int64_t\".to_string(),\n        TyF32 => \"float\".to_string(),\n        TyF64 => \"double\".to_string(),\n        TyString => \"std::string\".to_string(),\n        TyTuple(x) => format!(\n            \"std::tuple<{}>\",\n            x.iter().map(ty_to_str).collect::<Vec<_>>().join(\", \")\n        ),\n        TyOption(x) => format!(\"std::optional<{}>\", ty_to_str(x)),\n        TyVec(x) => format!(\"std::vector<{}>\", ty_to_str(x)),\n        TyBox(x) => format!(\"std::unique_ptr<{}>\", ty_to_str(x)),\n        TyName(x) => format!(\"rust::{x}\"),\n    }\n}\n\nfn many_to_str(x: &[Expr]) -> String {\n    x.iter().map(to_str).collect::<Vec<_>>().join(\", \")\n}\n\nfn to_str(expr: &Expr) -> String {\n    match expr {\n        Bool(x) => format!(\"{x}\"),\n        U8(x) => format!(\"uint8_t({x})\"),\n        U16(x) => format!(\"uint16_t({x})\"),\n        U32(x) => format!(\"uint32_t({x})\"),\n        Usize(x) => format!(\"uintptr_t({x})\"),\n        U64(x) => format!(\"uint64_t({x}ull)\"),\n        I8(x) => format!(\"int8_t({x})\"),\n        I16(x) => format!(\"int16_t({x})\"),\n        I32(x) => {\n            if *x == std::i32::MIN {\n                // Avoid a Visual C++ warning\n                format!(\"int32_t({} - 1)\", x + 1)\n            } else {\n                format!(\"int32_t({x})\")\n            }\n        }\n        Isize(x) => format!(\"intptr_t({x})\"),\n        I64(x) => {\n            if *x == std::i64::MIN {\n                // Avoid a clang warning\n                format!(\"int64_t({}ll - 1)\", x + 1)\n            } else {\n                format!(\"int64_t({x}ll)\")\n            }\n        }\n        F32(x) => format!(\"float({x})\"),\n        F64(x) => format!(\"double({x})\"),\n        Str(x) => format!(\"std::string({x:?}, {})\", x.len()),\n        Export(x) => format!(\"rust::{x}\"),\n        Enum(x, y) => format!(\"rust::{x}::{y}\"),\n        EnumPayload(x, y, z) => format!(\n            \"rust::{x}{{rust::{x}::{y}{{{}}}}}\",\n            z.iter()\n                .map(|(_, v)| to_str(v))\n                .collect::<Vec<_>>()\n                .join(\", \")\n        ),\n        DeclareMutableLocal(x, y) => format!(\"auto {x} = {}\", to_str(y)),\n        DeclareImmutableLocal(x, y) => format!(\"const auto {x} = {}\", to_str(y)),\n        LoadLocal(x) => format!(\"{x}\"),\n        StoreLocal(x, y) => format!(\"{x} = {}\", to_str(y)),\n        NewBox(ty, x, y) => format!(\n            \"std::unique_ptr<{}>(new {x}({}))\",\n            ty_to_str(ty),\n            many_to_str(y)\n        ),\n        NewRc(ty, x, y) => format!(\n            \"std::shared_ptr<{}>(new {x}({}))\",\n            ty_to_str(ty),\n            many_to_str(y)\n        ),\n        Tuple(x) => format!(\"std::make_tuple({})\", many_to_str(x)),\n        Vector(x) => format!(\"make_vector({})\", many_to_str(x)),\n        EmptyVector(x) => format!(\"std::vector<{}>()\", ty_to_str(x)),\n        Struct(x, y) => format!(\n            \"rust::{x}{{{}}}\",\n            y.iter()\n                .map(|(_, v)| to_str(v))\n                .collect::<Vec<_>>()\n                .join(\", \")\n        ),\n        AssertEqual(x, y) => match &**y {\n            F32(y) if *y == 0.0 => {\n                format!(\n                    r#\"{{\n                        auto left = {};\n                        assert(left == 0.0 && signbit(left) == {});\n                    }}\"#,\n                    to_str(x),\n                    y.is_sign_negative()\n                )\n            }\n            F64(y) if *y == 0.0 => {\n                format!(\n                    r#\"{{\n                        auto left = {};\n                        assert(left == 0.0 && signbit(left) == {});\n                    }}\"#,\n                    to_str(x),\n                    y.is_sign_negative()\n                )\n            }\n            Str(_) => {\n                // \"x\" might be a \"std::string_view\" constant\n                format!(\"assert(std::string({}) == ({}))\", to_str(x), to_str(y))\n            }\n            _ => format!(\"assert(({}) == ({}))\", to_str(x), to_str(y)),\n        },\n        AssertNotEqual(x, y) => match &**y {\n            F32(y) if *y == 0.0 => {\n                format!(\n                    r#\"{{\n                        auto left = {};\n                        assert(left != 0.0 || signbit(left) != {});\n                    }}\"#,\n                    to_str(x),\n                    y.is_sign_negative()\n                )\n            }\n            F64(y) if *y == 0.0 => {\n                format!(\n                    r#\"{{\n                        auto left = {};\n                        assert(left != 0.0 || signbit(left) != {});\n                    }}\"#,\n                    to_str(x),\n                    y.is_sign_negative()\n                )\n            }\n            Str(_) => {\n                // \"x\" might be a \"std::string_view\" constant\n                format!(\"assert(std::string({}) != ({}))\", to_str(x), to_str(y))\n            }\n            _ => format!(\"assert(({}) != ({}))\", to_str(x), to_str(y)),\n        },\n        StrConcat(x, y) => format!(\"({}) + ({})\", to_str(x), to_str(y)),\n        Call(x, y) => format!(\"{}({})\", to_str(x), many_to_str(y)),\n        CallMethod(x, y, z) => format!(\"({})->{y}({})\", to_str(x), many_to_str(z)),\n        TupleMember(x, y) => format!(\"std::get<{y}>({})\", to_str(x)),\n        StructMember(x, y) => format!(\"({}).{y}\", to_str(x)),\n        VectorMember(x, y) => format!(\"({}).at({y})\", to_str(x)),\n        VectorLen(x) => format!(\"({}).size()\", to_str(x)),\n        AfterGC(x) => to_str(x),\n        OptNone(x) => format!(\"std::optional<{}>()\", ty_to_str(x)),\n        OptSome(x) => format!(\"std::make_optional({})\", to_str(x)),\n        Boxed(x, y) => format!(\"std::make_unique<{}>({})\", ty_to_str(x), to_str(y)),\n    }\n}\n"
  },
  {
    "path": "src/tests/mod.rs",
    "content": "use super::*;\nuse std::process::{Command, Output};\nuse std::sync::{Mutex, OnceLock};\n\nmod cases;\nmod cpp;\nmod swift;\nmod warnings;\nmod wasm;\n\nmacro_rules! test_all {\n    () => {\n        #[test]\n        fn wasm_2021() {\n            begin_test();\n            wasm::run_test(file!(), &test_case(), 2021);\n            end_test();\n        }\n        #[test]\n        fn wasm_2024() {\n            begin_test();\n            wasm::run_test(file!(), &test_case(), 2024);\n            end_test();\n        }\n\n        #[test]\n        fn swift_2021() {\n            begin_test();\n            swift::run_test(file!(), &test_case(), 2021);\n            end_test();\n        }\n        #[test]\n        fn swift_2024() {\n            begin_test();\n            swift::run_test(file!(), &test_case(), 2024);\n            end_test();\n        }\n\n        #[test]\n        fn cpp_2021() {\n            begin_test();\n            cpp::run_test(file!(), &test_case(), 2021);\n            end_test();\n        }\n        #[test]\n        fn cpp_2024() {\n            begin_test();\n            cpp::run_test(file!(), &test_case(), 2024);\n            end_test();\n        }\n    };\n}\nuse test_all;\n\n#[derive(Default)]\nstruct TestCase {\n    rust: &'static str,\n    checks: Vec<Expr>,\n\n    js_pre: &'static str,\n    js_post: &'static str,\n\n    swift_pre: &'static str,\n    swift_post: &'static str,\n\n    cpp_pre: &'static str,\n    cpp_post: &'static str,\n}\n\n#[derive(Clone)]\nenum ExprTy {\n    TyBool,\n    TyU8,\n    TyU16,\n    TyU32,\n    TyUsize,\n    TyU64,\n    TyI8,\n    TyI16,\n    TyI32,\n    TyIsize,\n    TyI64,\n    TyF32,\n    TyF64,\n    TyString,\n    TyTuple(Box<[ExprTy]>),\n    TyOption(Box<ExprTy>),\n    TyBox(Box<ExprTy>),\n    TyVec(Box<ExprTy>),\n    TyName(&'static str),\n}\nuse ExprTy::*;\n\n#[derive(Clone)]\nenum Expr {\n    Bool(bool),\n    U8(u8),\n    U16(u16),\n    U32(u32),\n    Usize(usize),\n    U64(u64),\n    I8(i8),\n    I16(i16),\n    I32(i32),\n    Isize(isize),\n    I64(i64),\n    F32(f32),\n    F64(f64),\n    Str(&'static str),\n    Export(&'static str),\n    Enum(&'static str, &'static str),\n    EnumPayload(&'static str, &'static str, Box<[(&'static str, Expr)]>),\n    DeclareMutableLocal(&'static str, Box<Expr>),\n    DeclareImmutableLocal(&'static str, Box<Expr>),\n    LoadLocal(&'static str),\n    StoreLocal(&'static str, Box<Expr>),\n    NewBox(ExprTy, &'static str, Box<[Expr]>),\n    NewRc(ExprTy, &'static str, Box<[Expr]>),\n    Tuple(Box<[Expr]>),\n    Vector(Box<[Expr]>),\n    EmptyVector(ExprTy), // This needs a type to help type inference\n    Struct(&'static str, Box<[(&'static str, Expr)]>),\n    AssertEqual(Box<Expr>, Box<Expr>),\n    AssertNotEqual(Box<Expr>, Box<Expr>),\n    StrConcat(Box<Expr>, Box<Expr>),\n    Call(Box<Expr>, Box<[Expr]>),\n    CallMethod(Box<Expr>, &'static str, Box<[Expr]>),\n    TupleMember(Box<Expr>, u32),\n    StructMember(Box<Expr>, &'static str),\n    VectorMember(Box<Expr>, usize),\n    VectorLen(Box<Expr>),\n    AfterGC(Box<Expr>),\n    OptNone(ExprTy),\n    OptSome(Box<Expr>),\n    Boxed(ExprTy, Box<Expr>),\n}\nuse Expr::*;\n\nstatic COUNTER: OnceLock<Mutex<usize>> = OnceLock::new();\n\nfn counter() -> &'static Mutex<usize> {\n    COUNTER.get_or_init(|| Mutex::new(0))\n}\n\nfn begin_test() {\n    let mut counter = counter().lock().unwrap();\n    *counter += 1;\n}\n\nfn end_test() {\n    let mut counter = counter().lock().unwrap();\n    *counter -= 1;\n\n    // Clean up after the last test (intentionally done while the lock is held)\n    if *counter == 0 {\n        let test_dir = &PathBuf::from(\".temp\");\n        if let Ok(entries) = std::fs::read_dir(test_dir) {\n            for entry in entries {\n                let name = entry.unwrap().file_name();\n                if name != \"target\"\n                    && name != \"node_modules\"\n                    && name != \"package.json\"\n                    && name != \"package-lock.json\"\n                {\n                    // Each test that passes deletes its test directory. So if\n                    // we encounter anything here that's not in the allow-list,\n                    // then it's likely a test failure. Don't remove the target\n                    // directory if there's a test that failed.\n                    return;\n                }\n            }\n\n            // If all tests passed, automatically delete the target directory.\n            // This prevents the target directory from taking up multiple\n            // gigabytes of file system space when it's not needed.\n            _ = std::fs::remove_dir_all(test_dir.join(\"target\"));\n        }\n    }\n\n    drop(counter);\n}\n\nfn check_output(output: Output) {\n    if !output.status.success() {\n        if output.stdout.is_empty() && output.stderr.is_empty() {\n            panic!(\"(empty output)\");\n        }\n        panic!(\n            \"{}{}\",\n            String::from_utf8_lossy(&output.stdout),\n            String::from_utf8_lossy(&output.stderr)\n        );\n    }\n}\n\nfn cargo_build(test_dir: &Path, target: Option<&str>) {\n    // Try offline-only first, otherwise cargo breaks when the internet is down\n    for offline in [true, false] {\n        let mut cmd = Command::new(\"cargo\");\n        cmd.current_dir(test_dir)\n            .env(\"RUST_BACKTRACE\", \"1\")\n            .arg(\"build\")\n            .arg(\"--quiet\")\n            .arg(\"--color=always\")\n            .arg(\"--message-format=short\")\n            .arg(format!(\"--target-dir=../target\"));\n        if offline {\n            cmd.arg(\"--offline\");\n        }\n        if let Some(target) = target {\n            cmd.arg(format!(\"--target={target}\"));\n        }\n        let output = cmd.output().expect(\"failed to run command `cargo`\");\n        if offline && !output.status.success() {\n            // Fall back to trying online if offline-only failed\n            continue;\n        }\n        check_output(output);\n        return;\n    }\n}\n\nfn copy_snapshot(name: &str, from: PathBuf) {\n    let snapshot_dir = &Path::new(\"src\").join(\"tests\").join(\"snapshots\").join(name);\n    let to = snapshot_dir.join(from.file_name().unwrap());\n    std::fs::create_dir_all(snapshot_dir)\n        .expect(\"failed to create directory `src/tests/snapshots`\");\n    std::fs::copy(&from, &to).expect(&format!(\n        \"failed to copy snapshot from `{}` to `{}`\",\n        from.display(),\n        to.display()\n    ));\n}\n\nfn rust_leak_check() -> &'static str {\n    // Test with \"cargo +nightly test\" to get memory leak checks\n    if let Ok(toolchain) = std::env::var(\"RUSTUP_TOOLCHAIN\") {\n        if toolchain.contains(\"nightly\") {\n            return r#\"\n            #![feature(allocator_api)]\n            struct LeakCheckAlloc;\n\n            unsafe impl std::alloc::GlobalAlloc for LeakCheckAlloc {\n                unsafe fn alloc(&self, layout: std::alloc::Layout) -> *mut u8 {\n                    unsafe {\n                        TOTAL_MEMORY += layout.size();\n                        std::alloc::System.alloc(layout)\n                    }\n                }\n\n                unsafe fn dealloc(&self, ptr: *mut u8, layout: std::alloc::Layout) {\n                    unsafe {\n                        TOTAL_MEMORY -= layout.size();\n                        std::alloc::System.dealloc(ptr, layout);\n                    }\n                }\n            }\n\n            #[global_allocator]\n            static ALLOCATOR: LeakCheckAlloc = LeakCheckAlloc;\n            static mut TOTAL_MEMORY: usize = 0;\n\n            pub fn rust_mem_leaked() -> usize {\n                unsafe { TOTAL_MEMORY }\n            }\n            \"#;\n        }\n    }\n\n    r#\"\n    pub fn rust_mem_leaked() -> usize {\n        0\n    }\n    \"#\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_app_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_2_i32 {\n    int32_t _0;\n    int32_t _1;\n};\n\nstruct _ffi_ret_ptr_usize {\n    const void* _0;\n    uintptr_t _1;\n};\n\nextern \"C\" {\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\nvoid _ffi_drop_Box_Handler(const void* ptr);\nvoid* _ffi_alloc(uintptr_t len);\nvoid _ffi_Box_Handler__on_draw(const void* _self, const void* canvas_ptr);\nvoid _ffi_fn_create_app(const void* platform_ptr);\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\nstd::vector<rust::TextRun> _ffi_vec_TextRun_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<rust::TextRun> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_text_ptr = _ffi_read<const char*>(end);\n        auto item_text_len = _ffi_read<uintptr_t>(end);\n        auto item_text_cap = _ffi_read<uintptr_t>(end);\n        auto item_text = _ffi_string_from_rust(item_text_ptr, item_text_len, item_text_cap);\n        auto item_rect_x = _ffi_read<int32_t>(end);\n        auto item_rect_y = _ffi_read<int32_t>(end);\n        auto item_rect_w = _ffi_read<int32_t>(end);\n        auto item_rect_h = _ffi_read<int32_t>(end);\n        auto item_rect = rust::TextRect{item_rect_x, item_rect_y, item_rect_w, item_rect_h};\n        auto item = rust::TextRun{std::move(item_text), std::move(item_rect)};\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nstruct _ffi_Box_Handler final : rust::Handler {\n    _ffi_Box_Handler(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Box_Handler() { _ffi_drop_Box_Handler(_self); }\n    virtual void on_draw(std::unique_ptr<rust::Canvas> canvas);\n    const void* _self;\n};\n\nconst void* _ffi_string_to_rust(const std::string& str, uintptr_t &len) {\n    len = str.size();\n    return memcpy(_ffi_alloc(len), str.data(), len);\n}\n\n} // namespace\n\nextern \"C\" {\n\nvoid _ffi_cpp_Box_Canvas__draw_text_runs(rust::Canvas* _self, const void* buf_ptr, uintptr_t buf_cap, uintptr_t runs_len) {\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto runs = _ffi_vec_TextRun_from_rust(runs_len, buf_end);\n    _self->draw_text_runs(std::move(runs));\n    _ffi_dealloc(buf_ptr, buf_cap);\n}\n\nconst void* _ffi_cpp_Box_Platform__create_window(rust::Platform* _self) {\n    return new std::shared_ptr<rust::Window>(_self->create_window());\n}\n\nconst void* _ffi_cpp_Rc_Window__child_window(std::shared_ptr<rust::Window>* _self) {\n    return new std::shared_ptr<rust::Window>(_self->get()->child_window());\n}\n\n_ffi_ret_2_i32 _ffi_cpp_Rc_Window__get_size(std::shared_ptr<rust::Window>* _self) {\n    auto ret = _self->get()->get_size();\n    auto ret_0 = std::get<0>(ret);\n    auto ret_1 = std::get<1>(ret);\n    return _ffi_ret_2_i32{ret_0, ret_1};\n}\n\n_ffi_ret_ptr_usize _ffi_cpp_Rc_Window__get_title(std::shared_ptr<rust::Window>* _self) {\n    uintptr_t ret_len;\n    const void* ret_ptr = _ffi_string_to_rust(_self->get()->get_title(), ret_len);\n    return _ffi_ret_ptr_usize{ret_ptr, ret_len};\n}\n\nvoid _ffi_cpp_Rc_Window__set_handler(std::shared_ptr<rust::Window>* _self, const void* handler_ptr) {\n    auto handler = std::unique_ptr<rust::Handler>(new _ffi_Box_Handler(handler_ptr));\n    _self->get()->set_handler(std::move(handler));\n}\n\nvoid _ffi_cpp_Rc_Window__set_size(std::shared_ptr<rust::Window>* _self, int32_t width, int32_t height) {\n    _self->get()->set_size(width, height);\n}\n\nvoid _ffi_cpp_Rc_Window__set_title(std::shared_ptr<rust::Window>* _self, const char* title_ptr, uintptr_t title_len, uintptr_t title_cap) {\n    auto title = _ffi_string_from_rust(title_ptr, title_len, title_cap);\n    _self->get()->set_title(std::move(title));\n}\n\nvoid _ffi_cpp_drop_Box_Canvas(rust::Canvas* self) {\n    delete self;\n}\n\nvoid _ffi_cpp_drop_Box_Platform(rust::Platform* self) {\n    delete self;\n}\n\nvoid _ffi_cpp_drop_Rc_Window(std::shared_ptr<rust::Window>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nvoid _ffi_Box_Handler::on_draw(std::unique_ptr<rust::Canvas> canvas) {\n    auto canvas_ptr = canvas.release();\n    _ffi_Box_Handler__on_draw(_self, canvas_ptr);\n}\n\nvoid rust::create_app(std::unique_ptr<rust::Platform> platform) {\n    auto platform_ptr = platform.release();\n    _ffi_fn_create_app(platform_ptr);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_app_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n#include <vector>\n#include <string>\n#include <tuple>\n\nnamespace rust {\n\nstruct TextRun;\nstruct Canvas;\nstruct Window;\nstruct Handler;\n\nstruct Canvas {\n    virtual ~Canvas() {}\n    virtual void draw_text_runs(std::vector<TextRun> runs) = 0;\n};\n\nstruct Handler {\n    virtual ~Handler() {}\n    virtual void on_draw(std::unique_ptr<Canvas> canvas) = 0;\n};\n\nstruct Platform {\n    virtual ~Platform() {}\n    virtual std::shared_ptr<Window> create_window() = 0;\n};\n\nstruct TextRect {\n    int32_t x = 0;\n    int32_t y = 0;\n    int32_t w = 0;\n    int32_t h = 0;\n};\n\nstruct TextRun {\n    std::string text;\n    TextRect rect;\n};\n\nstruct Window {\n    virtual ~Window() {}\n    virtual std::string get_title() = 0;\n    virtual void set_title(std::string title) = 0;\n    virtual std::tuple<int32_t, int32_t> get_size() = 0;\n    virtual void set_size(int32_t width, int32_t height) = 0;\n    virtual void set_handler(std::unique_ptr<Handler> handler) = 0;\n    virtual std::shared_ptr<Window> child_window() = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nvoid create_app(std::unique_ptr<Platform> platform);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_app_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Box_Handler__on_draw(_self: *const u8, canvas_ptr: *const u8) {\n    let _self = unsafe { &*(_self as *const Box<dyn Handler>) };\n    _self.on_draw(Box::new(_ffi_rs_Box_Canvas(canvas_ptr)));\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_drop_Box_Handler(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Handler>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_create_app(platform_ptr: *const u8) {\n    create_app(Box::new(_ffi_rs_Box_Platform(platform_ptr)));\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_2_i32(i32, i32);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Box_Canvas(*const u8);\n\nimpl Drop for _ffi_rs_Box_Canvas {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_cpp_drop_Box_Canvas(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Box_Canvas(self.0) };\n    }\n}\n\nimpl Canvas for _ffi_rs_Box_Canvas {\n    fn draw_text_runs(&self, runs: Vec<TextRun>) {\n        extern \"C\" { fn _ffi_cpp_Box_Canvas__draw_text_runs(_: *const u8, buf_ptr: *const u8, buf_cap: usize, runs_len: usize); }\n        let mut buf = Vec::<u8>::new();\n        let runs_len = runs.len();\n        _ffi_vec_TextRun_to_cpp(runs, &mut buf);\n        let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n        unsafe { _ffi_cpp_Box_Canvas__draw_text_runs(self.0, buf_ptr, buf_cap, runs_len) };\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Box_Platform(*const u8);\n\nimpl Drop for _ffi_rs_Box_Platform {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_cpp_drop_Box_Platform(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Box_Platform(self.0) };\n    }\n}\n\nimpl Platform for _ffi_rs_Box_Platform {\n    fn create_window(&self) -> std::rc::Rc<dyn Window> {\n        extern \"C\" { fn _ffi_cpp_Box_Platform__create_window(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_cpp_Box_Platform__create_window(self.0) };\n        std::rc::Rc::new(_ffi_rs_Rc_Window(ret_ptr))\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Window(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Window {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_cpp_drop_Rc_Window(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Window(self.0) };\n    }\n}\n\nimpl Window for _ffi_rs_Rc_Window {\n    fn get_title(&self) -> String {\n        extern \"C\" { fn _ffi_cpp_Rc_Window__get_title(_: *const u8) -> _ffi_ret_ptr_usize; }\n        let multi_ret = unsafe { _ffi_cpp_Rc_Window__get_title(self.0) };\n        let ret_ptr = multi_ret.0;\n        let ret_len = multi_ret.1;\n        _ffi_string_from_host(ret_ptr, ret_len)\n    }\n\n    fn set_title(&self, title: &str) {\n        extern \"C\" { fn _ffi_cpp_Rc_Window__set_title(_: *const u8, title_ptr: *const u8, title_len: usize, title_cap: usize); }\n        let (title_ptr, title_len, title_cap) = _ffi_string_to_host(title.into());\n        unsafe { _ffi_cpp_Rc_Window__set_title(self.0, title_ptr, title_len, title_cap) };\n    }\n\n    fn get_size(&self) -> (i32, i32) {\n        extern \"C\" { fn _ffi_cpp_Rc_Window__get_size(_: *const u8) -> _ffi_ret_2_i32; }\n        let multi_ret = unsafe { _ffi_cpp_Rc_Window__get_size(self.0) };\n        let ret_0 = multi_ret.0;\n        let ret_1 = multi_ret.1;\n        (ret_0, ret_1)\n    }\n\n    fn set_size(&self, width: i32, height: i32) {\n        extern \"C\" { fn _ffi_cpp_Rc_Window__set_size(_: *const u8, width: i32, height: i32); }\n        unsafe { _ffi_cpp_Rc_Window__set_size(self.0, width, height) };\n    }\n\n    fn set_handler(&self, handler: Box<dyn Handler>) {\n        extern \"C\" { fn _ffi_cpp_Rc_Window__set_handler(_: *const u8, handler_ptr: *const u8); }\n        unsafe { _ffi_cpp_Rc_Window__set_handler(self.0, Box::into_raw(Box::new(handler)) as *const u8) };\n    }\n\n    fn child_window(&self) -> std::rc::Rc<dyn Window> {\n        extern \"C\" { fn _ffi_cpp_Rc_Window__child_window(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_cpp_Rc_Window__child_window(self.0) };\n        std::rc::Rc::new(_ffi_rs_Rc_Window(ret_ptr))\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_TextRun_to_cpp(items: Vec<TextRun>, buf: &mut Vec<u8>) {\n    for item in items {\n        let (item_text_ptr, item_text_len, item_text_cap) = _ffi_string_to_host(item.text);\n        _ffi_write(item_text_ptr, buf);\n        _ffi_write(item_text_len, buf);\n        _ffi_write(item_text_cap, buf);\n        _ffi_write(item.rect.x, buf);\n        _ffi_write(item.rect.y, buf);\n        _ffi_write(item.rect.w, buf);\n        _ffi_write(item.rect.h, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_app_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_2_i32 {\n    int32_t _0;\n    int32_t _1;\n};\n\nstruct _ffi_ret_ptr_usize {\n    const void* _0;\n    uintptr_t _1;\n};\n\nextern \"C\" {\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\nvoid _ffi_drop_Box_Handler(const void* ptr);\nvoid* _ffi_alloc(uintptr_t len);\nvoid _ffi_Box_Handler__on_draw(const void* _self, const void* canvas_ptr);\nvoid _ffi_fn_create_app(const void* platform_ptr);\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\nstd::vector<rust::TextRun> _ffi_vec_TextRun_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<rust::TextRun> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_text_ptr = _ffi_read<const char*>(end);\n        auto item_text_len = _ffi_read<uintptr_t>(end);\n        auto item_text_cap = _ffi_read<uintptr_t>(end);\n        auto item_text = _ffi_string_from_rust(item_text_ptr, item_text_len, item_text_cap);\n        auto item_rect_x = _ffi_read<int32_t>(end);\n        auto item_rect_y = _ffi_read<int32_t>(end);\n        auto item_rect_w = _ffi_read<int32_t>(end);\n        auto item_rect_h = _ffi_read<int32_t>(end);\n        auto item_rect = rust::TextRect{item_rect_x, item_rect_y, item_rect_w, item_rect_h};\n        auto item = rust::TextRun{std::move(item_text), std::move(item_rect)};\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nstruct _ffi_Box_Handler final : rust::Handler {\n    _ffi_Box_Handler(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Box_Handler() { _ffi_drop_Box_Handler(_self); }\n    virtual void on_draw(std::unique_ptr<rust::Canvas> canvas);\n    const void* _self;\n};\n\nconst void* _ffi_string_to_rust(const std::string& str, uintptr_t &len) {\n    len = str.size();\n    return memcpy(_ffi_alloc(len), str.data(), len);\n}\n\n} // namespace\n\nextern \"C\" {\n\nvoid _ffi_cpp_Box_Canvas__draw_text_runs(rust::Canvas* _self, const void* buf_ptr, uintptr_t buf_cap, uintptr_t runs_len) {\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto runs = _ffi_vec_TextRun_from_rust(runs_len, buf_end);\n    _self->draw_text_runs(std::move(runs));\n    _ffi_dealloc(buf_ptr, buf_cap);\n}\n\nconst void* _ffi_cpp_Box_Platform__create_window(rust::Platform* _self) {\n    return new std::shared_ptr<rust::Window>(_self->create_window());\n}\n\nconst void* _ffi_cpp_Rc_Window__child_window(std::shared_ptr<rust::Window>* _self) {\n    return new std::shared_ptr<rust::Window>(_self->get()->child_window());\n}\n\n_ffi_ret_2_i32 _ffi_cpp_Rc_Window__get_size(std::shared_ptr<rust::Window>* _self) {\n    auto ret = _self->get()->get_size();\n    auto ret_0 = std::get<0>(ret);\n    auto ret_1 = std::get<1>(ret);\n    return _ffi_ret_2_i32{ret_0, ret_1};\n}\n\n_ffi_ret_ptr_usize _ffi_cpp_Rc_Window__get_title(std::shared_ptr<rust::Window>* _self) {\n    uintptr_t ret_len;\n    const void* ret_ptr = _ffi_string_to_rust(_self->get()->get_title(), ret_len);\n    return _ffi_ret_ptr_usize{ret_ptr, ret_len};\n}\n\nvoid _ffi_cpp_Rc_Window__set_handler(std::shared_ptr<rust::Window>* _self, const void* handler_ptr) {\n    auto handler = std::unique_ptr<rust::Handler>(new _ffi_Box_Handler(handler_ptr));\n    _self->get()->set_handler(std::move(handler));\n}\n\nvoid _ffi_cpp_Rc_Window__set_size(std::shared_ptr<rust::Window>* _self, int32_t width, int32_t height) {\n    _self->get()->set_size(width, height);\n}\n\nvoid _ffi_cpp_Rc_Window__set_title(std::shared_ptr<rust::Window>* _self, const char* title_ptr, uintptr_t title_len, uintptr_t title_cap) {\n    auto title = _ffi_string_from_rust(title_ptr, title_len, title_cap);\n    _self->get()->set_title(std::move(title));\n}\n\nvoid _ffi_cpp_drop_Box_Canvas(rust::Canvas* self) {\n    delete self;\n}\n\nvoid _ffi_cpp_drop_Box_Platform(rust::Platform* self) {\n    delete self;\n}\n\nvoid _ffi_cpp_drop_Rc_Window(std::shared_ptr<rust::Window>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nvoid _ffi_Box_Handler::on_draw(std::unique_ptr<rust::Canvas> canvas) {\n    auto canvas_ptr = canvas.release();\n    _ffi_Box_Handler__on_draw(_self, canvas_ptr);\n}\n\nvoid rust::create_app(std::unique_ptr<rust::Platform> platform) {\n    auto platform_ptr = platform.release();\n    _ffi_fn_create_app(platform_ptr);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_app_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n#include <vector>\n#include <string>\n#include <tuple>\n\nnamespace rust {\n\nstruct TextRun;\nstruct Canvas;\nstruct Window;\nstruct Handler;\n\nstruct Canvas {\n    virtual ~Canvas() {}\n    virtual void draw_text_runs(std::vector<TextRun> runs) = 0;\n};\n\nstruct Handler {\n    virtual ~Handler() {}\n    virtual void on_draw(std::unique_ptr<Canvas> canvas) = 0;\n};\n\nstruct Platform {\n    virtual ~Platform() {}\n    virtual std::shared_ptr<Window> create_window() = 0;\n};\n\nstruct TextRect {\n    int32_t x = 0;\n    int32_t y = 0;\n    int32_t w = 0;\n    int32_t h = 0;\n};\n\nstruct TextRun {\n    std::string text;\n    TextRect rect;\n};\n\nstruct Window {\n    virtual ~Window() {}\n    virtual std::string get_title() = 0;\n    virtual void set_title(std::string title) = 0;\n    virtual std::tuple<int32_t, int32_t> get_size() = 0;\n    virtual void set_size(int32_t width, int32_t height) = 0;\n    virtual void set_handler(std::unique_ptr<Handler> handler) = 0;\n    virtual std::shared_ptr<Window> child_window() = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nvoid create_app(std::unique_ptr<Platform> platform);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_app_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Box_Handler__on_draw(_self: *const u8, canvas_ptr: *const u8) {\n    let _self = unsafe { &*(_self as *const Box<dyn Handler>) };\n    _self.on_draw(Box::new(_ffi_rs_Box_Canvas(canvas_ptr)));\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_drop_Box_Handler(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Handler>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_create_app(platform_ptr: *const u8) {\n    create_app(Box::new(_ffi_rs_Box_Platform(platform_ptr)));\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_2_i32(i32, i32);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Box_Canvas(*const u8);\n\nimpl Drop for _ffi_rs_Box_Canvas {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_cpp_drop_Box_Canvas(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Box_Canvas(self.0) };\n    }\n}\n\nimpl Canvas for _ffi_rs_Box_Canvas {\n    fn draw_text_runs(&self, runs: Vec<TextRun>) {\n        unsafe extern \"C\" { fn _ffi_cpp_Box_Canvas__draw_text_runs(_: *const u8, buf_ptr: *const u8, buf_cap: usize, runs_len: usize); }\n        let mut buf = Vec::<u8>::new();\n        let runs_len = runs.len();\n        _ffi_vec_TextRun_to_cpp(runs, &mut buf);\n        let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n        unsafe { _ffi_cpp_Box_Canvas__draw_text_runs(self.0, buf_ptr, buf_cap, runs_len) };\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Box_Platform(*const u8);\n\nimpl Drop for _ffi_rs_Box_Platform {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_cpp_drop_Box_Platform(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Box_Platform(self.0) };\n    }\n}\n\nimpl Platform for _ffi_rs_Box_Platform {\n    fn create_window(&self) -> std::rc::Rc<dyn Window> {\n        unsafe extern \"C\" { fn _ffi_cpp_Box_Platform__create_window(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_cpp_Box_Platform__create_window(self.0) };\n        std::rc::Rc::new(_ffi_rs_Rc_Window(ret_ptr))\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Window(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Window {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_cpp_drop_Rc_Window(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Window(self.0) };\n    }\n}\n\nimpl Window for _ffi_rs_Rc_Window {\n    fn get_title(&self) -> String {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_Window__get_title(_: *const u8) -> _ffi_ret_ptr_usize; }\n        let multi_ret = unsafe { _ffi_cpp_Rc_Window__get_title(self.0) };\n        let ret_ptr = multi_ret.0;\n        let ret_len = multi_ret.1;\n        _ffi_string_from_host(ret_ptr, ret_len)\n    }\n\n    fn set_title(&self, title: &str) {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_Window__set_title(_: *const u8, title_ptr: *const u8, title_len: usize, title_cap: usize); }\n        let (title_ptr, title_len, title_cap) = _ffi_string_to_host(title.into());\n        unsafe { _ffi_cpp_Rc_Window__set_title(self.0, title_ptr, title_len, title_cap) };\n    }\n\n    fn get_size(&self) -> (i32, i32) {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_Window__get_size(_: *const u8) -> _ffi_ret_2_i32; }\n        let multi_ret = unsafe { _ffi_cpp_Rc_Window__get_size(self.0) };\n        let ret_0 = multi_ret.0;\n        let ret_1 = multi_ret.1;\n        (ret_0, ret_1)\n    }\n\n    fn set_size(&self, width: i32, height: i32) {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_Window__set_size(_: *const u8, width: i32, height: i32); }\n        unsafe { _ffi_cpp_Rc_Window__set_size(self.0, width, height) };\n    }\n\n    fn set_handler(&self, handler: Box<dyn Handler>) {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_Window__set_handler(_: *const u8, handler_ptr: *const u8); }\n        unsafe { _ffi_cpp_Rc_Window__set_handler(self.0, Box::into_raw(Box::new(handler)) as *const u8) };\n    }\n\n    fn child_window(&self) -> std::rc::Rc<dyn Window> {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_Window__child_window(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_cpp_Rc_Window__child_window(self.0) };\n        std::rc::Rc::new(_ffi_rs_Rc_Window(ret_ptr))\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_TextRun_to_cpp(items: Vec<TextRun>, buf: &mut Vec<u8>) {\n    for item in items {\n        let (item_text_ptr, item_text_len, item_text_cap) = _ffi_string_to_host(item.text);\n        _ffi_write(item_text_ptr, buf);\n        _ffi_write(item_text_len, buf);\n        _ffi_write(item_text_cap, buf);\n        _ffi_write(item.rect.x, buf);\n        _ffi_write(item.rect.y, buf);\n        _ffi_write(item.rect.w, buf);\n        _ffi_write(item.rect.h, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_const_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_const_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <string_view>\n\nnamespace rust {\n\nfloat const CONST_F32_NEG_0 = -0.0f;\nfloat const CONST_F32_PI = 3.1415927f;\ndouble const CONST_F64_NEG_0 = -0.0;\ndouble const CONST_F64_PI = -3.141592653589793;\nbool const CONST_FALSE = false;\nint16_t const CONST_I16_MAX = 32767;\nint16_t const CONST_I16_MIN = -32768;\nint32_t const CONST_I32_MAX = 2147483647;\nint32_t const CONST_I32_MIN = -2147483647 - 1;\nint64_t const CONST_I64_MAX = 9223372036854775807ll;\nint64_t const CONST_I64_MIN = -9223372036854775807ll - 1;\nint8_t const CONST_I8_MAX = 127;\nint8_t const CONST_I8_MIN = -128;\nstd::string_view const CONST_STRING = std::string_view(\"\\000\\r\\n🦀\", 7);\nbool const CONST_TRUE = true;\nuint16_t const CONST_U16_MAX = 65535u;\nuint16_t const CONST_U16_MIN = 0u;\nuint32_t const CONST_U32_MAX = 4294967295u;\nuint32_t const CONST_U32_MIN = 0u;\nuint64_t const CONST_U64_MAX = 18446744073709551615ull;\nuint64_t const CONST_U64_MIN = 0ull;\nuint8_t const CONST_U8_MAX = 255u;\nuint8_t const CONST_U8_MIN = 0u;\n\nuintptr_t rust_mem_leaked();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_const_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_const_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_const_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <string_view>\n\nnamespace rust {\n\nfloat const CONST_F32_NEG_0 = -0.0f;\nfloat const CONST_F32_PI = 3.1415927f;\ndouble const CONST_F64_NEG_0 = -0.0;\ndouble const CONST_F64_PI = -3.141592653589793;\nbool const CONST_FALSE = false;\nint16_t const CONST_I16_MAX = 32767;\nint16_t const CONST_I16_MIN = -32768;\nint32_t const CONST_I32_MAX = 2147483647;\nint32_t const CONST_I32_MIN = -2147483647 - 1;\nint64_t const CONST_I64_MAX = 9223372036854775807ll;\nint64_t const CONST_I64_MIN = -9223372036854775807ll - 1;\nint8_t const CONST_I8_MAX = 127;\nint8_t const CONST_I8_MIN = -128;\nstd::string_view const CONST_STRING = std::string_view(\"\\000\\r\\n🦀\", 7);\nbool const CONST_TRUE = true;\nuint16_t const CONST_U16_MAX = 65535u;\nuint16_t const CONST_U16_MIN = 0u;\nuint32_t const CONST_U32_MAX = 4294967295u;\nuint32_t const CONST_U32_MIN = 0u;\nuint64_t const CONST_U64_MAX = 18446744073709551615ull;\nuint64_t const CONST_U64_MIN = 0ull;\nuint8_t const CONST_U8_MAX = 255u;\nuint8_t const CONST_U8_MIN = 0u;\n\nuintptr_t rust_mem_leaked();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_const_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_derive_eq_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n#include <stdlib.h>\n#include <algorithm>\n\nstruct _ffi_ret_ptr_2_usize {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nstruct _ffi_ret_ptr_usize {\n    const void* _0;\n    uintptr_t _1;\n};\n\nstruct _ffi_ret_ptr_usize_bool {\n    const void* _0;\n    uintptr_t _1;\n    bool _2;\n};\n\nextern \"C\" {\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n_ffi_ret_ptr_usize _ffi_fn_box_opt(const void* buf_ptr);\nvoid* _ffi_alloc(uintptr_t len);\n_ffi_ret_ptr_usize _ffi_fn_box_opt_box(const void* buf_ptr);\n_ffi_ret_ptr_usize _ffi_fn_box_tup_0(const void* buf_ptr);\n_ffi_ret_ptr_usize _ffi_fn_box_tup_1(const void* buf_ptr);\n_ffi_ret_ptr_usize _ffi_fn_box_tup_2(const void* buf_ptr);\n_ffi_ret_ptr_usize _ffi_fn_box_vec(const void* buf_ptr);\n_ffi_ret_ptr_usize _ffi_fn_box_vec_box(const void* buf_ptr);\nvoid _ffi_fn_empty_struct();\nvoid _ffi_fn_empty_tuple();\n_ffi_ret_ptr_usize _ffi_fn_enum_box_tup(const void* buf_ptr);\n_ffi_ret_ptr_usize _ffi_fn_enum_opt_tup(const void* buf_ptr);\n_ffi_ret_ptr_usize _ffi_fn_enum_vec_tup(const void* buf_ptr);\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_box(const void* buf_ptr, bool has_x_0);\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_box_opt(const void* buf_ptr, bool has_x_0);\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_tup_0(const void* buf_ptr, bool has_x_0);\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_tup_1(const void* buf_ptr, bool has_x_0);\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_tup_2(const void* buf_ptr, bool has_x_0);\nuintptr_t _ffi_fn_rust_mem_leaked();\n_ffi_ret_ptr_usize _ffi_fn_tup_box(const void* buf_ptr);\n_ffi_ret_ptr_2_usize _ffi_fn_vec_box(const void* buf_ptr, uintptr_t x_0_len);\n_ffi_ret_ptr_2_usize _ffi_fn_vec_box_vec(const void* buf_ptr, uintptr_t x_0_len);\n_ffi_ret_ptr_2_usize _ffi_fn_vec_tup_0(const void* buf_ptr, uintptr_t x_0_len);\n_ffi_ret_ptr_2_usize _ffi_fn_vec_tup_1(const void* buf_ptr, uintptr_t x_0_len);\n_ffi_ret_ptr_2_usize _ffi_fn_vec_tup_2(const void* buf_ptr, uintptr_t x_0_len);\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nstd::unique_ptr<std::tuple<int32_t, int32_t>> _ffi_box_i32_i32_from_rust(const uint8_t*& end) {\n    auto val_0 = _ffi_read<int32_t>(end);\n    auto val_1 = _ffi_read<int32_t>(end);\n    auto val = std::make_tuple(val_0, val_1);\n    return std::make_unique<std::tuple<int32_t, int32_t>>(std::move(val));\n}\n\nrust::EnumBoxTup _ffi_enum_EnumBoxTup_from_rust(const uint8_t*& end) {\n    switch (_ffi_read<int32_t>(end)) {\n    case 0: {\n        auto x = _ffi_box_i32_i32_from_rust(end);\n        return rust::EnumBoxTup{rust::EnumBoxTup::Foo{std::move(x)}};\n    }\n    case 1:\n        return rust::EnumBoxTup{rust::EnumBoxTup::Bar{}};\n    case 2: {\n        auto x = _ffi_read<int32_t>(end);\n        auto y = _ffi_read<int32_t>(end);\n        return rust::EnumBoxTup{rust::EnumBoxTup::Baz{x, y}};\n    }\n    default:\n        abort();\n    }\n}\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_box_i32_i32_to_rust(std::tuple<int32_t, int32_t> val, std::vector<uint8_t>& buf) {\n    _ffi_write(std::get<0>(val), buf);\n    _ffi_write(std::get<1>(val), buf);\n}\n\nvoid _ffi_enum_EnumBoxTup_to_rust(rust::EnumBoxTup val, std::vector<uint8_t>& buf) {\n    if (auto it = val.as<rust::EnumBoxTup::Foo>()) {\n        _ffi_write(int32_t(0), buf);\n        _ffi_box_i32_i32_to_rust(std::move(*it->_0), buf);\n    } else if (val.is<rust::EnumBoxTup::Bar>()) {\n        _ffi_write(int32_t(1), buf);\n    } else if (auto it = val.as<rust::EnumBoxTup::Baz>()) {\n        _ffi_write(int32_t(2), buf);\n        _ffi_write(it->x, buf);\n        _ffi_write(it->y, buf);\n    } else {\n        abort();\n    }\n}\n\nrust::EnumOptTup _ffi_enum_EnumOptTup_from_rust(const uint8_t*& end) {\n    switch (_ffi_read<int32_t>(end)) {\n    case 0: {\n        std::optional<std::tuple<int32_t, int32_t>> x;\n        if (_ffi_read<bool>(end)) {\n            auto x_val_0 = _ffi_read<int32_t>(end);\n            auto x_val_1 = _ffi_read<int32_t>(end);\n            x = std::make_optional(std::make_tuple(x_val_0, x_val_1));\n        }\n        return rust::EnumOptTup{rust::EnumOptTup::Foo{std::move(x)}};\n    }\n    case 1:\n        return rust::EnumOptTup{rust::EnumOptTup::Bar{}};\n    case 2: {\n        auto x = _ffi_read<int32_t>(end);\n        auto y = _ffi_read<int32_t>(end);\n        return rust::EnumOptTup{rust::EnumOptTup::Baz{x, y}};\n    }\n    default:\n        abort();\n    }\n}\n\nvoid _ffi_enum_EnumOptTup_to_rust(rust::EnumOptTup val, std::vector<uint8_t>& buf) {\n    if (auto it = val.as<rust::EnumOptTup::Foo>()) {\n        _ffi_write(int32_t(0), buf);\n        auto has_x = it->_0.has_value();\n        _ffi_write(has_x, buf);\n        if (has_x) {\n            _ffi_write(std::get<0>(it->_0.value()), buf);\n            _ffi_write(std::get<1>(it->_0.value()), buf);\n        }\n    } else if (val.is<rust::EnumOptTup::Bar>()) {\n        _ffi_write(int32_t(1), buf);\n    } else if (auto it = val.as<rust::EnumOptTup::Baz>()) {\n        _ffi_write(int32_t(2), buf);\n        _ffi_write(it->x, buf);\n        _ffi_write(it->y, buf);\n    } else {\n        abort();\n    }\n}\n\nstd::vector<std::tuple<int32_t, int32_t>> _ffi_vec_i32_i32_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::tuple<int32_t, int32_t>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_0 = _ffi_read<int32_t>(end);\n        auto item_1 = _ffi_read<int32_t>(end);\n        auto item = std::make_tuple(item_0, item_1);\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nrust::EnumVecTup _ffi_enum_EnumVecTup_from_rust(const uint8_t*& end) {\n    switch (_ffi_read<int32_t>(end)) {\n    case 0: {\n        auto x_len = _ffi_read<uintptr_t>(end);\n        auto x = _ffi_vec_i32_i32_from_rust(x_len, end);\n        return rust::EnumVecTup{rust::EnumVecTup::Foo{std::move(x)}};\n    }\n    case 1:\n        return rust::EnumVecTup{rust::EnumVecTup::Bar{}};\n    case 2: {\n        auto x = _ffi_read<int32_t>(end);\n        auto y = _ffi_read<int32_t>(end);\n        return rust::EnumVecTup{rust::EnumVecTup::Baz{x, y}};\n    }\n    default:\n        abort();\n    }\n}\n\nvoid _ffi_vec_i32_i32_to_rust(std::vector<std::tuple<int32_t, int32_t>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(std::get<0>(item), buf);\n        _ffi_write(std::get<1>(item), buf);\n    }\n}\n\nvoid _ffi_enum_EnumVecTup_to_rust(rust::EnumVecTup val, std::vector<uint8_t>& buf) {\n    if (auto it = val.as<rust::EnumVecTup::Foo>()) {\n        _ffi_write(int32_t(0), buf);\n        auto x_len = it->_0.size();\n        _ffi_write(x_len, buf);\n        _ffi_vec_i32_i32_to_rust(std::move(it->_0), buf);\n    } else if (val.is<rust::EnumVecTup::Bar>()) {\n        _ffi_write(int32_t(1), buf);\n    } else if (auto it = val.as<rust::EnumVecTup::Baz>()) {\n        _ffi_write(int32_t(2), buf);\n        _ffi_write(it->x, buf);\n        _ffi_write(it->y, buf);\n    } else {\n        abort();\n    }\n}\n\nstd::unique_ptr<std::optional<int32_t>> _ffi_box_option_i32_from_rust(const uint8_t*& end) {\n    auto val = _ffi_read<bool>(end) ? std::make_optional(_ffi_read<int32_t>(end)) : std::nullopt;\n    return std::make_unique<std::optional<int32_t>>(std::move(val));\n}\n\nvoid _ffi_box_option_i32_to_rust(std::optional<int32_t> val, std::vector<uint8_t>& buf) {\n    auto has_val = val.has_value();\n    _ffi_write(has_val, buf);\n    if (has_val) {\n        _ffi_write(val.value(), buf);\n    }\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\nstd::unique_ptr<int32_t> _ffi_box_i32_from_rust2(const uint8_t*& end) {\n    auto val = _ffi_read<int32_t>(end);\n    return std::make_unique<int32_t>(val);\n}\n\nstd::unique_ptr<std::optional<std::unique_ptr<int32_t>>> _ffi_box_option_box_i32_from_rust(const uint8_t*& end) {\n    auto val = _ffi_read<bool>(end) ? std::make_optional(_ffi_box_i32_from_rust2(end)) : std::nullopt;\n    return std::make_unique<std::optional<std::unique_ptr<int32_t>>>(std::move(val));\n}\n\nvoid _ffi_box_i32_to_rust2(int32_t val, std::vector<uint8_t>& buf) {\n    _ffi_write(val, buf);\n}\n\nvoid _ffi_box_option_box_i32_to_rust(std::optional<std::unique_ptr<int32_t>> val, std::vector<uint8_t>& buf) {\n    auto has_val = val.has_value();\n    _ffi_write(has_val, buf);\n    if (has_val) {\n        _ffi_box_i32_to_rust2(std::move(*val.value()), buf);\n    }\n}\n\nstd::unique_ptr<std::tuple<>> _ffi_box__from_rust(const uint8_t*& end) {\n    auto val = std::tuple<>();\n    return std::make_unique<std::tuple<>>(std::move(val));\n}\n\nvoid _ffi_box__to_rust(std::tuple<> val, std::vector<uint8_t>& buf) {\n    (void)val;\n}\n\nstd::unique_ptr<std::tuple<int32_t>> _ffi_box_i32_from_rust(const uint8_t*& end) {\n    auto val_0 = _ffi_read<int32_t>(end);\n    auto val = val_0;\n    return std::make_unique<std::tuple<int32_t>>(std::move(val));\n}\n\nvoid _ffi_box_i32_to_rust(std::tuple<int32_t> val, std::vector<uint8_t>& buf) {\n    _ffi_write(std::get<0>(val), buf);\n}\n\nstd::vector<int32_t> _ffi_vec_i32_from_rust2(uintptr_t len, const uint8_t*& end) {\n    std::vector<int32_t> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item = _ffi_read<int32_t>(end);\n        items.emplace_back(item);\n    }\n    return items;\n}\n\nstd::unique_ptr<std::vector<int32_t>> _ffi_box_vec_i32_from_rust(const uint8_t*& end) {\n    auto val_len = _ffi_read<uintptr_t>(end);\n    auto val = _ffi_vec_i32_from_rust2(val_len, end);\n    return std::make_unique<std::vector<int32_t>>(std::move(val));\n}\n\nvoid _ffi_vec_i32_to_rust2(std::vector<int32_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_box_vec_i32_to_rust(std::vector<int32_t> val, std::vector<uint8_t>& buf) {\n    auto val_len = val.size();\n    _ffi_write(val_len, buf);\n    _ffi_vec_i32_to_rust2(std::move(val), buf);\n}\n\nstd::vector<std::unique_ptr<int32_t>> _ffi_vec_box_i32_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::unique_ptr<int32_t>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item = _ffi_box_i32_from_rust2(end);\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nstd::unique_ptr<std::vector<std::unique_ptr<int32_t>>> _ffi_box_vec_box_i32_from_rust(const uint8_t*& end) {\n    auto val_len = _ffi_read<uintptr_t>(end);\n    auto val = _ffi_vec_box_i32_from_rust(val_len, end);\n    return std::make_unique<std::vector<std::unique_ptr<int32_t>>>(std::move(val));\n}\n\nvoid _ffi_vec_box_i32_to_rust(std::vector<std::unique_ptr<int32_t>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_box_i32_to_rust2(std::move(*item), buf);\n    }\n}\n\nvoid _ffi_box_vec_box_i32_to_rust(std::vector<std::unique_ptr<int32_t>> val, std::vector<uint8_t>& buf) {\n    auto val_len = val.size();\n    _ffi_write(val_len, buf);\n    _ffi_vec_box_i32_to_rust(std::move(val), buf);\n}\n\nstd::unique_ptr<bool> _ffi_box_bool_from_rust(const uint8_t*& end) {\n    auto val = _ffi_read<bool>(end);\n    return std::make_unique<bool>(val);\n}\n\nvoid _ffi_box_bool_to_rust(bool val, std::vector<uint8_t>& buf) {\n    _ffi_write(val, buf);\n}\n\nstd::vector<std::unique_ptr<std::vector<int32_t>>> _ffi_vec_box_vec_i32_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::unique_ptr<std::vector<int32_t>>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item = _ffi_box_vec_i32_from_rust(end);\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nvoid _ffi_vec_box_vec_i32_to_rust(std::vector<std::unique_ptr<std::vector<int32_t>>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_box_vec_i32_to_rust(std::move(*item), buf);\n    }\n}\n\nstd::vector<std::tuple<>> _ffi_vec__from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::tuple<>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item = std::tuple<>();\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nvoid _ffi_vec__to_rust(std::vector<std::tuple<>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        (void)item;\n    }\n}\n\nstd::vector<std::tuple<int32_t>> _ffi_vec_i32_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::tuple<int32_t>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_0 = _ffi_read<int32_t>(end);\n        auto item = item_0;\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nvoid _ffi_vec_i32_to_rust(std::vector<std::tuple<int32_t>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(std::get<0>(item), buf);\n    }\n}\n\n} // namespace\n\nbool rust::BoxOpt::operator == (const rust::BoxOpt& b) const {\n    return *_0 == *b._0;\n}\n\nbool rust::BoxOptBox::operator == (const rust::BoxOptBox& b) const {\n    return (*_0 && *b._0 ? ***_0 == ***b._0 : !*_0 && !*b._0);\n}\n\nbool rust::BoxTup0::operator == (const rust::BoxTup0& b) const {\n    return *_0 == *b._0;\n}\n\nbool rust::BoxTup1::operator == (const rust::BoxTup1& b) const {\n    return *_0 == *b._0;\n}\n\nbool rust::BoxTup2::operator == (const rust::BoxTup2& b) const {\n    return *_0 == *b._0;\n}\n\nbool rust::BoxVec::operator == (const rust::BoxVec& b) const {\n    return *_0 == *b._0;\n}\n\nbool rust::BoxVecBox::operator == (const rust::BoxVecBox& b) const {\n    return std::equal((*_0).begin(), (*_0).end(), (*b._0).begin(), (*b._0).end(), [](const auto& a, const auto& b) { return *a == *b; });\n}\n\nbool rust::detail::EnumBoxTup__Baz::operator == (const rust::detail::EnumBoxTup__Baz& e) const {\n    return x == e.x && y == e.y;\n}\n\nbool rust::detail::EnumBoxTup__Foo::operator == (const rust::detail::EnumBoxTup__Foo& e) const {\n    return *_0 == *e._0;\n}\n\nbool rust::detail::EnumOptTup__Baz::operator == (const rust::detail::EnumOptTup__Baz& e) const {\n    return x == e.x && y == e.y;\n}\n\nbool rust::detail::EnumOptTup__Foo::operator == (const rust::detail::EnumOptTup__Foo& e) const {\n    return _0 == e._0;\n}\n\nbool rust::detail::EnumVecTup__Baz::operator == (const rust::detail::EnumVecTup__Baz& e) const {\n    return x == e.x && y == e.y;\n}\n\nbool rust::detail::EnumVecTup__Foo::operator == (const rust::detail::EnumVecTup__Foo& e) const {\n    return _0 == e._0;\n}\n\nbool rust::OptBox::operator == (const rust::OptBox& o) const {\n    return (_0 && o._0 ? **_0 == **o._0 : !_0 && !o._0);\n}\n\nbool rust::OptBoxOpt::operator == (const rust::OptBoxOpt& o) const {\n    return (_0 && o._0 ? **_0 == **o._0 : !_0 && !o._0);\n}\n\nbool rust::OptTup0::operator == (const rust::OptTup0& o) const {\n    return _0 == o._0;\n}\n\nbool rust::OptTup1::operator == (const rust::OptTup1& o) const {\n    return _0 == o._0;\n}\n\nbool rust::OptTup2::operator == (const rust::OptTup2& o) const {\n    return _0 == o._0;\n}\n\nbool rust::TupBox::operator == (const rust::TupBox& t) const {\n    return *std::get<0>(_0) == *std::get<0>(t._0) && *std::get<1>(_0) == *std::get<1>(t._0);\n}\n\nbool rust::VecBox::operator == (const rust::VecBox& v) const {\n    return std::equal(_0.begin(), _0.end(), v._0.begin(), v._0.end(), [](const auto& a, const auto& b) { return *a == *b; });\n}\n\nbool rust::VecBoxVec::operator == (const rust::VecBoxVec& v) const {\n    return std::equal(_0.begin(), _0.end(), v._0.begin(), v._0.end(), [](const auto& a, const auto& b) { return *a == *b; });\n}\n\nbool rust::VecTup0::operator == (const rust::VecTup0& v) const {\n    return _0 == v._0;\n}\n\nbool rust::VecTup1::operator == (const rust::VecTup1& v) const {\n    return _0 == v._0;\n}\n\nbool rust::VecTup2::operator == (const rust::VecTup2& v) const {\n    return _0 == v._0;\n}\n\nrust::BoxOpt rust::box_opt(rust::BoxOpt x) {\n    std::vector<uint8_t> buf;\n    _ffi_box_option_i32_to_rust(std::move(*x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_box_opt(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_box_option_i32_from_rust(buf_end2);\n    auto ret = rust::BoxOpt{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::BoxOptBox rust::box_opt_box(rust::BoxOptBox x) {\n    std::vector<uint8_t> buf;\n    _ffi_box_option_box_i32_to_rust(std::move(*x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_box_opt_box(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_box_option_box_i32_from_rust(buf_end2);\n    auto ret = rust::BoxOptBox{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::BoxTup0 rust::box_tup_0(rust::BoxTup0 x) {\n    std::vector<uint8_t> buf;\n    _ffi_box__to_rust(std::move(*x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_box_tup_0(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_box__from_rust(buf_end2);\n    auto ret = rust::BoxTup0{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::BoxTup1 rust::box_tup_1(rust::BoxTup1 x) {\n    std::vector<uint8_t> buf;\n    _ffi_box_i32_to_rust(std::move(*x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_box_tup_1(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_box_i32_from_rust(buf_end2);\n    auto ret = rust::BoxTup1{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::BoxTup2 rust::box_tup_2(rust::BoxTup2 x) {\n    std::vector<uint8_t> buf;\n    _ffi_box_i32_i32_to_rust(std::move(*x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_box_tup_2(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_box_i32_i32_from_rust(buf_end2);\n    auto ret = rust::BoxTup2{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::BoxVec rust::box_vec(rust::BoxVec x) {\n    std::vector<uint8_t> buf;\n    _ffi_box_vec_i32_to_rust(std::move(*x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_box_vec(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_box_vec_i32_from_rust(buf_end2);\n    auto ret = rust::BoxVec{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::BoxVecBox rust::box_vec_box(rust::BoxVecBox x) {\n    std::vector<uint8_t> buf;\n    _ffi_box_vec_box_i32_to_rust(std::move(*x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_box_vec_box(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_box_vec_box_i32_from_rust(buf_end2);\n    auto ret = rust::BoxVecBox{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::EmptyStruct rust::empty_struct(rust::EmptyStruct x) {\n    (void)x;\n    _ffi_fn_empty_struct();\n    return rust::EmptyStruct{};\n}\n\nstd::tuple<> rust::empty_tuple(std::tuple<> x) {\n    (void)x;\n    _ffi_fn_empty_tuple();\n    return std::tuple<>();\n}\n\nrust::EnumBoxTup rust::enum_box_tup(rust::EnumBoxTup x) {\n    std::vector<uint8_t> buf;\n    _ffi_enum_EnumBoxTup_to_rust(std::move(x), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_enum_box_tup(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret = _ffi_enum_EnumBoxTup_from_rust(buf_end2);\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::EnumOptTup rust::enum_opt_tup(rust::EnumOptTup x) {\n    std::vector<uint8_t> buf;\n    _ffi_enum_EnumOptTup_to_rust(std::move(x), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_enum_opt_tup(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret = _ffi_enum_EnumOptTup_from_rust(buf_end2);\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::EnumVecTup rust::enum_vec_tup(rust::EnumVecTup x) {\n    std::vector<uint8_t> buf;\n    _ffi_enum_EnumVecTup_to_rust(std::move(x), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_enum_vec_tup(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret = _ffi_enum_EnumVecTup_from_rust(buf_end2);\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::OptBox rust::opt_box(rust::OptBox x) {\n    std::vector<uint8_t> buf;\n    auto has_x_0 = x._0.has_value();\n    if (has_x_0) {\n        _ffi_box_i32_to_rust2(std::move(*x._0.value()), buf);\n    }\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_opt_box(buf_ptr, has_x_0);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto has_ret_0 = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = has_ret_0 ? std::make_optional(_ffi_box_i32_from_rust2(buf_end2)) : std::nullopt;\n    auto ret = rust::OptBox{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::OptBoxOpt rust::opt_box_opt(rust::OptBoxOpt x) {\n    std::vector<uint8_t> buf;\n    auto has_x_0 = x._0.has_value();\n    if (has_x_0) {\n        _ffi_box_option_i32_to_rust(std::move(*x._0.value()), buf);\n    }\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_opt_box_opt(buf_ptr, has_x_0);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto has_ret_0 = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = has_ret_0 ? std::make_optional(_ffi_box_option_i32_from_rust(buf_end2)) : std::nullopt;\n    auto ret = rust::OptBoxOpt{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::OptTup0 rust::opt_tup_0(rust::OptTup0 x) {\n    std::vector<uint8_t> buf;\n    auto has_x_0 = x._0.has_value();\n    if (has_x_0) {\n        (void)x._0.value();\n    }\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_opt_tup_0(buf_ptr, has_x_0);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto has_ret_0 = multi_ret._2;\n    auto ret_0 = has_ret_0 ? std::make_optional(std::tuple<>()) : std::nullopt;\n    auto ret = rust::OptTup0{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::OptTup1 rust::opt_tup_1(rust::OptTup1 x) {\n    std::vector<uint8_t> buf;\n    auto has_x_0 = x._0.has_value();\n    if (has_x_0) {\n        _ffi_write(std::get<0>(x._0.value()), buf);\n    }\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_opt_tup_1(buf_ptr, has_x_0);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto has_ret_0 = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    std::optional<std::tuple<int32_t>> ret_0;\n    if (has_ret_0) {\n        auto ret_0_val_0 = _ffi_read<int32_t>(buf_end2);\n        ret_0 = std::make_optional(ret_0_val_0);\n    }\n    auto ret = rust::OptTup1{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::OptTup2 rust::opt_tup_2(rust::OptTup2 x) {\n    std::vector<uint8_t> buf;\n    auto has_x_0 = x._0.has_value();\n    if (has_x_0) {\n        _ffi_write(std::get<0>(x._0.value()), buf);\n        _ffi_write(std::get<1>(x._0.value()), buf);\n    }\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_opt_tup_2(buf_ptr, has_x_0);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto has_ret_0 = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    std::optional<std::tuple<int32_t, int32_t>> ret_0;\n    if (has_ret_0) {\n        auto ret_0_val_0 = _ffi_read<int32_t>(buf_end2);\n        auto ret_0_val_1 = _ffi_read<int32_t>(buf_end2);\n        ret_0 = std::make_optional(std::make_tuple(ret_0_val_0, ret_0_val_1));\n    }\n    auto ret = rust::OptTup2{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nrust::TupBox rust::tup_box(rust::TupBox x) {\n    std::vector<uint8_t> buf;\n    _ffi_box_i32_to_rust2(std::move(*std::get<0>(x._0)), buf);\n    _ffi_box_bool_to_rust(std::move(*std::get<1>(x._0)), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_tup_box(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0_0 = _ffi_box_i32_from_rust2(buf_end2);\n    auto ret_0_1 = _ffi_box_bool_from_rust(buf_end2);\n    auto ret_0 = std::make_tuple(std::move(ret_0_0), std::move(ret_0_1));\n    auto ret = rust::TupBox{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::VecBox rust::vec_box(rust::VecBox x) {\n    std::vector<uint8_t> buf;\n    auto x_0_len = x._0.size();\n    _ffi_vec_box_i32_to_rust(std::move(x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_vec_box(buf_ptr, x_0_len);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_0_len = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_vec_box_i32_from_rust(ret_0_len, buf_end2);\n    auto ret = rust::VecBox{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::VecBoxVec rust::vec_box_vec(rust::VecBoxVec x) {\n    std::vector<uint8_t> buf;\n    auto x_0_len = x._0.size();\n    _ffi_vec_box_vec_i32_to_rust(std::move(x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_vec_box_vec(buf_ptr, x_0_len);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_0_len = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_vec_box_vec_i32_from_rust(ret_0_len, buf_end2);\n    auto ret = rust::VecBoxVec{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::VecTup0 rust::vec_tup_0(rust::VecTup0 x) {\n    std::vector<uint8_t> buf;\n    auto x_0_len = x._0.size();\n    _ffi_vec__to_rust(std::move(x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_vec_tup_0(buf_ptr, x_0_len);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_0_len = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_vec__from_rust(ret_0_len, buf_end2);\n    auto ret = rust::VecTup0{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::VecTup1 rust::vec_tup_1(rust::VecTup1 x) {\n    std::vector<uint8_t> buf;\n    auto x_0_len = x._0.size();\n    _ffi_vec_i32_to_rust(std::move(x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_vec_tup_1(buf_ptr, x_0_len);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_0_len = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_vec_i32_from_rust(ret_0_len, buf_end2);\n    auto ret = rust::VecTup1{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::VecTup2 rust::vec_tup_2(rust::VecTup2 x) {\n    std::vector<uint8_t> buf;\n    auto x_0_len = x._0.size();\n    _ffi_vec_i32_i32_to_rust(std::move(x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_vec_tup_2(buf_ptr, x_0_len);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_0_len = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_vec_i32_i32_from_rust(ret_0_len, buf_end2);\n    auto ret = rust::VecTup2{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_derive_eq_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <tuple>\n#include <memory>\n#include <optional>\n#include <vector>\n#include <variant>\n\nnamespace rust {\n\nstruct BoxOpt {\n    std::unique_ptr<std::optional<int32_t>> _0;\n    bool operator == (const BoxOpt&) const;\n    bool operator != (const BoxOpt& b) const { return !(*this == b); }\n};\n\nstruct BoxOptBox {\n    std::unique_ptr<std::optional<std::unique_ptr<int32_t>>> _0;\n    bool operator == (const BoxOptBox&) const;\n    bool operator != (const BoxOptBox& b) const { return !(*this == b); }\n};\n\nstruct BoxTup0 {\n    std::unique_ptr<std::tuple<>> _0;\n    bool operator == (const BoxTup0&) const;\n    bool operator != (const BoxTup0& b) const { return !(*this == b); }\n};\n\nstruct BoxTup1 {\n    std::unique_ptr<std::tuple<int32_t>> _0;\n    bool operator == (const BoxTup1&) const;\n    bool operator != (const BoxTup1& b) const { return !(*this == b); }\n};\n\nstruct BoxTup2 {\n    std::unique_ptr<std::tuple<int32_t, int32_t>> _0;\n    bool operator == (const BoxTup2&) const;\n    bool operator != (const BoxTup2& b) const { return !(*this == b); }\n};\n\nstruct BoxVec {\n    std::unique_ptr<std::vector<int32_t>> _0;\n    bool operator == (const BoxVec&) const;\n    bool operator != (const BoxVec& b) const { return !(*this == b); }\n};\n\nstruct BoxVecBox {\n    std::unique_ptr<std::vector<std::unique_ptr<int32_t>>> _0;\n    bool operator == (const BoxVecBox&) const;\n    bool operator != (const BoxVecBox& b) const { return !(*this == b); }\n};\n\nstruct EmptyStruct {\n    bool operator == (const EmptyStruct&) const { return true; }\n    bool operator != (const EmptyStruct& e) const { return !(*this == e); }\n};\n\nnamespace detail {\n\nstruct EnumBoxTup__Foo {\n    std::unique_ptr<std::tuple<int32_t, int32_t>> _0;\n    bool operator == (const EnumBoxTup__Foo&) const;\n    bool operator != (const EnumBoxTup__Foo& e) const { return !(*this == e); }\n};\n\nstruct EnumBoxTup__Bar {\n    bool operator == (const EnumBoxTup__Bar&) const { return true; }\n    bool operator != (const EnumBoxTup__Bar& e) const { return !(*this == e); }\n};\n\nstruct EnumBoxTup__Baz {\n    int32_t x = 0;\n    int32_t y = 0;\n    bool operator == (const EnumBoxTup__Baz&) const;\n    bool operator != (const EnumBoxTup__Baz& e) const { return !(*this == e); }\n};\n\n} // namespace detail\n\nstruct EnumBoxTup : std::variant<std::monostate, detail::EnumBoxTup__Foo, detail::EnumBoxTup__Bar, detail::EnumBoxTup__Baz> {\n    using Foo = detail::EnumBoxTup__Foo;\n    using Bar = detail::EnumBoxTup__Bar;\n    using Baz = detail::EnumBoxTup__Baz;\n    using std::variant<std::monostate, Foo, Bar, Baz>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nnamespace detail {\n\nstruct EnumOptTup__Foo {\n    std::optional<std::tuple<int32_t, int32_t>> _0;\n    bool operator == (const EnumOptTup__Foo&) const;\n    bool operator != (const EnumOptTup__Foo& e) const { return !(*this == e); }\n};\n\nstruct EnumOptTup__Bar {\n    bool operator == (const EnumOptTup__Bar&) const { return true; }\n    bool operator != (const EnumOptTup__Bar& e) const { return !(*this == e); }\n};\n\nstruct EnumOptTup__Baz {\n    int32_t x = 0;\n    int32_t y = 0;\n    bool operator == (const EnumOptTup__Baz&) const;\n    bool operator != (const EnumOptTup__Baz& e) const { return !(*this == e); }\n};\n\n} // namespace detail\n\nstruct EnumOptTup : std::variant<std::monostate, detail::EnumOptTup__Foo, detail::EnumOptTup__Bar, detail::EnumOptTup__Baz> {\n    using Foo = detail::EnumOptTup__Foo;\n    using Bar = detail::EnumOptTup__Bar;\n    using Baz = detail::EnumOptTup__Baz;\n    using std::variant<std::monostate, Foo, Bar, Baz>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nnamespace detail {\n\nstruct EnumVecTup__Foo {\n    std::vector<std::tuple<int32_t, int32_t>> _0;\n    bool operator == (const EnumVecTup__Foo&) const;\n    bool operator != (const EnumVecTup__Foo& e) const { return !(*this == e); }\n};\n\nstruct EnumVecTup__Bar {\n    bool operator == (const EnumVecTup__Bar&) const { return true; }\n    bool operator != (const EnumVecTup__Bar& e) const { return !(*this == e); }\n};\n\nstruct EnumVecTup__Baz {\n    int32_t x = 0;\n    int32_t y = 0;\n    bool operator == (const EnumVecTup__Baz&) const;\n    bool operator != (const EnumVecTup__Baz& e) const { return !(*this == e); }\n};\n\n} // namespace detail\n\nstruct EnumVecTup : std::variant<std::monostate, detail::EnumVecTup__Foo, detail::EnumVecTup__Bar, detail::EnumVecTup__Baz> {\n    using Foo = detail::EnumVecTup__Foo;\n    using Bar = detail::EnumVecTup__Bar;\n    using Baz = detail::EnumVecTup__Baz;\n    using std::variant<std::monostate, Foo, Bar, Baz>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nstruct OptBox {\n    std::optional<std::unique_ptr<int32_t>> _0;\n    bool operator == (const OptBox&) const;\n    bool operator != (const OptBox& o) const { return !(*this == o); }\n};\n\nstruct OptBoxOpt {\n    std::optional<std::unique_ptr<std::optional<int32_t>>> _0;\n    bool operator == (const OptBoxOpt&) const;\n    bool operator != (const OptBoxOpt& o) const { return !(*this == o); }\n};\n\nstruct OptTup0 {\n    std::optional<std::tuple<>> _0;\n    bool operator == (const OptTup0&) const;\n    bool operator != (const OptTup0& o) const { return !(*this == o); }\n};\n\nstruct OptTup1 {\n    std::optional<std::tuple<int32_t>> _0;\n    bool operator == (const OptTup1&) const;\n    bool operator != (const OptTup1& o) const { return !(*this == o); }\n};\n\nstruct OptTup2 {\n    std::optional<std::tuple<int32_t, int32_t>> _0;\n    bool operator == (const OptTup2&) const;\n    bool operator != (const OptTup2& o) const { return !(*this == o); }\n};\n\nstruct TupBox {\n    std::tuple<std::unique_ptr<int32_t>, std::unique_ptr<bool>> _0;\n    bool operator == (const TupBox&) const;\n    bool operator != (const TupBox& t) const { return !(*this == t); }\n};\n\nstruct VecBox {\n    std::vector<std::unique_ptr<int32_t>> _0;\n    bool operator == (const VecBox&) const;\n    bool operator != (const VecBox& v) const { return !(*this == v); }\n};\n\nstruct VecBoxVec {\n    std::vector<std::unique_ptr<std::vector<int32_t>>> _0;\n    bool operator == (const VecBoxVec&) const;\n    bool operator != (const VecBoxVec& v) const { return !(*this == v); }\n};\n\nstruct VecTup0 {\n    std::vector<std::tuple<>> _0;\n    bool operator == (const VecTup0&) const;\n    bool operator != (const VecTup0& v) const { return !(*this == v); }\n};\n\nstruct VecTup1 {\n    std::vector<std::tuple<int32_t>> _0;\n    bool operator == (const VecTup1&) const;\n    bool operator != (const VecTup1& v) const { return !(*this == v); }\n};\n\nstruct VecTup2 {\n    std::vector<std::tuple<int32_t, int32_t>> _0;\n    bool operator == (const VecTup2&) const;\n    bool operator != (const VecTup2& v) const { return !(*this == v); }\n};\n\nuintptr_t rust_mem_leaked();\n\nstd::tuple<> empty_tuple(std::tuple<> x);\n\nEmptyStruct empty_struct(EmptyStruct x);\n\nBoxTup0 box_tup_0(BoxTup0 x);\n\nBoxTup1 box_tup_1(BoxTup1 x);\n\nBoxTup2 box_tup_2(BoxTup2 x);\n\nVecTup0 vec_tup_0(VecTup0 x);\n\nVecTup1 vec_tup_1(VecTup1 x);\n\nVecTup2 vec_tup_2(VecTup2 x);\n\nOptTup0 opt_tup_0(OptTup0 x);\n\nOptTup1 opt_tup_1(OptTup1 x);\n\nOptTup2 opt_tup_2(OptTup2 x);\n\nEnumBoxTup enum_box_tup(EnumBoxTup x);\n\nEnumVecTup enum_vec_tup(EnumVecTup x);\n\nEnumOptTup enum_opt_tup(EnumOptTup x);\n\nTupBox tup_box(TupBox x);\n\nVecBox vec_box(VecBox x);\n\nBoxVec box_vec(BoxVec x);\n\nOptBox opt_box(OptBox x);\n\nBoxOpt box_opt(BoxOpt x);\n\nVecBoxVec vec_box_vec(VecBoxVec x);\n\nBoxVecBox box_vec_box(BoxVecBox x);\n\nOptBoxOpt opt_box_opt(OptBoxOpt x);\n\nBoxOptBox box_opt_box(BoxOptBox x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_derive_eq_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box__from_cpp(_: &mut *const u8) -> Box<()> {\n    Box::new(())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_box__to_cpp(val: (), _: &mut Vec<u8>) {\n    _ = val;\n}\n\nfn _ffi_box_bool_from_cpp(end: &mut *const u8) -> Box<bool> {\n    Box::new(_ffi_read::<bool>(end))\n}\n\nfn _ffi_box_bool_to_cpp(val: bool, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\nfn _ffi_box_i32_from_cpp(end: &mut *const u8) -> Box<(i32,)> {\n    Box::new((_ffi_read::<i32>(end),))\n}\n\nfn _ffi_box_i32_from_cpp2(end: &mut *const u8) -> Box<i32> {\n    Box::new(_ffi_read::<i32>(end))\n}\n\nfn _ffi_box_i32_i32_from_cpp(end: &mut *const u8) -> Box<(i32, i32)> {\n    Box::new((_ffi_read::<i32>(end), _ffi_read::<i32>(end)))\n}\n\nfn _ffi_box_i32_i32_to_cpp(val: (i32, i32), buf: &mut Vec<u8>) {\n    _ffi_write(val.0, buf);\n    _ffi_write(val.1, buf);\n}\n\nfn _ffi_box_i32_to_cpp(val: (i32,), buf: &mut Vec<u8>) {\n    _ffi_write(val.0, buf);\n}\n\nfn _ffi_box_i32_to_cpp2(val: i32, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\nfn _ffi_box_option_box_i32_from_cpp(end: &mut *const u8) -> Box<Option<Box<i32>>> {\n    Box::new(_ffi_read::<bool>(end).then(|| _ffi_box_i32_from_cpp2(end)))\n}\n\nfn _ffi_box_option_box_i32_to_cpp(val: Option<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_write(val.is_some(), buf);\n    if let Some(val_val) = val {\n        _ffi_box_i32_to_cpp2(*val_val, buf);\n    }\n}\n\nfn _ffi_box_option_i32_from_cpp(end: &mut *const u8) -> Box<Option<i32>> {\n    Box::new(_ffi_read::<bool>(end).then(|| _ffi_read::<i32>(end)))\n}\n\nfn _ffi_box_option_i32_to_cpp(val: Option<i32>, buf: &mut Vec<u8>) {\n    _ffi_write(val.is_some(), buf);\n    if let Some(val_val) = val {\n        _ffi_write(val_val, buf);\n    }\n}\n\nfn _ffi_box_vec_box_i32_from_cpp(end: &mut *const u8) -> Box<Vec<Box<i32>>> {\n    Box::new(_ffi_vec_box_i32_from_cpp(_ffi_read::<usize>(end), end))\n}\n\nfn _ffi_box_vec_box_i32_to_cpp(val: Vec<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_write(val.len(), buf);\n    _ffi_vec_box_i32_to_cpp(val, buf);\n}\n\nfn _ffi_box_vec_i32_from_cpp(end: &mut *const u8) -> Box<Vec<i32>> {\n    Box::new(_ffi_vec_i32_from_cpp2(_ffi_read::<usize>(end), end))\n}\n\nfn _ffi_box_vec_i32_to_cpp(val: Vec<i32>, buf: &mut Vec<u8>) {\n    _ffi_write(val.len(), buf);\n    _ffi_vec_i32_to_cpp2(val, buf);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumBoxTup_from_cpp(end: &mut *const u8) -> EnumBoxTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumBoxTup::Foo(_ffi_box_i32_i32_from_cpp(end)),\n        1 => EnumBoxTup::Bar,\n        2 => EnumBoxTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumBoxTup_to_cpp(val: EnumBoxTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumBoxTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_box_i32_i32_to_cpp(*x, buf);\n        }\n        EnumBoxTup::Bar => _ffi_write(1 as i32, buf),\n        EnumBoxTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumOptTup_from_cpp(end: &mut *const u8) -> EnumOptTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumOptTup::Foo(_ffi_read::<bool>(end).then(|| (_ffi_read::<i32>(end), _ffi_read::<i32>(end)))),\n        1 => EnumOptTup::Bar,\n        2 => EnumOptTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumOptTup_to_cpp(val: EnumOptTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumOptTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_write(x.is_some(), buf);\n            if let Some(x_val) = x {\n                _ffi_write(x_val.0, buf);\n                _ffi_write(x_val.1, buf);\n            }\n        }\n        EnumOptTup::Bar => _ffi_write(1 as i32, buf),\n        EnumOptTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumVecTup_from_cpp(end: &mut *const u8) -> EnumVecTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumVecTup::Foo(_ffi_vec_i32_i32_from_cpp(_ffi_read::<usize>(end), end)),\n        1 => EnumVecTup::Bar,\n        2 => EnumVecTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumVecTup_to_cpp(val: EnumVecTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumVecTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_write(x.len(), buf);\n            _ffi_vec_i32_i32_to_cpp(x, buf);\n        }\n        EnumVecTup::Bar => _ffi_write(1 as i32, buf),\n        EnumVecTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_opt(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_opt(BoxOpt(_ffi_box_option_i32_from_cpp(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_option_i32_to_cpp(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_opt_box(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_opt_box(BoxOptBox(_ffi_box_option_box_i32_from_cpp(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_option_box_i32_to_cpp(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_tup_0(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_0(BoxTup0(_ffi_box__from_cpp(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box__to_cpp(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_tup_1(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_1(BoxTup1(_ffi_box_i32_from_cpp(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_to_cpp(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_tup_2(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_2(BoxTup2(_ffi_box_i32_i32_from_cpp(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_i32_to_cpp(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_vec(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_vec(BoxVec(_ffi_box_vec_i32_from_cpp(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_vec_i32_to_cpp(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_vec_box(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_vec_box(BoxVecBox(_ffi_box_vec_box_i32_from_cpp(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_vec_box_i32_to_cpp(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_empty_struct() {\n    _ = empty_struct(EmptyStruct);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_empty_tuple() {\n    _ = empty_tuple(());\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_enum_box_tup(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumBoxTup_to_cpp(enum_box_tup(_ffi_enum_EnumBoxTup_from_cpp(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_enum_opt_tup(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumOptTup_to_cpp(enum_opt_tup(_ffi_enum_EnumOptTup_from_cpp(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_enum_vec_tup(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumVecTup_to_cpp(enum_vec_tup(_ffi_enum_EnumVecTup_from_cpp(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_box(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_box(OptBox(has_x_0.then(|| _ffi_box_i32_from_cpp2(&mut buf_end))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_box_i32_to_cpp2(*ret_0_val, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_box_opt(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_box_opt(OptBoxOpt(has_x_0.then(|| _ffi_box_option_i32_from_cpp(&mut buf_end))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_box_option_i32_to_cpp(*ret_0_val, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_tup_0(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let buf_end = buf_ptr;\n    let ret = opt_tup_0(OptTup0(has_x_0.then(|| ())));\n    let ret_0 = ret.0;\n    let buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ = ret_0_val;\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_tup_1(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_tup_1(OptTup1(has_x_0.then(|| (_ffi_read::<i32>(&mut buf_end),))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_write(ret_0_val.0, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_tup_2(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_tup_2(OptTup2(has_x_0.then(|| (_ffi_read::<i32>(&mut buf_end), _ffi_read::<i32>(&mut buf_end)))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_write(ret_0_val.0, &mut buf2);\n        _ffi_write(ret_0_val.1, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_tup_box(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = tup_box(TupBox((_ffi_box_i32_from_cpp2(&mut buf_end), _ffi_box_bool_from_cpp(&mut buf_end))));\n    let ret_0 = ret.0;\n    let ret_0_0 = ret_0.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_to_cpp2(*ret_0_0, &mut buf2);\n    let ret_0_1 = ret_0.1;\n    _ffi_box_bool_to_cpp(*ret_0_1, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_box(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_box(VecBox(_ffi_vec_box_i32_from_cpp(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_box_i32_to_cpp(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_box_vec(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_box_vec(VecBoxVec(_ffi_vec_box_vec_i32_from_cpp(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_box_vec_i32_to_cpp(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_tup_0(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_0(VecTup0(_ffi_vec__from_cpp(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec__to_cpp(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_tup_1(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_1(VecTup1(_ffi_vec_i32_from_cpp(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_i32_to_cpp(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_tup_2(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_2(VecTup2(_ffi_vec_i32_i32_from_cpp(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_i32_i32_to_cpp(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize_bool(*const u8, usize, bool);\n\n#[allow(non_snake_case)]\nfn _ffi_vec__from_cpp(len: usize, _: &mut *const u8) -> Vec<()> {\n    let mut items = Vec::<()>::with_capacity(len);\n    for _ in 0..len {\n        items.push(());\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__to_cpp(items: Vec<()>, _: &mut Vec<u8>) {\n    for item in items {\n        _ = item;\n    }\n}\n\nfn _ffi_vec_box_i32_from_cpp(len: usize, end: &mut *const u8) -> Vec<Box<i32>> {\n    let mut items = Vec::<Box<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_box_i32_from_cpp2(end));\n    }\n    items\n}\n\nfn _ffi_vec_box_i32_to_cpp(items: Vec<Box<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_box_i32_to_cpp2(*item, buf);\n    }\n}\n\nfn _ffi_vec_box_vec_i32_from_cpp(len: usize, end: &mut *const u8) -> Vec<Box<Vec<i32>>> {\n    let mut items = Vec::<Box<Vec<i32>>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_box_vec_i32_from_cpp(end));\n    }\n    items\n}\n\nfn _ffi_vec_box_vec_i32_to_cpp(items: Vec<Box<Vec<i32>>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_box_vec_i32_to_cpp(*item, buf);\n    }\n}\n\nfn _ffi_vec_i32_from_cpp(len: usize, end: &mut *const u8) -> Vec<(i32,)> {\n    let mut items = Vec::<(i32,)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((_ffi_read::<i32>(end),));\n    }\n    items\n}\n\nfn _ffi_vec_i32_from_cpp2(len: usize, end: &mut *const u8) -> Vec<i32> {\n    let mut items = Vec::<i32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i32_i32_from_cpp(len: usize, end: &mut *const u8) -> Vec<(i32, i32)> {\n    let mut items = Vec::<(i32, i32)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((_ffi_read::<i32>(end), _ffi_read::<i32>(end)));\n    }\n    items\n}\n\nfn _ffi_vec_i32_i32_to_cpp(items: Vec<(i32, i32)>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.0, buf);\n        _ffi_write(item.1, buf);\n    }\n}\n\nfn _ffi_vec_i32_to_cpp(items: Vec<(i32,)>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.0, buf);\n    }\n}\n\nfn _ffi_vec_i32_to_cpp2(items: Vec<i32>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item, buf);\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_derive_eq_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n#include <stdlib.h>\n#include <algorithm>\n\nstruct _ffi_ret_ptr_2_usize {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nstruct _ffi_ret_ptr_usize {\n    const void* _0;\n    uintptr_t _1;\n};\n\nstruct _ffi_ret_ptr_usize_bool {\n    const void* _0;\n    uintptr_t _1;\n    bool _2;\n};\n\nextern \"C\" {\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n_ffi_ret_ptr_usize _ffi_fn_box_opt(const void* buf_ptr);\nvoid* _ffi_alloc(uintptr_t len);\n_ffi_ret_ptr_usize _ffi_fn_box_opt_box(const void* buf_ptr);\n_ffi_ret_ptr_usize _ffi_fn_box_tup_0(const void* buf_ptr);\n_ffi_ret_ptr_usize _ffi_fn_box_tup_1(const void* buf_ptr);\n_ffi_ret_ptr_usize _ffi_fn_box_tup_2(const void* buf_ptr);\n_ffi_ret_ptr_usize _ffi_fn_box_vec(const void* buf_ptr);\n_ffi_ret_ptr_usize _ffi_fn_box_vec_box(const void* buf_ptr);\nvoid _ffi_fn_empty_struct();\nvoid _ffi_fn_empty_tuple();\n_ffi_ret_ptr_usize _ffi_fn_enum_box_tup(const void* buf_ptr);\n_ffi_ret_ptr_usize _ffi_fn_enum_opt_tup(const void* buf_ptr);\n_ffi_ret_ptr_usize _ffi_fn_enum_vec_tup(const void* buf_ptr);\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_box(const void* buf_ptr, bool has_x_0);\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_box_opt(const void* buf_ptr, bool has_x_0);\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_tup_0(const void* buf_ptr, bool has_x_0);\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_tup_1(const void* buf_ptr, bool has_x_0);\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_tup_2(const void* buf_ptr, bool has_x_0);\nuintptr_t _ffi_fn_rust_mem_leaked();\n_ffi_ret_ptr_usize _ffi_fn_tup_box(const void* buf_ptr);\n_ffi_ret_ptr_2_usize _ffi_fn_vec_box(const void* buf_ptr, uintptr_t x_0_len);\n_ffi_ret_ptr_2_usize _ffi_fn_vec_box_vec(const void* buf_ptr, uintptr_t x_0_len);\n_ffi_ret_ptr_2_usize _ffi_fn_vec_tup_0(const void* buf_ptr, uintptr_t x_0_len);\n_ffi_ret_ptr_2_usize _ffi_fn_vec_tup_1(const void* buf_ptr, uintptr_t x_0_len);\n_ffi_ret_ptr_2_usize _ffi_fn_vec_tup_2(const void* buf_ptr, uintptr_t x_0_len);\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nstd::unique_ptr<std::tuple<int32_t, int32_t>> _ffi_box_i32_i32_from_rust(const uint8_t*& end) {\n    auto val_0 = _ffi_read<int32_t>(end);\n    auto val_1 = _ffi_read<int32_t>(end);\n    auto val = std::make_tuple(val_0, val_1);\n    return std::make_unique<std::tuple<int32_t, int32_t>>(std::move(val));\n}\n\nrust::EnumBoxTup _ffi_enum_EnumBoxTup_from_rust(const uint8_t*& end) {\n    switch (_ffi_read<int32_t>(end)) {\n    case 0: {\n        auto x = _ffi_box_i32_i32_from_rust(end);\n        return rust::EnumBoxTup{rust::EnumBoxTup::Foo{std::move(x)}};\n    }\n    case 1:\n        return rust::EnumBoxTup{rust::EnumBoxTup::Bar{}};\n    case 2: {\n        auto x = _ffi_read<int32_t>(end);\n        auto y = _ffi_read<int32_t>(end);\n        return rust::EnumBoxTup{rust::EnumBoxTup::Baz{x, y}};\n    }\n    default:\n        abort();\n    }\n}\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_box_i32_i32_to_rust(std::tuple<int32_t, int32_t> val, std::vector<uint8_t>& buf) {\n    _ffi_write(std::get<0>(val), buf);\n    _ffi_write(std::get<1>(val), buf);\n}\n\nvoid _ffi_enum_EnumBoxTup_to_rust(rust::EnumBoxTup val, std::vector<uint8_t>& buf) {\n    if (auto it = val.as<rust::EnumBoxTup::Foo>()) {\n        _ffi_write(int32_t(0), buf);\n        _ffi_box_i32_i32_to_rust(std::move(*it->_0), buf);\n    } else if (val.is<rust::EnumBoxTup::Bar>()) {\n        _ffi_write(int32_t(1), buf);\n    } else if (auto it = val.as<rust::EnumBoxTup::Baz>()) {\n        _ffi_write(int32_t(2), buf);\n        _ffi_write(it->x, buf);\n        _ffi_write(it->y, buf);\n    } else {\n        abort();\n    }\n}\n\nrust::EnumOptTup _ffi_enum_EnumOptTup_from_rust(const uint8_t*& end) {\n    switch (_ffi_read<int32_t>(end)) {\n    case 0: {\n        std::optional<std::tuple<int32_t, int32_t>> x;\n        if (_ffi_read<bool>(end)) {\n            auto x_val_0 = _ffi_read<int32_t>(end);\n            auto x_val_1 = _ffi_read<int32_t>(end);\n            x = std::make_optional(std::make_tuple(x_val_0, x_val_1));\n        }\n        return rust::EnumOptTup{rust::EnumOptTup::Foo{std::move(x)}};\n    }\n    case 1:\n        return rust::EnumOptTup{rust::EnumOptTup::Bar{}};\n    case 2: {\n        auto x = _ffi_read<int32_t>(end);\n        auto y = _ffi_read<int32_t>(end);\n        return rust::EnumOptTup{rust::EnumOptTup::Baz{x, y}};\n    }\n    default:\n        abort();\n    }\n}\n\nvoid _ffi_enum_EnumOptTup_to_rust(rust::EnumOptTup val, std::vector<uint8_t>& buf) {\n    if (auto it = val.as<rust::EnumOptTup::Foo>()) {\n        _ffi_write(int32_t(0), buf);\n        auto has_x = it->_0.has_value();\n        _ffi_write(has_x, buf);\n        if (has_x) {\n            _ffi_write(std::get<0>(it->_0.value()), buf);\n            _ffi_write(std::get<1>(it->_0.value()), buf);\n        }\n    } else if (val.is<rust::EnumOptTup::Bar>()) {\n        _ffi_write(int32_t(1), buf);\n    } else if (auto it = val.as<rust::EnumOptTup::Baz>()) {\n        _ffi_write(int32_t(2), buf);\n        _ffi_write(it->x, buf);\n        _ffi_write(it->y, buf);\n    } else {\n        abort();\n    }\n}\n\nstd::vector<std::tuple<int32_t, int32_t>> _ffi_vec_i32_i32_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::tuple<int32_t, int32_t>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_0 = _ffi_read<int32_t>(end);\n        auto item_1 = _ffi_read<int32_t>(end);\n        auto item = std::make_tuple(item_0, item_1);\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nrust::EnumVecTup _ffi_enum_EnumVecTup_from_rust(const uint8_t*& end) {\n    switch (_ffi_read<int32_t>(end)) {\n    case 0: {\n        auto x_len = _ffi_read<uintptr_t>(end);\n        auto x = _ffi_vec_i32_i32_from_rust(x_len, end);\n        return rust::EnumVecTup{rust::EnumVecTup::Foo{std::move(x)}};\n    }\n    case 1:\n        return rust::EnumVecTup{rust::EnumVecTup::Bar{}};\n    case 2: {\n        auto x = _ffi_read<int32_t>(end);\n        auto y = _ffi_read<int32_t>(end);\n        return rust::EnumVecTup{rust::EnumVecTup::Baz{x, y}};\n    }\n    default:\n        abort();\n    }\n}\n\nvoid _ffi_vec_i32_i32_to_rust(std::vector<std::tuple<int32_t, int32_t>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(std::get<0>(item), buf);\n        _ffi_write(std::get<1>(item), buf);\n    }\n}\n\nvoid _ffi_enum_EnumVecTup_to_rust(rust::EnumVecTup val, std::vector<uint8_t>& buf) {\n    if (auto it = val.as<rust::EnumVecTup::Foo>()) {\n        _ffi_write(int32_t(0), buf);\n        auto x_len = it->_0.size();\n        _ffi_write(x_len, buf);\n        _ffi_vec_i32_i32_to_rust(std::move(it->_0), buf);\n    } else if (val.is<rust::EnumVecTup::Bar>()) {\n        _ffi_write(int32_t(1), buf);\n    } else if (auto it = val.as<rust::EnumVecTup::Baz>()) {\n        _ffi_write(int32_t(2), buf);\n        _ffi_write(it->x, buf);\n        _ffi_write(it->y, buf);\n    } else {\n        abort();\n    }\n}\n\nstd::unique_ptr<std::optional<int32_t>> _ffi_box_option_i32_from_rust(const uint8_t*& end) {\n    auto val = _ffi_read<bool>(end) ? std::make_optional(_ffi_read<int32_t>(end)) : std::nullopt;\n    return std::make_unique<std::optional<int32_t>>(std::move(val));\n}\n\nvoid _ffi_box_option_i32_to_rust(std::optional<int32_t> val, std::vector<uint8_t>& buf) {\n    auto has_val = val.has_value();\n    _ffi_write(has_val, buf);\n    if (has_val) {\n        _ffi_write(val.value(), buf);\n    }\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\nstd::unique_ptr<int32_t> _ffi_box_i32_from_rust2(const uint8_t*& end) {\n    auto val = _ffi_read<int32_t>(end);\n    return std::make_unique<int32_t>(val);\n}\n\nstd::unique_ptr<std::optional<std::unique_ptr<int32_t>>> _ffi_box_option_box_i32_from_rust(const uint8_t*& end) {\n    auto val = _ffi_read<bool>(end) ? std::make_optional(_ffi_box_i32_from_rust2(end)) : std::nullopt;\n    return std::make_unique<std::optional<std::unique_ptr<int32_t>>>(std::move(val));\n}\n\nvoid _ffi_box_i32_to_rust2(int32_t val, std::vector<uint8_t>& buf) {\n    _ffi_write(val, buf);\n}\n\nvoid _ffi_box_option_box_i32_to_rust(std::optional<std::unique_ptr<int32_t>> val, std::vector<uint8_t>& buf) {\n    auto has_val = val.has_value();\n    _ffi_write(has_val, buf);\n    if (has_val) {\n        _ffi_box_i32_to_rust2(std::move(*val.value()), buf);\n    }\n}\n\nstd::unique_ptr<std::tuple<>> _ffi_box__from_rust(const uint8_t*& end) {\n    auto val = std::tuple<>();\n    return std::make_unique<std::tuple<>>(std::move(val));\n}\n\nvoid _ffi_box__to_rust(std::tuple<> val, std::vector<uint8_t>& buf) {\n    (void)val;\n}\n\nstd::unique_ptr<std::tuple<int32_t>> _ffi_box_i32_from_rust(const uint8_t*& end) {\n    auto val_0 = _ffi_read<int32_t>(end);\n    auto val = val_0;\n    return std::make_unique<std::tuple<int32_t>>(std::move(val));\n}\n\nvoid _ffi_box_i32_to_rust(std::tuple<int32_t> val, std::vector<uint8_t>& buf) {\n    _ffi_write(std::get<0>(val), buf);\n}\n\nstd::vector<int32_t> _ffi_vec_i32_from_rust2(uintptr_t len, const uint8_t*& end) {\n    std::vector<int32_t> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item = _ffi_read<int32_t>(end);\n        items.emplace_back(item);\n    }\n    return items;\n}\n\nstd::unique_ptr<std::vector<int32_t>> _ffi_box_vec_i32_from_rust(const uint8_t*& end) {\n    auto val_len = _ffi_read<uintptr_t>(end);\n    auto val = _ffi_vec_i32_from_rust2(val_len, end);\n    return std::make_unique<std::vector<int32_t>>(std::move(val));\n}\n\nvoid _ffi_vec_i32_to_rust2(std::vector<int32_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_box_vec_i32_to_rust(std::vector<int32_t> val, std::vector<uint8_t>& buf) {\n    auto val_len = val.size();\n    _ffi_write(val_len, buf);\n    _ffi_vec_i32_to_rust2(std::move(val), buf);\n}\n\nstd::vector<std::unique_ptr<int32_t>> _ffi_vec_box_i32_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::unique_ptr<int32_t>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item = _ffi_box_i32_from_rust2(end);\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nstd::unique_ptr<std::vector<std::unique_ptr<int32_t>>> _ffi_box_vec_box_i32_from_rust(const uint8_t*& end) {\n    auto val_len = _ffi_read<uintptr_t>(end);\n    auto val = _ffi_vec_box_i32_from_rust(val_len, end);\n    return std::make_unique<std::vector<std::unique_ptr<int32_t>>>(std::move(val));\n}\n\nvoid _ffi_vec_box_i32_to_rust(std::vector<std::unique_ptr<int32_t>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_box_i32_to_rust2(std::move(*item), buf);\n    }\n}\n\nvoid _ffi_box_vec_box_i32_to_rust(std::vector<std::unique_ptr<int32_t>> val, std::vector<uint8_t>& buf) {\n    auto val_len = val.size();\n    _ffi_write(val_len, buf);\n    _ffi_vec_box_i32_to_rust(std::move(val), buf);\n}\n\nstd::unique_ptr<bool> _ffi_box_bool_from_rust(const uint8_t*& end) {\n    auto val = _ffi_read<bool>(end);\n    return std::make_unique<bool>(val);\n}\n\nvoid _ffi_box_bool_to_rust(bool val, std::vector<uint8_t>& buf) {\n    _ffi_write(val, buf);\n}\n\nstd::vector<std::unique_ptr<std::vector<int32_t>>> _ffi_vec_box_vec_i32_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::unique_ptr<std::vector<int32_t>>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item = _ffi_box_vec_i32_from_rust(end);\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nvoid _ffi_vec_box_vec_i32_to_rust(std::vector<std::unique_ptr<std::vector<int32_t>>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_box_vec_i32_to_rust(std::move(*item), buf);\n    }\n}\n\nstd::vector<std::tuple<>> _ffi_vec__from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::tuple<>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item = std::tuple<>();\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nvoid _ffi_vec__to_rust(std::vector<std::tuple<>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        (void)item;\n    }\n}\n\nstd::vector<std::tuple<int32_t>> _ffi_vec_i32_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::tuple<int32_t>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_0 = _ffi_read<int32_t>(end);\n        auto item = item_0;\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nvoid _ffi_vec_i32_to_rust(std::vector<std::tuple<int32_t>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(std::get<0>(item), buf);\n    }\n}\n\n} // namespace\n\nbool rust::BoxOpt::operator == (const rust::BoxOpt& b) const {\n    return *_0 == *b._0;\n}\n\nbool rust::BoxOptBox::operator == (const rust::BoxOptBox& b) const {\n    return (*_0 && *b._0 ? ***_0 == ***b._0 : !*_0 && !*b._0);\n}\n\nbool rust::BoxTup0::operator == (const rust::BoxTup0& b) const {\n    return *_0 == *b._0;\n}\n\nbool rust::BoxTup1::operator == (const rust::BoxTup1& b) const {\n    return *_0 == *b._0;\n}\n\nbool rust::BoxTup2::operator == (const rust::BoxTup2& b) const {\n    return *_0 == *b._0;\n}\n\nbool rust::BoxVec::operator == (const rust::BoxVec& b) const {\n    return *_0 == *b._0;\n}\n\nbool rust::BoxVecBox::operator == (const rust::BoxVecBox& b) const {\n    return std::equal((*_0).begin(), (*_0).end(), (*b._0).begin(), (*b._0).end(), [](const auto& a, const auto& b) { return *a == *b; });\n}\n\nbool rust::detail::EnumBoxTup__Baz::operator == (const rust::detail::EnumBoxTup__Baz& e) const {\n    return x == e.x && y == e.y;\n}\n\nbool rust::detail::EnumBoxTup__Foo::operator == (const rust::detail::EnumBoxTup__Foo& e) const {\n    return *_0 == *e._0;\n}\n\nbool rust::detail::EnumOptTup__Baz::operator == (const rust::detail::EnumOptTup__Baz& e) const {\n    return x == e.x && y == e.y;\n}\n\nbool rust::detail::EnumOptTup__Foo::operator == (const rust::detail::EnumOptTup__Foo& e) const {\n    return _0 == e._0;\n}\n\nbool rust::detail::EnumVecTup__Baz::operator == (const rust::detail::EnumVecTup__Baz& e) const {\n    return x == e.x && y == e.y;\n}\n\nbool rust::detail::EnumVecTup__Foo::operator == (const rust::detail::EnumVecTup__Foo& e) const {\n    return _0 == e._0;\n}\n\nbool rust::OptBox::operator == (const rust::OptBox& o) const {\n    return (_0 && o._0 ? **_0 == **o._0 : !_0 && !o._0);\n}\n\nbool rust::OptBoxOpt::operator == (const rust::OptBoxOpt& o) const {\n    return (_0 && o._0 ? **_0 == **o._0 : !_0 && !o._0);\n}\n\nbool rust::OptTup0::operator == (const rust::OptTup0& o) const {\n    return _0 == o._0;\n}\n\nbool rust::OptTup1::operator == (const rust::OptTup1& o) const {\n    return _0 == o._0;\n}\n\nbool rust::OptTup2::operator == (const rust::OptTup2& o) const {\n    return _0 == o._0;\n}\n\nbool rust::TupBox::operator == (const rust::TupBox& t) const {\n    return *std::get<0>(_0) == *std::get<0>(t._0) && *std::get<1>(_0) == *std::get<1>(t._0);\n}\n\nbool rust::VecBox::operator == (const rust::VecBox& v) const {\n    return std::equal(_0.begin(), _0.end(), v._0.begin(), v._0.end(), [](const auto& a, const auto& b) { return *a == *b; });\n}\n\nbool rust::VecBoxVec::operator == (const rust::VecBoxVec& v) const {\n    return std::equal(_0.begin(), _0.end(), v._0.begin(), v._0.end(), [](const auto& a, const auto& b) { return *a == *b; });\n}\n\nbool rust::VecTup0::operator == (const rust::VecTup0& v) const {\n    return _0 == v._0;\n}\n\nbool rust::VecTup1::operator == (const rust::VecTup1& v) const {\n    return _0 == v._0;\n}\n\nbool rust::VecTup2::operator == (const rust::VecTup2& v) const {\n    return _0 == v._0;\n}\n\nrust::BoxOpt rust::box_opt(rust::BoxOpt x) {\n    std::vector<uint8_t> buf;\n    _ffi_box_option_i32_to_rust(std::move(*x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_box_opt(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_box_option_i32_from_rust(buf_end2);\n    auto ret = rust::BoxOpt{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::BoxOptBox rust::box_opt_box(rust::BoxOptBox x) {\n    std::vector<uint8_t> buf;\n    _ffi_box_option_box_i32_to_rust(std::move(*x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_box_opt_box(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_box_option_box_i32_from_rust(buf_end2);\n    auto ret = rust::BoxOptBox{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::BoxTup0 rust::box_tup_0(rust::BoxTup0 x) {\n    std::vector<uint8_t> buf;\n    _ffi_box__to_rust(std::move(*x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_box_tup_0(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_box__from_rust(buf_end2);\n    auto ret = rust::BoxTup0{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::BoxTup1 rust::box_tup_1(rust::BoxTup1 x) {\n    std::vector<uint8_t> buf;\n    _ffi_box_i32_to_rust(std::move(*x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_box_tup_1(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_box_i32_from_rust(buf_end2);\n    auto ret = rust::BoxTup1{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::BoxTup2 rust::box_tup_2(rust::BoxTup2 x) {\n    std::vector<uint8_t> buf;\n    _ffi_box_i32_i32_to_rust(std::move(*x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_box_tup_2(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_box_i32_i32_from_rust(buf_end2);\n    auto ret = rust::BoxTup2{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::BoxVec rust::box_vec(rust::BoxVec x) {\n    std::vector<uint8_t> buf;\n    _ffi_box_vec_i32_to_rust(std::move(*x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_box_vec(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_box_vec_i32_from_rust(buf_end2);\n    auto ret = rust::BoxVec{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::BoxVecBox rust::box_vec_box(rust::BoxVecBox x) {\n    std::vector<uint8_t> buf;\n    _ffi_box_vec_box_i32_to_rust(std::move(*x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_box_vec_box(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_box_vec_box_i32_from_rust(buf_end2);\n    auto ret = rust::BoxVecBox{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::EmptyStruct rust::empty_struct(rust::EmptyStruct x) {\n    (void)x;\n    _ffi_fn_empty_struct();\n    return rust::EmptyStruct{};\n}\n\nstd::tuple<> rust::empty_tuple(std::tuple<> x) {\n    (void)x;\n    _ffi_fn_empty_tuple();\n    return std::tuple<>();\n}\n\nrust::EnumBoxTup rust::enum_box_tup(rust::EnumBoxTup x) {\n    std::vector<uint8_t> buf;\n    _ffi_enum_EnumBoxTup_to_rust(std::move(x), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_enum_box_tup(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret = _ffi_enum_EnumBoxTup_from_rust(buf_end2);\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::EnumOptTup rust::enum_opt_tup(rust::EnumOptTup x) {\n    std::vector<uint8_t> buf;\n    _ffi_enum_EnumOptTup_to_rust(std::move(x), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_enum_opt_tup(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret = _ffi_enum_EnumOptTup_from_rust(buf_end2);\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::EnumVecTup rust::enum_vec_tup(rust::EnumVecTup x) {\n    std::vector<uint8_t> buf;\n    _ffi_enum_EnumVecTup_to_rust(std::move(x), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_enum_vec_tup(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret = _ffi_enum_EnumVecTup_from_rust(buf_end2);\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::OptBox rust::opt_box(rust::OptBox x) {\n    std::vector<uint8_t> buf;\n    auto has_x_0 = x._0.has_value();\n    if (has_x_0) {\n        _ffi_box_i32_to_rust2(std::move(*x._0.value()), buf);\n    }\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_opt_box(buf_ptr, has_x_0);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto has_ret_0 = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = has_ret_0 ? std::make_optional(_ffi_box_i32_from_rust2(buf_end2)) : std::nullopt;\n    auto ret = rust::OptBox{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::OptBoxOpt rust::opt_box_opt(rust::OptBoxOpt x) {\n    std::vector<uint8_t> buf;\n    auto has_x_0 = x._0.has_value();\n    if (has_x_0) {\n        _ffi_box_option_i32_to_rust(std::move(*x._0.value()), buf);\n    }\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_opt_box_opt(buf_ptr, has_x_0);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto has_ret_0 = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = has_ret_0 ? std::make_optional(_ffi_box_option_i32_from_rust(buf_end2)) : std::nullopt;\n    auto ret = rust::OptBoxOpt{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::OptTup0 rust::opt_tup_0(rust::OptTup0 x) {\n    std::vector<uint8_t> buf;\n    auto has_x_0 = x._0.has_value();\n    if (has_x_0) {\n        (void)x._0.value();\n    }\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_opt_tup_0(buf_ptr, has_x_0);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto has_ret_0 = multi_ret._2;\n    auto ret_0 = has_ret_0 ? std::make_optional(std::tuple<>()) : std::nullopt;\n    auto ret = rust::OptTup0{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::OptTup1 rust::opt_tup_1(rust::OptTup1 x) {\n    std::vector<uint8_t> buf;\n    auto has_x_0 = x._0.has_value();\n    if (has_x_0) {\n        _ffi_write(std::get<0>(x._0.value()), buf);\n    }\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_opt_tup_1(buf_ptr, has_x_0);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto has_ret_0 = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    std::optional<std::tuple<int32_t>> ret_0;\n    if (has_ret_0) {\n        auto ret_0_val_0 = _ffi_read<int32_t>(buf_end2);\n        ret_0 = std::make_optional(ret_0_val_0);\n    }\n    auto ret = rust::OptTup1{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::OptTup2 rust::opt_tup_2(rust::OptTup2 x) {\n    std::vector<uint8_t> buf;\n    auto has_x_0 = x._0.has_value();\n    if (has_x_0) {\n        _ffi_write(std::get<0>(x._0.value()), buf);\n        _ffi_write(std::get<1>(x._0.value()), buf);\n    }\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_opt_tup_2(buf_ptr, has_x_0);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto has_ret_0 = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    std::optional<std::tuple<int32_t, int32_t>> ret_0;\n    if (has_ret_0) {\n        auto ret_0_val_0 = _ffi_read<int32_t>(buf_end2);\n        auto ret_0_val_1 = _ffi_read<int32_t>(buf_end2);\n        ret_0 = std::make_optional(std::make_tuple(ret_0_val_0, ret_0_val_1));\n    }\n    auto ret = rust::OptTup2{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nrust::TupBox rust::tup_box(rust::TupBox x) {\n    std::vector<uint8_t> buf;\n    _ffi_box_i32_to_rust2(std::move(*std::get<0>(x._0)), buf);\n    _ffi_box_bool_to_rust(std::move(*std::get<1>(x._0)), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_tup_box(buf_ptr);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0_0 = _ffi_box_i32_from_rust2(buf_end2);\n    auto ret_0_1 = _ffi_box_bool_from_rust(buf_end2);\n    auto ret_0 = std::make_tuple(std::move(ret_0_0), std::move(ret_0_1));\n    auto ret = rust::TupBox{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::VecBox rust::vec_box(rust::VecBox x) {\n    std::vector<uint8_t> buf;\n    auto x_0_len = x._0.size();\n    _ffi_vec_box_i32_to_rust(std::move(x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_vec_box(buf_ptr, x_0_len);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_0_len = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_vec_box_i32_from_rust(ret_0_len, buf_end2);\n    auto ret = rust::VecBox{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::VecBoxVec rust::vec_box_vec(rust::VecBoxVec x) {\n    std::vector<uint8_t> buf;\n    auto x_0_len = x._0.size();\n    _ffi_vec_box_vec_i32_to_rust(std::move(x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_vec_box_vec(buf_ptr, x_0_len);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_0_len = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_vec_box_vec_i32_from_rust(ret_0_len, buf_end2);\n    auto ret = rust::VecBoxVec{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::VecTup0 rust::vec_tup_0(rust::VecTup0 x) {\n    std::vector<uint8_t> buf;\n    auto x_0_len = x._0.size();\n    _ffi_vec__to_rust(std::move(x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_vec_tup_0(buf_ptr, x_0_len);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_0_len = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_vec__from_rust(ret_0_len, buf_end2);\n    auto ret = rust::VecTup0{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::VecTup1 rust::vec_tup_1(rust::VecTup1 x) {\n    std::vector<uint8_t> buf;\n    auto x_0_len = x._0.size();\n    _ffi_vec_i32_to_rust(std::move(x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_vec_tup_1(buf_ptr, x_0_len);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_0_len = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_vec_i32_from_rust(ret_0_len, buf_end2);\n    auto ret = rust::VecTup1{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nrust::VecTup2 rust::vec_tup_2(rust::VecTup2 x) {\n    std::vector<uint8_t> buf;\n    auto x_0_len = x._0.size();\n    _ffi_vec_i32_i32_to_rust(std::move(x._0), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_vec_tup_2(buf_ptr, x_0_len);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_0_len = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret_0 = _ffi_vec_i32_i32_from_rust(ret_0_len, buf_end2);\n    auto ret = rust::VecTup2{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_derive_eq_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <tuple>\n#include <memory>\n#include <optional>\n#include <vector>\n#include <variant>\n\nnamespace rust {\n\nstruct BoxOpt {\n    std::unique_ptr<std::optional<int32_t>> _0;\n    bool operator == (const BoxOpt&) const;\n    bool operator != (const BoxOpt& b) const { return !(*this == b); }\n};\n\nstruct BoxOptBox {\n    std::unique_ptr<std::optional<std::unique_ptr<int32_t>>> _0;\n    bool operator == (const BoxOptBox&) const;\n    bool operator != (const BoxOptBox& b) const { return !(*this == b); }\n};\n\nstruct BoxTup0 {\n    std::unique_ptr<std::tuple<>> _0;\n    bool operator == (const BoxTup0&) const;\n    bool operator != (const BoxTup0& b) const { return !(*this == b); }\n};\n\nstruct BoxTup1 {\n    std::unique_ptr<std::tuple<int32_t>> _0;\n    bool operator == (const BoxTup1&) const;\n    bool operator != (const BoxTup1& b) const { return !(*this == b); }\n};\n\nstruct BoxTup2 {\n    std::unique_ptr<std::tuple<int32_t, int32_t>> _0;\n    bool operator == (const BoxTup2&) const;\n    bool operator != (const BoxTup2& b) const { return !(*this == b); }\n};\n\nstruct BoxVec {\n    std::unique_ptr<std::vector<int32_t>> _0;\n    bool operator == (const BoxVec&) const;\n    bool operator != (const BoxVec& b) const { return !(*this == b); }\n};\n\nstruct BoxVecBox {\n    std::unique_ptr<std::vector<std::unique_ptr<int32_t>>> _0;\n    bool operator == (const BoxVecBox&) const;\n    bool operator != (const BoxVecBox& b) const { return !(*this == b); }\n};\n\nstruct EmptyStruct {\n    bool operator == (const EmptyStruct&) const { return true; }\n    bool operator != (const EmptyStruct& e) const { return !(*this == e); }\n};\n\nnamespace detail {\n\nstruct EnumBoxTup__Foo {\n    std::unique_ptr<std::tuple<int32_t, int32_t>> _0;\n    bool operator == (const EnumBoxTup__Foo&) const;\n    bool operator != (const EnumBoxTup__Foo& e) const { return !(*this == e); }\n};\n\nstruct EnumBoxTup__Bar {\n    bool operator == (const EnumBoxTup__Bar&) const { return true; }\n    bool operator != (const EnumBoxTup__Bar& e) const { return !(*this == e); }\n};\n\nstruct EnumBoxTup__Baz {\n    int32_t x = 0;\n    int32_t y = 0;\n    bool operator == (const EnumBoxTup__Baz&) const;\n    bool operator != (const EnumBoxTup__Baz& e) const { return !(*this == e); }\n};\n\n} // namespace detail\n\nstruct EnumBoxTup : std::variant<std::monostate, detail::EnumBoxTup__Foo, detail::EnumBoxTup__Bar, detail::EnumBoxTup__Baz> {\n    using Foo = detail::EnumBoxTup__Foo;\n    using Bar = detail::EnumBoxTup__Bar;\n    using Baz = detail::EnumBoxTup__Baz;\n    using std::variant<std::monostate, Foo, Bar, Baz>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nnamespace detail {\n\nstruct EnumOptTup__Foo {\n    std::optional<std::tuple<int32_t, int32_t>> _0;\n    bool operator == (const EnumOptTup__Foo&) const;\n    bool operator != (const EnumOptTup__Foo& e) const { return !(*this == e); }\n};\n\nstruct EnumOptTup__Bar {\n    bool operator == (const EnumOptTup__Bar&) const { return true; }\n    bool operator != (const EnumOptTup__Bar& e) const { return !(*this == e); }\n};\n\nstruct EnumOptTup__Baz {\n    int32_t x = 0;\n    int32_t y = 0;\n    bool operator == (const EnumOptTup__Baz&) const;\n    bool operator != (const EnumOptTup__Baz& e) const { return !(*this == e); }\n};\n\n} // namespace detail\n\nstruct EnumOptTup : std::variant<std::monostate, detail::EnumOptTup__Foo, detail::EnumOptTup__Bar, detail::EnumOptTup__Baz> {\n    using Foo = detail::EnumOptTup__Foo;\n    using Bar = detail::EnumOptTup__Bar;\n    using Baz = detail::EnumOptTup__Baz;\n    using std::variant<std::monostate, Foo, Bar, Baz>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nnamespace detail {\n\nstruct EnumVecTup__Foo {\n    std::vector<std::tuple<int32_t, int32_t>> _0;\n    bool operator == (const EnumVecTup__Foo&) const;\n    bool operator != (const EnumVecTup__Foo& e) const { return !(*this == e); }\n};\n\nstruct EnumVecTup__Bar {\n    bool operator == (const EnumVecTup__Bar&) const { return true; }\n    bool operator != (const EnumVecTup__Bar& e) const { return !(*this == e); }\n};\n\nstruct EnumVecTup__Baz {\n    int32_t x = 0;\n    int32_t y = 0;\n    bool operator == (const EnumVecTup__Baz&) const;\n    bool operator != (const EnumVecTup__Baz& e) const { return !(*this == e); }\n};\n\n} // namespace detail\n\nstruct EnumVecTup : std::variant<std::monostate, detail::EnumVecTup__Foo, detail::EnumVecTup__Bar, detail::EnumVecTup__Baz> {\n    using Foo = detail::EnumVecTup__Foo;\n    using Bar = detail::EnumVecTup__Bar;\n    using Baz = detail::EnumVecTup__Baz;\n    using std::variant<std::monostate, Foo, Bar, Baz>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nstruct OptBox {\n    std::optional<std::unique_ptr<int32_t>> _0;\n    bool operator == (const OptBox&) const;\n    bool operator != (const OptBox& o) const { return !(*this == o); }\n};\n\nstruct OptBoxOpt {\n    std::optional<std::unique_ptr<std::optional<int32_t>>> _0;\n    bool operator == (const OptBoxOpt&) const;\n    bool operator != (const OptBoxOpt& o) const { return !(*this == o); }\n};\n\nstruct OptTup0 {\n    std::optional<std::tuple<>> _0;\n    bool operator == (const OptTup0&) const;\n    bool operator != (const OptTup0& o) const { return !(*this == o); }\n};\n\nstruct OptTup1 {\n    std::optional<std::tuple<int32_t>> _0;\n    bool operator == (const OptTup1&) const;\n    bool operator != (const OptTup1& o) const { return !(*this == o); }\n};\n\nstruct OptTup2 {\n    std::optional<std::tuple<int32_t, int32_t>> _0;\n    bool operator == (const OptTup2&) const;\n    bool operator != (const OptTup2& o) const { return !(*this == o); }\n};\n\nstruct TupBox {\n    std::tuple<std::unique_ptr<int32_t>, std::unique_ptr<bool>> _0;\n    bool operator == (const TupBox&) const;\n    bool operator != (const TupBox& t) const { return !(*this == t); }\n};\n\nstruct VecBox {\n    std::vector<std::unique_ptr<int32_t>> _0;\n    bool operator == (const VecBox&) const;\n    bool operator != (const VecBox& v) const { return !(*this == v); }\n};\n\nstruct VecBoxVec {\n    std::vector<std::unique_ptr<std::vector<int32_t>>> _0;\n    bool operator == (const VecBoxVec&) const;\n    bool operator != (const VecBoxVec& v) const { return !(*this == v); }\n};\n\nstruct VecTup0 {\n    std::vector<std::tuple<>> _0;\n    bool operator == (const VecTup0&) const;\n    bool operator != (const VecTup0& v) const { return !(*this == v); }\n};\n\nstruct VecTup1 {\n    std::vector<std::tuple<int32_t>> _0;\n    bool operator == (const VecTup1&) const;\n    bool operator != (const VecTup1& v) const { return !(*this == v); }\n};\n\nstruct VecTup2 {\n    std::vector<std::tuple<int32_t, int32_t>> _0;\n    bool operator == (const VecTup2&) const;\n    bool operator != (const VecTup2& v) const { return !(*this == v); }\n};\n\nuintptr_t rust_mem_leaked();\n\nstd::tuple<> empty_tuple(std::tuple<> x);\n\nEmptyStruct empty_struct(EmptyStruct x);\n\nBoxTup0 box_tup_0(BoxTup0 x);\n\nBoxTup1 box_tup_1(BoxTup1 x);\n\nBoxTup2 box_tup_2(BoxTup2 x);\n\nVecTup0 vec_tup_0(VecTup0 x);\n\nVecTup1 vec_tup_1(VecTup1 x);\n\nVecTup2 vec_tup_2(VecTup2 x);\n\nOptTup0 opt_tup_0(OptTup0 x);\n\nOptTup1 opt_tup_1(OptTup1 x);\n\nOptTup2 opt_tup_2(OptTup2 x);\n\nEnumBoxTup enum_box_tup(EnumBoxTup x);\n\nEnumVecTup enum_vec_tup(EnumVecTup x);\n\nEnumOptTup enum_opt_tup(EnumOptTup x);\n\nTupBox tup_box(TupBox x);\n\nVecBox vec_box(VecBox x);\n\nBoxVec box_vec(BoxVec x);\n\nOptBox opt_box(OptBox x);\n\nBoxOpt box_opt(BoxOpt x);\n\nVecBoxVec vec_box_vec(VecBoxVec x);\n\nBoxVecBox box_vec_box(BoxVecBox x);\n\nOptBoxOpt opt_box_opt(OptBoxOpt x);\n\nBoxOptBox box_opt_box(BoxOptBox x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_derive_eq_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box__from_cpp(_: &mut *const u8) -> Box<()> {\n    Box::new(())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_box__to_cpp(val: (), _: &mut Vec<u8>) {\n    _ = val;\n}\n\nfn _ffi_box_bool_from_cpp(end: &mut *const u8) -> Box<bool> {\n    Box::new(_ffi_read::<bool>(end))\n}\n\nfn _ffi_box_bool_to_cpp(val: bool, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\nfn _ffi_box_i32_from_cpp(end: &mut *const u8) -> Box<(i32,)> {\n    Box::new((_ffi_read::<i32>(end),))\n}\n\nfn _ffi_box_i32_from_cpp2(end: &mut *const u8) -> Box<i32> {\n    Box::new(_ffi_read::<i32>(end))\n}\n\nfn _ffi_box_i32_i32_from_cpp(end: &mut *const u8) -> Box<(i32, i32)> {\n    Box::new((_ffi_read::<i32>(end), _ffi_read::<i32>(end)))\n}\n\nfn _ffi_box_i32_i32_to_cpp(val: (i32, i32), buf: &mut Vec<u8>) {\n    _ffi_write(val.0, buf);\n    _ffi_write(val.1, buf);\n}\n\nfn _ffi_box_i32_to_cpp(val: (i32,), buf: &mut Vec<u8>) {\n    _ffi_write(val.0, buf);\n}\n\nfn _ffi_box_i32_to_cpp2(val: i32, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\nfn _ffi_box_option_box_i32_from_cpp(end: &mut *const u8) -> Box<Option<Box<i32>>> {\n    Box::new(_ffi_read::<bool>(end).then(|| _ffi_box_i32_from_cpp2(end)))\n}\n\nfn _ffi_box_option_box_i32_to_cpp(val: Option<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_write(val.is_some(), buf);\n    if let Some(val_val) = val {\n        _ffi_box_i32_to_cpp2(*val_val, buf);\n    }\n}\n\nfn _ffi_box_option_i32_from_cpp(end: &mut *const u8) -> Box<Option<i32>> {\n    Box::new(_ffi_read::<bool>(end).then(|| _ffi_read::<i32>(end)))\n}\n\nfn _ffi_box_option_i32_to_cpp(val: Option<i32>, buf: &mut Vec<u8>) {\n    _ffi_write(val.is_some(), buf);\n    if let Some(val_val) = val {\n        _ffi_write(val_val, buf);\n    }\n}\n\nfn _ffi_box_vec_box_i32_from_cpp(end: &mut *const u8) -> Box<Vec<Box<i32>>> {\n    Box::new(_ffi_vec_box_i32_from_cpp(_ffi_read::<usize>(end), end))\n}\n\nfn _ffi_box_vec_box_i32_to_cpp(val: Vec<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_write(val.len(), buf);\n    _ffi_vec_box_i32_to_cpp(val, buf);\n}\n\nfn _ffi_box_vec_i32_from_cpp(end: &mut *const u8) -> Box<Vec<i32>> {\n    Box::new(_ffi_vec_i32_from_cpp2(_ffi_read::<usize>(end), end))\n}\n\nfn _ffi_box_vec_i32_to_cpp(val: Vec<i32>, buf: &mut Vec<u8>) {\n    _ffi_write(val.len(), buf);\n    _ffi_vec_i32_to_cpp2(val, buf);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumBoxTup_from_cpp(end: &mut *const u8) -> EnumBoxTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumBoxTup::Foo(_ffi_box_i32_i32_from_cpp(end)),\n        1 => EnumBoxTup::Bar,\n        2 => EnumBoxTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumBoxTup_to_cpp(val: EnumBoxTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumBoxTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_box_i32_i32_to_cpp(*x, buf);\n        }\n        EnumBoxTup::Bar => _ffi_write(1 as i32, buf),\n        EnumBoxTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumOptTup_from_cpp(end: &mut *const u8) -> EnumOptTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumOptTup::Foo(_ffi_read::<bool>(end).then(|| (_ffi_read::<i32>(end), _ffi_read::<i32>(end)))),\n        1 => EnumOptTup::Bar,\n        2 => EnumOptTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumOptTup_to_cpp(val: EnumOptTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumOptTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_write(x.is_some(), buf);\n            if let Some(x_val) = x {\n                _ffi_write(x_val.0, buf);\n                _ffi_write(x_val.1, buf);\n            }\n        }\n        EnumOptTup::Bar => _ffi_write(1 as i32, buf),\n        EnumOptTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumVecTup_from_cpp(end: &mut *const u8) -> EnumVecTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumVecTup::Foo(_ffi_vec_i32_i32_from_cpp(_ffi_read::<usize>(end), end)),\n        1 => EnumVecTup::Bar,\n        2 => EnumVecTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumVecTup_to_cpp(val: EnumVecTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumVecTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_write(x.len(), buf);\n            _ffi_vec_i32_i32_to_cpp(x, buf);\n        }\n        EnumVecTup::Bar => _ffi_write(1 as i32, buf),\n        EnumVecTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_opt(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_opt(BoxOpt(_ffi_box_option_i32_from_cpp(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_option_i32_to_cpp(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_opt_box(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_opt_box(BoxOptBox(_ffi_box_option_box_i32_from_cpp(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_option_box_i32_to_cpp(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_tup_0(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_0(BoxTup0(_ffi_box__from_cpp(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box__to_cpp(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_tup_1(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_1(BoxTup1(_ffi_box_i32_from_cpp(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_to_cpp(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_tup_2(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_2(BoxTup2(_ffi_box_i32_i32_from_cpp(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_i32_to_cpp(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_vec(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_vec(BoxVec(_ffi_box_vec_i32_from_cpp(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_vec_i32_to_cpp(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_vec_box(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_vec_box(BoxVecBox(_ffi_box_vec_box_i32_from_cpp(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_vec_box_i32_to_cpp(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_empty_struct() {\n    _ = empty_struct(EmptyStruct);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_empty_tuple() {\n    _ = empty_tuple(());\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_enum_box_tup(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumBoxTup_to_cpp(enum_box_tup(_ffi_enum_EnumBoxTup_from_cpp(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_enum_opt_tup(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumOptTup_to_cpp(enum_opt_tup(_ffi_enum_EnumOptTup_from_cpp(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_enum_vec_tup(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumVecTup_to_cpp(enum_vec_tup(_ffi_enum_EnumVecTup_from_cpp(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_box(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_box(OptBox(has_x_0.then(|| _ffi_box_i32_from_cpp2(&mut buf_end))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_box_i32_to_cpp2(*ret_0_val, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_box_opt(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_box_opt(OptBoxOpt(has_x_0.then(|| _ffi_box_option_i32_from_cpp(&mut buf_end))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_box_option_i32_to_cpp(*ret_0_val, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_tup_0(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let buf_end = buf_ptr;\n    let ret = opt_tup_0(OptTup0(has_x_0.then(|| ())));\n    let ret_0 = ret.0;\n    let buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ = ret_0_val;\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_tup_1(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_tup_1(OptTup1(has_x_0.then(|| (_ffi_read::<i32>(&mut buf_end),))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_write(ret_0_val.0, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_tup_2(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_tup_2(OptTup2(has_x_0.then(|| (_ffi_read::<i32>(&mut buf_end), _ffi_read::<i32>(&mut buf_end)))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_write(ret_0_val.0, &mut buf2);\n        _ffi_write(ret_0_val.1, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_tup_box(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = tup_box(TupBox((_ffi_box_i32_from_cpp2(&mut buf_end), _ffi_box_bool_from_cpp(&mut buf_end))));\n    let ret_0 = ret.0;\n    let ret_0_0 = ret_0.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_to_cpp2(*ret_0_0, &mut buf2);\n    let ret_0_1 = ret_0.1;\n    _ffi_box_bool_to_cpp(*ret_0_1, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_box(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_box(VecBox(_ffi_vec_box_i32_from_cpp(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_box_i32_to_cpp(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_box_vec(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_box_vec(VecBoxVec(_ffi_vec_box_vec_i32_from_cpp(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_box_vec_i32_to_cpp(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_tup_0(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_0(VecTup0(_ffi_vec__from_cpp(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec__to_cpp(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_tup_1(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_1(VecTup1(_ffi_vec_i32_from_cpp(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_i32_to_cpp(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_tup_2(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_2(VecTup2(_ffi_vec_i32_i32_from_cpp(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_i32_i32_to_cpp(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize_bool(*const u8, usize, bool);\n\n#[allow(non_snake_case)]\nfn _ffi_vec__from_cpp(len: usize, _: &mut *const u8) -> Vec<()> {\n    let mut items = Vec::<()>::with_capacity(len);\n    for _ in 0..len {\n        items.push(());\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__to_cpp(items: Vec<()>, _: &mut Vec<u8>) {\n    for item in items {\n        _ = item;\n    }\n}\n\nfn _ffi_vec_box_i32_from_cpp(len: usize, end: &mut *const u8) -> Vec<Box<i32>> {\n    let mut items = Vec::<Box<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_box_i32_from_cpp2(end));\n    }\n    items\n}\n\nfn _ffi_vec_box_i32_to_cpp(items: Vec<Box<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_box_i32_to_cpp2(*item, buf);\n    }\n}\n\nfn _ffi_vec_box_vec_i32_from_cpp(len: usize, end: &mut *const u8) -> Vec<Box<Vec<i32>>> {\n    let mut items = Vec::<Box<Vec<i32>>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_box_vec_i32_from_cpp(end));\n    }\n    items\n}\n\nfn _ffi_vec_box_vec_i32_to_cpp(items: Vec<Box<Vec<i32>>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_box_vec_i32_to_cpp(*item, buf);\n    }\n}\n\nfn _ffi_vec_i32_from_cpp(len: usize, end: &mut *const u8) -> Vec<(i32,)> {\n    let mut items = Vec::<(i32,)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((_ffi_read::<i32>(end),));\n    }\n    items\n}\n\nfn _ffi_vec_i32_from_cpp2(len: usize, end: &mut *const u8) -> Vec<i32> {\n    let mut items = Vec::<i32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i32_i32_from_cpp(len: usize, end: &mut *const u8) -> Vec<(i32, i32)> {\n    let mut items = Vec::<(i32, i32)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((_ffi_read::<i32>(end), _ffi_read::<i32>(end)));\n    }\n    items\n}\n\nfn _ffi_vec_i32_i32_to_cpp(items: Vec<(i32, i32)>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.0, buf);\n        _ffi_write(item.1, buf);\n    }\n}\n\nfn _ffi_vec_i32_to_cpp(items: Vec<(i32,)>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.0, buf);\n    }\n}\n\nfn _ffi_vec_i32_to_cpp2(items: Vec<i32>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item, buf);\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_enum_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_enum_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <variant>\n#include <memory>\n#include <tuple>\n#include <optional>\n#include <vector>\n\nnamespace rust {\n\nstruct InnerEnum;\nstruct InnerStruct;\nstruct NestedBox;\nstruct NestedOption;\nstruct NestedTuple;\nstruct NestedVec;\n\nnamespace detail {\n\nstruct NestedEnum__Foo {\n};\n\nstruct NestedEnum__Bar {\n    std::tuple<int32_t, std::unique_ptr<InnerEnum>> _0;\n};\n\n} // namespace detail\n\nstruct NestedEnum : std::variant<std::monostate, detail::NestedEnum__Foo, detail::NestedEnum__Bar> {\n    using Foo = detail::NestedEnum__Foo;\n    using Bar = detail::NestedEnum__Bar;\n    using std::variant<std::monostate, Foo, Bar>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nnamespace detail {\n\nstruct InnerEnum__Foo {\n    NestedEnum _0;\n};\n\n} // namespace detail\n\nstruct InnerEnum : std::variant<std::monostate, detail::InnerEnum__Foo> {\n    using Foo = detail::InnerEnum__Foo;\n    using std::variant<std::monostate, Foo>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nnamespace detail {\n\nstruct NestedStruct__Foo {\n};\n\nstruct NestedStruct__Bar {\n    std::tuple<int32_t, std::unique_ptr<InnerStruct>> _0;\n};\n\n} // namespace detail\n\nstruct NestedStruct : std::variant<std::monostate, detail::NestedStruct__Foo, detail::NestedStruct__Bar> {\n    using Foo = detail::NestedStruct__Foo;\n    using Bar = detail::NestedStruct__Bar;\n    using std::variant<std::monostate, Foo, Bar>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nstruct InnerStruct {\n    NestedStruct x;\n};\n\nnamespace detail {\n\nstruct NestedBox__Foo {\n};\n\nstruct NestedBox__Bar {\n    std::unique_ptr<NestedBox> _0;\n};\n\n} // namespace detail\n\nstruct NestedBox : std::variant<std::monostate, detail::NestedBox__Foo, detail::NestedBox__Bar> {\n    using Foo = detail::NestedBox__Foo;\n    using Bar = detail::NestedBox__Bar;\n    using std::variant<std::monostate, Foo, Bar>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nnamespace detail {\n\nstruct NestedOption__Foo {\n};\n\nstruct NestedOption__Bar {\n    std::optional<std::unique_ptr<NestedOption>> _0;\n};\n\n} // namespace detail\n\nstruct NestedOption : std::variant<std::monostate, detail::NestedOption__Foo, detail::NestedOption__Bar> {\n    using Foo = detail::NestedOption__Foo;\n    using Bar = detail::NestedOption__Bar;\n    using std::variant<std::monostate, Foo, Bar>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nnamespace detail {\n\nstruct NestedTuple__Foo {\n};\n\nstruct NestedTuple__Bar {\n    std::tuple<int32_t, std::unique_ptr<NestedTuple>> _0;\n};\n\n} // namespace detail\n\nstruct NestedTuple : std::variant<std::monostate, detail::NestedTuple__Foo, detail::NestedTuple__Bar> {\n    using Foo = detail::NestedTuple__Foo;\n    using Bar = detail::NestedTuple__Bar;\n    using std::variant<std::monostate, Foo, Bar>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nnamespace detail {\n\nstruct NestedVec__Foo {\n};\n\nstruct NestedVec__Bar {\n    std::vector<NestedVec> _0;\n};\n\n} // namespace detail\n\nstruct NestedVec : std::variant<std::monostate, detail::NestedVec__Foo, detail::NestedVec__Bar> {\n    using Foo = detail::NestedVec__Foo;\n    using Bar = detail::NestedVec__Bar;\n    using std::variant<std::monostate, Foo, Bar>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nuintptr_t rust_mem_leaked();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_enum_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_enum_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_enum_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <variant>\n#include <memory>\n#include <tuple>\n#include <optional>\n#include <vector>\n\nnamespace rust {\n\nstruct InnerEnum;\nstruct InnerStruct;\nstruct NestedBox;\nstruct NestedOption;\nstruct NestedTuple;\nstruct NestedVec;\n\nnamespace detail {\n\nstruct NestedEnum__Foo {\n};\n\nstruct NestedEnum__Bar {\n    std::tuple<int32_t, std::unique_ptr<InnerEnum>> _0;\n};\n\n} // namespace detail\n\nstruct NestedEnum : std::variant<std::monostate, detail::NestedEnum__Foo, detail::NestedEnum__Bar> {\n    using Foo = detail::NestedEnum__Foo;\n    using Bar = detail::NestedEnum__Bar;\n    using std::variant<std::monostate, Foo, Bar>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nnamespace detail {\n\nstruct InnerEnum__Foo {\n    NestedEnum _0;\n};\n\n} // namespace detail\n\nstruct InnerEnum : std::variant<std::monostate, detail::InnerEnum__Foo> {\n    using Foo = detail::InnerEnum__Foo;\n    using std::variant<std::monostate, Foo>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nnamespace detail {\n\nstruct NestedStruct__Foo {\n};\n\nstruct NestedStruct__Bar {\n    std::tuple<int32_t, std::unique_ptr<InnerStruct>> _0;\n};\n\n} // namespace detail\n\nstruct NestedStruct : std::variant<std::monostate, detail::NestedStruct__Foo, detail::NestedStruct__Bar> {\n    using Foo = detail::NestedStruct__Foo;\n    using Bar = detail::NestedStruct__Bar;\n    using std::variant<std::monostate, Foo, Bar>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nstruct InnerStruct {\n    NestedStruct x;\n};\n\nnamespace detail {\n\nstruct NestedBox__Foo {\n};\n\nstruct NestedBox__Bar {\n    std::unique_ptr<NestedBox> _0;\n};\n\n} // namespace detail\n\nstruct NestedBox : std::variant<std::monostate, detail::NestedBox__Foo, detail::NestedBox__Bar> {\n    using Foo = detail::NestedBox__Foo;\n    using Bar = detail::NestedBox__Bar;\n    using std::variant<std::monostate, Foo, Bar>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nnamespace detail {\n\nstruct NestedOption__Foo {\n};\n\nstruct NestedOption__Bar {\n    std::optional<std::unique_ptr<NestedOption>> _0;\n};\n\n} // namespace detail\n\nstruct NestedOption : std::variant<std::monostate, detail::NestedOption__Foo, detail::NestedOption__Bar> {\n    using Foo = detail::NestedOption__Foo;\n    using Bar = detail::NestedOption__Bar;\n    using std::variant<std::monostate, Foo, Bar>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nnamespace detail {\n\nstruct NestedTuple__Foo {\n};\n\nstruct NestedTuple__Bar {\n    std::tuple<int32_t, std::unique_ptr<NestedTuple>> _0;\n};\n\n} // namespace detail\n\nstruct NestedTuple : std::variant<std::monostate, detail::NestedTuple__Foo, detail::NestedTuple__Bar> {\n    using Foo = detail::NestedTuple__Foo;\n    using Bar = detail::NestedTuple__Bar;\n    using std::variant<std::monostate, Foo, Bar>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nnamespace detail {\n\nstruct NestedVec__Foo {\n};\n\nstruct NestedVec__Bar {\n    std::vector<NestedVec> _0;\n};\n\n} // namespace detail\n\nstruct NestedVec : std::variant<std::monostate, detail::NestedVec__Foo, detail::NestedVec__Bar> {\n    using Foo = detail::NestedVec__Foo;\n    using Bar = detail::NestedVec__Bar;\n    using std::variant<std::monostate, Foo, Bar>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nuintptr_t rust_mem_leaked();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_enum_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_keyword_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_test_alignas(int32_t alignas2);\nint32_t _ffi_fn_test_alignof(int32_t alignof2);\nint32_t _ffi_fn_test_and(int32_t and2);\nint32_t _ffi_fn_test_and_eq(int32_t and_eq2);\nint32_t _ffi_fn_test_asm(int32_t asm2);\nint32_t _ffi_fn_test_associatedtype(int32_t associatedtype);\nint32_t _ffi_fn_test_associativity(int32_t associativity);\nint32_t _ffi_fn_test_atomic_cancel(int32_t atomic_cancel2);\nint32_t _ffi_fn_test_atomic_commit(int32_t atomic_commit2);\nint32_t _ffi_fn_test_atomic_noexcept(int32_t atomic_noexcept2);\nint32_t _ffi_fn_test_auto(int32_t auto2);\nint32_t _ffi_fn_test_bitand(int32_t bitand2);\nint32_t _ffi_fn_test_bitor(int32_t bitor2);\nint32_t _ffi_fn_test_bool(int32_t bool2);\nint32_t _ffi_fn_test_boolean(int32_t boolean);\nint32_t _ffi_fn_test_borrowing(int32_t borrowing);\nint32_t _ffi_fn_test_byte(int32_t byte);\nint32_t _ffi_fn_test_case(int32_t case2);\nint32_t _ffi_fn_test_catch(int32_t catch2);\nint32_t _ffi_fn_test_char(int32_t char2);\nint32_t _ffi_fn_test_char16_t(int32_t char16_t2);\nint32_t _ffi_fn_test_char32_t(int32_t char32_t2);\nint32_t _ffi_fn_test_char8_t(int32_t char8_t2);\nint32_t _ffi_fn_test_class(int32_t class2);\nint32_t _ffi_fn_test_co_await(int32_t co_await2);\nint32_t _ffi_fn_test_co_return(int32_t co_return2);\nint32_t _ffi_fn_test_co_yield(int32_t co_yield2);\nint32_t _ffi_fn_test_compl(int32_t compl2);\nint32_t _ffi_fn_test_concept(int32_t concept2);\nint32_t _ffi_fn_test_const_cast(int32_t const_cast2);\nint32_t _ffi_fn_test_consteval(int32_t consteval2);\nint32_t _ffi_fn_test_constexpr(int32_t constexpr2);\nint32_t _ffi_fn_test_constinit(int32_t constinit2);\nint32_t _ffi_fn_test_consuming(int32_t consuming);\nint32_t _ffi_fn_test_contract_assert(int32_t contract_assert2);\nint32_t _ffi_fn_test_convenience(int32_t convenience);\nint32_t _ffi_fn_test_debugger(int32_t debugger);\nint32_t _ffi_fn_test_decltype(int32_t decltype2);\nint32_t _ffi_fn_test_default(int32_t default2);\nint32_t _ffi_fn_test_defer(int32_t defer);\nint32_t _ffi_fn_test_deinit(int32_t deinit);\nint32_t _ffi_fn_test_delete(int32_t delete2);\nint32_t _ffi_fn_test_double(int32_t double2);\nint32_t _ffi_fn_test_dynamic(int32_t dynamic);\nint32_t _ffi_fn_test_dynamic_cast(int32_t dynamic_cast2);\nint32_t _ffi_fn_test_explicit(int32_t explicit2);\nint32_t _ffi_fn_test_export(int32_t export2);\nint32_t _ffi_fn_test_extends(int32_t extends);\nint32_t _ffi_fn_test_extension(int32_t extension);\nint32_t _ffi_fn_test_fallthrough(int32_t fallthrough);\nint32_t _ffi_fn_test_fileprivate(int32_t fileprivate);\nint32_t _ffi_fn_test_finally(int32_t finally);\nint32_t _ffi_fn_test_float(int32_t float2);\nint32_t _ffi_fn_test_friend(int32_t friend2);\nint32_t _ffi_fn_test_func(int32_t func);\nint32_t _ffi_fn_test_function(int32_t function);\nint32_t _ffi_fn_test_get(int32_t get);\nint32_t _ffi_fn_test_goto(int32_t goto2);\nint32_t _ffi_fn_test_guard(int32_t guard);\nint32_t _ffi_fn_test_implements(int32_t implements);\nint32_t _ffi_fn_test_import(int32_t import);\nint32_t _ffi_fn_test_indirect(int32_t indirect);\nint32_t _ffi_fn_test_infix(int32_t infix);\nint32_t _ffi_fn_test_init(int32_t init);\nint32_t _ffi_fn_test_inline(int32_t inline2);\nint32_t _ffi_fn_test_inout(int32_t inout);\nint32_t _ffi_fn_test_instanceof(int32_t instanceof);\nint32_t _ffi_fn_test_int(int32_t int2);\nint32_t _ffi_fn_test_interface(int32_t interface);\nint32_t _ffi_fn_test_internal(int32_t internal);\nint32_t _ffi_fn_test_is(int32_t is);\nint32_t _ffi_fn_test_lazy(int32_t lazy);\nint32_t _ffi_fn_test_left(int32_t left);\nint32_t _ffi_fn_test_long(int32_t long2);\nint32_t _ffi_fn_test_mutable(int32_t mutable2);\nint32_t _ffi_fn_test_mutating(int32_t mutating);\nint32_t _ffi_fn_test_namespace(int32_t namespace2);\nint32_t _ffi_fn_test_native(int32_t native);\nint32_t _ffi_fn_test_new(int32_t new2);\nint32_t _ffi_fn_test_nil(int32_t nil);\nint32_t _ffi_fn_test_noexcept(int32_t noexcept2);\nint32_t _ffi_fn_test_none(int32_t none);\nint32_t _ffi_fn_test_nonisolated(int32_t nonisolated);\nint32_t _ffi_fn_test_nonmutating(int32_t nonmutating);\nint32_t _ffi_fn_test_not(int32_t not2);\nint32_t _ffi_fn_test_not_eq(int32_t not_eq2);\nint32_t _ffi_fn_test_null(int32_t null);\nint32_t _ffi_fn_test_nullptr(int32_t nullptr2);\nint32_t _ffi_fn_test_open(int32_t open);\nint32_t _ffi_fn_test_operator(int32_t operator2);\nint32_t _ffi_fn_test_optional(int32_t optional);\nint32_t _ffi_fn_test_or(int32_t or2);\nint32_t _ffi_fn_test_or_eq(int32_t or_eq2);\nint32_t _ffi_fn_test_package(int32_t package);\nint32_t _ffi_fn_test_postfix(int32_t postfix);\nint32_t _ffi_fn_test_precedence(int32_t precedence);\nint32_t _ffi_fn_test_precedencegroup(int32_t precedencegroup);\nint32_t _ffi_fn_test_prefix(int32_t prefix);\nint32_t _ffi_fn_test_private(int32_t private2);\nint32_t _ffi_fn_test_protected(int32_t protected2);\nint32_t _ffi_fn_test_protocol(int32_t protocol);\nint32_t _ffi_fn_test_public(int32_t public2);\nint32_t _ffi_fn_test_reflexpr(int32_t reflexpr2);\nint32_t _ffi_fn_test_register(int32_t register2);\nint32_t _ffi_fn_test_reinterpret_cast(int32_t reinterpret_cast2);\nint32_t _ffi_fn_test_repeat(int32_t repeat);\nint32_t _ffi_fn_test_required(int32_t required);\nint32_t _ffi_fn_test_requires(int32_t requires2);\nint32_t _ffi_fn_test_rethrows(int32_t rethrows);\nint32_t _ffi_fn_test_right(int32_t right);\nint32_t _ffi_fn_test_set(int32_t set);\nint32_t _ffi_fn_test_short(int32_t short2);\nint32_t _ffi_fn_test_signed(int32_t signed2);\nint32_t _ffi_fn_test_sizeof(int32_t sizeof2);\nint32_t _ffi_fn_test_some(int32_t some);\nint32_t _ffi_fn_test_static_assert(int32_t static_assert2);\nint32_t _ffi_fn_test_static_cast(int32_t static_cast2);\nint32_t _ffi_fn_test_subscript(int32_t subscript);\nint32_t _ffi_fn_test_switch(int32_t switch2);\nint32_t _ffi_fn_test_synchronized(int32_t synchronized2);\nint32_t _ffi_fn_test_template(int32_t template2);\nint32_t _ffi_fn_test_this(int32_t this2);\nint32_t _ffi_fn_test_thread_local(int32_t thread_local2);\nint32_t _ffi_fn_test_throw(int32_t throw2);\nint32_t _ffi_fn_test_throws(int32_t throws);\nint32_t _ffi_fn_test_transient(int32_t transient);\nint32_t _ffi_fn_test_typealias(int32_t typealias);\nint32_t _ffi_fn_test_typedef(int32_t typedef2);\nint32_t _ffi_fn_test_typeid(int32_t typeid2);\nint32_t _ffi_fn_test_typename(int32_t typename2);\nint32_t _ffi_fn_test_undefined(int32_t undefined);\nint32_t _ffi_fn_test_union(int32_t union2);\nint32_t _ffi_fn_test_unowned(int32_t unowned);\nint32_t _ffi_fn_test_unsigned(int32_t unsigned2);\nint32_t _ffi_fn_test_using(int32_t using2);\nint32_t _ffi_fn_test_var(int32_t var);\nint32_t _ffi_fn_test_void(int32_t void2);\nint32_t _ffi_fn_test_volatile(int32_t volatile2);\nint32_t _ffi_fn_test_wchar_t(int32_t wchar_t2);\nint32_t _ffi_fn_test_weak(int32_t weak);\nint32_t _ffi_fn_test_with(int32_t with);\nint32_t _ffi_fn_test_xor(int32_t xor2);\nint32_t _ffi_fn_test_xor_eq(int32_t xor_eq2);\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::test_alignas(int32_t alignas2) {\n    return _ffi_fn_test_alignas(alignas2);\n}\n\nint32_t rust::test_alignof(int32_t alignof2) {\n    return _ffi_fn_test_alignof(alignof2);\n}\n\nint32_t rust::test_and(int32_t and2) {\n    return _ffi_fn_test_and(and2);\n}\n\nint32_t rust::test_and_eq(int32_t and_eq2) {\n    return _ffi_fn_test_and_eq(and_eq2);\n}\n\nint32_t rust::test_asm(int32_t asm2) {\n    return _ffi_fn_test_asm(asm2);\n}\n\nint32_t rust::test_associatedtype(int32_t associatedtype) {\n    return _ffi_fn_test_associatedtype(associatedtype);\n}\n\nint32_t rust::test_associativity(int32_t associativity) {\n    return _ffi_fn_test_associativity(associativity);\n}\n\nint32_t rust::test_atomic_cancel(int32_t atomic_cancel2) {\n    return _ffi_fn_test_atomic_cancel(atomic_cancel2);\n}\n\nint32_t rust::test_atomic_commit(int32_t atomic_commit2) {\n    return _ffi_fn_test_atomic_commit(atomic_commit2);\n}\n\nint32_t rust::test_atomic_noexcept(int32_t atomic_noexcept2) {\n    return _ffi_fn_test_atomic_noexcept(atomic_noexcept2);\n}\n\nint32_t rust::test_auto(int32_t auto2) {\n    return _ffi_fn_test_auto(auto2);\n}\n\nint32_t rust::test_bitand(int32_t bitand2) {\n    return _ffi_fn_test_bitand(bitand2);\n}\n\nint32_t rust::test_bitor(int32_t bitor2) {\n    return _ffi_fn_test_bitor(bitor2);\n}\n\nint32_t rust::test_bool(int32_t bool2) {\n    return _ffi_fn_test_bool(bool2);\n}\n\nint32_t rust::test_boolean(int32_t boolean) {\n    return _ffi_fn_test_boolean(boolean);\n}\n\nint32_t rust::test_borrowing(int32_t borrowing) {\n    return _ffi_fn_test_borrowing(borrowing);\n}\n\nint32_t rust::test_byte(int32_t byte) {\n    return _ffi_fn_test_byte(byte);\n}\n\nint32_t rust::test_case(int32_t case2) {\n    return _ffi_fn_test_case(case2);\n}\n\nint32_t rust::test_catch(int32_t catch2) {\n    return _ffi_fn_test_catch(catch2);\n}\n\nint32_t rust::test_char(int32_t char2) {\n    return _ffi_fn_test_char(char2);\n}\n\nint32_t rust::test_char16_t(int32_t char16_t2) {\n    return _ffi_fn_test_char16_t(char16_t2);\n}\n\nint32_t rust::test_char32_t(int32_t char32_t2) {\n    return _ffi_fn_test_char32_t(char32_t2);\n}\n\nint32_t rust::test_char8_t(int32_t char8_t2) {\n    return _ffi_fn_test_char8_t(char8_t2);\n}\n\nint32_t rust::test_class(int32_t class2) {\n    return _ffi_fn_test_class(class2);\n}\n\nint32_t rust::test_co_await(int32_t co_await2) {\n    return _ffi_fn_test_co_await(co_await2);\n}\n\nint32_t rust::test_co_return(int32_t co_return2) {\n    return _ffi_fn_test_co_return(co_return2);\n}\n\nint32_t rust::test_co_yield(int32_t co_yield2) {\n    return _ffi_fn_test_co_yield(co_yield2);\n}\n\nint32_t rust::test_compl(int32_t compl2) {\n    return _ffi_fn_test_compl(compl2);\n}\n\nint32_t rust::test_concept(int32_t concept2) {\n    return _ffi_fn_test_concept(concept2);\n}\n\nint32_t rust::test_const_cast(int32_t const_cast2) {\n    return _ffi_fn_test_const_cast(const_cast2);\n}\n\nint32_t rust::test_consteval(int32_t consteval2) {\n    return _ffi_fn_test_consteval(consteval2);\n}\n\nint32_t rust::test_constexpr(int32_t constexpr2) {\n    return _ffi_fn_test_constexpr(constexpr2);\n}\n\nint32_t rust::test_constinit(int32_t constinit2) {\n    return _ffi_fn_test_constinit(constinit2);\n}\n\nint32_t rust::test_consuming(int32_t consuming) {\n    return _ffi_fn_test_consuming(consuming);\n}\n\nint32_t rust::test_contract_assert(int32_t contract_assert2) {\n    return _ffi_fn_test_contract_assert(contract_assert2);\n}\n\nint32_t rust::test_convenience(int32_t convenience) {\n    return _ffi_fn_test_convenience(convenience);\n}\n\nint32_t rust::test_debugger(int32_t debugger) {\n    return _ffi_fn_test_debugger(debugger);\n}\n\nint32_t rust::test_decltype(int32_t decltype2) {\n    return _ffi_fn_test_decltype(decltype2);\n}\n\nint32_t rust::test_default(int32_t default2) {\n    return _ffi_fn_test_default(default2);\n}\n\nint32_t rust::test_defer(int32_t defer) {\n    return _ffi_fn_test_defer(defer);\n}\n\nint32_t rust::test_deinit(int32_t deinit) {\n    return _ffi_fn_test_deinit(deinit);\n}\n\nint32_t rust::test_delete(int32_t delete2) {\n    return _ffi_fn_test_delete(delete2);\n}\n\nint32_t rust::test_double(int32_t double2) {\n    return _ffi_fn_test_double(double2);\n}\n\nint32_t rust::test_dynamic(int32_t dynamic) {\n    return _ffi_fn_test_dynamic(dynamic);\n}\n\nint32_t rust::test_dynamic_cast(int32_t dynamic_cast2) {\n    return _ffi_fn_test_dynamic_cast(dynamic_cast2);\n}\n\nint32_t rust::test_explicit(int32_t explicit2) {\n    return _ffi_fn_test_explicit(explicit2);\n}\n\nint32_t rust::test_export(int32_t export2) {\n    return _ffi_fn_test_export(export2);\n}\n\nint32_t rust::test_extends(int32_t extends) {\n    return _ffi_fn_test_extends(extends);\n}\n\nint32_t rust::test_extension(int32_t extension) {\n    return _ffi_fn_test_extension(extension);\n}\n\nint32_t rust::test_fallthrough(int32_t fallthrough) {\n    return _ffi_fn_test_fallthrough(fallthrough);\n}\n\nint32_t rust::test_fileprivate(int32_t fileprivate) {\n    return _ffi_fn_test_fileprivate(fileprivate);\n}\n\nint32_t rust::test_finally(int32_t finally) {\n    return _ffi_fn_test_finally(finally);\n}\n\nint32_t rust::test_float(int32_t float2) {\n    return _ffi_fn_test_float(float2);\n}\n\nint32_t rust::test_friend(int32_t friend2) {\n    return _ffi_fn_test_friend(friend2);\n}\n\nint32_t rust::test_func(int32_t func) {\n    return _ffi_fn_test_func(func);\n}\n\nint32_t rust::test_function(int32_t function) {\n    return _ffi_fn_test_function(function);\n}\n\nint32_t rust::test_get(int32_t get) {\n    return _ffi_fn_test_get(get);\n}\n\nint32_t rust::test_goto(int32_t goto2) {\n    return _ffi_fn_test_goto(goto2);\n}\n\nint32_t rust::test_guard(int32_t guard) {\n    return _ffi_fn_test_guard(guard);\n}\n\nint32_t rust::test_implements(int32_t implements) {\n    return _ffi_fn_test_implements(implements);\n}\n\nint32_t rust::test_import(int32_t import) {\n    return _ffi_fn_test_import(import);\n}\n\nint32_t rust::test_indirect(int32_t indirect) {\n    return _ffi_fn_test_indirect(indirect);\n}\n\nint32_t rust::test_infix(int32_t infix) {\n    return _ffi_fn_test_infix(infix);\n}\n\nint32_t rust::test_init(int32_t init) {\n    return _ffi_fn_test_init(init);\n}\n\nint32_t rust::test_inline(int32_t inline2) {\n    return _ffi_fn_test_inline(inline2);\n}\n\nint32_t rust::test_inout(int32_t inout) {\n    return _ffi_fn_test_inout(inout);\n}\n\nint32_t rust::test_instanceof(int32_t instanceof) {\n    return _ffi_fn_test_instanceof(instanceof);\n}\n\nint32_t rust::test_int(int32_t int2) {\n    return _ffi_fn_test_int(int2);\n}\n\nint32_t rust::test_interface(int32_t interface) {\n    return _ffi_fn_test_interface(interface);\n}\n\nint32_t rust::test_internal(int32_t internal) {\n    return _ffi_fn_test_internal(internal);\n}\n\nint32_t rust::test_is(int32_t is) {\n    return _ffi_fn_test_is(is);\n}\n\nint32_t rust::test_lazy(int32_t lazy) {\n    return _ffi_fn_test_lazy(lazy);\n}\n\nint32_t rust::test_left(int32_t left) {\n    return _ffi_fn_test_left(left);\n}\n\nint32_t rust::test_long(int32_t long2) {\n    return _ffi_fn_test_long(long2);\n}\n\nint32_t rust::test_mutable(int32_t mutable2) {\n    return _ffi_fn_test_mutable(mutable2);\n}\n\nint32_t rust::test_mutating(int32_t mutating) {\n    return _ffi_fn_test_mutating(mutating);\n}\n\nint32_t rust::test_namespace(int32_t namespace2) {\n    return _ffi_fn_test_namespace(namespace2);\n}\n\nint32_t rust::test_native(int32_t native) {\n    return _ffi_fn_test_native(native);\n}\n\nint32_t rust::test_new(int32_t new2) {\n    return _ffi_fn_test_new(new2);\n}\n\nint32_t rust::test_nil(int32_t nil) {\n    return _ffi_fn_test_nil(nil);\n}\n\nint32_t rust::test_noexcept(int32_t noexcept2) {\n    return _ffi_fn_test_noexcept(noexcept2);\n}\n\nint32_t rust::test_none(int32_t none) {\n    return _ffi_fn_test_none(none);\n}\n\nint32_t rust::test_nonisolated(int32_t nonisolated) {\n    return _ffi_fn_test_nonisolated(nonisolated);\n}\n\nint32_t rust::test_nonmutating(int32_t nonmutating) {\n    return _ffi_fn_test_nonmutating(nonmutating);\n}\n\nint32_t rust::test_not(int32_t not2) {\n    return _ffi_fn_test_not(not2);\n}\n\nint32_t rust::test_not_eq(int32_t not_eq2) {\n    return _ffi_fn_test_not_eq(not_eq2);\n}\n\nint32_t rust::test_null(int32_t null) {\n    return _ffi_fn_test_null(null);\n}\n\nint32_t rust::test_nullptr(int32_t nullptr2) {\n    return _ffi_fn_test_nullptr(nullptr2);\n}\n\nint32_t rust::test_open(int32_t open) {\n    return _ffi_fn_test_open(open);\n}\n\nint32_t rust::test_operator(int32_t operator2) {\n    return _ffi_fn_test_operator(operator2);\n}\n\nint32_t rust::test_optional(int32_t optional) {\n    return _ffi_fn_test_optional(optional);\n}\n\nint32_t rust::test_or(int32_t or2) {\n    return _ffi_fn_test_or(or2);\n}\n\nint32_t rust::test_or_eq(int32_t or_eq2) {\n    return _ffi_fn_test_or_eq(or_eq2);\n}\n\nint32_t rust::test_package(int32_t package) {\n    return _ffi_fn_test_package(package);\n}\n\nint32_t rust::test_postfix(int32_t postfix) {\n    return _ffi_fn_test_postfix(postfix);\n}\n\nint32_t rust::test_precedence(int32_t precedence) {\n    return _ffi_fn_test_precedence(precedence);\n}\n\nint32_t rust::test_precedencegroup(int32_t precedencegroup) {\n    return _ffi_fn_test_precedencegroup(precedencegroup);\n}\n\nint32_t rust::test_prefix(int32_t prefix) {\n    return _ffi_fn_test_prefix(prefix);\n}\n\nint32_t rust::test_private(int32_t private2) {\n    return _ffi_fn_test_private(private2);\n}\n\nint32_t rust::test_protected(int32_t protected2) {\n    return _ffi_fn_test_protected(protected2);\n}\n\nint32_t rust::test_protocol(int32_t protocol) {\n    return _ffi_fn_test_protocol(protocol);\n}\n\nint32_t rust::test_public(int32_t public2) {\n    return _ffi_fn_test_public(public2);\n}\n\nint32_t rust::test_reflexpr(int32_t reflexpr2) {\n    return _ffi_fn_test_reflexpr(reflexpr2);\n}\n\nint32_t rust::test_register(int32_t register2) {\n    return _ffi_fn_test_register(register2);\n}\n\nint32_t rust::test_reinterpret_cast(int32_t reinterpret_cast2) {\n    return _ffi_fn_test_reinterpret_cast(reinterpret_cast2);\n}\n\nint32_t rust::test_repeat(int32_t repeat) {\n    return _ffi_fn_test_repeat(repeat);\n}\n\nint32_t rust::test_required(int32_t required) {\n    return _ffi_fn_test_required(required);\n}\n\nint32_t rust::test_requires(int32_t requires2) {\n    return _ffi_fn_test_requires(requires2);\n}\n\nint32_t rust::test_rethrows(int32_t rethrows) {\n    return _ffi_fn_test_rethrows(rethrows);\n}\n\nint32_t rust::test_right(int32_t right) {\n    return _ffi_fn_test_right(right);\n}\n\nint32_t rust::test_set(int32_t set) {\n    return _ffi_fn_test_set(set);\n}\n\nint32_t rust::test_short(int32_t short2) {\n    return _ffi_fn_test_short(short2);\n}\n\nint32_t rust::test_signed(int32_t signed2) {\n    return _ffi_fn_test_signed(signed2);\n}\n\nint32_t rust::test_sizeof(int32_t sizeof2) {\n    return _ffi_fn_test_sizeof(sizeof2);\n}\n\nint32_t rust::test_some(int32_t some) {\n    return _ffi_fn_test_some(some);\n}\n\nint32_t rust::test_static_assert(int32_t static_assert2) {\n    return _ffi_fn_test_static_assert(static_assert2);\n}\n\nint32_t rust::test_static_cast(int32_t static_cast2) {\n    return _ffi_fn_test_static_cast(static_cast2);\n}\n\nint32_t rust::test_subscript(int32_t subscript) {\n    return _ffi_fn_test_subscript(subscript);\n}\n\nint32_t rust::test_switch(int32_t switch2) {\n    return _ffi_fn_test_switch(switch2);\n}\n\nint32_t rust::test_synchronized(int32_t synchronized2) {\n    return _ffi_fn_test_synchronized(synchronized2);\n}\n\nint32_t rust::test_template(int32_t template2) {\n    return _ffi_fn_test_template(template2);\n}\n\nint32_t rust::test_this(int32_t this2) {\n    return _ffi_fn_test_this(this2);\n}\n\nint32_t rust::test_thread_local(int32_t thread_local2) {\n    return _ffi_fn_test_thread_local(thread_local2);\n}\n\nint32_t rust::test_throw(int32_t throw2) {\n    return _ffi_fn_test_throw(throw2);\n}\n\nint32_t rust::test_throws(int32_t throws) {\n    return _ffi_fn_test_throws(throws);\n}\n\nint32_t rust::test_transient(int32_t transient) {\n    return _ffi_fn_test_transient(transient);\n}\n\nint32_t rust::test_typealias(int32_t typealias) {\n    return _ffi_fn_test_typealias(typealias);\n}\n\nint32_t rust::test_typedef(int32_t typedef2) {\n    return _ffi_fn_test_typedef(typedef2);\n}\n\nint32_t rust::test_typeid(int32_t typeid2) {\n    return _ffi_fn_test_typeid(typeid2);\n}\n\nint32_t rust::test_typename(int32_t typename2) {\n    return _ffi_fn_test_typename(typename2);\n}\n\nint32_t rust::test_undefined(int32_t undefined) {\n    return _ffi_fn_test_undefined(undefined);\n}\n\nint32_t rust::test_union(int32_t union2) {\n    return _ffi_fn_test_union(union2);\n}\n\nint32_t rust::test_unowned(int32_t unowned) {\n    return _ffi_fn_test_unowned(unowned);\n}\n\nint32_t rust::test_unsigned(int32_t unsigned2) {\n    return _ffi_fn_test_unsigned(unsigned2);\n}\n\nint32_t rust::test_using(int32_t using2) {\n    return _ffi_fn_test_using(using2);\n}\n\nint32_t rust::test_var(int32_t var) {\n    return _ffi_fn_test_var(var);\n}\n\nint32_t rust::test_void(int32_t void2) {\n    return _ffi_fn_test_void(void2);\n}\n\nint32_t rust::test_volatile(int32_t volatile2) {\n    return _ffi_fn_test_volatile(volatile2);\n}\n\nint32_t rust::test_wchar_t(int32_t wchar_t2) {\n    return _ffi_fn_test_wchar_t(wchar_t2);\n}\n\nint32_t rust::test_weak(int32_t weak) {\n    return _ffi_fn_test_weak(weak);\n}\n\nint32_t rust::test_with(int32_t with) {\n    return _ffi_fn_test_with(with);\n}\n\nint32_t rust::test_xor(int32_t xor2) {\n    return _ffi_fn_test_xor(xor2);\n}\n\nint32_t rust::test_xor_eq(int32_t xor_eq2) {\n    return _ffi_fn_test_xor_eq(xor_eq2);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_keyword_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nint32_t test_alignas(int32_t alignas2);\n\nint32_t test_alignof(int32_t alignof2);\n\nint32_t test_and(int32_t and2);\n\nint32_t test_and_eq(int32_t and_eq2);\n\nint32_t test_asm(int32_t asm2);\n\nint32_t test_associatedtype(int32_t associatedtype);\n\nint32_t test_associativity(int32_t associativity);\n\nint32_t test_atomic_cancel(int32_t atomic_cancel2);\n\nint32_t test_atomic_commit(int32_t atomic_commit2);\n\nint32_t test_atomic_noexcept(int32_t atomic_noexcept2);\n\nint32_t test_auto(int32_t auto2);\n\nint32_t test_bitand(int32_t bitand2);\n\nint32_t test_bitor(int32_t bitor2);\n\nint32_t test_bool(int32_t bool2);\n\nint32_t test_boolean(int32_t boolean);\n\nint32_t test_borrowing(int32_t borrowing);\n\nint32_t test_byte(int32_t byte);\n\nint32_t test_case(int32_t case2);\n\nint32_t test_catch(int32_t catch2);\n\nint32_t test_char(int32_t char2);\n\nint32_t test_char16_t(int32_t char16_t2);\n\nint32_t test_char32_t(int32_t char32_t2);\n\nint32_t test_char8_t(int32_t char8_t2);\n\nint32_t test_class(int32_t class2);\n\nint32_t test_co_await(int32_t co_await2);\n\nint32_t test_co_return(int32_t co_return2);\n\nint32_t test_co_yield(int32_t co_yield2);\n\nint32_t test_compl(int32_t compl2);\n\nint32_t test_concept(int32_t concept2);\n\nint32_t test_const_cast(int32_t const_cast2);\n\nint32_t test_consteval(int32_t consteval2);\n\nint32_t test_constexpr(int32_t constexpr2);\n\nint32_t test_constinit(int32_t constinit2);\n\nint32_t test_consuming(int32_t consuming);\n\nint32_t test_contract_assert(int32_t contract_assert2);\n\nint32_t test_convenience(int32_t convenience);\n\nint32_t test_debugger(int32_t debugger);\n\nint32_t test_decltype(int32_t decltype2);\n\nint32_t test_default(int32_t default2);\n\nint32_t test_defer(int32_t defer);\n\nint32_t test_deinit(int32_t deinit);\n\nint32_t test_delete(int32_t delete2);\n\nint32_t test_double(int32_t double2);\n\nint32_t test_dynamic(int32_t dynamic);\n\nint32_t test_dynamic_cast(int32_t dynamic_cast2);\n\nint32_t test_explicit(int32_t explicit2);\n\nint32_t test_export(int32_t export2);\n\nint32_t test_extends(int32_t extends);\n\nint32_t test_extension(int32_t extension);\n\nint32_t test_fallthrough(int32_t fallthrough);\n\nint32_t test_fileprivate(int32_t fileprivate);\n\nint32_t test_finally(int32_t finally);\n\nint32_t test_float(int32_t float2);\n\nint32_t test_friend(int32_t friend2);\n\nint32_t test_func(int32_t func);\n\nint32_t test_function(int32_t function);\n\nint32_t test_get(int32_t get);\n\nint32_t test_goto(int32_t goto2);\n\nint32_t test_guard(int32_t guard);\n\nint32_t test_implements(int32_t implements);\n\nint32_t test_import(int32_t import);\n\nint32_t test_indirect(int32_t indirect);\n\nint32_t test_infix(int32_t infix);\n\nint32_t test_init(int32_t init);\n\nint32_t test_inline(int32_t inline2);\n\nint32_t test_inout(int32_t inout);\n\nint32_t test_instanceof(int32_t instanceof);\n\nint32_t test_int(int32_t int2);\n\nint32_t test_interface(int32_t interface);\n\nint32_t test_internal(int32_t internal);\n\nint32_t test_is(int32_t is);\n\nint32_t test_lazy(int32_t lazy);\n\nint32_t test_left(int32_t left);\n\nint32_t test_long(int32_t long2);\n\nint32_t test_mutable(int32_t mutable2);\n\nint32_t test_mutating(int32_t mutating);\n\nint32_t test_namespace(int32_t namespace2);\n\nint32_t test_native(int32_t native);\n\nint32_t test_new(int32_t new2);\n\nint32_t test_nil(int32_t nil);\n\nint32_t test_noexcept(int32_t noexcept2);\n\nint32_t test_none(int32_t none);\n\nint32_t test_nonisolated(int32_t nonisolated);\n\nint32_t test_nonmutating(int32_t nonmutating);\n\nint32_t test_not(int32_t not2);\n\nint32_t test_not_eq(int32_t not_eq2);\n\nint32_t test_null(int32_t null);\n\nint32_t test_nullptr(int32_t nullptr2);\n\nint32_t test_open(int32_t open);\n\nint32_t test_operator(int32_t operator2);\n\nint32_t test_optional(int32_t optional);\n\nint32_t test_or(int32_t or2);\n\nint32_t test_or_eq(int32_t or_eq2);\n\nint32_t test_package(int32_t package);\n\nint32_t test_postfix(int32_t postfix);\n\nint32_t test_precedence(int32_t precedence);\n\nint32_t test_precedencegroup(int32_t precedencegroup);\n\nint32_t test_prefix(int32_t prefix);\n\nint32_t test_private(int32_t private2);\n\nint32_t test_protected(int32_t protected2);\n\nint32_t test_protocol(int32_t protocol);\n\nint32_t test_public(int32_t public2);\n\nint32_t test_reflexpr(int32_t reflexpr2);\n\nint32_t test_register(int32_t register2);\n\nint32_t test_reinterpret_cast(int32_t reinterpret_cast2);\n\nint32_t test_repeat(int32_t repeat);\n\nint32_t test_required(int32_t required);\n\nint32_t test_requires(int32_t requires2);\n\nint32_t test_rethrows(int32_t rethrows);\n\nint32_t test_right(int32_t right);\n\nint32_t test_set(int32_t set);\n\nint32_t test_short(int32_t short2);\n\nint32_t test_signed(int32_t signed2);\n\nint32_t test_sizeof(int32_t sizeof2);\n\nint32_t test_some(int32_t some);\n\nint32_t test_static_assert(int32_t static_assert2);\n\nint32_t test_static_cast(int32_t static_cast2);\n\nint32_t test_subscript(int32_t subscript);\n\nint32_t test_switch(int32_t switch2);\n\nint32_t test_synchronized(int32_t synchronized2);\n\nint32_t test_template(int32_t template2);\n\nint32_t test_this(int32_t this2);\n\nint32_t test_thread_local(int32_t thread_local2);\n\nint32_t test_throw(int32_t throw2);\n\nint32_t test_throws(int32_t throws);\n\nint32_t test_transient(int32_t transient);\n\nint32_t test_typealias(int32_t typealias);\n\nint32_t test_typedef(int32_t typedef2);\n\nint32_t test_typeid(int32_t typeid2);\n\nint32_t test_typename(int32_t typename2);\n\nint32_t test_undefined(int32_t undefined);\n\nint32_t test_union(int32_t union2);\n\nint32_t test_unowned(int32_t unowned);\n\nint32_t test_unsigned(int32_t unsigned2);\n\nint32_t test_using(int32_t using2);\n\nint32_t test_var(int32_t var);\n\nint32_t test_void(int32_t void2);\n\nint32_t test_volatile(int32_t volatile2);\n\nint32_t test_wchar_t(int32_t wchar_t2);\n\nint32_t test_weak(int32_t weak);\n\nint32_t test_with(int32_t with);\n\nint32_t test_xor(int32_t xor2);\n\nint32_t test_xor_eq(int32_t xor_eq2);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_keyword_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_alignas(alignas2: i32) -> i32 {\n    test_alignas(alignas2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_alignof(alignof2: i32) -> i32 {\n    test_alignof(alignof2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_and(and2: i32) -> i32 {\n    test_and(and2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_and_eq(and_eq2: i32) -> i32 {\n    test_and_eq(and_eq2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_asm(asm2: i32) -> i32 {\n    test_asm(asm2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_associatedtype(associatedtype: i32) -> i32 {\n    test_associatedtype(associatedtype)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_associativity(associativity: i32) -> i32 {\n    test_associativity(associativity)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_atomic_cancel(atomic_cancel2: i32) -> i32 {\n    test_atomic_cancel(atomic_cancel2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_atomic_commit(atomic_commit2: i32) -> i32 {\n    test_atomic_commit(atomic_commit2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_atomic_noexcept(atomic_noexcept2: i32) -> i32 {\n    test_atomic_noexcept(atomic_noexcept2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_auto(auto2: i32) -> i32 {\n    test_auto(auto2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_bitand(bitand2: i32) -> i32 {\n    test_bitand(bitand2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_bitor(bitor2: i32) -> i32 {\n    test_bitor(bitor2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_bool(bool2: i32) -> i32 {\n    test_bool(bool2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_boolean(boolean: i32) -> i32 {\n    test_boolean(boolean)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_borrowing(borrowing: i32) -> i32 {\n    test_borrowing(borrowing)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_byte(byte: i32) -> i32 {\n    test_byte(byte)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_case(case2: i32) -> i32 {\n    test_case(case2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_catch(catch2: i32) -> i32 {\n    test_catch(catch2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_char(char2: i32) -> i32 {\n    test_char(char2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_char16_t(char16_t2: i32) -> i32 {\n    test_char16_t(char16_t2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_char32_t(char32_t2: i32) -> i32 {\n    test_char32_t(char32_t2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_char8_t(char8_t2: i32) -> i32 {\n    test_char8_t(char8_t2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_class(class2: i32) -> i32 {\n    test_class(class2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_co_await(co_await2: i32) -> i32 {\n    test_co_await(co_await2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_co_return(co_return2: i32) -> i32 {\n    test_co_return(co_return2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_co_yield(co_yield2: i32) -> i32 {\n    test_co_yield(co_yield2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_compl(compl2: i32) -> i32 {\n    test_compl(compl2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_concept(concept2: i32) -> i32 {\n    test_concept(concept2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_const_cast(const_cast2: i32) -> i32 {\n    test_const_cast(const_cast2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_consteval(consteval2: i32) -> i32 {\n    test_consteval(consteval2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_constexpr(constexpr2: i32) -> i32 {\n    test_constexpr(constexpr2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_constinit(constinit2: i32) -> i32 {\n    test_constinit(constinit2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_consuming(consuming: i32) -> i32 {\n    test_consuming(consuming)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_contract_assert(contract_assert2: i32) -> i32 {\n    test_contract_assert(contract_assert2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_convenience(convenience: i32) -> i32 {\n    test_convenience(convenience)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_debugger(debugger: i32) -> i32 {\n    test_debugger(debugger)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_decltype(decltype2: i32) -> i32 {\n    test_decltype(decltype2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_default(default2: i32) -> i32 {\n    test_default(default2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_defer(defer: i32) -> i32 {\n    test_defer(defer)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_deinit(deinit: i32) -> i32 {\n    test_deinit(deinit)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_delete(delete2: i32) -> i32 {\n    test_delete(delete2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_double(double2: i32) -> i32 {\n    test_double(double2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_dynamic(dynamic: i32) -> i32 {\n    test_dynamic(dynamic)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_dynamic_cast(dynamic_cast2: i32) -> i32 {\n    test_dynamic_cast(dynamic_cast2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_explicit(explicit2: i32) -> i32 {\n    test_explicit(explicit2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_export(export2: i32) -> i32 {\n    test_export(export2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_extends(extends: i32) -> i32 {\n    test_extends(extends)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_extension(extension: i32) -> i32 {\n    test_extension(extension)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_fallthrough(fallthrough: i32) -> i32 {\n    test_fallthrough(fallthrough)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_fileprivate(fileprivate: i32) -> i32 {\n    test_fileprivate(fileprivate)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_finally(finally: i32) -> i32 {\n    test_finally(finally)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_float(float2: i32) -> i32 {\n    test_float(float2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_friend(friend2: i32) -> i32 {\n    test_friend(friend2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_func(func: i32) -> i32 {\n    test_func(func)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_function(function: i32) -> i32 {\n    test_function(function)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_get(get: i32) -> i32 {\n    test_get(get)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_goto(goto2: i32) -> i32 {\n    test_goto(goto2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_guard(guard: i32) -> i32 {\n    test_guard(guard)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_implements(implements: i32) -> i32 {\n    test_implements(implements)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_import(import: i32) -> i32 {\n    test_import(import)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_indirect(indirect: i32) -> i32 {\n    test_indirect(indirect)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_infix(infix: i32) -> i32 {\n    test_infix(infix)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_init(init: i32) -> i32 {\n    test_init(init)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_inline(inline2: i32) -> i32 {\n    test_inline(inline2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_inout(inout: i32) -> i32 {\n    test_inout(inout)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_instanceof(instanceof: i32) -> i32 {\n    test_instanceof(instanceof)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_int(int2: i32) -> i32 {\n    test_int(int2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_interface(interface: i32) -> i32 {\n    test_interface(interface)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_internal(internal: i32) -> i32 {\n    test_internal(internal)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_is(is: i32) -> i32 {\n    test_is(is)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_lazy(lazy: i32) -> i32 {\n    test_lazy(lazy)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_left(left: i32) -> i32 {\n    test_left(left)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_long(long2: i32) -> i32 {\n    test_long(long2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_mutable(mutable2: i32) -> i32 {\n    test_mutable(mutable2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_mutating(mutating: i32) -> i32 {\n    test_mutating(mutating)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_namespace(namespace2: i32) -> i32 {\n    test_namespace(namespace2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_native(native: i32) -> i32 {\n    test_native(native)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_new(new2: i32) -> i32 {\n    test_new(new2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_nil(nil: i32) -> i32 {\n    test_nil(nil)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_noexcept(noexcept2: i32) -> i32 {\n    test_noexcept(noexcept2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_none(none: i32) -> i32 {\n    test_none(none)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_nonisolated(nonisolated: i32) -> i32 {\n    test_nonisolated(nonisolated)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_nonmutating(nonmutating: i32) -> i32 {\n    test_nonmutating(nonmutating)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_not(not2: i32) -> i32 {\n    test_not(not2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_not_eq(not_eq2: i32) -> i32 {\n    test_not_eq(not_eq2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_null(null: i32) -> i32 {\n    test_null(null)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_nullptr(nullptr2: i32) -> i32 {\n    test_nullptr(nullptr2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_open(open: i32) -> i32 {\n    test_open(open)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_operator(operator2: i32) -> i32 {\n    test_operator(operator2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_optional(optional: i32) -> i32 {\n    test_optional(optional)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_or(or2: i32) -> i32 {\n    test_or(or2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_or_eq(or_eq2: i32) -> i32 {\n    test_or_eq(or_eq2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_package(package: i32) -> i32 {\n    test_package(package)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_postfix(postfix: i32) -> i32 {\n    test_postfix(postfix)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_precedence(precedence: i32) -> i32 {\n    test_precedence(precedence)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_precedencegroup(precedencegroup: i32) -> i32 {\n    test_precedencegroup(precedencegroup)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_prefix(prefix: i32) -> i32 {\n    test_prefix(prefix)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_private(private2: i32) -> i32 {\n    test_private(private2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_protected(protected2: i32) -> i32 {\n    test_protected(protected2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_protocol(protocol: i32) -> i32 {\n    test_protocol(protocol)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_public(public2: i32) -> i32 {\n    test_public(public2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_reflexpr(reflexpr2: i32) -> i32 {\n    test_reflexpr(reflexpr2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_register(register2: i32) -> i32 {\n    test_register(register2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_reinterpret_cast(reinterpret_cast2: i32) -> i32 {\n    test_reinterpret_cast(reinterpret_cast2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_repeat(repeat: i32) -> i32 {\n    test_repeat(repeat)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_required(required: i32) -> i32 {\n    test_required(required)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_requires(requires2: i32) -> i32 {\n    test_requires(requires2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_rethrows(rethrows: i32) -> i32 {\n    test_rethrows(rethrows)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_right(right: i32) -> i32 {\n    test_right(right)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_set(set: i32) -> i32 {\n    test_set(set)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_short(short2: i32) -> i32 {\n    test_short(short2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_signed(signed2: i32) -> i32 {\n    test_signed(signed2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_sizeof(sizeof2: i32) -> i32 {\n    test_sizeof(sizeof2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_some(some: i32) -> i32 {\n    test_some(some)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_static_assert(static_assert2: i32) -> i32 {\n    test_static_assert(static_assert2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_static_cast(static_cast2: i32) -> i32 {\n    test_static_cast(static_cast2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_subscript(subscript: i32) -> i32 {\n    test_subscript(subscript)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_switch(switch2: i32) -> i32 {\n    test_switch(switch2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_synchronized(synchronized2: i32) -> i32 {\n    test_synchronized(synchronized2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_template(template2: i32) -> i32 {\n    test_template(template2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_this(this2: i32) -> i32 {\n    test_this(this2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_thread_local(thread_local2: i32) -> i32 {\n    test_thread_local(thread_local2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_throw(throw2: i32) -> i32 {\n    test_throw(throw2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_throws(throws: i32) -> i32 {\n    test_throws(throws)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_transient(transient: i32) -> i32 {\n    test_transient(transient)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_typealias(typealias: i32) -> i32 {\n    test_typealias(typealias)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_typedef(typedef2: i32) -> i32 {\n    test_typedef(typedef2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_typeid(typeid2: i32) -> i32 {\n    test_typeid(typeid2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_typename(typename2: i32) -> i32 {\n    test_typename(typename2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_undefined(undefined: i32) -> i32 {\n    test_undefined(undefined)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_union(union2: i32) -> i32 {\n    test_union(union2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_unowned(unowned: i32) -> i32 {\n    test_unowned(unowned)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_unsigned(unsigned2: i32) -> i32 {\n    test_unsigned(unsigned2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_using(using2: i32) -> i32 {\n    test_using(using2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_var(var: i32) -> i32 {\n    test_var(var)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_void(void2: i32) -> i32 {\n    test_void(void2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_volatile(volatile2: i32) -> i32 {\n    test_volatile(volatile2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_wchar_t(wchar_t2: i32) -> i32 {\n    test_wchar_t(wchar_t2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_weak(weak: i32) -> i32 {\n    test_weak(weak)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_with(with: i32) -> i32 {\n    test_with(with)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_xor(xor2: i32) -> i32 {\n    test_xor(xor2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_xor_eq(xor_eq2: i32) -> i32 {\n    test_xor_eq(xor_eq2)\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_keyword_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_test_alignas(int32_t alignas2);\nint32_t _ffi_fn_test_alignof(int32_t alignof2);\nint32_t _ffi_fn_test_and(int32_t and2);\nint32_t _ffi_fn_test_and_eq(int32_t and_eq2);\nint32_t _ffi_fn_test_asm(int32_t asm2);\nint32_t _ffi_fn_test_associatedtype(int32_t associatedtype);\nint32_t _ffi_fn_test_associativity(int32_t associativity);\nint32_t _ffi_fn_test_atomic_cancel(int32_t atomic_cancel2);\nint32_t _ffi_fn_test_atomic_commit(int32_t atomic_commit2);\nint32_t _ffi_fn_test_atomic_noexcept(int32_t atomic_noexcept2);\nint32_t _ffi_fn_test_auto(int32_t auto2);\nint32_t _ffi_fn_test_bitand(int32_t bitand2);\nint32_t _ffi_fn_test_bitor(int32_t bitor2);\nint32_t _ffi_fn_test_bool(int32_t bool2);\nint32_t _ffi_fn_test_boolean(int32_t boolean);\nint32_t _ffi_fn_test_borrowing(int32_t borrowing);\nint32_t _ffi_fn_test_byte(int32_t byte);\nint32_t _ffi_fn_test_case(int32_t case2);\nint32_t _ffi_fn_test_catch(int32_t catch2);\nint32_t _ffi_fn_test_char(int32_t char2);\nint32_t _ffi_fn_test_char16_t(int32_t char16_t2);\nint32_t _ffi_fn_test_char32_t(int32_t char32_t2);\nint32_t _ffi_fn_test_char8_t(int32_t char8_t2);\nint32_t _ffi_fn_test_class(int32_t class2);\nint32_t _ffi_fn_test_co_await(int32_t co_await2);\nint32_t _ffi_fn_test_co_return(int32_t co_return2);\nint32_t _ffi_fn_test_co_yield(int32_t co_yield2);\nint32_t _ffi_fn_test_compl(int32_t compl2);\nint32_t _ffi_fn_test_concept(int32_t concept2);\nint32_t _ffi_fn_test_const_cast(int32_t const_cast2);\nint32_t _ffi_fn_test_consteval(int32_t consteval2);\nint32_t _ffi_fn_test_constexpr(int32_t constexpr2);\nint32_t _ffi_fn_test_constinit(int32_t constinit2);\nint32_t _ffi_fn_test_consuming(int32_t consuming);\nint32_t _ffi_fn_test_contract_assert(int32_t contract_assert2);\nint32_t _ffi_fn_test_convenience(int32_t convenience);\nint32_t _ffi_fn_test_debugger(int32_t debugger);\nint32_t _ffi_fn_test_decltype(int32_t decltype2);\nint32_t _ffi_fn_test_default(int32_t default2);\nint32_t _ffi_fn_test_defer(int32_t defer);\nint32_t _ffi_fn_test_deinit(int32_t deinit);\nint32_t _ffi_fn_test_delete(int32_t delete2);\nint32_t _ffi_fn_test_double(int32_t double2);\nint32_t _ffi_fn_test_dynamic(int32_t dynamic);\nint32_t _ffi_fn_test_dynamic_cast(int32_t dynamic_cast2);\nint32_t _ffi_fn_test_explicit(int32_t explicit2);\nint32_t _ffi_fn_test_export(int32_t export2);\nint32_t _ffi_fn_test_extends(int32_t extends);\nint32_t _ffi_fn_test_extension(int32_t extension);\nint32_t _ffi_fn_test_fallthrough(int32_t fallthrough);\nint32_t _ffi_fn_test_fileprivate(int32_t fileprivate);\nint32_t _ffi_fn_test_finally(int32_t finally);\nint32_t _ffi_fn_test_float(int32_t float2);\nint32_t _ffi_fn_test_friend(int32_t friend2);\nint32_t _ffi_fn_test_func(int32_t func);\nint32_t _ffi_fn_test_function(int32_t function);\nint32_t _ffi_fn_test_get(int32_t get);\nint32_t _ffi_fn_test_goto(int32_t goto2);\nint32_t _ffi_fn_test_guard(int32_t guard);\nint32_t _ffi_fn_test_implements(int32_t implements);\nint32_t _ffi_fn_test_import(int32_t import);\nint32_t _ffi_fn_test_indirect(int32_t indirect);\nint32_t _ffi_fn_test_infix(int32_t infix);\nint32_t _ffi_fn_test_init(int32_t init);\nint32_t _ffi_fn_test_inline(int32_t inline2);\nint32_t _ffi_fn_test_inout(int32_t inout);\nint32_t _ffi_fn_test_instanceof(int32_t instanceof);\nint32_t _ffi_fn_test_int(int32_t int2);\nint32_t _ffi_fn_test_interface(int32_t interface);\nint32_t _ffi_fn_test_internal(int32_t internal);\nint32_t _ffi_fn_test_is(int32_t is);\nint32_t _ffi_fn_test_lazy(int32_t lazy);\nint32_t _ffi_fn_test_left(int32_t left);\nint32_t _ffi_fn_test_long(int32_t long2);\nint32_t _ffi_fn_test_mutable(int32_t mutable2);\nint32_t _ffi_fn_test_mutating(int32_t mutating);\nint32_t _ffi_fn_test_namespace(int32_t namespace2);\nint32_t _ffi_fn_test_native(int32_t native);\nint32_t _ffi_fn_test_new(int32_t new2);\nint32_t _ffi_fn_test_nil(int32_t nil);\nint32_t _ffi_fn_test_noexcept(int32_t noexcept2);\nint32_t _ffi_fn_test_none(int32_t none);\nint32_t _ffi_fn_test_nonisolated(int32_t nonisolated);\nint32_t _ffi_fn_test_nonmutating(int32_t nonmutating);\nint32_t _ffi_fn_test_not(int32_t not2);\nint32_t _ffi_fn_test_not_eq(int32_t not_eq2);\nint32_t _ffi_fn_test_null(int32_t null);\nint32_t _ffi_fn_test_nullptr(int32_t nullptr2);\nint32_t _ffi_fn_test_open(int32_t open);\nint32_t _ffi_fn_test_operator(int32_t operator2);\nint32_t _ffi_fn_test_optional(int32_t optional);\nint32_t _ffi_fn_test_or(int32_t or2);\nint32_t _ffi_fn_test_or_eq(int32_t or_eq2);\nint32_t _ffi_fn_test_package(int32_t package);\nint32_t _ffi_fn_test_postfix(int32_t postfix);\nint32_t _ffi_fn_test_precedence(int32_t precedence);\nint32_t _ffi_fn_test_precedencegroup(int32_t precedencegroup);\nint32_t _ffi_fn_test_prefix(int32_t prefix);\nint32_t _ffi_fn_test_private(int32_t private2);\nint32_t _ffi_fn_test_protected(int32_t protected2);\nint32_t _ffi_fn_test_protocol(int32_t protocol);\nint32_t _ffi_fn_test_public(int32_t public2);\nint32_t _ffi_fn_test_reflexpr(int32_t reflexpr2);\nint32_t _ffi_fn_test_register(int32_t register2);\nint32_t _ffi_fn_test_reinterpret_cast(int32_t reinterpret_cast2);\nint32_t _ffi_fn_test_repeat(int32_t repeat);\nint32_t _ffi_fn_test_required(int32_t required);\nint32_t _ffi_fn_test_requires(int32_t requires2);\nint32_t _ffi_fn_test_rethrows(int32_t rethrows);\nint32_t _ffi_fn_test_right(int32_t right);\nint32_t _ffi_fn_test_set(int32_t set);\nint32_t _ffi_fn_test_short(int32_t short2);\nint32_t _ffi_fn_test_signed(int32_t signed2);\nint32_t _ffi_fn_test_sizeof(int32_t sizeof2);\nint32_t _ffi_fn_test_some(int32_t some);\nint32_t _ffi_fn_test_static_assert(int32_t static_assert2);\nint32_t _ffi_fn_test_static_cast(int32_t static_cast2);\nint32_t _ffi_fn_test_subscript(int32_t subscript);\nint32_t _ffi_fn_test_switch(int32_t switch2);\nint32_t _ffi_fn_test_synchronized(int32_t synchronized2);\nint32_t _ffi_fn_test_template(int32_t template2);\nint32_t _ffi_fn_test_this(int32_t this2);\nint32_t _ffi_fn_test_thread_local(int32_t thread_local2);\nint32_t _ffi_fn_test_throw(int32_t throw2);\nint32_t _ffi_fn_test_throws(int32_t throws);\nint32_t _ffi_fn_test_transient(int32_t transient);\nint32_t _ffi_fn_test_typealias(int32_t typealias);\nint32_t _ffi_fn_test_typedef(int32_t typedef2);\nint32_t _ffi_fn_test_typeid(int32_t typeid2);\nint32_t _ffi_fn_test_typename(int32_t typename2);\nint32_t _ffi_fn_test_undefined(int32_t undefined);\nint32_t _ffi_fn_test_union(int32_t union2);\nint32_t _ffi_fn_test_unowned(int32_t unowned);\nint32_t _ffi_fn_test_unsigned(int32_t unsigned2);\nint32_t _ffi_fn_test_using(int32_t using2);\nint32_t _ffi_fn_test_var(int32_t var);\nint32_t _ffi_fn_test_void(int32_t void2);\nint32_t _ffi_fn_test_volatile(int32_t volatile2);\nint32_t _ffi_fn_test_wchar_t(int32_t wchar_t2);\nint32_t _ffi_fn_test_weak(int32_t weak);\nint32_t _ffi_fn_test_with(int32_t with);\nint32_t _ffi_fn_test_xor(int32_t xor2);\nint32_t _ffi_fn_test_xor_eq(int32_t xor_eq2);\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::test_alignas(int32_t alignas2) {\n    return _ffi_fn_test_alignas(alignas2);\n}\n\nint32_t rust::test_alignof(int32_t alignof2) {\n    return _ffi_fn_test_alignof(alignof2);\n}\n\nint32_t rust::test_and(int32_t and2) {\n    return _ffi_fn_test_and(and2);\n}\n\nint32_t rust::test_and_eq(int32_t and_eq2) {\n    return _ffi_fn_test_and_eq(and_eq2);\n}\n\nint32_t rust::test_asm(int32_t asm2) {\n    return _ffi_fn_test_asm(asm2);\n}\n\nint32_t rust::test_associatedtype(int32_t associatedtype) {\n    return _ffi_fn_test_associatedtype(associatedtype);\n}\n\nint32_t rust::test_associativity(int32_t associativity) {\n    return _ffi_fn_test_associativity(associativity);\n}\n\nint32_t rust::test_atomic_cancel(int32_t atomic_cancel2) {\n    return _ffi_fn_test_atomic_cancel(atomic_cancel2);\n}\n\nint32_t rust::test_atomic_commit(int32_t atomic_commit2) {\n    return _ffi_fn_test_atomic_commit(atomic_commit2);\n}\n\nint32_t rust::test_atomic_noexcept(int32_t atomic_noexcept2) {\n    return _ffi_fn_test_atomic_noexcept(atomic_noexcept2);\n}\n\nint32_t rust::test_auto(int32_t auto2) {\n    return _ffi_fn_test_auto(auto2);\n}\n\nint32_t rust::test_bitand(int32_t bitand2) {\n    return _ffi_fn_test_bitand(bitand2);\n}\n\nint32_t rust::test_bitor(int32_t bitor2) {\n    return _ffi_fn_test_bitor(bitor2);\n}\n\nint32_t rust::test_bool(int32_t bool2) {\n    return _ffi_fn_test_bool(bool2);\n}\n\nint32_t rust::test_boolean(int32_t boolean) {\n    return _ffi_fn_test_boolean(boolean);\n}\n\nint32_t rust::test_borrowing(int32_t borrowing) {\n    return _ffi_fn_test_borrowing(borrowing);\n}\n\nint32_t rust::test_byte(int32_t byte) {\n    return _ffi_fn_test_byte(byte);\n}\n\nint32_t rust::test_case(int32_t case2) {\n    return _ffi_fn_test_case(case2);\n}\n\nint32_t rust::test_catch(int32_t catch2) {\n    return _ffi_fn_test_catch(catch2);\n}\n\nint32_t rust::test_char(int32_t char2) {\n    return _ffi_fn_test_char(char2);\n}\n\nint32_t rust::test_char16_t(int32_t char16_t2) {\n    return _ffi_fn_test_char16_t(char16_t2);\n}\n\nint32_t rust::test_char32_t(int32_t char32_t2) {\n    return _ffi_fn_test_char32_t(char32_t2);\n}\n\nint32_t rust::test_char8_t(int32_t char8_t2) {\n    return _ffi_fn_test_char8_t(char8_t2);\n}\n\nint32_t rust::test_class(int32_t class2) {\n    return _ffi_fn_test_class(class2);\n}\n\nint32_t rust::test_co_await(int32_t co_await2) {\n    return _ffi_fn_test_co_await(co_await2);\n}\n\nint32_t rust::test_co_return(int32_t co_return2) {\n    return _ffi_fn_test_co_return(co_return2);\n}\n\nint32_t rust::test_co_yield(int32_t co_yield2) {\n    return _ffi_fn_test_co_yield(co_yield2);\n}\n\nint32_t rust::test_compl(int32_t compl2) {\n    return _ffi_fn_test_compl(compl2);\n}\n\nint32_t rust::test_concept(int32_t concept2) {\n    return _ffi_fn_test_concept(concept2);\n}\n\nint32_t rust::test_const_cast(int32_t const_cast2) {\n    return _ffi_fn_test_const_cast(const_cast2);\n}\n\nint32_t rust::test_consteval(int32_t consteval2) {\n    return _ffi_fn_test_consteval(consteval2);\n}\n\nint32_t rust::test_constexpr(int32_t constexpr2) {\n    return _ffi_fn_test_constexpr(constexpr2);\n}\n\nint32_t rust::test_constinit(int32_t constinit2) {\n    return _ffi_fn_test_constinit(constinit2);\n}\n\nint32_t rust::test_consuming(int32_t consuming) {\n    return _ffi_fn_test_consuming(consuming);\n}\n\nint32_t rust::test_contract_assert(int32_t contract_assert2) {\n    return _ffi_fn_test_contract_assert(contract_assert2);\n}\n\nint32_t rust::test_convenience(int32_t convenience) {\n    return _ffi_fn_test_convenience(convenience);\n}\n\nint32_t rust::test_debugger(int32_t debugger) {\n    return _ffi_fn_test_debugger(debugger);\n}\n\nint32_t rust::test_decltype(int32_t decltype2) {\n    return _ffi_fn_test_decltype(decltype2);\n}\n\nint32_t rust::test_default(int32_t default2) {\n    return _ffi_fn_test_default(default2);\n}\n\nint32_t rust::test_defer(int32_t defer) {\n    return _ffi_fn_test_defer(defer);\n}\n\nint32_t rust::test_deinit(int32_t deinit) {\n    return _ffi_fn_test_deinit(deinit);\n}\n\nint32_t rust::test_delete(int32_t delete2) {\n    return _ffi_fn_test_delete(delete2);\n}\n\nint32_t rust::test_double(int32_t double2) {\n    return _ffi_fn_test_double(double2);\n}\n\nint32_t rust::test_dynamic(int32_t dynamic) {\n    return _ffi_fn_test_dynamic(dynamic);\n}\n\nint32_t rust::test_dynamic_cast(int32_t dynamic_cast2) {\n    return _ffi_fn_test_dynamic_cast(dynamic_cast2);\n}\n\nint32_t rust::test_explicit(int32_t explicit2) {\n    return _ffi_fn_test_explicit(explicit2);\n}\n\nint32_t rust::test_export(int32_t export2) {\n    return _ffi_fn_test_export(export2);\n}\n\nint32_t rust::test_extends(int32_t extends) {\n    return _ffi_fn_test_extends(extends);\n}\n\nint32_t rust::test_extension(int32_t extension) {\n    return _ffi_fn_test_extension(extension);\n}\n\nint32_t rust::test_fallthrough(int32_t fallthrough) {\n    return _ffi_fn_test_fallthrough(fallthrough);\n}\n\nint32_t rust::test_fileprivate(int32_t fileprivate) {\n    return _ffi_fn_test_fileprivate(fileprivate);\n}\n\nint32_t rust::test_finally(int32_t finally) {\n    return _ffi_fn_test_finally(finally);\n}\n\nint32_t rust::test_float(int32_t float2) {\n    return _ffi_fn_test_float(float2);\n}\n\nint32_t rust::test_friend(int32_t friend2) {\n    return _ffi_fn_test_friend(friend2);\n}\n\nint32_t rust::test_func(int32_t func) {\n    return _ffi_fn_test_func(func);\n}\n\nint32_t rust::test_function(int32_t function) {\n    return _ffi_fn_test_function(function);\n}\n\nint32_t rust::test_get(int32_t get) {\n    return _ffi_fn_test_get(get);\n}\n\nint32_t rust::test_goto(int32_t goto2) {\n    return _ffi_fn_test_goto(goto2);\n}\n\nint32_t rust::test_guard(int32_t guard) {\n    return _ffi_fn_test_guard(guard);\n}\n\nint32_t rust::test_implements(int32_t implements) {\n    return _ffi_fn_test_implements(implements);\n}\n\nint32_t rust::test_import(int32_t import) {\n    return _ffi_fn_test_import(import);\n}\n\nint32_t rust::test_indirect(int32_t indirect) {\n    return _ffi_fn_test_indirect(indirect);\n}\n\nint32_t rust::test_infix(int32_t infix) {\n    return _ffi_fn_test_infix(infix);\n}\n\nint32_t rust::test_init(int32_t init) {\n    return _ffi_fn_test_init(init);\n}\n\nint32_t rust::test_inline(int32_t inline2) {\n    return _ffi_fn_test_inline(inline2);\n}\n\nint32_t rust::test_inout(int32_t inout) {\n    return _ffi_fn_test_inout(inout);\n}\n\nint32_t rust::test_instanceof(int32_t instanceof) {\n    return _ffi_fn_test_instanceof(instanceof);\n}\n\nint32_t rust::test_int(int32_t int2) {\n    return _ffi_fn_test_int(int2);\n}\n\nint32_t rust::test_interface(int32_t interface) {\n    return _ffi_fn_test_interface(interface);\n}\n\nint32_t rust::test_internal(int32_t internal) {\n    return _ffi_fn_test_internal(internal);\n}\n\nint32_t rust::test_is(int32_t is) {\n    return _ffi_fn_test_is(is);\n}\n\nint32_t rust::test_lazy(int32_t lazy) {\n    return _ffi_fn_test_lazy(lazy);\n}\n\nint32_t rust::test_left(int32_t left) {\n    return _ffi_fn_test_left(left);\n}\n\nint32_t rust::test_long(int32_t long2) {\n    return _ffi_fn_test_long(long2);\n}\n\nint32_t rust::test_mutable(int32_t mutable2) {\n    return _ffi_fn_test_mutable(mutable2);\n}\n\nint32_t rust::test_mutating(int32_t mutating) {\n    return _ffi_fn_test_mutating(mutating);\n}\n\nint32_t rust::test_namespace(int32_t namespace2) {\n    return _ffi_fn_test_namespace(namespace2);\n}\n\nint32_t rust::test_native(int32_t native) {\n    return _ffi_fn_test_native(native);\n}\n\nint32_t rust::test_new(int32_t new2) {\n    return _ffi_fn_test_new(new2);\n}\n\nint32_t rust::test_nil(int32_t nil) {\n    return _ffi_fn_test_nil(nil);\n}\n\nint32_t rust::test_noexcept(int32_t noexcept2) {\n    return _ffi_fn_test_noexcept(noexcept2);\n}\n\nint32_t rust::test_none(int32_t none) {\n    return _ffi_fn_test_none(none);\n}\n\nint32_t rust::test_nonisolated(int32_t nonisolated) {\n    return _ffi_fn_test_nonisolated(nonisolated);\n}\n\nint32_t rust::test_nonmutating(int32_t nonmutating) {\n    return _ffi_fn_test_nonmutating(nonmutating);\n}\n\nint32_t rust::test_not(int32_t not2) {\n    return _ffi_fn_test_not(not2);\n}\n\nint32_t rust::test_not_eq(int32_t not_eq2) {\n    return _ffi_fn_test_not_eq(not_eq2);\n}\n\nint32_t rust::test_null(int32_t null) {\n    return _ffi_fn_test_null(null);\n}\n\nint32_t rust::test_nullptr(int32_t nullptr2) {\n    return _ffi_fn_test_nullptr(nullptr2);\n}\n\nint32_t rust::test_open(int32_t open) {\n    return _ffi_fn_test_open(open);\n}\n\nint32_t rust::test_operator(int32_t operator2) {\n    return _ffi_fn_test_operator(operator2);\n}\n\nint32_t rust::test_optional(int32_t optional) {\n    return _ffi_fn_test_optional(optional);\n}\n\nint32_t rust::test_or(int32_t or2) {\n    return _ffi_fn_test_or(or2);\n}\n\nint32_t rust::test_or_eq(int32_t or_eq2) {\n    return _ffi_fn_test_or_eq(or_eq2);\n}\n\nint32_t rust::test_package(int32_t package) {\n    return _ffi_fn_test_package(package);\n}\n\nint32_t rust::test_postfix(int32_t postfix) {\n    return _ffi_fn_test_postfix(postfix);\n}\n\nint32_t rust::test_precedence(int32_t precedence) {\n    return _ffi_fn_test_precedence(precedence);\n}\n\nint32_t rust::test_precedencegroup(int32_t precedencegroup) {\n    return _ffi_fn_test_precedencegroup(precedencegroup);\n}\n\nint32_t rust::test_prefix(int32_t prefix) {\n    return _ffi_fn_test_prefix(prefix);\n}\n\nint32_t rust::test_private(int32_t private2) {\n    return _ffi_fn_test_private(private2);\n}\n\nint32_t rust::test_protected(int32_t protected2) {\n    return _ffi_fn_test_protected(protected2);\n}\n\nint32_t rust::test_protocol(int32_t protocol) {\n    return _ffi_fn_test_protocol(protocol);\n}\n\nint32_t rust::test_public(int32_t public2) {\n    return _ffi_fn_test_public(public2);\n}\n\nint32_t rust::test_reflexpr(int32_t reflexpr2) {\n    return _ffi_fn_test_reflexpr(reflexpr2);\n}\n\nint32_t rust::test_register(int32_t register2) {\n    return _ffi_fn_test_register(register2);\n}\n\nint32_t rust::test_reinterpret_cast(int32_t reinterpret_cast2) {\n    return _ffi_fn_test_reinterpret_cast(reinterpret_cast2);\n}\n\nint32_t rust::test_repeat(int32_t repeat) {\n    return _ffi_fn_test_repeat(repeat);\n}\n\nint32_t rust::test_required(int32_t required) {\n    return _ffi_fn_test_required(required);\n}\n\nint32_t rust::test_requires(int32_t requires2) {\n    return _ffi_fn_test_requires(requires2);\n}\n\nint32_t rust::test_rethrows(int32_t rethrows) {\n    return _ffi_fn_test_rethrows(rethrows);\n}\n\nint32_t rust::test_right(int32_t right) {\n    return _ffi_fn_test_right(right);\n}\n\nint32_t rust::test_set(int32_t set) {\n    return _ffi_fn_test_set(set);\n}\n\nint32_t rust::test_short(int32_t short2) {\n    return _ffi_fn_test_short(short2);\n}\n\nint32_t rust::test_signed(int32_t signed2) {\n    return _ffi_fn_test_signed(signed2);\n}\n\nint32_t rust::test_sizeof(int32_t sizeof2) {\n    return _ffi_fn_test_sizeof(sizeof2);\n}\n\nint32_t rust::test_some(int32_t some) {\n    return _ffi_fn_test_some(some);\n}\n\nint32_t rust::test_static_assert(int32_t static_assert2) {\n    return _ffi_fn_test_static_assert(static_assert2);\n}\n\nint32_t rust::test_static_cast(int32_t static_cast2) {\n    return _ffi_fn_test_static_cast(static_cast2);\n}\n\nint32_t rust::test_subscript(int32_t subscript) {\n    return _ffi_fn_test_subscript(subscript);\n}\n\nint32_t rust::test_switch(int32_t switch2) {\n    return _ffi_fn_test_switch(switch2);\n}\n\nint32_t rust::test_synchronized(int32_t synchronized2) {\n    return _ffi_fn_test_synchronized(synchronized2);\n}\n\nint32_t rust::test_template(int32_t template2) {\n    return _ffi_fn_test_template(template2);\n}\n\nint32_t rust::test_this(int32_t this2) {\n    return _ffi_fn_test_this(this2);\n}\n\nint32_t rust::test_thread_local(int32_t thread_local2) {\n    return _ffi_fn_test_thread_local(thread_local2);\n}\n\nint32_t rust::test_throw(int32_t throw2) {\n    return _ffi_fn_test_throw(throw2);\n}\n\nint32_t rust::test_throws(int32_t throws) {\n    return _ffi_fn_test_throws(throws);\n}\n\nint32_t rust::test_transient(int32_t transient) {\n    return _ffi_fn_test_transient(transient);\n}\n\nint32_t rust::test_typealias(int32_t typealias) {\n    return _ffi_fn_test_typealias(typealias);\n}\n\nint32_t rust::test_typedef(int32_t typedef2) {\n    return _ffi_fn_test_typedef(typedef2);\n}\n\nint32_t rust::test_typeid(int32_t typeid2) {\n    return _ffi_fn_test_typeid(typeid2);\n}\n\nint32_t rust::test_typename(int32_t typename2) {\n    return _ffi_fn_test_typename(typename2);\n}\n\nint32_t rust::test_undefined(int32_t undefined) {\n    return _ffi_fn_test_undefined(undefined);\n}\n\nint32_t rust::test_union(int32_t union2) {\n    return _ffi_fn_test_union(union2);\n}\n\nint32_t rust::test_unowned(int32_t unowned) {\n    return _ffi_fn_test_unowned(unowned);\n}\n\nint32_t rust::test_unsigned(int32_t unsigned2) {\n    return _ffi_fn_test_unsigned(unsigned2);\n}\n\nint32_t rust::test_using(int32_t using2) {\n    return _ffi_fn_test_using(using2);\n}\n\nint32_t rust::test_var(int32_t var) {\n    return _ffi_fn_test_var(var);\n}\n\nint32_t rust::test_void(int32_t void2) {\n    return _ffi_fn_test_void(void2);\n}\n\nint32_t rust::test_volatile(int32_t volatile2) {\n    return _ffi_fn_test_volatile(volatile2);\n}\n\nint32_t rust::test_wchar_t(int32_t wchar_t2) {\n    return _ffi_fn_test_wchar_t(wchar_t2);\n}\n\nint32_t rust::test_weak(int32_t weak) {\n    return _ffi_fn_test_weak(weak);\n}\n\nint32_t rust::test_with(int32_t with) {\n    return _ffi_fn_test_with(with);\n}\n\nint32_t rust::test_xor(int32_t xor2) {\n    return _ffi_fn_test_xor(xor2);\n}\n\nint32_t rust::test_xor_eq(int32_t xor_eq2) {\n    return _ffi_fn_test_xor_eq(xor_eq2);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_keyword_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nint32_t test_alignas(int32_t alignas2);\n\nint32_t test_alignof(int32_t alignof2);\n\nint32_t test_and(int32_t and2);\n\nint32_t test_and_eq(int32_t and_eq2);\n\nint32_t test_asm(int32_t asm2);\n\nint32_t test_associatedtype(int32_t associatedtype);\n\nint32_t test_associativity(int32_t associativity);\n\nint32_t test_atomic_cancel(int32_t atomic_cancel2);\n\nint32_t test_atomic_commit(int32_t atomic_commit2);\n\nint32_t test_atomic_noexcept(int32_t atomic_noexcept2);\n\nint32_t test_auto(int32_t auto2);\n\nint32_t test_bitand(int32_t bitand2);\n\nint32_t test_bitor(int32_t bitor2);\n\nint32_t test_bool(int32_t bool2);\n\nint32_t test_boolean(int32_t boolean);\n\nint32_t test_borrowing(int32_t borrowing);\n\nint32_t test_byte(int32_t byte);\n\nint32_t test_case(int32_t case2);\n\nint32_t test_catch(int32_t catch2);\n\nint32_t test_char(int32_t char2);\n\nint32_t test_char16_t(int32_t char16_t2);\n\nint32_t test_char32_t(int32_t char32_t2);\n\nint32_t test_char8_t(int32_t char8_t2);\n\nint32_t test_class(int32_t class2);\n\nint32_t test_co_await(int32_t co_await2);\n\nint32_t test_co_return(int32_t co_return2);\n\nint32_t test_co_yield(int32_t co_yield2);\n\nint32_t test_compl(int32_t compl2);\n\nint32_t test_concept(int32_t concept2);\n\nint32_t test_const_cast(int32_t const_cast2);\n\nint32_t test_consteval(int32_t consteval2);\n\nint32_t test_constexpr(int32_t constexpr2);\n\nint32_t test_constinit(int32_t constinit2);\n\nint32_t test_consuming(int32_t consuming);\n\nint32_t test_contract_assert(int32_t contract_assert2);\n\nint32_t test_convenience(int32_t convenience);\n\nint32_t test_debugger(int32_t debugger);\n\nint32_t test_decltype(int32_t decltype2);\n\nint32_t test_default(int32_t default2);\n\nint32_t test_defer(int32_t defer);\n\nint32_t test_deinit(int32_t deinit);\n\nint32_t test_delete(int32_t delete2);\n\nint32_t test_double(int32_t double2);\n\nint32_t test_dynamic(int32_t dynamic);\n\nint32_t test_dynamic_cast(int32_t dynamic_cast2);\n\nint32_t test_explicit(int32_t explicit2);\n\nint32_t test_export(int32_t export2);\n\nint32_t test_extends(int32_t extends);\n\nint32_t test_extension(int32_t extension);\n\nint32_t test_fallthrough(int32_t fallthrough);\n\nint32_t test_fileprivate(int32_t fileprivate);\n\nint32_t test_finally(int32_t finally);\n\nint32_t test_float(int32_t float2);\n\nint32_t test_friend(int32_t friend2);\n\nint32_t test_func(int32_t func);\n\nint32_t test_function(int32_t function);\n\nint32_t test_get(int32_t get);\n\nint32_t test_goto(int32_t goto2);\n\nint32_t test_guard(int32_t guard);\n\nint32_t test_implements(int32_t implements);\n\nint32_t test_import(int32_t import);\n\nint32_t test_indirect(int32_t indirect);\n\nint32_t test_infix(int32_t infix);\n\nint32_t test_init(int32_t init);\n\nint32_t test_inline(int32_t inline2);\n\nint32_t test_inout(int32_t inout);\n\nint32_t test_instanceof(int32_t instanceof);\n\nint32_t test_int(int32_t int2);\n\nint32_t test_interface(int32_t interface);\n\nint32_t test_internal(int32_t internal);\n\nint32_t test_is(int32_t is);\n\nint32_t test_lazy(int32_t lazy);\n\nint32_t test_left(int32_t left);\n\nint32_t test_long(int32_t long2);\n\nint32_t test_mutable(int32_t mutable2);\n\nint32_t test_mutating(int32_t mutating);\n\nint32_t test_namespace(int32_t namespace2);\n\nint32_t test_native(int32_t native);\n\nint32_t test_new(int32_t new2);\n\nint32_t test_nil(int32_t nil);\n\nint32_t test_noexcept(int32_t noexcept2);\n\nint32_t test_none(int32_t none);\n\nint32_t test_nonisolated(int32_t nonisolated);\n\nint32_t test_nonmutating(int32_t nonmutating);\n\nint32_t test_not(int32_t not2);\n\nint32_t test_not_eq(int32_t not_eq2);\n\nint32_t test_null(int32_t null);\n\nint32_t test_nullptr(int32_t nullptr2);\n\nint32_t test_open(int32_t open);\n\nint32_t test_operator(int32_t operator2);\n\nint32_t test_optional(int32_t optional);\n\nint32_t test_or(int32_t or2);\n\nint32_t test_or_eq(int32_t or_eq2);\n\nint32_t test_package(int32_t package);\n\nint32_t test_postfix(int32_t postfix);\n\nint32_t test_precedence(int32_t precedence);\n\nint32_t test_precedencegroup(int32_t precedencegroup);\n\nint32_t test_prefix(int32_t prefix);\n\nint32_t test_private(int32_t private2);\n\nint32_t test_protected(int32_t protected2);\n\nint32_t test_protocol(int32_t protocol);\n\nint32_t test_public(int32_t public2);\n\nint32_t test_reflexpr(int32_t reflexpr2);\n\nint32_t test_register(int32_t register2);\n\nint32_t test_reinterpret_cast(int32_t reinterpret_cast2);\n\nint32_t test_repeat(int32_t repeat);\n\nint32_t test_required(int32_t required);\n\nint32_t test_requires(int32_t requires2);\n\nint32_t test_rethrows(int32_t rethrows);\n\nint32_t test_right(int32_t right);\n\nint32_t test_set(int32_t set);\n\nint32_t test_short(int32_t short2);\n\nint32_t test_signed(int32_t signed2);\n\nint32_t test_sizeof(int32_t sizeof2);\n\nint32_t test_some(int32_t some);\n\nint32_t test_static_assert(int32_t static_assert2);\n\nint32_t test_static_cast(int32_t static_cast2);\n\nint32_t test_subscript(int32_t subscript);\n\nint32_t test_switch(int32_t switch2);\n\nint32_t test_synchronized(int32_t synchronized2);\n\nint32_t test_template(int32_t template2);\n\nint32_t test_this(int32_t this2);\n\nint32_t test_thread_local(int32_t thread_local2);\n\nint32_t test_throw(int32_t throw2);\n\nint32_t test_throws(int32_t throws);\n\nint32_t test_transient(int32_t transient);\n\nint32_t test_typealias(int32_t typealias);\n\nint32_t test_typedef(int32_t typedef2);\n\nint32_t test_typeid(int32_t typeid2);\n\nint32_t test_typename(int32_t typename2);\n\nint32_t test_undefined(int32_t undefined);\n\nint32_t test_union(int32_t union2);\n\nint32_t test_unowned(int32_t unowned);\n\nint32_t test_unsigned(int32_t unsigned2);\n\nint32_t test_using(int32_t using2);\n\nint32_t test_var(int32_t var);\n\nint32_t test_void(int32_t void2);\n\nint32_t test_volatile(int32_t volatile2);\n\nint32_t test_wchar_t(int32_t wchar_t2);\n\nint32_t test_weak(int32_t weak);\n\nint32_t test_with(int32_t with);\n\nint32_t test_xor(int32_t xor2);\n\nint32_t test_xor_eq(int32_t xor_eq2);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_keyword_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_alignas(alignas2: i32) -> i32 {\n    test_alignas(alignas2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_alignof(alignof2: i32) -> i32 {\n    test_alignof(alignof2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_and(and2: i32) -> i32 {\n    test_and(and2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_and_eq(and_eq2: i32) -> i32 {\n    test_and_eq(and_eq2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_asm(asm2: i32) -> i32 {\n    test_asm(asm2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_associatedtype(associatedtype: i32) -> i32 {\n    test_associatedtype(associatedtype)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_associativity(associativity: i32) -> i32 {\n    test_associativity(associativity)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_atomic_cancel(atomic_cancel2: i32) -> i32 {\n    test_atomic_cancel(atomic_cancel2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_atomic_commit(atomic_commit2: i32) -> i32 {\n    test_atomic_commit(atomic_commit2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_atomic_noexcept(atomic_noexcept2: i32) -> i32 {\n    test_atomic_noexcept(atomic_noexcept2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_auto(auto2: i32) -> i32 {\n    test_auto(auto2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_bitand(bitand2: i32) -> i32 {\n    test_bitand(bitand2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_bitor(bitor2: i32) -> i32 {\n    test_bitor(bitor2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_bool(bool2: i32) -> i32 {\n    test_bool(bool2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_boolean(boolean: i32) -> i32 {\n    test_boolean(boolean)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_borrowing(borrowing: i32) -> i32 {\n    test_borrowing(borrowing)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_byte(byte: i32) -> i32 {\n    test_byte(byte)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_case(case2: i32) -> i32 {\n    test_case(case2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_catch(catch2: i32) -> i32 {\n    test_catch(catch2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_char(char2: i32) -> i32 {\n    test_char(char2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_char16_t(char16_t2: i32) -> i32 {\n    test_char16_t(char16_t2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_char32_t(char32_t2: i32) -> i32 {\n    test_char32_t(char32_t2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_char8_t(char8_t2: i32) -> i32 {\n    test_char8_t(char8_t2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_class(class2: i32) -> i32 {\n    test_class(class2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_co_await(co_await2: i32) -> i32 {\n    test_co_await(co_await2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_co_return(co_return2: i32) -> i32 {\n    test_co_return(co_return2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_co_yield(co_yield2: i32) -> i32 {\n    test_co_yield(co_yield2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_compl(compl2: i32) -> i32 {\n    test_compl(compl2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_concept(concept2: i32) -> i32 {\n    test_concept(concept2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_const_cast(const_cast2: i32) -> i32 {\n    test_const_cast(const_cast2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_consteval(consteval2: i32) -> i32 {\n    test_consteval(consteval2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_constexpr(constexpr2: i32) -> i32 {\n    test_constexpr(constexpr2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_constinit(constinit2: i32) -> i32 {\n    test_constinit(constinit2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_consuming(consuming: i32) -> i32 {\n    test_consuming(consuming)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_contract_assert(contract_assert2: i32) -> i32 {\n    test_contract_assert(contract_assert2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_convenience(convenience: i32) -> i32 {\n    test_convenience(convenience)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_debugger(debugger: i32) -> i32 {\n    test_debugger(debugger)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_decltype(decltype2: i32) -> i32 {\n    test_decltype(decltype2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_default(default2: i32) -> i32 {\n    test_default(default2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_defer(defer: i32) -> i32 {\n    test_defer(defer)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_deinit(deinit: i32) -> i32 {\n    test_deinit(deinit)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_delete(delete2: i32) -> i32 {\n    test_delete(delete2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_double(double2: i32) -> i32 {\n    test_double(double2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_dynamic(dynamic: i32) -> i32 {\n    test_dynamic(dynamic)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_dynamic_cast(dynamic_cast2: i32) -> i32 {\n    test_dynamic_cast(dynamic_cast2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_explicit(explicit2: i32) -> i32 {\n    test_explicit(explicit2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_export(export2: i32) -> i32 {\n    test_export(export2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_extends(extends: i32) -> i32 {\n    test_extends(extends)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_extension(extension: i32) -> i32 {\n    test_extension(extension)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_fallthrough(fallthrough: i32) -> i32 {\n    test_fallthrough(fallthrough)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_fileprivate(fileprivate: i32) -> i32 {\n    test_fileprivate(fileprivate)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_finally(finally: i32) -> i32 {\n    test_finally(finally)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_float(float2: i32) -> i32 {\n    test_float(float2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_friend(friend2: i32) -> i32 {\n    test_friend(friend2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_func(func: i32) -> i32 {\n    test_func(func)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_function(function: i32) -> i32 {\n    test_function(function)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_get(get: i32) -> i32 {\n    test_get(get)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_goto(goto2: i32) -> i32 {\n    test_goto(goto2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_guard(guard: i32) -> i32 {\n    test_guard(guard)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_implements(implements: i32) -> i32 {\n    test_implements(implements)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_import(import: i32) -> i32 {\n    test_import(import)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_indirect(indirect: i32) -> i32 {\n    test_indirect(indirect)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_infix(infix: i32) -> i32 {\n    test_infix(infix)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_init(init: i32) -> i32 {\n    test_init(init)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_inline(inline2: i32) -> i32 {\n    test_inline(inline2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_inout(inout: i32) -> i32 {\n    test_inout(inout)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_instanceof(instanceof: i32) -> i32 {\n    test_instanceof(instanceof)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_int(int2: i32) -> i32 {\n    test_int(int2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_interface(interface: i32) -> i32 {\n    test_interface(interface)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_internal(internal: i32) -> i32 {\n    test_internal(internal)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_is(is: i32) -> i32 {\n    test_is(is)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_lazy(lazy: i32) -> i32 {\n    test_lazy(lazy)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_left(left: i32) -> i32 {\n    test_left(left)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_long(long2: i32) -> i32 {\n    test_long(long2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_mutable(mutable2: i32) -> i32 {\n    test_mutable(mutable2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_mutating(mutating: i32) -> i32 {\n    test_mutating(mutating)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_namespace(namespace2: i32) -> i32 {\n    test_namespace(namespace2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_native(native: i32) -> i32 {\n    test_native(native)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_new(new2: i32) -> i32 {\n    test_new(new2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_nil(nil: i32) -> i32 {\n    test_nil(nil)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_noexcept(noexcept2: i32) -> i32 {\n    test_noexcept(noexcept2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_none(none: i32) -> i32 {\n    test_none(none)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_nonisolated(nonisolated: i32) -> i32 {\n    test_nonisolated(nonisolated)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_nonmutating(nonmutating: i32) -> i32 {\n    test_nonmutating(nonmutating)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_not(not2: i32) -> i32 {\n    test_not(not2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_not_eq(not_eq2: i32) -> i32 {\n    test_not_eq(not_eq2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_null(null: i32) -> i32 {\n    test_null(null)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_nullptr(nullptr2: i32) -> i32 {\n    test_nullptr(nullptr2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_open(open: i32) -> i32 {\n    test_open(open)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_operator(operator2: i32) -> i32 {\n    test_operator(operator2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_optional(optional: i32) -> i32 {\n    test_optional(optional)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_or(or2: i32) -> i32 {\n    test_or(or2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_or_eq(or_eq2: i32) -> i32 {\n    test_or_eq(or_eq2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_package(package: i32) -> i32 {\n    test_package(package)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_postfix(postfix: i32) -> i32 {\n    test_postfix(postfix)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_precedence(precedence: i32) -> i32 {\n    test_precedence(precedence)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_precedencegroup(precedencegroup: i32) -> i32 {\n    test_precedencegroup(precedencegroup)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_prefix(prefix: i32) -> i32 {\n    test_prefix(prefix)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_private(private2: i32) -> i32 {\n    test_private(private2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_protected(protected2: i32) -> i32 {\n    test_protected(protected2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_protocol(protocol: i32) -> i32 {\n    test_protocol(protocol)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_public(public2: i32) -> i32 {\n    test_public(public2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_reflexpr(reflexpr2: i32) -> i32 {\n    test_reflexpr(reflexpr2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_register(register2: i32) -> i32 {\n    test_register(register2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_reinterpret_cast(reinterpret_cast2: i32) -> i32 {\n    test_reinterpret_cast(reinterpret_cast2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_repeat(repeat: i32) -> i32 {\n    test_repeat(repeat)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_required(required: i32) -> i32 {\n    test_required(required)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_requires(requires2: i32) -> i32 {\n    test_requires(requires2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_rethrows(rethrows: i32) -> i32 {\n    test_rethrows(rethrows)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_right(right: i32) -> i32 {\n    test_right(right)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_set(set: i32) -> i32 {\n    test_set(set)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_short(short2: i32) -> i32 {\n    test_short(short2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_signed(signed2: i32) -> i32 {\n    test_signed(signed2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_sizeof(sizeof2: i32) -> i32 {\n    test_sizeof(sizeof2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_some(some: i32) -> i32 {\n    test_some(some)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_static_assert(static_assert2: i32) -> i32 {\n    test_static_assert(static_assert2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_static_cast(static_cast2: i32) -> i32 {\n    test_static_cast(static_cast2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_subscript(subscript: i32) -> i32 {\n    test_subscript(subscript)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_switch(switch2: i32) -> i32 {\n    test_switch(switch2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_synchronized(synchronized2: i32) -> i32 {\n    test_synchronized(synchronized2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_template(template2: i32) -> i32 {\n    test_template(template2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_this(this2: i32) -> i32 {\n    test_this(this2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_thread_local(thread_local2: i32) -> i32 {\n    test_thread_local(thread_local2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_throw(throw2: i32) -> i32 {\n    test_throw(throw2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_throws(throws: i32) -> i32 {\n    test_throws(throws)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_transient(transient: i32) -> i32 {\n    test_transient(transient)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_typealias(typealias: i32) -> i32 {\n    test_typealias(typealias)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_typedef(typedef2: i32) -> i32 {\n    test_typedef(typedef2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_typeid(typeid2: i32) -> i32 {\n    test_typeid(typeid2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_typename(typename2: i32) -> i32 {\n    test_typename(typename2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_undefined(undefined: i32) -> i32 {\n    test_undefined(undefined)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_union(union2: i32) -> i32 {\n    test_union(union2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_unowned(unowned: i32) -> i32 {\n    test_unowned(unowned)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_unsigned(unsigned2: i32) -> i32 {\n    test_unsigned(unsigned2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_using(using2: i32) -> i32 {\n    test_using(using2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_var(var: i32) -> i32 {\n    test_var(var)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_void(void2: i32) -> i32 {\n    test_void(void2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_volatile(volatile2: i32) -> i32 {\n    test_volatile(volatile2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_wchar_t(wchar_t2: i32) -> i32 {\n    test_wchar_t(wchar_t2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_weak(weak: i32) -> i32 {\n    test_weak(weak)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_with(with: i32) -> i32 {\n    test_with(with)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_xor(xor2: i32) -> i32 {\n    test_xor(xor2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_xor_eq(xor_eq2: i32) -> i32 {\n    test_xor_eq(xor_eq2)\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_order_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_order_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <variant>\n#include <vector>\n#include <memory>\n\nnamespace rust {\n\nstruct SecondEnum;\nstruct SecondStruct;\nstruct SecondTrait;\nstruct FirstEnum;\nstruct FirstStruct;\nstruct FirstTrait;\n\nnamespace detail {\n\nstruct EarlyInsideEnum__Value {\n    bool _0 = false;\n};\n\n} // namespace detail\n\nstruct EarlyInsideEnum : std::variant<std::monostate, detail::EarlyInsideEnum__Value> {\n    using Value = detail::EarlyInsideEnum__Value;\n    using std::variant<std::monostate, Value>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nstruct EarlyInsideStruct {\n    bool y = false;\n};\n\nnamespace detail {\n\nstruct LaterInsideEnum__Value {\n    bool _0 = false;\n};\n\n} // namespace detail\n\nstruct LaterInsideEnum : std::variant<std::monostate, detail::LaterInsideEnum__Value> {\n    using Value = detail::LaterInsideEnum__Value;\n    using std::variant<std::monostate, Value>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nnamespace detail {\n\nstruct EarlyOutsideEnum__Value {\n    LaterInsideEnum _0;\n};\n\n} // namespace detail\n\nstruct EarlyOutsideEnum : std::variant<std::monostate, detail::EarlyOutsideEnum__Value> {\n    using Value = detail::EarlyOutsideEnum__Value;\n    using std::variant<std::monostate, Value>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nstruct LaterInsideStruct {\n    bool y = false;\n};\n\nstruct EarlyOutsideStruct {\n    LaterInsideStruct x;\n};\n\nnamespace detail {\n\nstruct FirstEnum__Second {\n    std::vector<SecondEnum> _0;\n};\n\n} // namespace detail\n\nstruct FirstEnum : std::variant<std::monostate, detail::FirstEnum__Second> {\n    using Second = detail::FirstEnum__Second;\n    using std::variant<std::monostate, Second>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nstruct FirstStruct {\n    std::vector<SecondStruct> second;\n};\n\nstruct FirstTrait {\n    virtual ~FirstTrait() {}\n    virtual std::shared_ptr<SecondTrait> second() = 0;\n};\n\nnamespace detail {\n\nstruct LaterOutsideEnum__Value {\n    EarlyInsideEnum _0;\n};\n\n} // namespace detail\n\nstruct LaterOutsideEnum : std::variant<std::monostate, detail::LaterOutsideEnum__Value> {\n    using Value = detail::LaterOutsideEnum__Value;\n    using std::variant<std::monostate, Value>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nstruct LaterOutsideStruct {\n    EarlyInsideStruct x;\n};\n\nnamespace detail {\n\nstruct SecondEnum__First {\n    std::vector<FirstEnum> _0;\n};\n\n} // namespace detail\n\nstruct SecondEnum : std::variant<std::monostate, detail::SecondEnum__First> {\n    using First = detail::SecondEnum__First;\n    using std::variant<std::monostate, First>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nstruct SecondStruct {\n    std::vector<FirstStruct> first;\n};\n\nstruct SecondTrait {\n    virtual ~SecondTrait() {}\n    virtual std::shared_ptr<FirstTrait> first() = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_order_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_order_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_order_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <variant>\n#include <vector>\n#include <memory>\n\nnamespace rust {\n\nstruct SecondEnum;\nstruct SecondStruct;\nstruct SecondTrait;\nstruct FirstEnum;\nstruct FirstStruct;\nstruct FirstTrait;\n\nnamespace detail {\n\nstruct EarlyInsideEnum__Value {\n    bool _0 = false;\n};\n\n} // namespace detail\n\nstruct EarlyInsideEnum : std::variant<std::monostate, detail::EarlyInsideEnum__Value> {\n    using Value = detail::EarlyInsideEnum__Value;\n    using std::variant<std::monostate, Value>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nstruct EarlyInsideStruct {\n    bool y = false;\n};\n\nnamespace detail {\n\nstruct LaterInsideEnum__Value {\n    bool _0 = false;\n};\n\n} // namespace detail\n\nstruct LaterInsideEnum : std::variant<std::monostate, detail::LaterInsideEnum__Value> {\n    using Value = detail::LaterInsideEnum__Value;\n    using std::variant<std::monostate, Value>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nnamespace detail {\n\nstruct EarlyOutsideEnum__Value {\n    LaterInsideEnum _0;\n};\n\n} // namespace detail\n\nstruct EarlyOutsideEnum : std::variant<std::monostate, detail::EarlyOutsideEnum__Value> {\n    using Value = detail::EarlyOutsideEnum__Value;\n    using std::variant<std::monostate, Value>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nstruct LaterInsideStruct {\n    bool y = false;\n};\n\nstruct EarlyOutsideStruct {\n    LaterInsideStruct x;\n};\n\nnamespace detail {\n\nstruct FirstEnum__Second {\n    std::vector<SecondEnum> _0;\n};\n\n} // namespace detail\n\nstruct FirstEnum : std::variant<std::monostate, detail::FirstEnum__Second> {\n    using Second = detail::FirstEnum__Second;\n    using std::variant<std::monostate, Second>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nstruct FirstStruct {\n    std::vector<SecondStruct> second;\n};\n\nstruct FirstTrait {\n    virtual ~FirstTrait() {}\n    virtual std::shared_ptr<SecondTrait> second() = 0;\n};\n\nnamespace detail {\n\nstruct LaterOutsideEnum__Value {\n    EarlyInsideEnum _0;\n};\n\n} // namespace detail\n\nstruct LaterOutsideEnum : std::variant<std::monostate, detail::LaterOutsideEnum__Value> {\n    using Value = detail::LaterOutsideEnum__Value;\n    using std::variant<std::monostate, Value>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nstruct LaterOutsideStruct {\n    EarlyInsideStruct x;\n};\n\nnamespace detail {\n\nstruct SecondEnum__First {\n    std::vector<FirstEnum> _0;\n};\n\n} // namespace detail\n\nstruct SecondEnum : std::variant<std::monostate, detail::SecondEnum__First> {\n    using First = detail::SecondEnum__First;\n    using std::variant<std::monostate, First>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nstruct SecondStruct {\n    std::vector<FirstStruct> first;\n};\n\nstruct SecondTrait {\n    virtual ~SecondTrait() {}\n    virtual std::shared_ptr<FirstTrait> first() = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_order_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_trait_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_ptr_2_usize {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nextern \"C\" {\n\nvoid _ffi_drop_Box_Trait(const void* ptr);\nvoid _ffi_drop_Rc_Trait(const void* ptr);\nvoid* _ffi_alloc(uintptr_t len);\nint32_t _ffi_Box_Trait__get(const void* _self);\nint32_t _ffi_Rc_Trait__get(const void* _self);\nuintptr_t _ffi_fn_rust_mem_leaked();\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n_ffi_ret_ptr_2_usize _ffi_fn_test(const void* buf_ptr, uintptr_t vec_len);\n\n} // extern \"C\"\n\nnamespace {\n\nstruct _ffi_Box_Trait final : rust::Trait {\n    _ffi_Box_Trait(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Box_Trait() { _ffi_drop_Box_Trait(_self); }\n    virtual int32_t get();\n    const void* _self;\n};\n\nstruct _ffi_Rc_Trait final : rust::Trait {\n    _ffi_Rc_Trait(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Rc_Trait() { _ffi_drop_Rc_Trait(_self); }\n    virtual int32_t get();\n    const void* _self;\n};\n\nconst void* _ffi_string_to_rust(const std::string& str, uintptr_t &len) {\n    len = str.size();\n    return memcpy(_ffi_alloc(len), str.data(), len);\n}\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\nstd::vector<std::unique_ptr<rust::Trait>> _ffi_vec_box_dyn_Trait_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::unique_ptr<rust::Trait>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_ptr = _ffi_read<const void*>(end);\n        auto item = std::unique_ptr<rust::Trait>(new _ffi_Box_Trait(item_ptr));\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nstd::vector<std::shared_ptr<rust::Trait>> _ffi_vec_rc_dyn_Trait_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::shared_ptr<rust::Trait>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_ptr = _ffi_read<const void*>(end);\n        auto item = std::make_shared<_ffi_Rc_Trait>(item_ptr);\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nstd::vector<rust::Example> _ffi_vec_Example_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<rust::Example> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_box_ptr_ptr = _ffi_read<const void*>(end);\n        auto item_box_ptr = std::unique_ptr<rust::Trait>(new _ffi_Box_Trait(item_box_ptr_ptr));\n        auto item_rc_ptr_ptr = _ffi_read<const void*>(end);\n        auto item_rc_ptr = std::make_shared<_ffi_Rc_Trait>(item_rc_ptr_ptr);\n        auto item_text_ptr = _ffi_read<const char*>(end);\n        auto item_text_len = _ffi_read<uintptr_t>(end);\n        auto item_text_cap = _ffi_read<uintptr_t>(end);\n        auto item_text = _ffi_string_from_rust(item_text_ptr, item_text_len, item_text_cap);\n        auto item_vec_box_len = _ffi_read<uintptr_t>(end);\n        auto item_vec_box = _ffi_vec_box_dyn_Trait_from_rust(item_vec_box_len, end);\n        auto item_vec_rc_len = _ffi_read<uintptr_t>(end);\n        auto item_vec_rc = _ffi_vec_rc_dyn_Trait_from_rust(item_vec_rc_len, end);\n        auto item = rust::Example{\n            std::move(item_box_ptr),\n            std::move(item_rc_ptr),\n            std::move(item_text),\n            std::move(item_vec_box),\n            std::move(item_vec_rc)\n        };\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_vec_box_dyn_Trait_to_rust(std::vector<std::unique_ptr<rust::Trait>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        auto item_ptr = item.release();\n        _ffi_write(item_ptr, buf);\n    }\n}\n\nvoid _ffi_vec_rc_dyn_Trait_to_rust(std::vector<std::shared_ptr<rust::Trait>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        auto item_ptr = new std::shared_ptr<rust::Trait>(item);\n        _ffi_write(item_ptr, buf);\n    }\n}\n\nvoid _ffi_vec_Example_to_rust(std::vector<rust::Example>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        auto item_box_ptr_ptr = item.box_ptr.release();\n        _ffi_write(item_box_ptr_ptr, buf);\n        auto item_rc_ptr_ptr = new std::shared_ptr<rust::Trait>(item.rc_ptr);\n        _ffi_write(item_rc_ptr_ptr, buf);\n        uintptr_t item_text_len;\n        const void* item_text_ptr = _ffi_string_to_rust(item.text, item_text_len);\n        _ffi_write(item_text_ptr, buf);\n        _ffi_write(item_text_len, buf);\n        auto item_vec_box_len = item.vec_box.size();\n        _ffi_write(item_vec_box_len, buf);\n        _ffi_vec_box_dyn_Trait_to_rust(std::move(item.vec_box), buf);\n        auto item_vec_rc_len = item.vec_rc.size();\n        _ffi_write(item_vec_rc_len, buf);\n        _ffi_vec_rc_dyn_Trait_to_rust(std::move(item.vec_rc), buf);\n    }\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\n} // namespace\n\nextern \"C\" {\n\nint32_t _ffi_cpp_Box_Trait__get(rust::Trait* _self) {\n    return _self->get();\n}\n\nint32_t _ffi_cpp_Rc_Trait__get(std::shared_ptr<rust::Trait>* _self) {\n    return _self->get()->get();\n}\n\nvoid _ffi_cpp_drop_Box_Trait(rust::Trait* self) {\n    delete self;\n}\n\nvoid _ffi_cpp_drop_Rc_Trait(std::shared_ptr<rust::Trait>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nint32_t _ffi_Box_Trait::get() {\n    return _ffi_Box_Trait__get(_self);\n}\n\nint32_t _ffi_Rc_Trait::get() {\n    return _ffi_Rc_Trait__get(_self);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nstd::vector<rust::Example> rust::test(std::vector<rust::Example> vec) {\n    std::vector<uint8_t> buf;\n    auto vec_len = vec.size();\n    _ffi_vec_Example_to_rust(std::move(vec), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_test(buf_ptr, vec_len);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_len = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret = _ffi_vec_Example_from_rust(ret_len, buf_end2);\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_trait_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include <memory>\n#include <string>\n\nnamespace rust {\n\nstruct Trait;\n\nstruct Example {\n    std::unique_ptr<Trait> box_ptr;\n    std::shared_ptr<Trait> rc_ptr;\n    std::string text;\n    std::vector<std::unique_ptr<Trait>> vec_box;\n    std::vector<std::shared_ptr<Trait>> vec_rc;\n};\n\nstruct Trait {\n    virtual ~Trait() {}\n    virtual int32_t get() = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nstd::vector<Example> test(std::vector<Example> vec);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_trait_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Box_Trait__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Trait>) };\n    _self.get()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Trait__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Trait>) };\n    _self.get()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_drop_Box_Trait(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Trait>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_drop_Rc_Trait(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Trait>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test(buf_ptr: *const u8, vec_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = test(_ffi_vec_Example_from_cpp(vec_len, &mut buf_end));\n    let mut buf2 = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_Example_to_cpp(ret, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_len)\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Box_Trait(*const u8);\n\nimpl Drop for _ffi_rs_Box_Trait {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_cpp_drop_Box_Trait(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Box_Trait(self.0) };\n    }\n}\n\nimpl Trait for _ffi_rs_Box_Trait {\n    fn get(&self) -> i32 {\n        extern \"C\" { fn _ffi_cpp_Box_Trait__get(_: *const u8) -> i32; }\n        unsafe { _ffi_cpp_Box_Trait__get(self.0) }\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Trait(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Trait {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_cpp_drop_Rc_Trait(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Trait(self.0) };\n    }\n}\n\nimpl Trait for _ffi_rs_Rc_Trait {\n    fn get(&self) -> i32 {\n        extern \"C\" { fn _ffi_cpp_Rc_Trait__get(_: *const u8) -> i32; }\n        unsafe { _ffi_cpp_Rc_Trait__get(self.0) }\n    }\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Example_from_cpp(len: usize, end: &mut *const u8) -> Vec<Example> {\n    let mut items = Vec::<Example>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Example {\n            box_ptr: Box::new(_ffi_rs_Box_Trait(_ffi_read::<*const u8>(end))),\n            rc_ptr: std::rc::Rc::new(_ffi_rs_Rc_Trait(_ffi_read::<*const u8>(end))),\n            text: _ffi_string_from_host(_ffi_read::<*const u8>(end), _ffi_read::<usize>(end)),\n            vec_box: _ffi_vec_box_dyn_Trait_from_cpp(_ffi_read::<usize>(end), end),\n            vec_rc: _ffi_vec_rc_dyn_Trait_from_cpp(_ffi_read::<usize>(end), end)\n        });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Example_to_cpp(items: Vec<Example>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item.box_ptr)) as *const u8, buf);\n        _ffi_write(Box::into_raw(Box::new(item.rc_ptr)) as *const u8, buf);\n        let (item_text_ptr, item_text_len, item_text_cap) = _ffi_string_to_host(item.text);\n        _ffi_write(item_text_ptr, buf);\n        _ffi_write(item_text_len, buf);\n        _ffi_write(item_text_cap, buf);\n        _ffi_write(item.vec_box.len(), buf);\n        _ffi_vec_box_dyn_Trait_to_cpp(item.vec_box, buf);\n        _ffi_write(item.vec_rc.len(), buf);\n        _ffi_vec_rc_dyn_Trait_to_cpp(item.vec_rc, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_box_dyn_Trait_from_cpp(len: usize, end: &mut *const u8) -> Vec<Box<dyn Trait>> {\n    let mut items = Vec::<Box<dyn Trait>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Box::new(_ffi_rs_Box_Trait(_ffi_read::<*const u8>(end))));\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_box_dyn_Trait_to_cpp(items: Vec<Box<dyn Trait>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item)) as *const u8, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_rc_dyn_Trait_from_cpp(len: usize, end: &mut *const u8) -> Vec<std::rc::Rc<dyn Trait>> {\n    let mut items = Vec::<std::rc::Rc<dyn Trait>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(std::rc::Rc::new(_ffi_rs_Rc_Trait(_ffi_read::<*const u8>(end))));\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_rc_dyn_Trait_to_cpp(items: Vec<std::rc::Rc<dyn Trait>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item)) as *const u8, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_trait_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_ptr_2_usize {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nextern \"C\" {\n\nvoid _ffi_drop_Box_Trait(const void* ptr);\nvoid _ffi_drop_Rc_Trait(const void* ptr);\nvoid* _ffi_alloc(uintptr_t len);\nint32_t _ffi_Box_Trait__get(const void* _self);\nint32_t _ffi_Rc_Trait__get(const void* _self);\nuintptr_t _ffi_fn_rust_mem_leaked();\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n_ffi_ret_ptr_2_usize _ffi_fn_test(const void* buf_ptr, uintptr_t vec_len);\n\n} // extern \"C\"\n\nnamespace {\n\nstruct _ffi_Box_Trait final : rust::Trait {\n    _ffi_Box_Trait(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Box_Trait() { _ffi_drop_Box_Trait(_self); }\n    virtual int32_t get();\n    const void* _self;\n};\n\nstruct _ffi_Rc_Trait final : rust::Trait {\n    _ffi_Rc_Trait(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Rc_Trait() { _ffi_drop_Rc_Trait(_self); }\n    virtual int32_t get();\n    const void* _self;\n};\n\nconst void* _ffi_string_to_rust(const std::string& str, uintptr_t &len) {\n    len = str.size();\n    return memcpy(_ffi_alloc(len), str.data(), len);\n}\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\nstd::vector<std::unique_ptr<rust::Trait>> _ffi_vec_box_dyn_Trait_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::unique_ptr<rust::Trait>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_ptr = _ffi_read<const void*>(end);\n        auto item = std::unique_ptr<rust::Trait>(new _ffi_Box_Trait(item_ptr));\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nstd::vector<std::shared_ptr<rust::Trait>> _ffi_vec_rc_dyn_Trait_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::shared_ptr<rust::Trait>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_ptr = _ffi_read<const void*>(end);\n        auto item = std::make_shared<_ffi_Rc_Trait>(item_ptr);\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nstd::vector<rust::Example> _ffi_vec_Example_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<rust::Example> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_box_ptr_ptr = _ffi_read<const void*>(end);\n        auto item_box_ptr = std::unique_ptr<rust::Trait>(new _ffi_Box_Trait(item_box_ptr_ptr));\n        auto item_rc_ptr_ptr = _ffi_read<const void*>(end);\n        auto item_rc_ptr = std::make_shared<_ffi_Rc_Trait>(item_rc_ptr_ptr);\n        auto item_text_ptr = _ffi_read<const char*>(end);\n        auto item_text_len = _ffi_read<uintptr_t>(end);\n        auto item_text_cap = _ffi_read<uintptr_t>(end);\n        auto item_text = _ffi_string_from_rust(item_text_ptr, item_text_len, item_text_cap);\n        auto item_vec_box_len = _ffi_read<uintptr_t>(end);\n        auto item_vec_box = _ffi_vec_box_dyn_Trait_from_rust(item_vec_box_len, end);\n        auto item_vec_rc_len = _ffi_read<uintptr_t>(end);\n        auto item_vec_rc = _ffi_vec_rc_dyn_Trait_from_rust(item_vec_rc_len, end);\n        auto item = rust::Example{\n            std::move(item_box_ptr),\n            std::move(item_rc_ptr),\n            std::move(item_text),\n            std::move(item_vec_box),\n            std::move(item_vec_rc)\n        };\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_vec_box_dyn_Trait_to_rust(std::vector<std::unique_ptr<rust::Trait>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        auto item_ptr = item.release();\n        _ffi_write(item_ptr, buf);\n    }\n}\n\nvoid _ffi_vec_rc_dyn_Trait_to_rust(std::vector<std::shared_ptr<rust::Trait>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        auto item_ptr = new std::shared_ptr<rust::Trait>(item);\n        _ffi_write(item_ptr, buf);\n    }\n}\n\nvoid _ffi_vec_Example_to_rust(std::vector<rust::Example>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        auto item_box_ptr_ptr = item.box_ptr.release();\n        _ffi_write(item_box_ptr_ptr, buf);\n        auto item_rc_ptr_ptr = new std::shared_ptr<rust::Trait>(item.rc_ptr);\n        _ffi_write(item_rc_ptr_ptr, buf);\n        uintptr_t item_text_len;\n        const void* item_text_ptr = _ffi_string_to_rust(item.text, item_text_len);\n        _ffi_write(item_text_ptr, buf);\n        _ffi_write(item_text_len, buf);\n        auto item_vec_box_len = item.vec_box.size();\n        _ffi_write(item_vec_box_len, buf);\n        _ffi_vec_box_dyn_Trait_to_rust(std::move(item.vec_box), buf);\n        auto item_vec_rc_len = item.vec_rc.size();\n        _ffi_write(item_vec_rc_len, buf);\n        _ffi_vec_rc_dyn_Trait_to_rust(std::move(item.vec_rc), buf);\n    }\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\n} // namespace\n\nextern \"C\" {\n\nint32_t _ffi_cpp_Box_Trait__get(rust::Trait* _self) {\n    return _self->get();\n}\n\nint32_t _ffi_cpp_Rc_Trait__get(std::shared_ptr<rust::Trait>* _self) {\n    return _self->get()->get();\n}\n\nvoid _ffi_cpp_drop_Box_Trait(rust::Trait* self) {\n    delete self;\n}\n\nvoid _ffi_cpp_drop_Rc_Trait(std::shared_ptr<rust::Trait>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nint32_t _ffi_Box_Trait::get() {\n    return _ffi_Box_Trait__get(_self);\n}\n\nint32_t _ffi_Rc_Trait::get() {\n    return _ffi_Rc_Trait__get(_self);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nstd::vector<rust::Example> rust::test(std::vector<rust::Example> vec) {\n    std::vector<uint8_t> buf;\n    auto vec_len = vec.size();\n    _ffi_vec_Example_to_rust(std::move(vec), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_test(buf_ptr, vec_len);\n    auto buf_ptr2 = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_len = multi_ret._2;\n    auto buf_end2 = (const uint8_t*)buf_ptr2;\n    auto ret = _ffi_vec_Example_from_rust(ret_len, buf_end2);\n    _ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_trait_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include <memory>\n#include <string>\n\nnamespace rust {\n\nstruct Trait;\n\nstruct Example {\n    std::unique_ptr<Trait> box_ptr;\n    std::shared_ptr<Trait> rc_ptr;\n    std::string text;\n    std::vector<std::unique_ptr<Trait>> vec_box;\n    std::vector<std::shared_ptr<Trait>> vec_rc;\n};\n\nstruct Trait {\n    virtual ~Trait() {}\n    virtual int32_t get() = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nstd::vector<Example> test(std::vector<Example> vec);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_demo_trait_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Box_Trait__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Trait>) };\n    _self.get()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Trait__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Trait>) };\n    _self.get()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_drop_Box_Trait(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Trait>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_drop_Rc_Trait(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Trait>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test(buf_ptr: *const u8, vec_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = test(_ffi_vec_Example_from_cpp(vec_len, &mut buf_end));\n    let mut buf2 = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_Example_to_cpp(ret, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_len)\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Box_Trait(*const u8);\n\nimpl Drop for _ffi_rs_Box_Trait {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_cpp_drop_Box_Trait(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Box_Trait(self.0) };\n    }\n}\n\nimpl Trait for _ffi_rs_Box_Trait {\n    fn get(&self) -> i32 {\n        unsafe extern \"C\" { fn _ffi_cpp_Box_Trait__get(_: *const u8) -> i32; }\n        unsafe { _ffi_cpp_Box_Trait__get(self.0) }\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Trait(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Trait {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_cpp_drop_Rc_Trait(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Trait(self.0) };\n    }\n}\n\nimpl Trait for _ffi_rs_Rc_Trait {\n    fn get(&self) -> i32 {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_Trait__get(_: *const u8) -> i32; }\n        unsafe { _ffi_cpp_Rc_Trait__get(self.0) }\n    }\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Example_from_cpp(len: usize, end: &mut *const u8) -> Vec<Example> {\n    let mut items = Vec::<Example>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Example {\n            box_ptr: Box::new(_ffi_rs_Box_Trait(_ffi_read::<*const u8>(end))),\n            rc_ptr: std::rc::Rc::new(_ffi_rs_Rc_Trait(_ffi_read::<*const u8>(end))),\n            text: _ffi_string_from_host(_ffi_read::<*const u8>(end), _ffi_read::<usize>(end)),\n            vec_box: _ffi_vec_box_dyn_Trait_from_cpp(_ffi_read::<usize>(end), end),\n            vec_rc: _ffi_vec_rc_dyn_Trait_from_cpp(_ffi_read::<usize>(end), end)\n        });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Example_to_cpp(items: Vec<Example>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item.box_ptr)) as *const u8, buf);\n        _ffi_write(Box::into_raw(Box::new(item.rc_ptr)) as *const u8, buf);\n        let (item_text_ptr, item_text_len, item_text_cap) = _ffi_string_to_host(item.text);\n        _ffi_write(item_text_ptr, buf);\n        _ffi_write(item_text_len, buf);\n        _ffi_write(item_text_cap, buf);\n        _ffi_write(item.vec_box.len(), buf);\n        _ffi_vec_box_dyn_Trait_to_cpp(item.vec_box, buf);\n        _ffi_write(item.vec_rc.len(), buf);\n        _ffi_vec_rc_dyn_Trait_to_cpp(item.vec_rc, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_box_dyn_Trait_from_cpp(len: usize, end: &mut *const u8) -> Vec<Box<dyn Trait>> {\n    let mut items = Vec::<Box<dyn Trait>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Box::new(_ffi_rs_Box_Trait(_ffi_read::<*const u8>(end))));\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_box_dyn_Trait_to_cpp(items: Vec<Box<dyn Trait>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item)) as *const u8, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_rc_dyn_Trait_from_cpp(len: usize, end: &mut *const u8) -> Vec<std::rc::Rc<dyn Trait>> {\n    let mut items = Vec::<std::rc::Rc<dyn Trait>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(std::rc::Rc::new(_ffi_rs_Rc_Trait(_ffi_read::<*const u8>(end))));\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_rc_dyn_Trait_to_cpp(items: Vec<std::rc::Rc<dyn Trait>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item)) as *const u8, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_basic_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nbool _ffi_fn_add_bool(bool x, bool y);\nfloat _ffi_fn_add_f32(float x, float y);\ndouble _ffi_fn_add_f64(double x, double y);\nint16_t _ffi_fn_add_i16(int16_t x, int16_t y);\nint32_t _ffi_fn_add_i32(int32_t x, int32_t y);\nint64_t _ffi_fn_add_i64(int64_t x, int64_t y);\nint8_t _ffi_fn_add_i8(int8_t x, int8_t y);\nintptr_t _ffi_fn_add_isize(intptr_t x, intptr_t y);\nuint16_t _ffi_fn_add_u16(uint16_t x, uint16_t y);\nuint32_t _ffi_fn_add_u32(uint32_t x, uint32_t y);\nuint64_t _ffi_fn_add_u64(uint64_t x, uint64_t y);\nuint8_t _ffi_fn_add_u8(uint8_t x, uint8_t y);\nuintptr_t _ffi_fn_add_usize(uintptr_t x, uintptr_t y);\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nbool rust::add_bool(bool x, bool y) {\n    return _ffi_fn_add_bool(x, y);\n}\n\nfloat rust::add_f32(float x, float y) {\n    return _ffi_fn_add_f32(x, y);\n}\n\ndouble rust::add_f64(double x, double y) {\n    return _ffi_fn_add_f64(x, y);\n}\n\nint16_t rust::add_i16(int16_t x, int16_t y) {\n    return _ffi_fn_add_i16(x, y);\n}\n\nint32_t rust::add_i32(int32_t x, int32_t y) {\n    return _ffi_fn_add_i32(x, y);\n}\n\nint64_t rust::add_i64(int64_t x, int64_t y) {\n    return _ffi_fn_add_i64(x, y);\n}\n\nint8_t rust::add_i8(int8_t x, int8_t y) {\n    return _ffi_fn_add_i8(x, y);\n}\n\nintptr_t rust::add_isize(intptr_t x, intptr_t y) {\n    return _ffi_fn_add_isize(x, y);\n}\n\nuint16_t rust::add_u16(uint16_t x, uint16_t y) {\n    return _ffi_fn_add_u16(x, y);\n}\n\nuint32_t rust::add_u32(uint32_t x, uint32_t y) {\n    return _ffi_fn_add_u32(x, y);\n}\n\nuint64_t rust::add_u64(uint64_t x, uint64_t y) {\n    return _ffi_fn_add_u64(x, y);\n}\n\nuint8_t rust::add_u8(uint8_t x, uint8_t y) {\n    return _ffi_fn_add_u8(x, y);\n}\n\nuintptr_t rust::add_usize(uintptr_t x, uintptr_t y) {\n    return _ffi_fn_add_usize(x, y);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_basic_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nbool add_bool(bool x, bool y);\n\nuint8_t add_u8(uint8_t x, uint8_t y);\n\nuint16_t add_u16(uint16_t x, uint16_t y);\n\nuint32_t add_u32(uint32_t x, uint32_t y);\n\nuintptr_t add_usize(uintptr_t x, uintptr_t y);\n\nuint64_t add_u64(uint64_t x, uint64_t y);\n\nint8_t add_i8(int8_t x, int8_t y);\n\nint16_t add_i16(int16_t x, int16_t y);\n\nint32_t add_i32(int32_t x, int32_t y);\n\nintptr_t add_isize(intptr_t x, intptr_t y);\n\nint64_t add_i64(int64_t x, int64_t y);\n\nfloat add_f32(float x, float y);\n\ndouble add_f64(double x, double y);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_basic_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_bool(x: bool, y: bool) -> bool {\n    add_bool(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_f32(x: f32, y: f32) -> f32 {\n    add_f32(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_f64(x: f64, y: f64) -> f64 {\n    add_f64(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_i16(x: i16, y: i16) -> i16 {\n    add_i16(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_i32(x: i32, y: i32) -> i32 {\n    add_i32(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_i64(x: i64, y: i64) -> i64 {\n    add_i64(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_i8(x: i8, y: i8) -> i8 {\n    add_i8(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_isize(x: isize, y: isize) -> isize {\n    add_isize(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_u16(x: u16, y: u16) -> u16 {\n    add_u16(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_u32(x: u32, y: u32) -> u32 {\n    add_u32(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_u64(x: u64, y: u64) -> u64 {\n    add_u64(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_u8(x: u8, y: u8) -> u8 {\n    add_u8(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_usize(x: usize, y: usize) -> usize {\n    add_usize(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_basic_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nbool _ffi_fn_add_bool(bool x, bool y);\nfloat _ffi_fn_add_f32(float x, float y);\ndouble _ffi_fn_add_f64(double x, double y);\nint16_t _ffi_fn_add_i16(int16_t x, int16_t y);\nint32_t _ffi_fn_add_i32(int32_t x, int32_t y);\nint64_t _ffi_fn_add_i64(int64_t x, int64_t y);\nint8_t _ffi_fn_add_i8(int8_t x, int8_t y);\nintptr_t _ffi_fn_add_isize(intptr_t x, intptr_t y);\nuint16_t _ffi_fn_add_u16(uint16_t x, uint16_t y);\nuint32_t _ffi_fn_add_u32(uint32_t x, uint32_t y);\nuint64_t _ffi_fn_add_u64(uint64_t x, uint64_t y);\nuint8_t _ffi_fn_add_u8(uint8_t x, uint8_t y);\nuintptr_t _ffi_fn_add_usize(uintptr_t x, uintptr_t y);\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nbool rust::add_bool(bool x, bool y) {\n    return _ffi_fn_add_bool(x, y);\n}\n\nfloat rust::add_f32(float x, float y) {\n    return _ffi_fn_add_f32(x, y);\n}\n\ndouble rust::add_f64(double x, double y) {\n    return _ffi_fn_add_f64(x, y);\n}\n\nint16_t rust::add_i16(int16_t x, int16_t y) {\n    return _ffi_fn_add_i16(x, y);\n}\n\nint32_t rust::add_i32(int32_t x, int32_t y) {\n    return _ffi_fn_add_i32(x, y);\n}\n\nint64_t rust::add_i64(int64_t x, int64_t y) {\n    return _ffi_fn_add_i64(x, y);\n}\n\nint8_t rust::add_i8(int8_t x, int8_t y) {\n    return _ffi_fn_add_i8(x, y);\n}\n\nintptr_t rust::add_isize(intptr_t x, intptr_t y) {\n    return _ffi_fn_add_isize(x, y);\n}\n\nuint16_t rust::add_u16(uint16_t x, uint16_t y) {\n    return _ffi_fn_add_u16(x, y);\n}\n\nuint32_t rust::add_u32(uint32_t x, uint32_t y) {\n    return _ffi_fn_add_u32(x, y);\n}\n\nuint64_t rust::add_u64(uint64_t x, uint64_t y) {\n    return _ffi_fn_add_u64(x, y);\n}\n\nuint8_t rust::add_u8(uint8_t x, uint8_t y) {\n    return _ffi_fn_add_u8(x, y);\n}\n\nuintptr_t rust::add_usize(uintptr_t x, uintptr_t y) {\n    return _ffi_fn_add_usize(x, y);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_basic_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nbool add_bool(bool x, bool y);\n\nuint8_t add_u8(uint8_t x, uint8_t y);\n\nuint16_t add_u16(uint16_t x, uint16_t y);\n\nuint32_t add_u32(uint32_t x, uint32_t y);\n\nuintptr_t add_usize(uintptr_t x, uintptr_t y);\n\nuint64_t add_u64(uint64_t x, uint64_t y);\n\nint8_t add_i8(int8_t x, int8_t y);\n\nint16_t add_i16(int16_t x, int16_t y);\n\nint32_t add_i32(int32_t x, int32_t y);\n\nintptr_t add_isize(intptr_t x, intptr_t y);\n\nint64_t add_i64(int64_t x, int64_t y);\n\nfloat add_f32(float x, float y);\n\ndouble add_f64(double x, double y);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_basic_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_bool(x: bool, y: bool) -> bool {\n    add_bool(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_f32(x: f32, y: f32) -> f32 {\n    add_f32(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_f64(x: f64, y: f64) -> f64 {\n    add_f64(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_i16(x: i16, y: i16) -> i16 {\n    add_i16(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_i32(x: i32, y: i32) -> i32 {\n    add_i32(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_i64(x: i64, y: i64) -> i64 {\n    add_i64(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_i8(x: i8, y: i8) -> i8 {\n    add_i8(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_isize(x: isize, y: isize) -> isize {\n    add_isize(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_u16(x: u16, y: u16) -> u16 {\n    add_u16(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_u32(x: u32, y: u32) -> u32 {\n    add_u32(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_u64(x: u64, y: u64) -> u64 {\n    add_u64(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_u8(x: u8, y: u8) -> u8 {\n    add_u8(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_usize(x: usize, y: usize) -> usize {\n    add_usize(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_basic_void_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nvoid _ffi_fn_add_empty_tuple(int32_t x, int32_t y);\nvoid _ffi_fn_add_void(int32_t x, int32_t y);\nint32_t _ffi_fn_get_result();\nuintptr_t _ffi_fn_rust_mem_leaked();\nvoid _ffi_fn_wild_arg(int32_t _1, int32_t _3);\n\n} // extern \"C\"\n\nstd::tuple<> rust::add_empty_tuple(int32_t x, int32_t y) {\n    _ffi_fn_add_empty_tuple(x, y);\n    return std::tuple<>();\n}\n\nvoid rust::add_void(int32_t x, int32_t y) {\n    _ffi_fn_add_void(x, y);\n}\n\nint32_t rust::get_result() {\n    return _ffi_fn_get_result();\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nstd::tuple<> rust::wild_arg(int32_t _1, std::tuple<> _2, int32_t _3) {\n    (void)_2;\n    _ffi_fn_wild_arg(_1, _3);\n    return std::tuple<>();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_basic_void_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <tuple>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nvoid add_void(int32_t x, int32_t y);\n\nstd::tuple<> add_empty_tuple(int32_t x, int32_t y);\n\nint32_t get_result();\n\nstd::tuple<> wild_arg(int32_t _1, std::tuple<> _2, int32_t _3);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_basic_void_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_empty_tuple(x: i32, y: i32) {\n    _ = add_empty_tuple(x, y);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_void(x: i32, y: i32) {\n    add_void(x, y);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_result() -> i32 {\n    get_result()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_wild_arg(_1: i32, _3: i32) {\n    _ = wild_arg(_1, (), _3);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_basic_void_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nvoid _ffi_fn_add_empty_tuple(int32_t x, int32_t y);\nvoid _ffi_fn_add_void(int32_t x, int32_t y);\nint32_t _ffi_fn_get_result();\nuintptr_t _ffi_fn_rust_mem_leaked();\nvoid _ffi_fn_wild_arg(int32_t _1, int32_t _3);\n\n} // extern \"C\"\n\nstd::tuple<> rust::add_empty_tuple(int32_t x, int32_t y) {\n    _ffi_fn_add_empty_tuple(x, y);\n    return std::tuple<>();\n}\n\nvoid rust::add_void(int32_t x, int32_t y) {\n    _ffi_fn_add_void(x, y);\n}\n\nint32_t rust::get_result() {\n    return _ffi_fn_get_result();\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nstd::tuple<> rust::wild_arg(int32_t _1, std::tuple<> _2, int32_t _3) {\n    (void)_2;\n    _ffi_fn_wild_arg(_1, _3);\n    return std::tuple<>();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_basic_void_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <tuple>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nvoid add_void(int32_t x, int32_t y);\n\nstd::tuple<> add_empty_tuple(int32_t x, int32_t y);\n\nint32_t get_result();\n\nstd::tuple<> wild_arg(int32_t _1, std::tuple<> _2, int32_t _3);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_basic_void_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_empty_tuple(x: i32, y: i32) {\n    _ = add_empty_tuple(x, y);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_void(x: i32, y: i32) {\n    add_void(x, y);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_result() -> i32 {\n    get_result()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_wild_arg(_1: i32, _3: i32) {\n    _ = wild_arg(_1, (), _3);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_box_in_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n#include <vector>\n\nextern \"C\" {\n\nint32_t _ffi_fn_check_nested(const void* buf_ptr);\nvoid* _ffi_alloc(uintptr_t len);\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_sum_tree(int32_t tree_value, const void* buf_ptr, bool has_tree_left, bool has_tree_right);\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_box_i32_to_rust(int32_t val, std::vector<uint8_t>& buf) {\n    _ffi_write(val, buf);\n}\n\nvoid _ffi_box_box_i32_to_rust(std::unique_ptr<int32_t> val, std::vector<uint8_t>& buf) {\n    _ffi_box_i32_to_rust(std::move(*val), buf);\n}\n\nvoid _ffi_box_box_box_i32_to_rust(std::unique_ptr<std::unique_ptr<int32_t>> val, std::vector<uint8_t>& buf) {\n    _ffi_box_box_i32_to_rust(std::move(*val), buf);\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\nvoid _ffi_box_Tree_to_rust(rust::Tree val, std::vector<uint8_t>& buf);\n\nvoid _ffi_box_Tree_to_rust(rust::Tree val, std::vector<uint8_t>& buf) {\n    _ffi_write(val.value, buf);\n    auto has_val_left = val.left.has_value();\n    _ffi_write(has_val_left, buf);\n    if (has_val_left) {\n        _ffi_box_Tree_to_rust(std::move(*val.left.value()), buf);\n    }\n    auto has_val_right = val.right.has_value();\n    _ffi_write(has_val_right, buf);\n    if (has_val_right) {\n        _ffi_box_Tree_to_rust(std::move(*val.right.value()), buf);\n    }\n}\n\n} // namespace\n\nbool rust::Tree::operator == (const rust::Tree& t) const {\n    return (\n        value == t.value &&\n        (left && t.left ? **left == **t.left : !left && !t.left) &&\n        (right && t.right ? **right == **t.right : !right && !t.right)\n    );\n}\n\nint32_t rust::check_nested(std::unique_ptr<std::unique_ptr<std::unique_ptr<int32_t>>> x) {\n    std::vector<uint8_t> buf;\n    _ffi_box_box_box_i32_to_rust(std::move(*x), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_check_nested(buf_ptr);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::sum_tree(rust::Tree tree) {\n    std::vector<uint8_t> buf;\n    auto has_tree_left = tree.left.has_value();\n    if (has_tree_left) {\n        _ffi_box_Tree_to_rust(std::move(*tree.left.value()), buf);\n    }\n    auto has_tree_right = tree.right.has_value();\n    if (has_tree_right) {\n        _ffi_box_Tree_to_rust(std::move(*tree.right.value()), buf);\n    }\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_tree(tree.value, buf_ptr, has_tree_left, has_tree_right);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_box_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n#include <optional>\n\nnamespace rust {\n\nstruct Tree;\n\nstruct Tree {\n    int32_t value = 0;\n    std::optional<std::unique_ptr<Tree>> left;\n    std::optional<std::unique_ptr<Tree>> right;\n    bool operator == (const Tree&) const;\n    bool operator != (const Tree& t) const { return !(*this == t); }\n};\n\nuintptr_t rust_mem_leaked();\n\nint32_t sum_tree(Tree tree);\n\nint32_t check_nested(std::unique_ptr<std::unique_ptr<std::unique_ptr<int32_t>>> x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_box_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Tree_from_cpp(end: &mut *const u8) -> Box<Tree> {\n    Box::new(Tree {\n        value: _ffi_read::<i32>(end),\n        left: _ffi_read::<bool>(end).then(|| _ffi_box_Tree_from_cpp(end)),\n        right: _ffi_read::<bool>(end).then(|| _ffi_box_Tree_from_cpp(end))\n    })\n}\n\nfn _ffi_box_box_box_i32_from_cpp(end: &mut *const u8) -> Box<Box<Box<i32>>> {\n    Box::new(_ffi_box_box_i32_from_cpp(end))\n}\n\nfn _ffi_box_box_i32_from_cpp(end: &mut *const u8) -> Box<Box<i32>> {\n    Box::new(_ffi_box_i32_from_cpp(end))\n}\n\nfn _ffi_box_i32_from_cpp(end: &mut *const u8) -> Box<i32> {\n    Box::new(_ffi_read::<i32>(end))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_nested(buf_ptr: *const u8) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = check_nested(_ffi_box_box_box_i32_from_cpp(&mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_tree(tree_value: i32, buf_ptr: *const u8, has_tree_left: bool, has_tree_right: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_tree(Tree {\n        value: tree_value,\n        left: has_tree_left.then(|| _ffi_box_Tree_from_cpp(&mut buf_end)),\n        right: has_tree_right.then(|| _ffi_box_Tree_from_cpp(&mut buf_end))\n    });\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_box_in_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n#include <vector>\n\nextern \"C\" {\n\nint32_t _ffi_fn_check_nested(const void* buf_ptr);\nvoid* _ffi_alloc(uintptr_t len);\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_sum_tree(int32_t tree_value, const void* buf_ptr, bool has_tree_left, bool has_tree_right);\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_box_i32_to_rust(int32_t val, std::vector<uint8_t>& buf) {\n    _ffi_write(val, buf);\n}\n\nvoid _ffi_box_box_i32_to_rust(std::unique_ptr<int32_t> val, std::vector<uint8_t>& buf) {\n    _ffi_box_i32_to_rust(std::move(*val), buf);\n}\n\nvoid _ffi_box_box_box_i32_to_rust(std::unique_ptr<std::unique_ptr<int32_t>> val, std::vector<uint8_t>& buf) {\n    _ffi_box_box_i32_to_rust(std::move(*val), buf);\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\nvoid _ffi_box_Tree_to_rust(rust::Tree val, std::vector<uint8_t>& buf);\n\nvoid _ffi_box_Tree_to_rust(rust::Tree val, std::vector<uint8_t>& buf) {\n    _ffi_write(val.value, buf);\n    auto has_val_left = val.left.has_value();\n    _ffi_write(has_val_left, buf);\n    if (has_val_left) {\n        _ffi_box_Tree_to_rust(std::move(*val.left.value()), buf);\n    }\n    auto has_val_right = val.right.has_value();\n    _ffi_write(has_val_right, buf);\n    if (has_val_right) {\n        _ffi_box_Tree_to_rust(std::move(*val.right.value()), buf);\n    }\n}\n\n} // namespace\n\nbool rust::Tree::operator == (const rust::Tree& t) const {\n    return (\n        value == t.value &&\n        (left && t.left ? **left == **t.left : !left && !t.left) &&\n        (right && t.right ? **right == **t.right : !right && !t.right)\n    );\n}\n\nint32_t rust::check_nested(std::unique_ptr<std::unique_ptr<std::unique_ptr<int32_t>>> x) {\n    std::vector<uint8_t> buf;\n    _ffi_box_box_box_i32_to_rust(std::move(*x), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_check_nested(buf_ptr);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::sum_tree(rust::Tree tree) {\n    std::vector<uint8_t> buf;\n    auto has_tree_left = tree.left.has_value();\n    if (has_tree_left) {\n        _ffi_box_Tree_to_rust(std::move(*tree.left.value()), buf);\n    }\n    auto has_tree_right = tree.right.has_value();\n    if (has_tree_right) {\n        _ffi_box_Tree_to_rust(std::move(*tree.right.value()), buf);\n    }\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_tree(tree.value, buf_ptr, has_tree_left, has_tree_right);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_box_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n#include <optional>\n\nnamespace rust {\n\nstruct Tree;\n\nstruct Tree {\n    int32_t value = 0;\n    std::optional<std::unique_ptr<Tree>> left;\n    std::optional<std::unique_ptr<Tree>> right;\n    bool operator == (const Tree&) const;\n    bool operator != (const Tree& t) const { return !(*this == t); }\n};\n\nuintptr_t rust_mem_leaked();\n\nint32_t sum_tree(Tree tree);\n\nint32_t check_nested(std::unique_ptr<std::unique_ptr<std::unique_ptr<int32_t>>> x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_box_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Tree_from_cpp(end: &mut *const u8) -> Box<Tree> {\n    Box::new(Tree {\n        value: _ffi_read::<i32>(end),\n        left: _ffi_read::<bool>(end).then(|| _ffi_box_Tree_from_cpp(end)),\n        right: _ffi_read::<bool>(end).then(|| _ffi_box_Tree_from_cpp(end))\n    })\n}\n\nfn _ffi_box_box_box_i32_from_cpp(end: &mut *const u8) -> Box<Box<Box<i32>>> {\n    Box::new(_ffi_box_box_i32_from_cpp(end))\n}\n\nfn _ffi_box_box_i32_from_cpp(end: &mut *const u8) -> Box<Box<i32>> {\n    Box::new(_ffi_box_i32_from_cpp(end))\n}\n\nfn _ffi_box_i32_from_cpp(end: &mut *const u8) -> Box<i32> {\n    Box::new(_ffi_read::<i32>(end))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_nested(buf_ptr: *const u8) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = check_nested(_ffi_box_box_box_i32_from_cpp(&mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_tree(tree_value: i32, buf_ptr: *const u8, has_tree_left: bool, has_tree_right: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_tree(Tree {\n        value: tree_value,\n        left: has_tree_left.then(|| _ffi_box_Tree_from_cpp(&mut buf_end)),\n        right: has_tree_right.then(|| _ffi_box_Tree_from_cpp(&mut buf_end))\n    });\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_box_out_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_i32_ptr_usize_2_bool {\n    int32_t _0;\n    const void* _1;\n    uintptr_t _2;\n    bool _3;\n    bool _4;\n};\n\nstruct _ffi_ret_ptr_usize {\n    const void* _0;\n    uintptr_t _1;\n};\n\nextern \"C\" {\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n_ffi_ret_ptr_usize _ffi_fn_check_nested(int32_t x);\n_ffi_ret_i32_ptr_usize_2_bool _ffi_fn_get_tree();\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nstd::unique_ptr<int32_t> _ffi_box_i32_from_rust(const uint8_t*& end) {\n    auto val = _ffi_read<int32_t>(end);\n    return std::make_unique<int32_t>(val);\n}\n\nstd::unique_ptr<std::unique_ptr<int32_t>> _ffi_box_box_i32_from_rust(const uint8_t*& end) {\n    auto val = _ffi_box_i32_from_rust(end);\n    return std::make_unique<std::unique_ptr<int32_t>>(std::move(val));\n}\n\nstd::unique_ptr<std::unique_ptr<std::unique_ptr<int32_t>>> _ffi_box_box_box_i32_from_rust(const uint8_t*& end) {\n    auto val = _ffi_box_box_i32_from_rust(end);\n    return std::make_unique<std::unique_ptr<std::unique_ptr<int32_t>>>(std::move(val));\n}\n\nstd::unique_ptr<rust::Tree> _ffi_box_Tree_from_rust(const uint8_t*& end);\n\nstd::unique_ptr<rust::Tree> _ffi_box_Tree_from_rust(const uint8_t*& end) {\n    auto val_value = _ffi_read<int32_t>(end);\n    auto val_left = _ffi_read<bool>(end) ? std::make_optional(_ffi_box_Tree_from_rust(end)) : std::nullopt;\n    auto val_right = _ffi_read<bool>(end) ? std::make_optional(_ffi_box_Tree_from_rust(end)) : std::nullopt;\n    auto val = rust::Tree{val_value, std::move(val_left), std::move(val_right)};\n    return std::make_unique<rust::Tree>(std::move(val));\n}\n\n} // namespace\n\nbool rust::Nested::operator == (const rust::Nested& n) const {\n    return ***_0 == ***n._0;\n}\n\nbool rust::Tree::operator == (const rust::Tree& t) const {\n    return (\n        value == t.value &&\n        (left && t.left ? **left == **t.left : !left && !t.left) &&\n        (right && t.right ? **right == **t.right : !right && !t.right)\n    );\n}\n\nrust::Nested rust::check_nested(int32_t x) {\n    auto multi_ret = _ffi_fn_check_nested(x);\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret_0 = _ffi_box_box_box_i32_from_rust(buf_end);\n    auto ret = rust::Nested{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nrust::Tree rust::get_tree() {\n    auto multi_ret = _ffi_fn_get_tree();\n    auto ret_value = multi_ret._0;\n    auto buf_ptr = multi_ret._1;\n    auto buf_cap = multi_ret._2;\n    auto has_ret_left = multi_ret._3;\n    auto has_ret_right = multi_ret._4;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret_left = has_ret_left ? std::make_optional(_ffi_box_Tree_from_rust(buf_end)) : std::nullopt;\n    auto ret_right = has_ret_right ? std::make_optional(_ffi_box_Tree_from_rust(buf_end)) : std::nullopt;\n    auto ret = rust::Tree{ret_value, std::move(ret_left), std::move(ret_right)};\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_box_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <memory>\n#include <optional>\n\nnamespace rust {\n\nstruct Tree;\n\nstruct Nested {\n    std::unique_ptr<std::unique_ptr<std::unique_ptr<int32_t>>> _0;\n    bool operator == (const Nested&) const;\n    bool operator != (const Nested& n) const { return !(*this == n); }\n};\n\nstruct Tree {\n    int32_t value = 0;\n    std::optional<std::unique_ptr<Tree>> left;\n    std::optional<std::unique_ptr<Tree>> right;\n    bool operator == (const Tree&) const;\n    bool operator != (const Tree& t) const { return !(*this == t); }\n};\n\nuintptr_t rust_mem_leaked();\n\nTree get_tree();\n\nNested check_nested(int32_t x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_box_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Tree_to_cpp(val: Tree, buf: &mut Vec<u8>) {\n    _ffi_write(val.value, buf);\n    _ffi_write(val.left.is_some(), buf);\n    if let Some(val_left_val) = val.left {\n        _ffi_box_Tree_to_cpp(*val_left_val, buf);\n    }\n    _ffi_write(val.right.is_some(), buf);\n    if let Some(val_right_val) = val.right {\n        _ffi_box_Tree_to_cpp(*val_right_val, buf);\n    }\n}\n\nfn _ffi_box_box_box_i32_to_cpp(val: Box<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_box_box_i32_to_cpp(*val, buf);\n}\n\nfn _ffi_box_box_i32_to_cpp(val: Box<i32>, buf: &mut Vec<u8>) {\n    _ffi_box_i32_to_cpp(*val, buf);\n}\n\nfn _ffi_box_i32_to_cpp(val: i32, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_nested(x: i32) -> _ffi_ret_ptr_usize {\n    let ret = check_nested(x);\n    let ret_0 = ret.0;\n    let mut buf = Vec::<u8>::new();\n    _ffi_box_box_box_i32_to_cpp(*ret_0, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize(buf_ptr, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_tree() -> _ffi_ret_i32_ptr_usize_2_bool {\n    let ret = get_tree();\n    let ret_value = ret.value;\n    let ret_left = ret.left;\n    let mut buf = Vec::<u8>::new();\n    let has_ret_left = ret_left.is_some();\n    if let Some(ret_left_val) = ret_left {\n        _ffi_box_Tree_to_cpp(*ret_left_val, &mut buf);\n    }\n    let ret_right = ret.right;\n    let has_ret_right = ret_right.is_some();\n    if let Some(ret_right_val) = ret_right {\n        _ffi_box_Tree_to_cpp(*ret_right_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_i32_ptr_usize_2_bool(ret_value, buf_ptr, buf_cap, has_ret_left, has_ret_right)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr_usize_2_bool(i32, *const u8, usize, bool, bool);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_box_out_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_i32_ptr_usize_2_bool {\n    int32_t _0;\n    const void* _1;\n    uintptr_t _2;\n    bool _3;\n    bool _4;\n};\n\nstruct _ffi_ret_ptr_usize {\n    const void* _0;\n    uintptr_t _1;\n};\n\nextern \"C\" {\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n_ffi_ret_ptr_usize _ffi_fn_check_nested(int32_t x);\n_ffi_ret_i32_ptr_usize_2_bool _ffi_fn_get_tree();\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nstd::unique_ptr<int32_t> _ffi_box_i32_from_rust(const uint8_t*& end) {\n    auto val = _ffi_read<int32_t>(end);\n    return std::make_unique<int32_t>(val);\n}\n\nstd::unique_ptr<std::unique_ptr<int32_t>> _ffi_box_box_i32_from_rust(const uint8_t*& end) {\n    auto val = _ffi_box_i32_from_rust(end);\n    return std::make_unique<std::unique_ptr<int32_t>>(std::move(val));\n}\n\nstd::unique_ptr<std::unique_ptr<std::unique_ptr<int32_t>>> _ffi_box_box_box_i32_from_rust(const uint8_t*& end) {\n    auto val = _ffi_box_box_i32_from_rust(end);\n    return std::make_unique<std::unique_ptr<std::unique_ptr<int32_t>>>(std::move(val));\n}\n\nstd::unique_ptr<rust::Tree> _ffi_box_Tree_from_rust(const uint8_t*& end);\n\nstd::unique_ptr<rust::Tree> _ffi_box_Tree_from_rust(const uint8_t*& end) {\n    auto val_value = _ffi_read<int32_t>(end);\n    auto val_left = _ffi_read<bool>(end) ? std::make_optional(_ffi_box_Tree_from_rust(end)) : std::nullopt;\n    auto val_right = _ffi_read<bool>(end) ? std::make_optional(_ffi_box_Tree_from_rust(end)) : std::nullopt;\n    auto val = rust::Tree{val_value, std::move(val_left), std::move(val_right)};\n    return std::make_unique<rust::Tree>(std::move(val));\n}\n\n} // namespace\n\nbool rust::Nested::operator == (const rust::Nested& n) const {\n    return ***_0 == ***n._0;\n}\n\nbool rust::Tree::operator == (const rust::Tree& t) const {\n    return (\n        value == t.value &&\n        (left && t.left ? **left == **t.left : !left && !t.left) &&\n        (right && t.right ? **right == **t.right : !right && !t.right)\n    );\n}\n\nrust::Nested rust::check_nested(int32_t x) {\n    auto multi_ret = _ffi_fn_check_nested(x);\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret_0 = _ffi_box_box_box_i32_from_rust(buf_end);\n    auto ret = rust::Nested{std::move(ret_0)};\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nrust::Tree rust::get_tree() {\n    auto multi_ret = _ffi_fn_get_tree();\n    auto ret_value = multi_ret._0;\n    auto buf_ptr = multi_ret._1;\n    auto buf_cap = multi_ret._2;\n    auto has_ret_left = multi_ret._3;\n    auto has_ret_right = multi_ret._4;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret_left = has_ret_left ? std::make_optional(_ffi_box_Tree_from_rust(buf_end)) : std::nullopt;\n    auto ret_right = has_ret_right ? std::make_optional(_ffi_box_Tree_from_rust(buf_end)) : std::nullopt;\n    auto ret = rust::Tree{ret_value, std::move(ret_left), std::move(ret_right)};\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_box_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <memory>\n#include <optional>\n\nnamespace rust {\n\nstruct Tree;\n\nstruct Nested {\n    std::unique_ptr<std::unique_ptr<std::unique_ptr<int32_t>>> _0;\n    bool operator == (const Nested&) const;\n    bool operator != (const Nested& n) const { return !(*this == n); }\n};\n\nstruct Tree {\n    int32_t value = 0;\n    std::optional<std::unique_ptr<Tree>> left;\n    std::optional<std::unique_ptr<Tree>> right;\n    bool operator == (const Tree&) const;\n    bool operator != (const Tree& t) const { return !(*this == t); }\n};\n\nuintptr_t rust_mem_leaked();\n\nTree get_tree();\n\nNested check_nested(int32_t x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_box_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Tree_to_cpp(val: Tree, buf: &mut Vec<u8>) {\n    _ffi_write(val.value, buf);\n    _ffi_write(val.left.is_some(), buf);\n    if let Some(val_left_val) = val.left {\n        _ffi_box_Tree_to_cpp(*val_left_val, buf);\n    }\n    _ffi_write(val.right.is_some(), buf);\n    if let Some(val_right_val) = val.right {\n        _ffi_box_Tree_to_cpp(*val_right_val, buf);\n    }\n}\n\nfn _ffi_box_box_box_i32_to_cpp(val: Box<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_box_box_i32_to_cpp(*val, buf);\n}\n\nfn _ffi_box_box_i32_to_cpp(val: Box<i32>, buf: &mut Vec<u8>) {\n    _ffi_box_i32_to_cpp(*val, buf);\n}\n\nfn _ffi_box_i32_to_cpp(val: i32, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_nested(x: i32) -> _ffi_ret_ptr_usize {\n    let ret = check_nested(x);\n    let ret_0 = ret.0;\n    let mut buf = Vec::<u8>::new();\n    _ffi_box_box_box_i32_to_cpp(*ret_0, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize(buf_ptr, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_tree() -> _ffi_ret_i32_ptr_usize_2_bool {\n    let ret = get_tree();\n    let ret_value = ret.value;\n    let ret_left = ret.left;\n    let mut buf = Vec::<u8>::new();\n    let has_ret_left = ret_left.is_some();\n    if let Some(ret_left_val) = ret_left {\n        _ffi_box_Tree_to_cpp(*ret_left_val, &mut buf);\n    }\n    let ret_right = ret.right;\n    let has_ret_right = ret_right.is_some();\n    if let Some(ret_right_val) = ret_right {\n        _ffi_box_Tree_to_cpp(*ret_right_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_i32_ptr_usize_2_bool(ret_value, buf_ptr, buf_cap, has_ret_left, has_ret_right)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr_usize_2_bool(i32, *const u8, usize, bool, bool);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_combo_in_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_ptr_2_usize {\n    const char* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nextern \"C\" {\n\n_ffi_ret_ptr_2_usize _ffi_fn_check_combo(int32_t foo_x_0_x, const void* buf_ptr, uintptr_t foo_x_0_y_len, uintptr_t foo_x_1_len, uintptr_t foo_y_len);\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\nvoid* _ffi_alloc(uintptr_t len);\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\nvoid _ffi_vec_Bar_to_rust(std::vector<rust::Bar>&& items, std::vector<uint8_t>& buf);\n\nvoid _ffi_vec_Foo_to_rust(std::vector<rust::Foo>&& items, std::vector<uint8_t>& buf);\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_vec__i32_f32_bool_to_rust(std::vector<std::tuple<std::tuple<>, std::tuple<int32_t>, std::tuple<float, bool>>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        (void)std::get<0>(item);\n        _ffi_write(std::get<0>(std::get<1>(item)), buf);\n        _ffi_write(std::get<0>(std::get<2>(item)), buf);\n        _ffi_write(std::get<1>(std::get<2>(item)), buf);\n    }\n}\n\nvoid _ffi_vec_Foo_to_rust(std::vector<rust::Foo>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(std::get<0>(item.x).x, buf);\n        auto item_x_0_y_len = std::get<0>(item.x).y.size();\n        _ffi_write(item_x_0_y_len, buf);\n        _ffi_vec_Foo_to_rust(std::move(std::get<0>(item.x).y), buf);\n        auto item_x_1_len = std::get<1>(item.x).size();\n        _ffi_write(item_x_1_len, buf);\n        _ffi_vec_Bar_to_rust(std::move(std::get<1>(item.x)), buf);\n        auto item_y_len = item.y.size();\n        _ffi_write(item_y_len, buf);\n        _ffi_vec__i32_f32_bool_to_rust(std::move(item.y), buf);\n    }\n}\n\nvoid _ffi_vec_Bar_to_rust(std::vector<rust::Bar>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item.x, buf);\n        auto item_y_len = item.y.size();\n        _ffi_write(item_y_len, buf);\n        _ffi_vec_Foo_to_rust(std::move(item.y), buf);\n    }\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\n} // namespace\n\nstd::string rust::check_combo(rust::Foo foo) {\n    std::vector<uint8_t> buf;\n    auto foo_x_0_y_len = std::get<0>(foo.x).y.size();\n    _ffi_vec_Foo_to_rust(std::move(std::get<0>(foo.x).y), buf);\n    auto foo_x_1_len = std::get<1>(foo.x).size();\n    _ffi_vec_Bar_to_rust(std::move(std::get<1>(foo.x)), buf);\n    auto foo_y_len = foo.y.size();\n    _ffi_vec__i32_f32_bool_to_rust(std::move(foo.y), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_check_combo(std::get<0>(foo.x).x, buf_ptr, foo_x_0_y_len, foo_x_1_len, foo_y_len);\n    auto ret_ptr = multi_ret._0;\n    auto ret_len = multi_ret._1;\n    auto ret_cap = multi_ret._2;\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_combo_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <string>\n#include <vector>\n#include <tuple>\n\nnamespace rust {\n\nstruct Foo;\nstruct Bar;\n\nstruct Bar {\n    int32_t x = 0;\n    std::vector<Foo> y;\n};\n\nstruct Foo {\n    std::tuple<Bar, std::vector<Bar>> x;\n    std::vector<std::tuple<std::tuple<>, std::tuple<int32_t>, std::tuple<float, bool>>> y;\n};\n\nuintptr_t rust_mem_leaked();\n\nstd::string check_combo(Foo foo);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_combo_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_combo(foo_x_0_x: i32, buf_ptr: *const u8, foo_x_0_y_len: usize, foo_x_1_len: usize, foo_y_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(check_combo(Foo {\n        x: (\n            Bar { x: foo_x_0_x, y: _ffi_vec_Foo_from_cpp(foo_x_0_y_len, &mut buf_end) },\n            _ffi_vec_Bar_from_cpp(foo_x_1_len, &mut buf_end)\n        ),\n        y: _ffi_vec__i32_f32_bool_from_cpp(foo_y_len, &mut buf_end)\n    }));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Bar_from_cpp(len: usize, end: &mut *const u8) -> Vec<Bar> {\n    let mut items = Vec::<Bar>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Bar { x: _ffi_read::<i32>(end), y: _ffi_vec_Foo_from_cpp(_ffi_read::<usize>(end), end) });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_from_cpp(len: usize, end: &mut *const u8) -> Vec<Foo> {\n    let mut items = Vec::<Foo>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Foo {\n            x: (\n                Bar { x: _ffi_read::<i32>(end), y: _ffi_vec_Foo_from_cpp(_ffi_read::<usize>(end), end) },\n                _ffi_vec_Bar_from_cpp(_ffi_read::<usize>(end), end)\n            ),\n            y: _ffi_vec__i32_f32_bool_from_cpp(_ffi_read::<usize>(end), end)\n        });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__i32_f32_bool_from_cpp(len: usize, end: &mut *const u8) -> Vec<((), (i32,), (f32, bool))> {\n    let mut items = Vec::<((), (i32,), (f32, bool))>::with_capacity(len);\n    for _ in 0..len {\n        items.push(((), (_ffi_read::<i32>(end),), (_ffi_read::<f32>(end), _ffi_read::<bool>(end))));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_combo_in_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_ptr_2_usize {\n    const char* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nextern \"C\" {\n\n_ffi_ret_ptr_2_usize _ffi_fn_check_combo(int32_t foo_x_0_x, const void* buf_ptr, uintptr_t foo_x_0_y_len, uintptr_t foo_x_1_len, uintptr_t foo_y_len);\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\nvoid* _ffi_alloc(uintptr_t len);\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\nvoid _ffi_vec_Bar_to_rust(std::vector<rust::Bar>&& items, std::vector<uint8_t>& buf);\n\nvoid _ffi_vec_Foo_to_rust(std::vector<rust::Foo>&& items, std::vector<uint8_t>& buf);\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_vec__i32_f32_bool_to_rust(std::vector<std::tuple<std::tuple<>, std::tuple<int32_t>, std::tuple<float, bool>>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        (void)std::get<0>(item);\n        _ffi_write(std::get<0>(std::get<1>(item)), buf);\n        _ffi_write(std::get<0>(std::get<2>(item)), buf);\n        _ffi_write(std::get<1>(std::get<2>(item)), buf);\n    }\n}\n\nvoid _ffi_vec_Foo_to_rust(std::vector<rust::Foo>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(std::get<0>(item.x).x, buf);\n        auto item_x_0_y_len = std::get<0>(item.x).y.size();\n        _ffi_write(item_x_0_y_len, buf);\n        _ffi_vec_Foo_to_rust(std::move(std::get<0>(item.x).y), buf);\n        auto item_x_1_len = std::get<1>(item.x).size();\n        _ffi_write(item_x_1_len, buf);\n        _ffi_vec_Bar_to_rust(std::move(std::get<1>(item.x)), buf);\n        auto item_y_len = item.y.size();\n        _ffi_write(item_y_len, buf);\n        _ffi_vec__i32_f32_bool_to_rust(std::move(item.y), buf);\n    }\n}\n\nvoid _ffi_vec_Bar_to_rust(std::vector<rust::Bar>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item.x, buf);\n        auto item_y_len = item.y.size();\n        _ffi_write(item_y_len, buf);\n        _ffi_vec_Foo_to_rust(std::move(item.y), buf);\n    }\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\n} // namespace\n\nstd::string rust::check_combo(rust::Foo foo) {\n    std::vector<uint8_t> buf;\n    auto foo_x_0_y_len = std::get<0>(foo.x).y.size();\n    _ffi_vec_Foo_to_rust(std::move(std::get<0>(foo.x).y), buf);\n    auto foo_x_1_len = std::get<1>(foo.x).size();\n    _ffi_vec_Bar_to_rust(std::move(std::get<1>(foo.x)), buf);\n    auto foo_y_len = foo.y.size();\n    _ffi_vec__i32_f32_bool_to_rust(std::move(foo.y), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_check_combo(std::get<0>(foo.x).x, buf_ptr, foo_x_0_y_len, foo_x_1_len, foo_y_len);\n    auto ret_ptr = multi_ret._0;\n    auto ret_len = multi_ret._1;\n    auto ret_cap = multi_ret._2;\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_combo_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <string>\n#include <vector>\n#include <tuple>\n\nnamespace rust {\n\nstruct Foo;\nstruct Bar;\n\nstruct Bar {\n    int32_t x = 0;\n    std::vector<Foo> y;\n};\n\nstruct Foo {\n    std::tuple<Bar, std::vector<Bar>> x;\n    std::vector<std::tuple<std::tuple<>, std::tuple<int32_t>, std::tuple<float, bool>>> y;\n};\n\nuintptr_t rust_mem_leaked();\n\nstd::string check_combo(Foo foo);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_combo_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_combo(foo_x_0_x: i32, buf_ptr: *const u8, foo_x_0_y_len: usize, foo_x_1_len: usize, foo_y_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(check_combo(Foo {\n        x: (\n            Bar { x: foo_x_0_x, y: _ffi_vec_Foo_from_cpp(foo_x_0_y_len, &mut buf_end) },\n            _ffi_vec_Bar_from_cpp(foo_x_1_len, &mut buf_end)\n        ),\n        y: _ffi_vec__i32_f32_bool_from_cpp(foo_y_len, &mut buf_end)\n    }));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Bar_from_cpp(len: usize, end: &mut *const u8) -> Vec<Bar> {\n    let mut items = Vec::<Bar>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Bar { x: _ffi_read::<i32>(end), y: _ffi_vec_Foo_from_cpp(_ffi_read::<usize>(end), end) });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_from_cpp(len: usize, end: &mut *const u8) -> Vec<Foo> {\n    let mut items = Vec::<Foo>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Foo {\n            x: (\n                Bar { x: _ffi_read::<i32>(end), y: _ffi_vec_Foo_from_cpp(_ffi_read::<usize>(end), end) },\n                _ffi_vec_Bar_from_cpp(_ffi_read::<usize>(end), end)\n            ),\n            y: _ffi_vec__i32_f32_bool_from_cpp(_ffi_read::<usize>(end), end)\n        });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__i32_f32_bool_from_cpp(len: usize, end: &mut *const u8) -> Vec<((), (i32,), (f32, bool))> {\n    let mut items = Vec::<((), (i32,), (f32, bool))>::with_capacity(len);\n    for _ in 0..len {\n        items.push(((), (_ffi_read::<i32>(end),), (_ffi_read::<f32>(end), _ffi_read::<bool>(end))));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_combo_out_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_i32_ptr_4_usize {\n    int32_t _0;\n    const void* _1;\n    uintptr_t _2;\n    uintptr_t _3;\n    uintptr_t _4;\n    uintptr_t _5;\n};\n\nextern \"C\" {\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n_ffi_ret_i32_ptr_4_usize _ffi_fn_check_combo1();\n_ffi_ret_i32_ptr_4_usize _ffi_fn_check_combo2();\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nstd::vector<rust::Bar> _ffi_vec_Bar_from_rust(uintptr_t len, const uint8_t*& end);\n\nstd::vector<rust::Foo> _ffi_vec_Foo_from_rust(uintptr_t len, const uint8_t*& end);\n\nstd::vector<std::tuple<std::tuple<>, std::tuple<int32_t>, std::tuple<float, bool>>> _ffi_vec__i32_f32_bool_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::tuple<std::tuple<>, std::tuple<int32_t>, std::tuple<float, bool>>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_0 = std::tuple<>();\n        auto item_1_0 = _ffi_read<int32_t>(end);\n        auto item_1 = item_1_0;\n        auto item_2_0 = _ffi_read<float>(end);\n        auto item_2_1 = _ffi_read<bool>(end);\n        auto item_2 = std::make_tuple(item_2_0, item_2_1);\n        auto item = std::make_tuple(std::move(item_0), std::move(item_1), std::move(item_2));\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nstd::vector<rust::Foo> _ffi_vec_Foo_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<rust::Foo> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_x_0_x = _ffi_read<int32_t>(end);\n        auto item_x_0_y_len = _ffi_read<uintptr_t>(end);\n        auto item_x_0_y = _ffi_vec_Foo_from_rust(item_x_0_y_len, end);\n        auto item_x_0 = rust::Bar{item_x_0_x, std::move(item_x_0_y)};\n        auto item_x_1_len = _ffi_read<uintptr_t>(end);\n        auto item_x_1 = _ffi_vec_Bar_from_rust(item_x_1_len, end);\n        auto item_x = std::make_tuple(std::move(item_x_0), std::move(item_x_1));\n        auto item_y_len = _ffi_read<uintptr_t>(end);\n        auto item_y = _ffi_vec__i32_f32_bool_from_rust(item_y_len, end);\n        auto item = rust::Foo{std::move(item_x), std::move(item_y)};\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nstd::vector<rust::Bar> _ffi_vec_Bar_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<rust::Bar> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_x = _ffi_read<int32_t>(end);\n        auto item_y_len = _ffi_read<uintptr_t>(end);\n        auto item_y = _ffi_vec_Foo_from_rust(item_y_len, end);\n        auto item = rust::Bar{item_x, std::move(item_y)};\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\n} // namespace\n\nbool rust::Bar::operator == (const rust::Bar& b) const {\n    return x == b.x && y == b.y;\n}\n\nbool rust::Foo::operator == (const rust::Foo& f) const {\n    return x == f.x && y == f.y;\n}\n\nrust::Foo rust::check_combo1() {\n    auto multi_ret = _ffi_fn_check_combo1();\n    auto ret_x_0_x = multi_ret._0;\n    auto buf_ptr = multi_ret._1;\n    auto buf_cap = multi_ret._2;\n    auto ret_x_0_y_len = multi_ret._3;\n    auto ret_x_1_len = multi_ret._4;\n    auto ret_y_len = multi_ret._5;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret_x_0_y = _ffi_vec_Foo_from_rust(ret_x_0_y_len, buf_end);\n    auto ret_x_0 = rust::Bar{ret_x_0_x, std::move(ret_x_0_y)};\n    auto ret_x_1 = _ffi_vec_Bar_from_rust(ret_x_1_len, buf_end);\n    auto ret_x = std::make_tuple(std::move(ret_x_0), std::move(ret_x_1));\n    auto ret_y = _ffi_vec__i32_f32_bool_from_rust(ret_y_len, buf_end);\n    auto ret = rust::Foo{std::move(ret_x), std::move(ret_y)};\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nrust::Foo rust::check_combo2() {\n    auto multi_ret = _ffi_fn_check_combo2();\n    auto ret_x_0_x = multi_ret._0;\n    auto buf_ptr = multi_ret._1;\n    auto buf_cap = multi_ret._2;\n    auto ret_x_0_y_len = multi_ret._3;\n    auto ret_x_1_len = multi_ret._4;\n    auto ret_y_len = multi_ret._5;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret_x_0_y = _ffi_vec_Foo_from_rust(ret_x_0_y_len, buf_end);\n    auto ret_x_0 = rust::Bar{ret_x_0_x, std::move(ret_x_0_y)};\n    auto ret_x_1 = _ffi_vec_Bar_from_rust(ret_x_1_len, buf_end);\n    auto ret_x = std::make_tuple(std::move(ret_x_0), std::move(ret_x_1));\n    auto ret_y = _ffi_vec__i32_f32_bool_from_rust(ret_y_len, buf_end);\n    auto ret = rust::Foo{std::move(ret_x), std::move(ret_y)};\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_combo_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include <tuple>\n\nnamespace rust {\n\nstruct Foo;\nstruct Bar;\n\nstruct Bar {\n    int32_t x = 0;\n    std::vector<Foo> y;\n    bool operator == (const Bar&) const;\n    bool operator != (const Bar& b) const { return !(*this == b); }\n};\n\nstruct Foo {\n    std::tuple<Bar, std::vector<Bar>> x;\n    std::vector<std::tuple<std::tuple<>, std::tuple<int32_t>, std::tuple<float, bool>>> y;\n    bool operator == (const Foo&) const;\n    bool operator != (const Foo& f) const { return !(*this == f); }\n};\n\nuintptr_t rust_mem_leaked();\n\nFoo check_combo1();\n\nFoo check_combo2();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_combo_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_combo1() -> _ffi_ret_i32_ptr_4_usize {\n    let ret = check_combo1();\n    let ret_x = ret.x;\n    let ret_x_0 = ret_x.0;\n    let ret_x_0_x = ret_x_0.x;\n    let ret_x_0_y = ret_x_0.y;\n    let mut buf = Vec::<u8>::new();\n    let ret_x_0_y_len = ret_x_0_y.len();\n    _ffi_vec_Foo_to_cpp(ret_x_0_y, &mut buf);\n    let ret_x_1 = ret_x.1;\n    let ret_x_1_len = ret_x_1.len();\n    _ffi_vec_Bar_to_cpp(ret_x_1, &mut buf);\n    let ret_y = ret.y;\n    let ret_y_len = ret_y.len();\n    _ffi_vec__i32_f32_bool_to_cpp(ret_y, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_i32_ptr_4_usize(ret_x_0_x, buf_ptr, buf_cap, ret_x_0_y_len, ret_x_1_len, ret_y_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_combo2() -> _ffi_ret_i32_ptr_4_usize {\n    let ret = check_combo2();\n    let ret_x = ret.x;\n    let ret_x_0 = ret_x.0;\n    let ret_x_0_x = ret_x_0.x;\n    let ret_x_0_y = ret_x_0.y;\n    let mut buf = Vec::<u8>::new();\n    let ret_x_0_y_len = ret_x_0_y.len();\n    _ffi_vec_Foo_to_cpp(ret_x_0_y, &mut buf);\n    let ret_x_1 = ret_x.1;\n    let ret_x_1_len = ret_x_1.len();\n    _ffi_vec_Bar_to_cpp(ret_x_1, &mut buf);\n    let ret_y = ret.y;\n    let ret_y_len = ret_y.len();\n    _ffi_vec__i32_f32_bool_to_cpp(ret_y, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_i32_ptr_4_usize(ret_x_0_x, buf_ptr, buf_cap, ret_x_0_y_len, ret_x_1_len, ret_y_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr_4_usize(i32, *const u8, usize, usize, usize, usize);\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Bar_to_cpp(items: Vec<Bar>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.x, buf);\n        _ffi_write(item.y.len(), buf);\n        _ffi_vec_Foo_to_cpp(item.y, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_to_cpp(items: Vec<Foo>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.x.0.x, buf);\n        _ffi_write(item.x.0.y.len(), buf);\n        _ffi_vec_Foo_to_cpp(item.x.0.y, buf);\n        _ffi_write(item.x.1.len(), buf);\n        _ffi_vec_Bar_to_cpp(item.x.1, buf);\n        _ffi_write(item.y.len(), buf);\n        _ffi_vec__i32_f32_bool_to_cpp(item.y, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__i32_f32_bool_to_cpp(items: Vec<((), (i32,), (f32, bool))>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ = item.0;\n        _ffi_write(item.1.0, buf);\n        _ffi_write(item.2.0, buf);\n        _ffi_write(item.2.1, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_combo_out_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_i32_ptr_4_usize {\n    int32_t _0;\n    const void* _1;\n    uintptr_t _2;\n    uintptr_t _3;\n    uintptr_t _4;\n    uintptr_t _5;\n};\n\nextern \"C\" {\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n_ffi_ret_i32_ptr_4_usize _ffi_fn_check_combo1();\n_ffi_ret_i32_ptr_4_usize _ffi_fn_check_combo2();\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nstd::vector<rust::Bar> _ffi_vec_Bar_from_rust(uintptr_t len, const uint8_t*& end);\n\nstd::vector<rust::Foo> _ffi_vec_Foo_from_rust(uintptr_t len, const uint8_t*& end);\n\nstd::vector<std::tuple<std::tuple<>, std::tuple<int32_t>, std::tuple<float, bool>>> _ffi_vec__i32_f32_bool_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::tuple<std::tuple<>, std::tuple<int32_t>, std::tuple<float, bool>>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_0 = std::tuple<>();\n        auto item_1_0 = _ffi_read<int32_t>(end);\n        auto item_1 = item_1_0;\n        auto item_2_0 = _ffi_read<float>(end);\n        auto item_2_1 = _ffi_read<bool>(end);\n        auto item_2 = std::make_tuple(item_2_0, item_2_1);\n        auto item = std::make_tuple(std::move(item_0), std::move(item_1), std::move(item_2));\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nstd::vector<rust::Foo> _ffi_vec_Foo_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<rust::Foo> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_x_0_x = _ffi_read<int32_t>(end);\n        auto item_x_0_y_len = _ffi_read<uintptr_t>(end);\n        auto item_x_0_y = _ffi_vec_Foo_from_rust(item_x_0_y_len, end);\n        auto item_x_0 = rust::Bar{item_x_0_x, std::move(item_x_0_y)};\n        auto item_x_1_len = _ffi_read<uintptr_t>(end);\n        auto item_x_1 = _ffi_vec_Bar_from_rust(item_x_1_len, end);\n        auto item_x = std::make_tuple(std::move(item_x_0), std::move(item_x_1));\n        auto item_y_len = _ffi_read<uintptr_t>(end);\n        auto item_y = _ffi_vec__i32_f32_bool_from_rust(item_y_len, end);\n        auto item = rust::Foo{std::move(item_x), std::move(item_y)};\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nstd::vector<rust::Bar> _ffi_vec_Bar_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<rust::Bar> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_x = _ffi_read<int32_t>(end);\n        auto item_y_len = _ffi_read<uintptr_t>(end);\n        auto item_y = _ffi_vec_Foo_from_rust(item_y_len, end);\n        auto item = rust::Bar{item_x, std::move(item_y)};\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\n} // namespace\n\nbool rust::Bar::operator == (const rust::Bar& b) const {\n    return x == b.x && y == b.y;\n}\n\nbool rust::Foo::operator == (const rust::Foo& f) const {\n    return x == f.x && y == f.y;\n}\n\nrust::Foo rust::check_combo1() {\n    auto multi_ret = _ffi_fn_check_combo1();\n    auto ret_x_0_x = multi_ret._0;\n    auto buf_ptr = multi_ret._1;\n    auto buf_cap = multi_ret._2;\n    auto ret_x_0_y_len = multi_ret._3;\n    auto ret_x_1_len = multi_ret._4;\n    auto ret_y_len = multi_ret._5;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret_x_0_y = _ffi_vec_Foo_from_rust(ret_x_0_y_len, buf_end);\n    auto ret_x_0 = rust::Bar{ret_x_0_x, std::move(ret_x_0_y)};\n    auto ret_x_1 = _ffi_vec_Bar_from_rust(ret_x_1_len, buf_end);\n    auto ret_x = std::make_tuple(std::move(ret_x_0), std::move(ret_x_1));\n    auto ret_y = _ffi_vec__i32_f32_bool_from_rust(ret_y_len, buf_end);\n    auto ret = rust::Foo{std::move(ret_x), std::move(ret_y)};\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nrust::Foo rust::check_combo2() {\n    auto multi_ret = _ffi_fn_check_combo2();\n    auto ret_x_0_x = multi_ret._0;\n    auto buf_ptr = multi_ret._1;\n    auto buf_cap = multi_ret._2;\n    auto ret_x_0_y_len = multi_ret._3;\n    auto ret_x_1_len = multi_ret._4;\n    auto ret_y_len = multi_ret._5;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret_x_0_y = _ffi_vec_Foo_from_rust(ret_x_0_y_len, buf_end);\n    auto ret_x_0 = rust::Bar{ret_x_0_x, std::move(ret_x_0_y)};\n    auto ret_x_1 = _ffi_vec_Bar_from_rust(ret_x_1_len, buf_end);\n    auto ret_x = std::make_tuple(std::move(ret_x_0), std::move(ret_x_1));\n    auto ret_y = _ffi_vec__i32_f32_bool_from_rust(ret_y_len, buf_end);\n    auto ret = rust::Foo{std::move(ret_x), std::move(ret_y)};\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_combo_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include <tuple>\n\nnamespace rust {\n\nstruct Foo;\nstruct Bar;\n\nstruct Bar {\n    int32_t x = 0;\n    std::vector<Foo> y;\n    bool operator == (const Bar&) const;\n    bool operator != (const Bar& b) const { return !(*this == b); }\n};\n\nstruct Foo {\n    std::tuple<Bar, std::vector<Bar>> x;\n    std::vector<std::tuple<std::tuple<>, std::tuple<int32_t>, std::tuple<float, bool>>> y;\n    bool operator == (const Foo&) const;\n    bool operator != (const Foo& f) const { return !(*this == f); }\n};\n\nuintptr_t rust_mem_leaked();\n\nFoo check_combo1();\n\nFoo check_combo2();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_combo_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_combo1() -> _ffi_ret_i32_ptr_4_usize {\n    let ret = check_combo1();\n    let ret_x = ret.x;\n    let ret_x_0 = ret_x.0;\n    let ret_x_0_x = ret_x_0.x;\n    let ret_x_0_y = ret_x_0.y;\n    let mut buf = Vec::<u8>::new();\n    let ret_x_0_y_len = ret_x_0_y.len();\n    _ffi_vec_Foo_to_cpp(ret_x_0_y, &mut buf);\n    let ret_x_1 = ret_x.1;\n    let ret_x_1_len = ret_x_1.len();\n    _ffi_vec_Bar_to_cpp(ret_x_1, &mut buf);\n    let ret_y = ret.y;\n    let ret_y_len = ret_y.len();\n    _ffi_vec__i32_f32_bool_to_cpp(ret_y, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_i32_ptr_4_usize(ret_x_0_x, buf_ptr, buf_cap, ret_x_0_y_len, ret_x_1_len, ret_y_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_combo2() -> _ffi_ret_i32_ptr_4_usize {\n    let ret = check_combo2();\n    let ret_x = ret.x;\n    let ret_x_0 = ret_x.0;\n    let ret_x_0_x = ret_x_0.x;\n    let ret_x_0_y = ret_x_0.y;\n    let mut buf = Vec::<u8>::new();\n    let ret_x_0_y_len = ret_x_0_y.len();\n    _ffi_vec_Foo_to_cpp(ret_x_0_y, &mut buf);\n    let ret_x_1 = ret_x.1;\n    let ret_x_1_len = ret_x_1.len();\n    _ffi_vec_Bar_to_cpp(ret_x_1, &mut buf);\n    let ret_y = ret.y;\n    let ret_y_len = ret_y.len();\n    _ffi_vec__i32_f32_bool_to_cpp(ret_y, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_i32_ptr_4_usize(ret_x_0_x, buf_ptr, buf_cap, ret_x_0_y_len, ret_x_1_len, ret_y_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr_4_usize(i32, *const u8, usize, usize, usize, usize);\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Bar_to_cpp(items: Vec<Bar>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.x, buf);\n        _ffi_write(item.y.len(), buf);\n        _ffi_vec_Foo_to_cpp(item.y, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_to_cpp(items: Vec<Foo>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.x.0.x, buf);\n        _ffi_write(item.x.0.y.len(), buf);\n        _ffi_vec_Foo_to_cpp(item.x.0.y, buf);\n        _ffi_write(item.x.1.len(), buf);\n        _ffi_vec_Bar_to_cpp(item.x.1, buf);\n        _ffi_write(item.y.len(), buf);\n        _ffi_vec__i32_f32_bool_to_cpp(item.y, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__i32_f32_bool_to_cpp(items: Vec<((), (i32,), (f32, bool))>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ = item.0;\n        _ffi_write(item.1.0, buf);\n        _ffi_write(item.2.0, buf);\n        _ffi_write(item.2.1, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_enum_in_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n#include <stdlib.h>\n#include <vector>\n\nextern \"C\" {\n\nint32_t _ffi_fn_big_to_i32(int32_t big_raw);\nint32_t _ffi_fn_foo_to_i32(int32_t foo_raw);\nvoid _ffi_fn_long_in(const void* buf_ptr);\nvoid* _ffi_alloc(uintptr_t len);\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_enum_LongEnum_to_rust(rust::LongEnum val, std::vector<uint8_t>& buf) {\n    if (val.is<rust::LongEnum::Empty>()) {\n        _ffi_write(int32_t(0), buf);\n    } else if (auto it = val.as<rust::LongEnum::ShortTuple>()) {\n        _ffi_write(int32_t(1), buf);\n        _ffi_write(it->_0, buf);\n    } else if (auto it = val.as<rust::LongEnum::ShortStruct>()) {\n        _ffi_write(int32_t(2), buf);\n        _ffi_write(it->a, buf);\n    } else if (auto it = val.as<rust::LongEnum::LongTuple>()) {\n        _ffi_write(int32_t(3), buf);\n        _ffi_write(it->_0, buf);\n        _ffi_write(it->_1, buf);\n        _ffi_write(it->_2, buf);\n        _ffi_write(it->_3, buf);\n        _ffi_write(it->_4, buf);\n        _ffi_write(it->_5, buf);\n        _ffi_write(it->_6, buf);\n        _ffi_write(it->_7, buf);\n    } else if (auto it = val.as<rust::LongEnum::LongStruct>()) {\n        _ffi_write(int32_t(4), buf);\n        _ffi_write(it->a, buf);\n        _ffi_write(it->b, buf);\n        _ffi_write(it->c, buf);\n        _ffi_write(it->d, buf);\n        _ffi_write(it->e, buf);\n        _ffi_write(it->f, buf);\n    } else {\n        abort();\n    }\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\n} // namespace\n\nint32_t rust::big_to_i32(rust::Big big) {\n    return _ffi_fn_big_to_i32(int32_t(big));\n}\n\nint32_t rust::foo_to_i32(rust::Foo foo) {\n    return _ffi_fn_foo_to_i32(int32_t(foo));\n}\n\nvoid rust::long_in(rust::LongEnum _1) {\n    std::vector<uint8_t> buf;\n    _ffi_enum_LongEnum_to_rust(std::move(_1), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    _ffi_fn_long_in(buf_ptr);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_enum_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <variant>\n\nnamespace rust {\n\nenum struct Big : int32_t {\n    Min = -2147483647 - 1,\n    Max = 2147483647,\n};\n\nenum struct Foo : int32_t {\n    Zero = 0,\n    One = 1,\n    Hundred = 100,\n};\n\nnamespace detail {\n\nstruct LongEnum__Empty {\n};\n\nstruct LongEnum__ShortTuple {\n    int32_t _0 = 0;\n};\n\nstruct LongEnum__ShortStruct {\n    int32_t a = 0;\n};\n\nstruct LongEnum__LongTuple {\n    int32_t _0 = 0;\n    int32_t _1 = 0;\n    int32_t _2 = 0;\n    int32_t _3 = 0;\n    int32_t _4 = 0;\n    int32_t _5 = 0;\n    int32_t _6 = 0;\n    int32_t _7 = 0;\n};\n\nstruct LongEnum__LongStruct {\n    int32_t a = 0;\n    int32_t b = 0;\n    int32_t c = 0;\n    int32_t d = 0;\n    int32_t e = 0;\n    int32_t f = 0;\n};\n\n} // namespace detail\n\nstruct LongEnum : std::variant<std::monostate, detail::LongEnum__Empty, detail::LongEnum__ShortTuple, detail::LongEnum__ShortStruct, detail::LongEnum__LongTuple, detail::LongEnum__LongStruct> {\n    using Empty = detail::LongEnum__Empty;\n    using ShortTuple = detail::LongEnum__ShortTuple;\n    using ShortStruct = detail::LongEnum__ShortStruct;\n    using LongTuple = detail::LongEnum__LongTuple;\n    using LongStruct = detail::LongEnum__LongStruct;\n    using std::variant<std::monostate, Empty, ShortTuple, ShortStruct, LongTuple, LongStruct>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nuintptr_t rust_mem_leaked();\n\nint32_t foo_to_i32(Foo foo);\n\nint32_t big_to_i32(Big big);\n\nvoid long_in(LongEnum _1);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_enum_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Big_from_cpp(val: i32) -> Big {\n    match val {\n        -2147483648 => Big::Min,\n        2147483647 => Big::Max,\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_from_cpp(val: i32) -> Foo {\n    match val {\n        0 => Foo::Zero,\n        1 => Foo::One,\n        100 => Foo::Hundred,\n        _ => panic!(),\n    }\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_LongEnum_from_cpp(end: &mut *const u8) -> LongEnum {\n    match _ffi_read::<i32>(end) {\n        0 => LongEnum::Empty,\n        1 => LongEnum::ShortTuple(_ffi_read::<i32>(end)),\n        2 => LongEnum::ShortStruct { a: _ffi_read::<i32>(end) },\n        3 => LongEnum::LongTuple(\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end)\n        ),\n        4 => LongEnum::LongStruct {\n            a: _ffi_read::<i32>(end),\n            b: _ffi_read::<i32>(end),\n            c: _ffi_read::<i32>(end),\n            d: _ffi_read::<i32>(end),\n            e: _ffi_read::<i32>(end),\n            f: _ffi_read::<i32>(end)\n        },\n        _ => panic!(),\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_big_to_i32(big_raw: i32) -> i32 {\n    big_to_i32(_ffi_enum_Big_from_cpp(big_raw))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_foo_to_i32(foo_raw: i32) -> i32 {\n    foo_to_i32(_ffi_enum_Foo_from_cpp(foo_raw))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_long_in(buf_ptr: *const u8) {\n    let mut buf_end = buf_ptr;\n    long_in(_ffi_enum_LongEnum_from_cpp(&mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_enum_in_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n#include <stdlib.h>\n#include <vector>\n\nextern \"C\" {\n\nint32_t _ffi_fn_big_to_i32(int32_t big_raw);\nint32_t _ffi_fn_foo_to_i32(int32_t foo_raw);\nvoid _ffi_fn_long_in(const void* buf_ptr);\nvoid* _ffi_alloc(uintptr_t len);\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_enum_LongEnum_to_rust(rust::LongEnum val, std::vector<uint8_t>& buf) {\n    if (val.is<rust::LongEnum::Empty>()) {\n        _ffi_write(int32_t(0), buf);\n    } else if (auto it = val.as<rust::LongEnum::ShortTuple>()) {\n        _ffi_write(int32_t(1), buf);\n        _ffi_write(it->_0, buf);\n    } else if (auto it = val.as<rust::LongEnum::ShortStruct>()) {\n        _ffi_write(int32_t(2), buf);\n        _ffi_write(it->a, buf);\n    } else if (auto it = val.as<rust::LongEnum::LongTuple>()) {\n        _ffi_write(int32_t(3), buf);\n        _ffi_write(it->_0, buf);\n        _ffi_write(it->_1, buf);\n        _ffi_write(it->_2, buf);\n        _ffi_write(it->_3, buf);\n        _ffi_write(it->_4, buf);\n        _ffi_write(it->_5, buf);\n        _ffi_write(it->_6, buf);\n        _ffi_write(it->_7, buf);\n    } else if (auto it = val.as<rust::LongEnum::LongStruct>()) {\n        _ffi_write(int32_t(4), buf);\n        _ffi_write(it->a, buf);\n        _ffi_write(it->b, buf);\n        _ffi_write(it->c, buf);\n        _ffi_write(it->d, buf);\n        _ffi_write(it->e, buf);\n        _ffi_write(it->f, buf);\n    } else {\n        abort();\n    }\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\n} // namespace\n\nint32_t rust::big_to_i32(rust::Big big) {\n    return _ffi_fn_big_to_i32(int32_t(big));\n}\n\nint32_t rust::foo_to_i32(rust::Foo foo) {\n    return _ffi_fn_foo_to_i32(int32_t(foo));\n}\n\nvoid rust::long_in(rust::LongEnum _1) {\n    std::vector<uint8_t> buf;\n    _ffi_enum_LongEnum_to_rust(std::move(_1), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    _ffi_fn_long_in(buf_ptr);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_enum_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <variant>\n\nnamespace rust {\n\nenum struct Big : int32_t {\n    Min = -2147483647 - 1,\n    Max = 2147483647,\n};\n\nenum struct Foo : int32_t {\n    Zero = 0,\n    One = 1,\n    Hundred = 100,\n};\n\nnamespace detail {\n\nstruct LongEnum__Empty {\n};\n\nstruct LongEnum__ShortTuple {\n    int32_t _0 = 0;\n};\n\nstruct LongEnum__ShortStruct {\n    int32_t a = 0;\n};\n\nstruct LongEnum__LongTuple {\n    int32_t _0 = 0;\n    int32_t _1 = 0;\n    int32_t _2 = 0;\n    int32_t _3 = 0;\n    int32_t _4 = 0;\n    int32_t _5 = 0;\n    int32_t _6 = 0;\n    int32_t _7 = 0;\n};\n\nstruct LongEnum__LongStruct {\n    int32_t a = 0;\n    int32_t b = 0;\n    int32_t c = 0;\n    int32_t d = 0;\n    int32_t e = 0;\n    int32_t f = 0;\n};\n\n} // namespace detail\n\nstruct LongEnum : std::variant<std::monostate, detail::LongEnum__Empty, detail::LongEnum__ShortTuple, detail::LongEnum__ShortStruct, detail::LongEnum__LongTuple, detail::LongEnum__LongStruct> {\n    using Empty = detail::LongEnum__Empty;\n    using ShortTuple = detail::LongEnum__ShortTuple;\n    using ShortStruct = detail::LongEnum__ShortStruct;\n    using LongTuple = detail::LongEnum__LongTuple;\n    using LongStruct = detail::LongEnum__LongStruct;\n    using std::variant<std::monostate, Empty, ShortTuple, ShortStruct, LongTuple, LongStruct>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nuintptr_t rust_mem_leaked();\n\nint32_t foo_to_i32(Foo foo);\n\nint32_t big_to_i32(Big big);\n\nvoid long_in(LongEnum _1);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_enum_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Big_from_cpp(val: i32) -> Big {\n    match val {\n        -2147483648 => Big::Min,\n        2147483647 => Big::Max,\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_from_cpp(val: i32) -> Foo {\n    match val {\n        0 => Foo::Zero,\n        1 => Foo::One,\n        100 => Foo::Hundred,\n        _ => panic!(),\n    }\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_LongEnum_from_cpp(end: &mut *const u8) -> LongEnum {\n    match _ffi_read::<i32>(end) {\n        0 => LongEnum::Empty,\n        1 => LongEnum::ShortTuple(_ffi_read::<i32>(end)),\n        2 => LongEnum::ShortStruct { a: _ffi_read::<i32>(end) },\n        3 => LongEnum::LongTuple(\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end)\n        ),\n        4 => LongEnum::LongStruct {\n            a: _ffi_read::<i32>(end),\n            b: _ffi_read::<i32>(end),\n            c: _ffi_read::<i32>(end),\n            d: _ffi_read::<i32>(end),\n            e: _ffi_read::<i32>(end),\n            f: _ffi_read::<i32>(end)\n        },\n        _ => panic!(),\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_big_to_i32(big_raw: i32) -> i32 {\n    big_to_i32(_ffi_enum_Big_from_cpp(big_raw))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_foo_to_i32(foo_raw: i32) -> i32 {\n    foo_to_i32(_ffi_enum_Foo_from_cpp(foo_raw))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_long_in(buf_ptr: *const u8) {\n    let mut buf_end = buf_ptr;\n    long_in(_ffi_enum_LongEnum_from_cpp(&mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_enum_out_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n#include <stdlib.h>\n\nstruct _ffi_ret_ptr_usize {\n    const void* _0;\n    uintptr_t _1;\n};\n\nextern \"C\" {\n\nint32_t _ffi_fn_i32_to_big(int32_t big);\nint32_t _ffi_fn_i32_to_foo(int32_t foo);\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n_ffi_ret_ptr_usize _ffi_fn_long_out();\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nrust::LongEnum _ffi_enum_LongEnum_from_rust(const uint8_t*& end) {\n    switch (_ffi_read<int32_t>(end)) {\n    case 0:\n        return rust::LongEnum{rust::LongEnum::Empty{}};\n    case 1: {\n        auto x = _ffi_read<int32_t>(end);\n        return rust::LongEnum{rust::LongEnum::ShortTuple{x}};\n    }\n    case 2: {\n        auto a = _ffi_read<int32_t>(end);\n        return rust::LongEnum{rust::LongEnum::ShortStruct{a}};\n    }\n    case 3: {\n        auto x0 = _ffi_read<int32_t>(end);\n        auto x1 = _ffi_read<int32_t>(end);\n        auto x2 = _ffi_read<int32_t>(end);\n        auto x3 = _ffi_read<int32_t>(end);\n        auto x4 = _ffi_read<int32_t>(end);\n        auto x5 = _ffi_read<int32_t>(end);\n        auto x6 = _ffi_read<int32_t>(end);\n        auto x7 = _ffi_read<int32_t>(end);\n        return rust::LongEnum{rust::LongEnum::LongTuple{x0, x1, x2, x3, x4, x5, x6, x7}};\n    }\n    case 4: {\n        auto a = _ffi_read<int32_t>(end);\n        auto b = _ffi_read<int32_t>(end);\n        auto c = _ffi_read<int32_t>(end);\n        auto d = _ffi_read<int32_t>(end);\n        auto e = _ffi_read<int32_t>(end);\n        auto f = _ffi_read<int32_t>(end);\n        return rust::LongEnum{rust::LongEnum::LongStruct{a, b, c, d, e, f}};\n    }\n    default:\n        abort();\n    }\n}\n\n} // namespace\n\nrust::Big rust::i32_to_big(int32_t big) {\n    auto ret_raw = _ffi_fn_i32_to_big(big);\n    return rust::Big(ret_raw);\n}\n\nrust::Foo rust::i32_to_foo(int32_t foo) {\n    auto ret_raw = _ffi_fn_i32_to_foo(foo);\n    return rust::Foo(ret_raw);\n}\n\nrust::LongEnum rust::long_out() {\n    auto multi_ret = _ffi_fn_long_out();\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret = _ffi_enum_LongEnum_from_rust(buf_end);\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_enum_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <variant>\n\nnamespace rust {\n\nenum struct Big : int32_t {\n    Min = -2147483647 - 1,\n    Max = 2147483647,\n};\n\nenum struct Foo : int32_t {\n    Zero = 0,\n    One = 1,\n    Hundred = 100,\n};\n\nnamespace detail {\n\nstruct LongEnum__Empty {\n};\n\nstruct LongEnum__ShortTuple {\n    int32_t _0 = 0;\n};\n\nstruct LongEnum__ShortStruct {\n    int32_t a = 0;\n};\n\nstruct LongEnum__LongTuple {\n    int32_t _0 = 0;\n    int32_t _1 = 0;\n    int32_t _2 = 0;\n    int32_t _3 = 0;\n    int32_t _4 = 0;\n    int32_t _5 = 0;\n    int32_t _6 = 0;\n    int32_t _7 = 0;\n};\n\nstruct LongEnum__LongStruct {\n    int32_t a = 0;\n    int32_t b = 0;\n    int32_t c = 0;\n    int32_t d = 0;\n    int32_t e = 0;\n    int32_t f = 0;\n};\n\n} // namespace detail\n\nstruct LongEnum : std::variant<std::monostate, detail::LongEnum__Empty, detail::LongEnum__ShortTuple, detail::LongEnum__ShortStruct, detail::LongEnum__LongTuple, detail::LongEnum__LongStruct> {\n    using Empty = detail::LongEnum__Empty;\n    using ShortTuple = detail::LongEnum__ShortTuple;\n    using ShortStruct = detail::LongEnum__ShortStruct;\n    using LongTuple = detail::LongEnum__LongTuple;\n    using LongStruct = detail::LongEnum__LongStruct;\n    using std::variant<std::monostate, Empty, ShortTuple, ShortStruct, LongTuple, LongStruct>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nuintptr_t rust_mem_leaked();\n\nFoo i32_to_foo(int32_t foo);\n\nBig i32_to_big(int32_t big);\n\nLongEnum long_out();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_enum_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_LongEnum_to_cpp(val: LongEnum, buf: &mut Vec<u8>) {\n    match val {\n        LongEnum::Empty => _ffi_write(0 as i32, buf),\n        LongEnum::ShortTuple(x) => {\n            _ffi_write(1 as i32, buf);\n            _ffi_write(x, buf);\n        }\n        LongEnum::ShortStruct { a } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(a, buf);\n        }\n        LongEnum::LongTuple(x0, x1, x2, x3, x4, x5, x6, x7) => {\n            _ffi_write(3 as i32, buf);\n            _ffi_write(x0, buf);\n            _ffi_write(x1, buf);\n            _ffi_write(x2, buf);\n            _ffi_write(x3, buf);\n            _ffi_write(x4, buf);\n            _ffi_write(x5, buf);\n            _ffi_write(x6, buf);\n            _ffi_write(x7, buf);\n        }\n        LongEnum::LongStruct { a, b, c, d, e, f } => {\n            _ffi_write(4 as i32, buf);\n            _ffi_write(a, buf);\n            _ffi_write(b, buf);\n            _ffi_write(c, buf);\n            _ffi_write(d, buf);\n            _ffi_write(e, buf);\n            _ffi_write(f, buf);\n        }\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_i32_to_big(big: i32) -> i32 {\n    i32_to_big(big) as i32\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_i32_to_foo(foo: i32) -> i32 {\n    i32_to_foo(foo) as i32\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_long_out() -> _ffi_ret_ptr_usize {\n    let mut buf = Vec::<u8>::new();\n    _ffi_enum_LongEnum_to_cpp(long_out(), &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize(buf_ptr, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_enum_out_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n#include <stdlib.h>\n\nstruct _ffi_ret_ptr_usize {\n    const void* _0;\n    uintptr_t _1;\n};\n\nextern \"C\" {\n\nint32_t _ffi_fn_i32_to_big(int32_t big);\nint32_t _ffi_fn_i32_to_foo(int32_t foo);\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n_ffi_ret_ptr_usize _ffi_fn_long_out();\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nrust::LongEnum _ffi_enum_LongEnum_from_rust(const uint8_t*& end) {\n    switch (_ffi_read<int32_t>(end)) {\n    case 0:\n        return rust::LongEnum{rust::LongEnum::Empty{}};\n    case 1: {\n        auto x = _ffi_read<int32_t>(end);\n        return rust::LongEnum{rust::LongEnum::ShortTuple{x}};\n    }\n    case 2: {\n        auto a = _ffi_read<int32_t>(end);\n        return rust::LongEnum{rust::LongEnum::ShortStruct{a}};\n    }\n    case 3: {\n        auto x0 = _ffi_read<int32_t>(end);\n        auto x1 = _ffi_read<int32_t>(end);\n        auto x2 = _ffi_read<int32_t>(end);\n        auto x3 = _ffi_read<int32_t>(end);\n        auto x4 = _ffi_read<int32_t>(end);\n        auto x5 = _ffi_read<int32_t>(end);\n        auto x6 = _ffi_read<int32_t>(end);\n        auto x7 = _ffi_read<int32_t>(end);\n        return rust::LongEnum{rust::LongEnum::LongTuple{x0, x1, x2, x3, x4, x5, x6, x7}};\n    }\n    case 4: {\n        auto a = _ffi_read<int32_t>(end);\n        auto b = _ffi_read<int32_t>(end);\n        auto c = _ffi_read<int32_t>(end);\n        auto d = _ffi_read<int32_t>(end);\n        auto e = _ffi_read<int32_t>(end);\n        auto f = _ffi_read<int32_t>(end);\n        return rust::LongEnum{rust::LongEnum::LongStruct{a, b, c, d, e, f}};\n    }\n    default:\n        abort();\n    }\n}\n\n} // namespace\n\nrust::Big rust::i32_to_big(int32_t big) {\n    auto ret_raw = _ffi_fn_i32_to_big(big);\n    return rust::Big(ret_raw);\n}\n\nrust::Foo rust::i32_to_foo(int32_t foo) {\n    auto ret_raw = _ffi_fn_i32_to_foo(foo);\n    return rust::Foo(ret_raw);\n}\n\nrust::LongEnum rust::long_out() {\n    auto multi_ret = _ffi_fn_long_out();\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret = _ffi_enum_LongEnum_from_rust(buf_end);\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_enum_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <variant>\n\nnamespace rust {\n\nenum struct Big : int32_t {\n    Min = -2147483647 - 1,\n    Max = 2147483647,\n};\n\nenum struct Foo : int32_t {\n    Zero = 0,\n    One = 1,\n    Hundred = 100,\n};\n\nnamespace detail {\n\nstruct LongEnum__Empty {\n};\n\nstruct LongEnum__ShortTuple {\n    int32_t _0 = 0;\n};\n\nstruct LongEnum__ShortStruct {\n    int32_t a = 0;\n};\n\nstruct LongEnum__LongTuple {\n    int32_t _0 = 0;\n    int32_t _1 = 0;\n    int32_t _2 = 0;\n    int32_t _3 = 0;\n    int32_t _4 = 0;\n    int32_t _5 = 0;\n    int32_t _6 = 0;\n    int32_t _7 = 0;\n};\n\nstruct LongEnum__LongStruct {\n    int32_t a = 0;\n    int32_t b = 0;\n    int32_t c = 0;\n    int32_t d = 0;\n    int32_t e = 0;\n    int32_t f = 0;\n};\n\n} // namespace detail\n\nstruct LongEnum : std::variant<std::monostate, detail::LongEnum__Empty, detail::LongEnum__ShortTuple, detail::LongEnum__ShortStruct, detail::LongEnum__LongTuple, detail::LongEnum__LongStruct> {\n    using Empty = detail::LongEnum__Empty;\n    using ShortTuple = detail::LongEnum__ShortTuple;\n    using ShortStruct = detail::LongEnum__ShortStruct;\n    using LongTuple = detail::LongEnum__LongTuple;\n    using LongStruct = detail::LongEnum__LongStruct;\n    using std::variant<std::monostate, Empty, ShortTuple, ShortStruct, LongTuple, LongStruct>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nuintptr_t rust_mem_leaked();\n\nFoo i32_to_foo(int32_t foo);\n\nBig i32_to_big(int32_t big);\n\nLongEnum long_out();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_enum_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_LongEnum_to_cpp(val: LongEnum, buf: &mut Vec<u8>) {\n    match val {\n        LongEnum::Empty => _ffi_write(0 as i32, buf),\n        LongEnum::ShortTuple(x) => {\n            _ffi_write(1 as i32, buf);\n            _ffi_write(x, buf);\n        }\n        LongEnum::ShortStruct { a } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(a, buf);\n        }\n        LongEnum::LongTuple(x0, x1, x2, x3, x4, x5, x6, x7) => {\n            _ffi_write(3 as i32, buf);\n            _ffi_write(x0, buf);\n            _ffi_write(x1, buf);\n            _ffi_write(x2, buf);\n            _ffi_write(x3, buf);\n            _ffi_write(x4, buf);\n            _ffi_write(x5, buf);\n            _ffi_write(x6, buf);\n            _ffi_write(x7, buf);\n        }\n        LongEnum::LongStruct { a, b, c, d, e, f } => {\n            _ffi_write(4 as i32, buf);\n            _ffi_write(a, buf);\n            _ffi_write(b, buf);\n            _ffi_write(c, buf);\n            _ffi_write(d, buf);\n            _ffi_write(e, buf);\n            _ffi_write(f, buf);\n        }\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_i32_to_big(big: i32) -> i32 {\n    i32_to_big(big) as i32\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_i32_to_foo(foo: i32) -> i32 {\n    i32_to_foo(foo) as i32\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_long_out() -> _ffi_ret_ptr_usize {\n    let mut buf = Vec::<u8>::new();\n    _ffi_enum_LongEnum_to_cpp(long_out(), &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize(buf_ptr, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_nested_in_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_test(int32_t x_0, const void* x_1_ptr_ptr, const void* buf_ptr, uintptr_t x_2_len);\nvoid* _ffi_alloc(uintptr_t len);\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_vec_i32_Foo_to_rust(std::vector<std::tuple<int32_t, rust::Foo>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(std::get<0>(item), buf);\n        (void)std::get<1>(item).empty;\n        auto item_1_ptr_ptr = new std::shared_ptr<rust::Bar>(std::get<1>(item).ptr);\n        _ffi_write(item_1_ptr_ptr, buf);\n    }\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\n} // namespace\n\nextern \"C\" {\n\nint32_t _ffi_cpp_Rc_Bar__get(std::shared_ptr<rust::Bar>* _self) {\n    return _self->get()->get();\n}\n\nvoid _ffi_cpp_drop_Rc_Bar(std::shared_ptr<rust::Bar>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::test(std::tuple<int32_t, rust::Foo, std::vector<std::tuple<int32_t, rust::Foo>>> x) {\n    (void)std::get<1>(x).empty;\n    auto x_1_ptr_ptr = new std::shared_ptr<rust::Bar>(std::get<1>(x).ptr);\n    std::vector<uint8_t> buf;\n    auto x_2_len = std::get<2>(x).size();\n    _ffi_vec_i32_Foo_to_rust(std::move(std::get<2>(x)), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_test(std::get<0>(x), x_1_ptr_ptr, buf_ptr, x_2_len);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_nested_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <tuple>\n#include <vector>\n#include <memory>\n\nnamespace rust {\n\nstruct Bar;\n\nstruct Bar {\n    virtual ~Bar() {}\n    virtual int32_t get() = 0;\n};\n\nstruct Foo {\n    std::tuple<> empty;\n    std::shared_ptr<Bar> ptr;\n};\n\nuintptr_t rust_mem_leaked();\n\nint32_t test(std::tuple<int32_t, Foo, std::vector<std::tuple<int32_t, Foo>>> x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_nested_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test(x_0: i32, x_1_ptr_ptr: *const u8, buf_ptr: *const u8, x_2_len: usize) -> i32 {\n    let x_1 = Foo { empty: (), ptr: std::rc::Rc::new(_ffi_rs_Rc_Bar(x_1_ptr_ptr)) };\n    let mut buf_end = buf_ptr;\n    let ret = test((x_0, x_1, _ffi_vec_i32_Foo_from_cpp(x_2_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Bar(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Bar {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_cpp_drop_Rc_Bar(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Bar(self.0) };\n    }\n}\n\nimpl Bar for _ffi_rs_Rc_Bar {\n    fn get(&self) -> i32 {\n        extern \"C\" { fn _ffi_cpp_Rc_Bar__get(_: *const u8) -> i32; }\n        unsafe { _ffi_cpp_Rc_Bar__get(self.0) }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_i32_Foo_from_cpp(len: usize, end: &mut *const u8) -> Vec<(i32, Foo)> {\n    let mut items = Vec::<(i32, Foo)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((\n            _ffi_read::<i32>(end),\n            Foo { empty: (), ptr: std::rc::Rc::new(_ffi_rs_Rc_Bar(_ffi_read::<*const u8>(end))) }\n        ));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_nested_in_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_test(int32_t x_0, const void* x_1_ptr_ptr, const void* buf_ptr, uintptr_t x_2_len);\nvoid* _ffi_alloc(uintptr_t len);\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_vec_i32_Foo_to_rust(std::vector<std::tuple<int32_t, rust::Foo>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(std::get<0>(item), buf);\n        (void)std::get<1>(item).empty;\n        auto item_1_ptr_ptr = new std::shared_ptr<rust::Bar>(std::get<1>(item).ptr);\n        _ffi_write(item_1_ptr_ptr, buf);\n    }\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\n} // namespace\n\nextern \"C\" {\n\nint32_t _ffi_cpp_Rc_Bar__get(std::shared_ptr<rust::Bar>* _self) {\n    return _self->get()->get();\n}\n\nvoid _ffi_cpp_drop_Rc_Bar(std::shared_ptr<rust::Bar>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::test(std::tuple<int32_t, rust::Foo, std::vector<std::tuple<int32_t, rust::Foo>>> x) {\n    (void)std::get<1>(x).empty;\n    auto x_1_ptr_ptr = new std::shared_ptr<rust::Bar>(std::get<1>(x).ptr);\n    std::vector<uint8_t> buf;\n    auto x_2_len = std::get<2>(x).size();\n    _ffi_vec_i32_Foo_to_rust(std::move(std::get<2>(x)), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_test(std::get<0>(x), x_1_ptr_ptr, buf_ptr, x_2_len);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_nested_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <tuple>\n#include <vector>\n#include <memory>\n\nnamespace rust {\n\nstruct Bar;\n\nstruct Bar {\n    virtual ~Bar() {}\n    virtual int32_t get() = 0;\n};\n\nstruct Foo {\n    std::tuple<> empty;\n    std::shared_ptr<Bar> ptr;\n};\n\nuintptr_t rust_mem_leaked();\n\nint32_t test(std::tuple<int32_t, Foo, std::vector<std::tuple<int32_t, Foo>>> x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_nested_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test(x_0: i32, x_1_ptr_ptr: *const u8, buf_ptr: *const u8, x_2_len: usize) -> i32 {\n    let x_1 = Foo { empty: (), ptr: std::rc::Rc::new(_ffi_rs_Rc_Bar(x_1_ptr_ptr)) };\n    let mut buf_end = buf_ptr;\n    let ret = test((x_0, x_1, _ffi_vec_i32_Foo_from_cpp(x_2_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Bar(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Bar {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_cpp_drop_Rc_Bar(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Bar(self.0) };\n    }\n}\n\nimpl Bar for _ffi_rs_Rc_Bar {\n    fn get(&self) -> i32 {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_Bar__get(_: *const u8) -> i32; }\n        unsafe { _ffi_cpp_Rc_Bar__get(self.0) }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_i32_Foo_from_cpp(len: usize, end: &mut *const u8) -> Vec<(i32, Foo)> {\n    let mut items = Vec::<(i32, Foo)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((\n            _ffi_read::<i32>(end),\n            Foo { empty: (), ptr: std::rc::Rc::new(_ffi_rs_Rc_Bar(_ffi_read::<*const u8>(end))) }\n        ));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_nested_out_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_i32_ptr {\n    int32_t _0;\n    const void* _1;\n};\n\nextern \"C\" {\n\nvoid _ffi_drop_Rc_Bar(const void* ptr);\nint32_t _ffi_Rc_Bar__get(const void* _self);\nuintptr_t _ffi_fn_rust_mem_leaked();\n_ffi_ret_i32_ptr _ffi_fn_test(int32_t x);\n\n} // extern \"C\"\n\nnamespace {\n\nstruct _ffi_Rc_Bar final : rust::Bar {\n    _ffi_Rc_Bar(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Rc_Bar() { _ffi_drop_Rc_Bar(_self); }\n    virtual int32_t get();\n    const void* _self;\n};\n\n} // namespace\n\nint32_t _ffi_Rc_Bar::get() {\n    return _ffi_Rc_Bar__get(_self);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nstd::tuple<int32_t, rust::Foo> rust::test(int32_t x) {\n    auto multi_ret = _ffi_fn_test(x);\n    auto ret_0 = multi_ret._0;\n    auto ret_1_ptr_ptr = multi_ret._1;\n    auto ret_1_ptr = std::make_shared<_ffi_Rc_Bar>(ret_1_ptr_ptr);\n    auto ret_1 = rust::Foo{std::move(ret_1_ptr)};\n    return std::make_tuple(ret_0, std::move(ret_1));\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_nested_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <tuple>\n#include <memory>\n\nnamespace rust {\n\nstruct Bar;\n\nstruct Bar {\n    virtual ~Bar() {}\n    virtual int32_t get() = 0;\n};\n\nstruct Foo {\n    std::shared_ptr<Bar> ptr;\n};\n\nuintptr_t rust_mem_leaked();\n\nstd::tuple<int32_t, Foo> test(int32_t x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_nested_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Bar__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Bar>) };\n    _self.get()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_drop_Rc_Bar(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Bar>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test(x: i32) -> _ffi_ret_i32_ptr {\n    let ret = test(x);\n    let ret_0 = ret.0;\n    let ret_1 = ret.1;\n    _ffi_ret_i32_ptr(ret_0, Box::into_raw(Box::new(ret_1.ptr)) as *const u8)\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr(i32, *const u8);\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_nested_out_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_i32_ptr {\n    int32_t _0;\n    const void* _1;\n};\n\nextern \"C\" {\n\nvoid _ffi_drop_Rc_Bar(const void* ptr);\nint32_t _ffi_Rc_Bar__get(const void* _self);\nuintptr_t _ffi_fn_rust_mem_leaked();\n_ffi_ret_i32_ptr _ffi_fn_test(int32_t x);\n\n} // extern \"C\"\n\nnamespace {\n\nstruct _ffi_Rc_Bar final : rust::Bar {\n    _ffi_Rc_Bar(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Rc_Bar() { _ffi_drop_Rc_Bar(_self); }\n    virtual int32_t get();\n    const void* _self;\n};\n\n} // namespace\n\nint32_t _ffi_Rc_Bar::get() {\n    return _ffi_Rc_Bar__get(_self);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nstd::tuple<int32_t, rust::Foo> rust::test(int32_t x) {\n    auto multi_ret = _ffi_fn_test(x);\n    auto ret_0 = multi_ret._0;\n    auto ret_1_ptr_ptr = multi_ret._1;\n    auto ret_1_ptr = std::make_shared<_ffi_Rc_Bar>(ret_1_ptr_ptr);\n    auto ret_1 = rust::Foo{std::move(ret_1_ptr)};\n    return std::make_tuple(ret_0, std::move(ret_1));\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_nested_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <tuple>\n#include <memory>\n\nnamespace rust {\n\nstruct Bar;\n\nstruct Bar {\n    virtual ~Bar() {}\n    virtual int32_t get() = 0;\n};\n\nstruct Foo {\n    std::shared_ptr<Bar> ptr;\n};\n\nuintptr_t rust_mem_leaked();\n\nstd::tuple<int32_t, Foo> test(int32_t x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_nested_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Bar__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Bar>) };\n    _self.get()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_drop_Rc_Bar(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Bar>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test(x: i32) -> _ffi_ret_i32_ptr {\n    let ret = test(x);\n    let ret_0 = ret.0;\n    let ret_1 = ret.1;\n    _ffi_ret_i32_ptr(ret_0, Box::into_raw(Box::new(ret_1.ptr)) as *const u8)\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr(i32, *const u8);\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_option_in_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_ptr_2_usize {\n    const char* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nextern \"C\" {\n\nvoid* _ffi_alloc(uintptr_t len);\nint32_t _ffi_fn_add_all(const void* buf_ptr, uintptr_t x_len);\nint32_t _ffi_fn_add_nested(const void* buf_ptr, bool has_x, bool has_y);\nint32_t _ffi_fn_add_option(const void* buf_ptr, bool has_x, bool has_y);\n_ffi_ret_ptr_2_usize _ffi_fn_join_all(const void* buf_ptr, uintptr_t x_len);\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\nconst void* _ffi_string_to_rust(const std::string& str, uintptr_t &len) {\n    len = str.size();\n    return memcpy(_ffi_alloc(len), str.data(), len);\n}\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_vec_option_i32_to_rust(std::vector<std::optional<int32_t>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        auto has_item = item.has_value();\n        _ffi_write(has_item, buf);\n        if (has_item) {\n            _ffi_write(item.value(), buf);\n        }\n    }\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\nvoid _ffi_vec_option_string_to_rust(std::vector<std::optional<std::string>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        auto has_item = item.has_value();\n        _ffi_write(has_item, buf);\n        if (has_item) {\n            uintptr_t item_val_len;\n            const void* item_val_ptr = _ffi_string_to_rust(item.value(), item_val_len);\n            _ffi_write(item_val_ptr, buf);\n            _ffi_write(item_val_len, buf);\n        }\n    }\n}\n\n} // namespace\n\nint32_t rust::add_all(std::vector<std::optional<int32_t>> x) {\n    std::vector<uint8_t> buf;\n    auto x_len = x.size();\n    _ffi_vec_option_i32_to_rust(std::move(x), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_add_all(buf_ptr, x_len);\n}\n\nint32_t rust::add_nested(std::optional<std::optional<int32_t>> x, std::optional<std::optional<int32_t>> y) {\n    std::vector<uint8_t> buf;\n    auto has_x = x.has_value();\n    if (has_x) {\n        auto has_x_val = x.value().has_value();\n        _ffi_write(has_x_val, buf);\n        if (has_x_val) {\n            _ffi_write(x.value().value(), buf);\n        }\n    }\n    auto has_y = y.has_value();\n    if (has_y) {\n        auto has_y_val = y.value().has_value();\n        _ffi_write(has_y_val, buf);\n        if (has_y_val) {\n            _ffi_write(y.value().value(), buf);\n        }\n    }\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_add_nested(buf_ptr, has_x, has_y);\n}\n\nint32_t rust::add_option(std::optional<int32_t> x, std::optional<int32_t> y) {\n    std::vector<uint8_t> buf;\n    auto has_x = x.has_value();\n    if (has_x) {\n        _ffi_write(x.value(), buf);\n    }\n    auto has_y = y.has_value();\n    if (has_y) {\n        _ffi_write(y.value(), buf);\n    }\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_add_option(buf_ptr, has_x, has_y);\n}\n\nstd::string rust::join_all(std::vector<std::optional<std::string>> x) {\n    std::vector<uint8_t> buf;\n    auto x_len = x.size();\n    _ffi_vec_option_string_to_rust(std::move(x), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_join_all(buf_ptr, x_len);\n    auto ret_ptr = multi_ret._0;\n    auto ret_len = multi_ret._1;\n    auto ret_cap = multi_ret._2;\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_option_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <optional>\n#include <stdint.h>\n#include <string>\n#include <vector>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nint32_t add_option(std::optional<int32_t> x, std::optional<int32_t> y);\n\nint32_t add_nested(std::optional<std::optional<int32_t>> x, std::optional<std::optional<int32_t>> y);\n\nint32_t add_all(std::vector<std::optional<int32_t>> x);\n\nstd::string join_all(std::vector<std::optional<std::string>> x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_option_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_all(buf_ptr: *const u8, x_len: usize) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_all(_ffi_vec_option_i32_from_cpp(x_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_nested(buf_ptr: *const u8, has_x: bool, has_y: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_nested(\n        has_x.then(|| _ffi_read::<bool>(&mut buf_end).then(|| _ffi_read::<i32>(&mut buf_end))),\n        has_y.then(|| _ffi_read::<bool>(&mut buf_end).then(|| _ffi_read::<i32>(&mut buf_end)))\n    );\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_option(buf_ptr: *const u8, has_x: bool, has_y: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_option(has_x.then(|| _ffi_read::<i32>(&mut buf_end)), has_y.then(|| _ffi_read::<i32>(&mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_join_all(buf_ptr: *const u8, x_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(join_all(_ffi_vec_option_string_from_cpp(x_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_option_i32_from_cpp(len: usize, end: &mut *const u8) -> Vec<Option<i32>> {\n    let mut items = Vec::<Option<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<bool>(end).then(|| _ffi_read::<i32>(end)));\n    }\n    items\n}\n\nfn _ffi_vec_option_string_from_cpp(len: usize, end: &mut *const u8) -> Vec<Option<String>> {\n    let mut items = Vec::<Option<String>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<bool>(end).then(|| _ffi_string_from_host(_ffi_read::<*const u8>(end), _ffi_read::<usize>(end))));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_option_in_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_ptr_2_usize {\n    const char* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nextern \"C\" {\n\nvoid* _ffi_alloc(uintptr_t len);\nint32_t _ffi_fn_add_all(const void* buf_ptr, uintptr_t x_len);\nint32_t _ffi_fn_add_nested(const void* buf_ptr, bool has_x, bool has_y);\nint32_t _ffi_fn_add_option(const void* buf_ptr, bool has_x, bool has_y);\n_ffi_ret_ptr_2_usize _ffi_fn_join_all(const void* buf_ptr, uintptr_t x_len);\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\nconst void* _ffi_string_to_rust(const std::string& str, uintptr_t &len) {\n    len = str.size();\n    return memcpy(_ffi_alloc(len), str.data(), len);\n}\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_vec_option_i32_to_rust(std::vector<std::optional<int32_t>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        auto has_item = item.has_value();\n        _ffi_write(has_item, buf);\n        if (has_item) {\n            _ffi_write(item.value(), buf);\n        }\n    }\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\nvoid _ffi_vec_option_string_to_rust(std::vector<std::optional<std::string>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        auto has_item = item.has_value();\n        _ffi_write(has_item, buf);\n        if (has_item) {\n            uintptr_t item_val_len;\n            const void* item_val_ptr = _ffi_string_to_rust(item.value(), item_val_len);\n            _ffi_write(item_val_ptr, buf);\n            _ffi_write(item_val_len, buf);\n        }\n    }\n}\n\n} // namespace\n\nint32_t rust::add_all(std::vector<std::optional<int32_t>> x) {\n    std::vector<uint8_t> buf;\n    auto x_len = x.size();\n    _ffi_vec_option_i32_to_rust(std::move(x), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_add_all(buf_ptr, x_len);\n}\n\nint32_t rust::add_nested(std::optional<std::optional<int32_t>> x, std::optional<std::optional<int32_t>> y) {\n    std::vector<uint8_t> buf;\n    auto has_x = x.has_value();\n    if (has_x) {\n        auto has_x_val = x.value().has_value();\n        _ffi_write(has_x_val, buf);\n        if (has_x_val) {\n            _ffi_write(x.value().value(), buf);\n        }\n    }\n    auto has_y = y.has_value();\n    if (has_y) {\n        auto has_y_val = y.value().has_value();\n        _ffi_write(has_y_val, buf);\n        if (has_y_val) {\n            _ffi_write(y.value().value(), buf);\n        }\n    }\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_add_nested(buf_ptr, has_x, has_y);\n}\n\nint32_t rust::add_option(std::optional<int32_t> x, std::optional<int32_t> y) {\n    std::vector<uint8_t> buf;\n    auto has_x = x.has_value();\n    if (has_x) {\n        _ffi_write(x.value(), buf);\n    }\n    auto has_y = y.has_value();\n    if (has_y) {\n        _ffi_write(y.value(), buf);\n    }\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_add_option(buf_ptr, has_x, has_y);\n}\n\nstd::string rust::join_all(std::vector<std::optional<std::string>> x) {\n    std::vector<uint8_t> buf;\n    auto x_len = x.size();\n    _ffi_vec_option_string_to_rust(std::move(x), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_join_all(buf_ptr, x_len);\n    auto ret_ptr = multi_ret._0;\n    auto ret_len = multi_ret._1;\n    auto ret_cap = multi_ret._2;\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_option_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <optional>\n#include <stdint.h>\n#include <string>\n#include <vector>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nint32_t add_option(std::optional<int32_t> x, std::optional<int32_t> y);\n\nint32_t add_nested(std::optional<std::optional<int32_t>> x, std::optional<std::optional<int32_t>> y);\n\nint32_t add_all(std::vector<std::optional<int32_t>> x);\n\nstd::string join_all(std::vector<std::optional<std::string>> x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_option_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_all(buf_ptr: *const u8, x_len: usize) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_all(_ffi_vec_option_i32_from_cpp(x_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_nested(buf_ptr: *const u8, has_x: bool, has_y: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_nested(\n        has_x.then(|| _ffi_read::<bool>(&mut buf_end).then(|| _ffi_read::<i32>(&mut buf_end))),\n        has_y.then(|| _ffi_read::<bool>(&mut buf_end).then(|| _ffi_read::<i32>(&mut buf_end)))\n    );\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_option(buf_ptr: *const u8, has_x: bool, has_y: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_option(has_x.then(|| _ffi_read::<i32>(&mut buf_end)), has_y.then(|| _ffi_read::<i32>(&mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_join_all(buf_ptr: *const u8, x_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(join_all(_ffi_vec_option_string_from_cpp(x_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_option_i32_from_cpp(len: usize, end: &mut *const u8) -> Vec<Option<i32>> {\n    let mut items = Vec::<Option<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<bool>(end).then(|| _ffi_read::<i32>(end)));\n    }\n    items\n}\n\nfn _ffi_vec_option_string_from_cpp(len: usize, end: &mut *const u8) -> Vec<Option<String>> {\n    let mut items = Vec::<Option<String>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<bool>(end).then(|| _ffi_string_from_host(_ffi_read::<*const u8>(end), _ffi_read::<usize>(end))));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_option_out_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_ptr_2_usize {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nstruct _ffi_ret_ptr_usize_bool {\n    const void* _0;\n    uintptr_t _1;\n    bool _2;\n};\n\nextern \"C\" {\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_int(bool x, int32_t y);\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_opt_int(bool x, bool y, int32_t z);\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_vec_opt_string(int32_t n);\nuintptr_t _ffi_fn_rust_mem_leaked();\n_ffi_ret_ptr_2_usize _ffi_fn_vec_opt_int(int32_t n);\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\nstd::vector<std::optional<std::string>> _ffi_vec_option_string_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::optional<std::string>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        std::optional<std::string> item;\n        if (_ffi_read<bool>(end)) {\n            auto item_val_ptr = _ffi_read<const char*>(end);\n            auto item_val_len = _ffi_read<uintptr_t>(end);\n            auto item_val_cap = _ffi_read<uintptr_t>(end);\n            item = std::make_optional(_ffi_string_from_rust(item_val_ptr, item_val_len, item_val_cap));\n        }\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nstd::vector<std::optional<int32_t>> _ffi_vec_option_i32_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::optional<int32_t>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item = _ffi_read<bool>(end) ? std::make_optional(_ffi_read<int32_t>(end)) : std::nullopt;\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\n} // namespace\n\nstd::optional<int32_t> rust::opt_int(bool x, int32_t y) {\n    auto multi_ret = _ffi_fn_opt_int(x, y);\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto has_ret = multi_ret._2;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret = has_ret ? std::make_optional(_ffi_read<int32_t>(buf_end)) : std::nullopt;\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nstd::optional<std::optional<int32_t>> rust::opt_opt_int(bool x, bool y, int32_t z) {\n    auto multi_ret = _ffi_fn_opt_opt_int(x, y, z);\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto has_ret = multi_ret._2;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret = has_ret ? std::make_optional(_ffi_read<bool>(buf_end) ? std::make_optional(_ffi_read<int32_t>(buf_end)) : std::nullopt) : std::nullopt;\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nstd::optional<std::vector<std::optional<std::string>>> rust::opt_vec_opt_string(int32_t n) {\n    auto multi_ret = _ffi_fn_opt_vec_opt_string(n);\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto has_ret = multi_ret._2;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    std::optional<std::vector<std::optional<std::string>>> ret;\n    if (has_ret) {\n        auto ret_val_len = _ffi_read<uintptr_t>(buf_end);\n        ret = std::make_optional(_ffi_vec_option_string_from_rust(ret_val_len, buf_end));\n    }\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nstd::vector<std::optional<int32_t>> rust::vec_opt_int(int32_t n) {\n    auto multi_ret = _ffi_fn_vec_opt_int(n);\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_len = multi_ret._2;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret = _ffi_vec_option_i32_from_rust(ret_len, buf_end);\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_option_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <optional>\n#include <stdint.h>\n#include <string>\n#include <vector>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nstd::optional<int32_t> opt_int(bool x, int32_t y);\n\nstd::optional<std::optional<int32_t>> opt_opt_int(bool x, bool y, int32_t z);\n\nstd::vector<std::optional<int32_t>> vec_opt_int(int32_t n);\n\nstd::optional<std::vector<std::optional<std::string>>> opt_vec_opt_string(int32_t n);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_option_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_int(x: bool, y: i32) -> _ffi_ret_ptr_usize_bool {\n    let ret = opt_int(x, y);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_opt_int(x: bool, y: bool, z: i32) -> _ffi_ret_ptr_usize_bool {\n    let ret = opt_opt_int(x, y, z);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val.is_some(), &mut buf);\n        if let Some(ret_val_val) = ret_val {\n            _ffi_write(ret_val_val, &mut buf);\n        }\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_vec_opt_string(n: i32) -> _ffi_ret_ptr_usize_bool {\n    let ret = opt_vec_opt_string(n);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val.len(), &mut buf);\n        _ffi_vec_option_string_to_cpp(ret_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_opt_int(n: i32) -> _ffi_ret_ptr_2_usize {\n    let ret = vec_opt_int(n);\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_option_i32_to_cpp(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len)\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize_bool(*const u8, usize, bool);\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_option_i32_to_cpp(items: Vec<Option<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.is_some(), buf);\n        if let Some(item_val) = item {\n            _ffi_write(item_val, buf);\n        }\n    }\n}\n\nfn _ffi_vec_option_string_to_cpp(items: Vec<Option<String>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.is_some(), buf);\n        if let Some(item_val) = item {\n            let (item_val_ptr, item_val_len, item_val_cap) = _ffi_string_to_host(item_val);\n            _ffi_write(item_val_ptr, buf);\n            _ffi_write(item_val_len, buf);\n            _ffi_write(item_val_cap, buf);\n        }\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_option_out_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_ptr_2_usize {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nstruct _ffi_ret_ptr_usize_bool {\n    const void* _0;\n    uintptr_t _1;\n    bool _2;\n};\n\nextern \"C\" {\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_int(bool x, int32_t y);\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_opt_int(bool x, bool y, int32_t z);\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_vec_opt_string(int32_t n);\nuintptr_t _ffi_fn_rust_mem_leaked();\n_ffi_ret_ptr_2_usize _ffi_fn_vec_opt_int(int32_t n);\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\nstd::vector<std::optional<std::string>> _ffi_vec_option_string_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::optional<std::string>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        std::optional<std::string> item;\n        if (_ffi_read<bool>(end)) {\n            auto item_val_ptr = _ffi_read<const char*>(end);\n            auto item_val_len = _ffi_read<uintptr_t>(end);\n            auto item_val_cap = _ffi_read<uintptr_t>(end);\n            item = std::make_optional(_ffi_string_from_rust(item_val_ptr, item_val_len, item_val_cap));\n        }\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\nstd::vector<std::optional<int32_t>> _ffi_vec_option_i32_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::optional<int32_t>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item = _ffi_read<bool>(end) ? std::make_optional(_ffi_read<int32_t>(end)) : std::nullopt;\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\n} // namespace\n\nstd::optional<int32_t> rust::opt_int(bool x, int32_t y) {\n    auto multi_ret = _ffi_fn_opt_int(x, y);\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto has_ret = multi_ret._2;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret = has_ret ? std::make_optional(_ffi_read<int32_t>(buf_end)) : std::nullopt;\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nstd::optional<std::optional<int32_t>> rust::opt_opt_int(bool x, bool y, int32_t z) {\n    auto multi_ret = _ffi_fn_opt_opt_int(x, y, z);\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto has_ret = multi_ret._2;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret = has_ret ? std::make_optional(_ffi_read<bool>(buf_end) ? std::make_optional(_ffi_read<int32_t>(buf_end)) : std::nullopt) : std::nullopt;\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nstd::optional<std::vector<std::optional<std::string>>> rust::opt_vec_opt_string(int32_t n) {\n    auto multi_ret = _ffi_fn_opt_vec_opt_string(n);\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto has_ret = multi_ret._2;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    std::optional<std::vector<std::optional<std::string>>> ret;\n    if (has_ret) {\n        auto ret_val_len = _ffi_read<uintptr_t>(buf_end);\n        ret = std::make_optional(_ffi_vec_option_string_from_rust(ret_val_len, buf_end));\n    }\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nstd::vector<std::optional<int32_t>> rust::vec_opt_int(int32_t n) {\n    auto multi_ret = _ffi_fn_vec_opt_int(n);\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_len = multi_ret._2;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret = _ffi_vec_option_i32_from_rust(ret_len, buf_end);\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_option_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <optional>\n#include <stdint.h>\n#include <string>\n#include <vector>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nstd::optional<int32_t> opt_int(bool x, int32_t y);\n\nstd::optional<std::optional<int32_t>> opt_opt_int(bool x, bool y, int32_t z);\n\nstd::vector<std::optional<int32_t>> vec_opt_int(int32_t n);\n\nstd::optional<std::vector<std::optional<std::string>>> opt_vec_opt_string(int32_t n);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_option_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_int(x: bool, y: i32) -> _ffi_ret_ptr_usize_bool {\n    let ret = opt_int(x, y);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_opt_int(x: bool, y: bool, z: i32) -> _ffi_ret_ptr_usize_bool {\n    let ret = opt_opt_int(x, y, z);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val.is_some(), &mut buf);\n        if let Some(ret_val_val) = ret_val {\n            _ffi_write(ret_val_val, &mut buf);\n        }\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_vec_opt_string(n: i32) -> _ffi_ret_ptr_usize_bool {\n    let ret = opt_vec_opt_string(n);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val.len(), &mut buf);\n        _ffi_vec_option_string_to_cpp(ret_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_opt_int(n: i32) -> _ffi_ret_ptr_2_usize {\n    let ret = vec_opt_int(n);\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_option_i32_to_cpp(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len)\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize_bool(*const u8, usize, bool);\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_option_i32_to_cpp(items: Vec<Option<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.is_some(), buf);\n        if let Some(item_val) = item {\n            _ffi_write(item_val, buf);\n        }\n    }\n}\n\nfn _ffi_vec_option_string_to_cpp(items: Vec<Option<String>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.is_some(), buf);\n        if let Some(item_val) = item {\n            let (item_val_ptr, item_val_len, item_val_cap) = _ffi_string_to_host(item_val);\n            _ffi_write(item_val_ptr, buf);\n            _ffi_write(item_val_len, buf);\n            _ffi_write(item_val_cap, buf);\n        }\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_payload_in_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n#include <stdlib.h>\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\nbool _ffi_fn_set_tests(const void* buf_ptr, uintptr_t tests_len);\nvoid* _ffi_alloc(uintptr_t len);\n\n} // extern \"C\"\n\nnamespace {\n\nvoid _ffi_enum_Foo_to_rust(rust::Foo val, std::vector<uint8_t>& buf);\n\nvoid _ffi_box_Foo_to_rust(rust::Foo val, std::vector<uint8_t>& buf) {\n    _ffi_enum_Foo_to_rust(std::move(val), buf);\n}\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_enum_Foo_to_rust(rust::Foo val, std::vector<uint8_t>& buf) {\n    if (val.is<rust::Foo::Empty>()) {\n        _ffi_write(int32_t(0), buf);\n    } else if (auto it = val.as<rust::Foo::Single>()) {\n        _ffi_write(int32_t(1), buf);\n        _ffi_write(it->_0, buf);\n    } else if (auto it = val.as<rust::Foo::Point>()) {\n        _ffi_write(int32_t(2), buf);\n        _ffi_write(it->x, buf);\n        _ffi_write(it->y, buf);\n    } else if (auto it = val.as<rust::Foo::Nested>()) {\n        _ffi_write(int32_t(3), buf);\n        _ffi_box_Foo_to_rust(std::move(*it->_0), buf);\n    } else {\n        abort();\n    }\n}\n\nvoid _ffi_vec_Foo_to_rust(std::vector<rust::Foo>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_enum_Foo_to_rust(std::move(item), buf);\n    }\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\n} // namespace\n\nbool rust::detail::Foo__Nested::operator == (const rust::detail::Foo__Nested& f) const {\n    return *_0 == *f._0;\n}\n\nbool rust::detail::Foo__Point::operator == (const rust::detail::Foo__Point& f) const {\n    return x == f.x && y == f.y;\n}\n\nbool rust::detail::Foo__Single::operator == (const rust::detail::Foo__Single& f) const {\n    return _0 == f._0;\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nbool rust::set_tests(std::vector<rust::Foo> tests) {\n    std::vector<uint8_t> buf;\n    auto tests_len = tests.size();\n    _ffi_vec_Foo_to_rust(std::move(tests), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_set_tests(buf_ptr, tests_len);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_payload_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include <variant>\n#include <memory>\n\nnamespace rust {\n\nstruct Foo;\n\nnamespace detail {\n\nstruct Foo__Empty {\n    bool operator == (const Foo__Empty&) const { return true; }\n    bool operator != (const Foo__Empty& f) const { return !(*this == f); }\n};\n\nstruct Foo__Single {\n    int32_t _0 = 0;\n    bool operator == (const Foo__Single&) const;\n    bool operator != (const Foo__Single& f) const { return !(*this == f); }\n};\n\nstruct Foo__Point {\n    int32_t x = 0;\n    int32_t y = 0;\n    bool operator == (const Foo__Point&) const;\n    bool operator != (const Foo__Point& f) const { return !(*this == f); }\n};\n\nstruct Foo__Nested {\n    std::unique_ptr<Foo> _0;\n    bool operator == (const Foo__Nested&) const;\n    bool operator != (const Foo__Nested& f) const { return !(*this == f); }\n};\n\n} // namespace detail\n\nstruct Foo : std::variant<std::monostate, detail::Foo__Empty, detail::Foo__Single, detail::Foo__Point, detail::Foo__Nested> {\n    using Empty = detail::Foo__Empty;\n    using Single = detail::Foo__Single;\n    using Point = detail::Foo__Point;\n    using Nested = detail::Foo__Nested;\n    using std::variant<std::monostate, Empty, Single, Point, Nested>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nuintptr_t rust_mem_leaked();\n\nbool set_tests(std::vector<Foo> tests);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_payload_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Foo_from_cpp(end: &mut *const u8) -> Box<Foo> {\n    Box::new(_ffi_enum_Foo_from_cpp(end))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_from_cpp(end: &mut *const u8) -> Foo {\n    match _ffi_read::<i32>(end) {\n        0 => Foo::Empty,\n        1 => Foo::Single(_ffi_read::<i32>(end)),\n        2 => Foo::Point { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        3 => Foo::Nested(_ffi_box_Foo_from_cpp(end)),\n        _ => panic!(),\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_tests(buf_ptr: *const u8, tests_len: usize) -> bool {\n    let mut buf_end = buf_ptr;\n    let ret = set_tests(_ffi_vec_Foo_from_cpp(tests_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_from_cpp(len: usize, end: &mut *const u8) -> Vec<Foo> {\n    let mut items = Vec::<Foo>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_enum_Foo_from_cpp(end));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_payload_in_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n#include <stdlib.h>\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\nbool _ffi_fn_set_tests(const void* buf_ptr, uintptr_t tests_len);\nvoid* _ffi_alloc(uintptr_t len);\n\n} // extern \"C\"\n\nnamespace {\n\nvoid _ffi_enum_Foo_to_rust(rust::Foo val, std::vector<uint8_t>& buf);\n\nvoid _ffi_box_Foo_to_rust(rust::Foo val, std::vector<uint8_t>& buf) {\n    _ffi_enum_Foo_to_rust(std::move(val), buf);\n}\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_enum_Foo_to_rust(rust::Foo val, std::vector<uint8_t>& buf) {\n    if (val.is<rust::Foo::Empty>()) {\n        _ffi_write(int32_t(0), buf);\n    } else if (auto it = val.as<rust::Foo::Single>()) {\n        _ffi_write(int32_t(1), buf);\n        _ffi_write(it->_0, buf);\n    } else if (auto it = val.as<rust::Foo::Point>()) {\n        _ffi_write(int32_t(2), buf);\n        _ffi_write(it->x, buf);\n        _ffi_write(it->y, buf);\n    } else if (auto it = val.as<rust::Foo::Nested>()) {\n        _ffi_write(int32_t(3), buf);\n        _ffi_box_Foo_to_rust(std::move(*it->_0), buf);\n    } else {\n        abort();\n    }\n}\n\nvoid _ffi_vec_Foo_to_rust(std::vector<rust::Foo>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_enum_Foo_to_rust(std::move(item), buf);\n    }\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\n} // namespace\n\nbool rust::detail::Foo__Nested::operator == (const rust::detail::Foo__Nested& f) const {\n    return *_0 == *f._0;\n}\n\nbool rust::detail::Foo__Point::operator == (const rust::detail::Foo__Point& f) const {\n    return x == f.x && y == f.y;\n}\n\nbool rust::detail::Foo__Single::operator == (const rust::detail::Foo__Single& f) const {\n    return _0 == f._0;\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nbool rust::set_tests(std::vector<rust::Foo> tests) {\n    std::vector<uint8_t> buf;\n    auto tests_len = tests.size();\n    _ffi_vec_Foo_to_rust(std::move(tests), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_set_tests(buf_ptr, tests_len);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_payload_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include <variant>\n#include <memory>\n\nnamespace rust {\n\nstruct Foo;\n\nnamespace detail {\n\nstruct Foo__Empty {\n    bool operator == (const Foo__Empty&) const { return true; }\n    bool operator != (const Foo__Empty& f) const { return !(*this == f); }\n};\n\nstruct Foo__Single {\n    int32_t _0 = 0;\n    bool operator == (const Foo__Single&) const;\n    bool operator != (const Foo__Single& f) const { return !(*this == f); }\n};\n\nstruct Foo__Point {\n    int32_t x = 0;\n    int32_t y = 0;\n    bool operator == (const Foo__Point&) const;\n    bool operator != (const Foo__Point& f) const { return !(*this == f); }\n};\n\nstruct Foo__Nested {\n    std::unique_ptr<Foo> _0;\n    bool operator == (const Foo__Nested&) const;\n    bool operator != (const Foo__Nested& f) const { return !(*this == f); }\n};\n\n} // namespace detail\n\nstruct Foo : std::variant<std::monostate, detail::Foo__Empty, detail::Foo__Single, detail::Foo__Point, detail::Foo__Nested> {\n    using Empty = detail::Foo__Empty;\n    using Single = detail::Foo__Single;\n    using Point = detail::Foo__Point;\n    using Nested = detail::Foo__Nested;\n    using std::variant<std::monostate, Empty, Single, Point, Nested>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nuintptr_t rust_mem_leaked();\n\nbool set_tests(std::vector<Foo> tests);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_payload_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Foo_from_cpp(end: &mut *const u8) -> Box<Foo> {\n    Box::new(_ffi_enum_Foo_from_cpp(end))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_from_cpp(end: &mut *const u8) -> Foo {\n    match _ffi_read::<i32>(end) {\n        0 => Foo::Empty,\n        1 => Foo::Single(_ffi_read::<i32>(end)),\n        2 => Foo::Point { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        3 => Foo::Nested(_ffi_box_Foo_from_cpp(end)),\n        _ => panic!(),\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_tests(buf_ptr: *const u8, tests_len: usize) -> bool {\n    let mut buf_end = buf_ptr;\n    let ret = set_tests(_ffi_vec_Foo_from_cpp(tests_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_from_cpp(len: usize, end: &mut *const u8) -> Vec<Foo> {\n    let mut items = Vec::<Foo>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_enum_Foo_from_cpp(end));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_payload_out_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n#include <stdlib.h>\n\nstruct _ffi_ret_ptr_2_usize {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nextern \"C\" {\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n_ffi_ret_ptr_2_usize _ffi_fn_get_tests();\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\nrust::Foo _ffi_enum_Foo_from_rust(const uint8_t*& end);\n\nstd::unique_ptr<rust::Foo> _ffi_box_Foo_from_rust(const uint8_t*& end) {\n    auto val = _ffi_enum_Foo_from_rust(end);\n    return std::make_unique<rust::Foo>(std::move(val));\n}\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nrust::Foo _ffi_enum_Foo_from_rust(const uint8_t*& end) {\n    switch (_ffi_read<int32_t>(end)) {\n    case 0:\n        return rust::Foo{rust::Foo::Empty{}};\n    case 1: {\n        auto x = _ffi_read<int32_t>(end);\n        return rust::Foo{rust::Foo::Single{x}};\n    }\n    case 2: {\n        auto x = _ffi_read<int32_t>(end);\n        auto y = _ffi_read<int32_t>(end);\n        return rust::Foo{rust::Foo::Point{x, y}};\n    }\n    case 3: {\n        auto x = _ffi_box_Foo_from_rust(end);\n        return rust::Foo{rust::Foo::Nested{std::move(x)}};\n    }\n    default:\n        abort();\n    }\n}\n\nstd::vector<rust::Foo> _ffi_vec_Foo_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<rust::Foo> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item = _ffi_enum_Foo_from_rust(end);\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\n} // namespace\n\nbool rust::detail::Foo__Nested::operator == (const rust::detail::Foo__Nested& f) const {\n    return *_0 == *f._0;\n}\n\nbool rust::detail::Foo__Point::operator == (const rust::detail::Foo__Point& f) const {\n    return x == f.x && y == f.y;\n}\n\nbool rust::detail::Foo__Single::operator == (const rust::detail::Foo__Single& f) const {\n    return _0 == f._0;\n}\n\nstd::vector<rust::Foo> rust::get_tests() {\n    auto multi_ret = _ffi_fn_get_tests();\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_len = multi_ret._2;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret = _ffi_vec_Foo_from_rust(ret_len, buf_end);\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_payload_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include <variant>\n#include <memory>\n\nnamespace rust {\n\nstruct Foo;\n\nnamespace detail {\n\nstruct Foo__Empty {\n    bool operator == (const Foo__Empty&) const { return true; }\n    bool operator != (const Foo__Empty& f) const { return !(*this == f); }\n};\n\nstruct Foo__Single {\n    int32_t _0 = 0;\n    bool operator == (const Foo__Single&) const;\n    bool operator != (const Foo__Single& f) const { return !(*this == f); }\n};\n\nstruct Foo__Point {\n    int32_t x = 0;\n    int32_t y = 0;\n    bool operator == (const Foo__Point&) const;\n    bool operator != (const Foo__Point& f) const { return !(*this == f); }\n};\n\nstruct Foo__Nested {\n    std::unique_ptr<Foo> _0;\n    bool operator == (const Foo__Nested&) const;\n    bool operator != (const Foo__Nested& f) const { return !(*this == f); }\n};\n\n} // namespace detail\n\nstruct Foo : std::variant<std::monostate, detail::Foo__Empty, detail::Foo__Single, detail::Foo__Point, detail::Foo__Nested> {\n    using Empty = detail::Foo__Empty;\n    using Single = detail::Foo__Single;\n    using Point = detail::Foo__Point;\n    using Nested = detail::Foo__Nested;\n    using std::variant<std::monostate, Empty, Single, Point, Nested>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nuintptr_t rust_mem_leaked();\n\nstd::vector<Foo> get_tests();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_payload_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Foo_to_cpp(val: Foo, buf: &mut Vec<u8>) {\n    _ffi_enum_Foo_to_cpp(val, buf);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_to_cpp(val: Foo, buf: &mut Vec<u8>) {\n    match val {\n        Foo::Empty => _ffi_write(0 as i32, buf),\n        Foo::Single(x) => {\n            _ffi_write(1 as i32, buf);\n            _ffi_write(x, buf);\n        }\n        Foo::Point { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n        Foo::Nested(x) => {\n            _ffi_write(3 as i32, buf);\n            _ffi_box_Foo_to_cpp(*x, buf);\n        }\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_tests() -> _ffi_ret_ptr_2_usize {\n    let ret = get_tests();\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_Foo_to_cpp(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_to_cpp(items: Vec<Foo>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_enum_Foo_to_cpp(item, buf);\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_payload_out_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n#include <stdlib.h>\n\nstruct _ffi_ret_ptr_2_usize {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nextern \"C\" {\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n_ffi_ret_ptr_2_usize _ffi_fn_get_tests();\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\nrust::Foo _ffi_enum_Foo_from_rust(const uint8_t*& end);\n\nstd::unique_ptr<rust::Foo> _ffi_box_Foo_from_rust(const uint8_t*& end) {\n    auto val = _ffi_enum_Foo_from_rust(end);\n    return std::make_unique<rust::Foo>(std::move(val));\n}\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nrust::Foo _ffi_enum_Foo_from_rust(const uint8_t*& end) {\n    switch (_ffi_read<int32_t>(end)) {\n    case 0:\n        return rust::Foo{rust::Foo::Empty{}};\n    case 1: {\n        auto x = _ffi_read<int32_t>(end);\n        return rust::Foo{rust::Foo::Single{x}};\n    }\n    case 2: {\n        auto x = _ffi_read<int32_t>(end);\n        auto y = _ffi_read<int32_t>(end);\n        return rust::Foo{rust::Foo::Point{x, y}};\n    }\n    case 3: {\n        auto x = _ffi_box_Foo_from_rust(end);\n        return rust::Foo{rust::Foo::Nested{std::move(x)}};\n    }\n    default:\n        abort();\n    }\n}\n\nstd::vector<rust::Foo> _ffi_vec_Foo_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<rust::Foo> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item = _ffi_enum_Foo_from_rust(end);\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\n} // namespace\n\nbool rust::detail::Foo__Nested::operator == (const rust::detail::Foo__Nested& f) const {\n    return *_0 == *f._0;\n}\n\nbool rust::detail::Foo__Point::operator == (const rust::detail::Foo__Point& f) const {\n    return x == f.x && y == f.y;\n}\n\nbool rust::detail::Foo__Single::operator == (const rust::detail::Foo__Single& f) const {\n    return _0 == f._0;\n}\n\nstd::vector<rust::Foo> rust::get_tests() {\n    auto multi_ret = _ffi_fn_get_tests();\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_len = multi_ret._2;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret = _ffi_vec_Foo_from_rust(ret_len, buf_end);\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_payload_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <vector>\n#include <variant>\n#include <memory>\n\nnamespace rust {\n\nstruct Foo;\n\nnamespace detail {\n\nstruct Foo__Empty {\n    bool operator == (const Foo__Empty&) const { return true; }\n    bool operator != (const Foo__Empty& f) const { return !(*this == f); }\n};\n\nstruct Foo__Single {\n    int32_t _0 = 0;\n    bool operator == (const Foo__Single&) const;\n    bool operator != (const Foo__Single& f) const { return !(*this == f); }\n};\n\nstruct Foo__Point {\n    int32_t x = 0;\n    int32_t y = 0;\n    bool operator == (const Foo__Point&) const;\n    bool operator != (const Foo__Point& f) const { return !(*this == f); }\n};\n\nstruct Foo__Nested {\n    std::unique_ptr<Foo> _0;\n    bool operator == (const Foo__Nested&) const;\n    bool operator != (const Foo__Nested& f) const { return !(*this == f); }\n};\n\n} // namespace detail\n\nstruct Foo : std::variant<std::monostate, detail::Foo__Empty, detail::Foo__Single, detail::Foo__Point, detail::Foo__Nested> {\n    using Empty = detail::Foo__Empty;\n    using Single = detail::Foo__Single;\n    using Point = detail::Foo__Point;\n    using Nested = detail::Foo__Nested;\n    using std::variant<std::monostate, Empty, Single, Point, Nested>::operator =;\n    template <typename T> bool is() const { return std::holds_alternative<T>(*this); }\n    template <typename T> const T* as() const { return std::get_if<T>(this); }\n    template <typename T> T* as() { return std::get_if<T>(this); }\n};\n\nuintptr_t rust_mem_leaked();\n\nstd::vector<Foo> get_tests();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_payload_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Foo_to_cpp(val: Foo, buf: &mut Vec<u8>) {\n    _ffi_enum_Foo_to_cpp(val, buf);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_to_cpp(val: Foo, buf: &mut Vec<u8>) {\n    match val {\n        Foo::Empty => _ffi_write(0 as i32, buf),\n        Foo::Single(x) => {\n            _ffi_write(1 as i32, buf);\n            _ffi_write(x, buf);\n        }\n        Foo::Point { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n        Foo::Nested(x) => {\n            _ffi_write(3 as i32, buf);\n            _ffi_box_Foo_to_cpp(*x, buf);\n        }\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_tests() -> _ffi_ret_ptr_2_usize {\n    let ret = get_tests();\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_Foo_to_cpp(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_to_cpp(items: Vec<Foo>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_enum_Foo_to_cpp(item, buf);\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_string_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_ptr_2_usize {\n    const char* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nextern \"C\" {\n\nvoid* _ffi_alloc(uintptr_t len);\n_ffi_ret_ptr_2_usize _ffi_fn_get_string();\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\nint32_t _ffi_fn_get_string_len();\nvoid _ffi_fn_reset();\nuintptr_t _ffi_fn_rust_mem_leaked();\nvoid _ffi_fn_set_str(const void* x_ptr, uintptr_t x_len);\nvoid _ffi_fn_set_string(const void* x_ptr, uintptr_t x_len);\n\n} // extern \"C\"\n\nnamespace {\n\nconst void* _ffi_string_to_rust(const std::string& str, uintptr_t &len) {\n    len = str.size();\n    return memcpy(_ffi_alloc(len), str.data(), len);\n}\n\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\n} // namespace\n\nstd::string rust::get_string() {\n    auto multi_ret = _ffi_fn_get_string();\n    auto ret_ptr = multi_ret._0;\n    auto ret_len = multi_ret._1;\n    auto ret_cap = multi_ret._2;\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nint32_t rust::get_string_len() {\n    return _ffi_fn_get_string_len();\n}\n\nvoid rust::reset() {\n    _ffi_fn_reset();\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nvoid rust::set_str(std::string x) {\n    uintptr_t x_len;\n    const void* x_ptr = _ffi_string_to_rust(x, x_len);\n    _ffi_fn_set_str(x_ptr, x_len);\n}\n\nvoid rust::set_string(std::string x) {\n    uintptr_t x_len;\n    const void* x_ptr = _ffi_string_to_rust(x, x_len);\n    _ffi_fn_set_string(x_ptr, x_len);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_string_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <string>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nvoid reset();\n\nint32_t get_string_len();\n\nstd::string get_string();\n\nvoid set_string(std::string x);\n\nvoid set_str(std::string x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_string_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_string() -> _ffi_ret_ptr_2_usize {\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(get_string());\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_string_len() -> i32 {\n    get_string_len()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_reset() {\n    reset();\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_str(x_ptr: *const u8, x_len: usize) {\n    set_str(&_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_string(x_ptr: *const u8, x_len: usize) {\n    set_string(_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_string_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_ptr_2_usize {\n    const char* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nextern \"C\" {\n\nvoid* _ffi_alloc(uintptr_t len);\n_ffi_ret_ptr_2_usize _ffi_fn_get_string();\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\nint32_t _ffi_fn_get_string_len();\nvoid _ffi_fn_reset();\nuintptr_t _ffi_fn_rust_mem_leaked();\nvoid _ffi_fn_set_str(const void* x_ptr, uintptr_t x_len);\nvoid _ffi_fn_set_string(const void* x_ptr, uintptr_t x_len);\n\n} // extern \"C\"\n\nnamespace {\n\nconst void* _ffi_string_to_rust(const std::string& str, uintptr_t &len) {\n    len = str.size();\n    return memcpy(_ffi_alloc(len), str.data(), len);\n}\n\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\n} // namespace\n\nstd::string rust::get_string() {\n    auto multi_ret = _ffi_fn_get_string();\n    auto ret_ptr = multi_ret._0;\n    auto ret_len = multi_ret._1;\n    auto ret_cap = multi_ret._2;\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nint32_t rust::get_string_len() {\n    return _ffi_fn_get_string_len();\n}\n\nvoid rust::reset() {\n    _ffi_fn_reset();\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nvoid rust::set_str(std::string x) {\n    uintptr_t x_len;\n    const void* x_ptr = _ffi_string_to_rust(x, x_len);\n    _ffi_fn_set_str(x_ptr, x_len);\n}\n\nvoid rust::set_string(std::string x) {\n    uintptr_t x_len;\n    const void* x_ptr = _ffi_string_to_rust(x, x_len);\n    _ffi_fn_set_string(x_ptr, x_len);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_string_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <string>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nvoid reset();\n\nint32_t get_string_len();\n\nstd::string get_string();\n\nvoid set_string(std::string x);\n\nvoid set_str(std::string x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_string_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_string() -> _ffi_ret_ptr_2_usize {\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(get_string());\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_string_len() -> i32 {\n    get_string_len()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_reset() {\n    reset();\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_str(x_ptr: *const u8, x_len: usize) {\n    set_str(&_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_string(x_ptr: *const u8, x_len: usize) {\n    set_string(_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_struct_in_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nint32_t _ffi_fn_empty_tuple(int32_t x, int32_t y);\nfloat _ffi_fn_multiply_pairs(float ab_x, float ab_y, float cd_x, float cd_y);\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_single_element_tuple(int32_t x_0, int32_t y_0);\n\n} // extern \"C\"\n\nint32_t rust::empty_tuple(int32_t x, rust::EmptyStruct foo, int32_t y) {\n    (void)foo;\n    return _ffi_fn_empty_tuple(x, y);\n}\n\nfloat rust::multiply_pairs(rust::PairStruct ab, rust::PairStruct cd) {\n    return _ffi_fn_multiply_pairs(ab.x, ab.y, cd.x, cd.y);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::single_element_tuple(rust::SingleElementStruct x, rust::SingleElementStruct y) {\n    return _ffi_fn_single_element_tuple(x._0, y._0);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_struct_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\nnamespace rust {\n\nstruct EmptyStruct {\n};\n\nstruct PairStruct {\n    float x = 0.0f;\n    float y = 0.0f;\n};\n\nstruct SingleElementStruct {\n    int32_t _0 = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nint32_t empty_tuple(int32_t x, EmptyStruct foo, int32_t y);\n\nint32_t single_element_tuple(SingleElementStruct x, SingleElementStruct y);\n\nfloat multiply_pairs(PairStruct ab, PairStruct cd);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_struct_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_empty_tuple(x: i32, y: i32) -> i32 {\n    empty_tuple(x, EmptyStruct, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_multiply_pairs(ab_x: f32, ab_y: f32, cd_x: f32, cd_y: f32) -> f32 {\n    multiply_pairs(PairStruct { x: ab_x, y: ab_y }, PairStruct { x: cd_x, y: cd_y })\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_single_element_tuple(x_0: i32, y_0: i32) -> i32 {\n    single_element_tuple(SingleElementStruct(x_0), SingleElementStruct(y_0))\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_struct_in_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nint32_t _ffi_fn_empty_tuple(int32_t x, int32_t y);\nfloat _ffi_fn_multiply_pairs(float ab_x, float ab_y, float cd_x, float cd_y);\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_single_element_tuple(int32_t x_0, int32_t y_0);\n\n} // extern \"C\"\n\nint32_t rust::empty_tuple(int32_t x, rust::EmptyStruct foo, int32_t y) {\n    (void)foo;\n    return _ffi_fn_empty_tuple(x, y);\n}\n\nfloat rust::multiply_pairs(rust::PairStruct ab, rust::PairStruct cd) {\n    return _ffi_fn_multiply_pairs(ab.x, ab.y, cd.x, cd.y);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::single_element_tuple(rust::SingleElementStruct x, rust::SingleElementStruct y) {\n    return _ffi_fn_single_element_tuple(x._0, y._0);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_struct_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\nnamespace rust {\n\nstruct EmptyStruct {\n};\n\nstruct PairStruct {\n    float x = 0.0f;\n    float y = 0.0f;\n};\n\nstruct SingleElementStruct {\n    int32_t _0 = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nint32_t empty_tuple(int32_t x, EmptyStruct foo, int32_t y);\n\nint32_t single_element_tuple(SingleElementStruct x, SingleElementStruct y);\n\nfloat multiply_pairs(PairStruct ab, PairStruct cd);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_struct_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_empty_tuple(x: i32, y: i32) -> i32 {\n    empty_tuple(x, EmptyStruct, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_multiply_pairs(ab_x: f32, ab_y: f32, cd_x: f32, cd_y: f32) -> f32 {\n    multiply_pairs(PairStruct { x: ab_x, y: ab_y }, PairStruct { x: cd_x, y: cd_y })\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_single_element_tuple(x_0: i32, y_0: i32) -> i32 {\n    single_element_tuple(SingleElementStruct(x_0), SingleElementStruct(y_0))\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_struct_out_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_2_f32 {\n    float _0;\n    float _1;\n};\n\nextern \"C\" {\n\nvoid _ffi_fn_empty_struct();\n_ffi_ret_2_f32 _ffi_fn_make_pair(float x, float y);\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_single_element_struct(int32_t x);\n\n} // extern \"C\"\n\nbool rust::PairStruct::operator == (const rust::PairStruct& p) const {\n    return x == p.x && y == p.y;\n}\n\nbool rust::SingleElementStruct::operator == (const rust::SingleElementStruct& s) const {\n    return _0 == s._0;\n}\n\nrust::EmptyStruct rust::empty_struct() {\n    _ffi_fn_empty_struct();\n    return rust::EmptyStruct{};\n}\n\nrust::PairStruct rust::make_pair(float x, float y) {\n    auto multi_ret = _ffi_fn_make_pair(x, y);\n    auto ret_x = multi_ret._0;\n    auto ret_y = multi_ret._1;\n    return rust::PairStruct{ret_x, ret_y};\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nrust::SingleElementStruct rust::single_element_struct(int32_t x) {\n    auto ret_0 = _ffi_fn_single_element_struct(x);\n    return rust::SingleElementStruct{ret_0};\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_struct_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\nnamespace rust {\n\nstruct EmptyStruct {\n    bool operator == (const EmptyStruct&) const { return true; }\n    bool operator != (const EmptyStruct& e) const { return !(*this == e); }\n};\n\nstruct PairStruct {\n    float x = 0.0f;\n    float y = 0.0f;\n    bool operator == (const PairStruct&) const;\n    bool operator != (const PairStruct& p) const { return !(*this == p); }\n};\n\nstruct SingleElementStruct {\n    int32_t _0 = 0;\n    bool operator == (const SingleElementStruct&) const;\n    bool operator != (const SingleElementStruct& s) const { return !(*this == s); }\n};\n\nuintptr_t rust_mem_leaked();\n\nEmptyStruct empty_struct();\n\nSingleElementStruct single_element_struct(int32_t x);\n\nPairStruct make_pair(float x, float y);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_struct_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_empty_struct() {\n    _ = empty_struct();\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_make_pair(x: f32, y: f32) -> _ffi_ret_2_f32 {\n    let ret = make_pair(x, y);\n    _ffi_ret_2_f32(ret.x, ret.y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_single_element_struct(x: i32) -> i32 {\n    let ret = single_element_struct(x);\n    ret.0\n}\n\n#[repr(C)]\nstruct _ffi_ret_2_f32(f32, f32);\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_struct_out_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_2_f32 {\n    float _0;\n    float _1;\n};\n\nextern \"C\" {\n\nvoid _ffi_fn_empty_struct();\n_ffi_ret_2_f32 _ffi_fn_make_pair(float x, float y);\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_single_element_struct(int32_t x);\n\n} // extern \"C\"\n\nbool rust::PairStruct::operator == (const rust::PairStruct& p) const {\n    return x == p.x && y == p.y;\n}\n\nbool rust::SingleElementStruct::operator == (const rust::SingleElementStruct& s) const {\n    return _0 == s._0;\n}\n\nrust::EmptyStruct rust::empty_struct() {\n    _ffi_fn_empty_struct();\n    return rust::EmptyStruct{};\n}\n\nrust::PairStruct rust::make_pair(float x, float y) {\n    auto multi_ret = _ffi_fn_make_pair(x, y);\n    auto ret_x = multi_ret._0;\n    auto ret_y = multi_ret._1;\n    return rust::PairStruct{ret_x, ret_y};\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nrust::SingleElementStruct rust::single_element_struct(int32_t x) {\n    auto ret_0 = _ffi_fn_single_element_struct(x);\n    return rust::SingleElementStruct{ret_0};\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_struct_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\nnamespace rust {\n\nstruct EmptyStruct {\n    bool operator == (const EmptyStruct&) const { return true; }\n    bool operator != (const EmptyStruct& e) const { return !(*this == e); }\n};\n\nstruct PairStruct {\n    float x = 0.0f;\n    float y = 0.0f;\n    bool operator == (const PairStruct&) const;\n    bool operator != (const PairStruct& p) const { return !(*this == p); }\n};\n\nstruct SingleElementStruct {\n    int32_t _0 = 0;\n    bool operator == (const SingleElementStruct&) const;\n    bool operator != (const SingleElementStruct& s) const { return !(*this == s); }\n};\n\nuintptr_t rust_mem_leaked();\n\nEmptyStruct empty_struct();\n\nSingleElementStruct single_element_struct(int32_t x);\n\nPairStruct make_pair(float x, float y);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_struct_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_empty_struct() {\n    _ = empty_struct();\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_make_pair(x: f32, y: f32) -> _ffi_ret_2_f32 {\n    let ret = make_pair(x, y);\n    _ffi_ret_2_f32(ret.x, ret.y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_single_element_struct(x: i32) -> i32 {\n    let ret = single_element_struct(x);\n    ret.0\n}\n\n#[repr(C)]\nstruct _ffi_ret_2_f32(f32, f32);\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_tuple_in_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nint32_t _ffi_fn_empty_tuple(int32_t x, int32_t y);\nfloat _ffi_fn_multiply_pairs(float ab_0, float ab_1, float cd_0, float cd_1);\nint32_t _ffi_fn_nesting(int32_t x_0, int32_t x_2_0, int32_t x_2_1_0);\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_single_element_tuple(int32_t x_0, int32_t y_0);\n\n} // extern \"C\"\n\nint32_t rust::empty_tuple(int32_t x, std::tuple<> foo, int32_t y) {\n    (void)foo;\n    return _ffi_fn_empty_tuple(x, y);\n}\n\nfloat rust::multiply_pairs(std::tuple<float, float> ab, std::tuple<float, float> cd) {\n    return _ffi_fn_multiply_pairs(std::get<0>(ab), std::get<1>(ab), std::get<0>(cd), std::get<1>(cd));\n}\n\nint32_t rust::nesting(std::tuple<int32_t, std::tuple<>, std::tuple<int32_t, std::tuple<int32_t>>> x) {\n    (void)std::get<1>(x);\n    return _ffi_fn_nesting(std::get<0>(x), std::get<0>(std::get<2>(x)), std::get<0>(std::get<1>(std::get<2>(x))));\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::single_element_tuple(std::tuple<int32_t> x, std::tuple<int32_t> y) {\n    return _ffi_fn_single_element_tuple(std::get<0>(x), std::get<0>(y));\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_tuple_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <tuple>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nint32_t empty_tuple(int32_t x, std::tuple<> foo, int32_t y);\n\nint32_t single_element_tuple(std::tuple<int32_t> x, std::tuple<int32_t> y);\n\nfloat multiply_pairs(std::tuple<float, float> ab, std::tuple<float, float> cd);\n\nint32_t nesting(std::tuple<int32_t, std::tuple<>, std::tuple<int32_t, std::tuple<int32_t>>> x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_tuple_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_empty_tuple(x: i32, y: i32) -> i32 {\n    empty_tuple(x, (), y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_multiply_pairs(ab_0: f32, ab_1: f32, cd_0: f32, cd_1: f32) -> f32 {\n    multiply_pairs((ab_0, ab_1), (cd_0, cd_1))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_nesting(x_0: i32, x_2_0: i32, x_2_1_0: i32) -> i32 {\n    nesting((x_0, (), (x_2_0, (x_2_1_0,))))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_single_element_tuple(x_0: i32, y_0: i32) -> i32 {\n    single_element_tuple((x_0,), (y_0,))\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_tuple_in_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nint32_t _ffi_fn_empty_tuple(int32_t x, int32_t y);\nfloat _ffi_fn_multiply_pairs(float ab_0, float ab_1, float cd_0, float cd_1);\nint32_t _ffi_fn_nesting(int32_t x_0, int32_t x_2_0, int32_t x_2_1_0);\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_single_element_tuple(int32_t x_0, int32_t y_0);\n\n} // extern \"C\"\n\nint32_t rust::empty_tuple(int32_t x, std::tuple<> foo, int32_t y) {\n    (void)foo;\n    return _ffi_fn_empty_tuple(x, y);\n}\n\nfloat rust::multiply_pairs(std::tuple<float, float> ab, std::tuple<float, float> cd) {\n    return _ffi_fn_multiply_pairs(std::get<0>(ab), std::get<1>(ab), std::get<0>(cd), std::get<1>(cd));\n}\n\nint32_t rust::nesting(std::tuple<int32_t, std::tuple<>, std::tuple<int32_t, std::tuple<int32_t>>> x) {\n    (void)std::get<1>(x);\n    return _ffi_fn_nesting(std::get<0>(x), std::get<0>(std::get<2>(x)), std::get<0>(std::get<1>(std::get<2>(x))));\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::single_element_tuple(std::tuple<int32_t> x, std::tuple<int32_t> y) {\n    return _ffi_fn_single_element_tuple(std::get<0>(x), std::get<0>(y));\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_tuple_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <tuple>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nint32_t empty_tuple(int32_t x, std::tuple<> foo, int32_t y);\n\nint32_t single_element_tuple(std::tuple<int32_t> x, std::tuple<int32_t> y);\n\nfloat multiply_pairs(std::tuple<float, float> ab, std::tuple<float, float> cd);\n\nint32_t nesting(std::tuple<int32_t, std::tuple<>, std::tuple<int32_t, std::tuple<int32_t>>> x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_tuple_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_empty_tuple(x: i32, y: i32) -> i32 {\n    empty_tuple(x, (), y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_multiply_pairs(ab_0: f32, ab_1: f32, cd_0: f32, cd_1: f32) -> f32 {\n    multiply_pairs((ab_0, ab_1), (cd_0, cd_1))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_nesting(x_0: i32, x_2_0: i32, x_2_1_0: i32) -> i32 {\n    nesting((x_0, (), (x_2_0, (x_2_1_0,))))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_single_element_tuple(x_0: i32, y_0: i32) -> i32 {\n    single_element_tuple((x_0,), (y_0,))\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_tuple_out_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_f32_bool {\n    float _0;\n    bool _1;\n};\n\nextern \"C\" {\n\n_ffi_ret_f32_bool _ffi_fn_return_pair(float x, bool y);\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_single_element_tuple(int32_t x);\n\n} // extern \"C\"\n\nstd::tuple<float, bool> rust::return_pair(float x, bool y) {\n    auto multi_ret = _ffi_fn_return_pair(x, y);\n    auto ret_0 = multi_ret._0;\n    auto ret_1 = multi_ret._1;\n    return std::make_tuple(ret_0, ret_1);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nstd::tuple<int32_t> rust::single_element_tuple(int32_t x) {\n    auto ret_0 = _ffi_fn_single_element_tuple(x);\n    return ret_0;\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_tuple_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <tuple>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nstd::tuple<int32_t> single_element_tuple(int32_t x);\n\nstd::tuple<float, bool> return_pair(float x, bool y);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_tuple_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_return_pair(x: f32, y: bool) -> _ffi_ret_f32_bool {\n    let ret = return_pair(x, y);\n    _ffi_ret_f32_bool(ret.0, ret.1)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_single_element_tuple(x: i32) -> i32 {\n    let ret = single_element_tuple(x);\n    ret.0\n}\n\n#[repr(C)]\nstruct _ffi_ret_f32_bool(f32, bool);\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_tuple_out_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_f32_bool {\n    float _0;\n    bool _1;\n};\n\nextern \"C\" {\n\n_ffi_ret_f32_bool _ffi_fn_return_pair(float x, bool y);\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_single_element_tuple(int32_t x);\n\n} // extern \"C\"\n\nstd::tuple<float, bool> rust::return_pair(float x, bool y) {\n    auto multi_ret = _ffi_fn_return_pair(x, y);\n    auto ret_0 = multi_ret._0;\n    auto ret_1 = multi_ret._1;\n    return std::make_tuple(ret_0, ret_1);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nstd::tuple<int32_t> rust::single_element_tuple(int32_t x) {\n    auto ret_0 = _ffi_fn_single_element_tuple(x);\n    return ret_0;\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_tuple_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <tuple>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nstd::tuple<int32_t> single_element_tuple(int32_t x);\n\nstd::tuple<float, bool> return_pair(float x, bool y);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_tuple_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_return_pair(x: f32, y: bool) -> _ffi_ret_f32_bool {\n    let ret = return_pair(x, y);\n    _ffi_ret_f32_bool(ret.0, ret.1)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_single_element_tuple(x: i32) -> i32 {\n    let ret = single_element_tuple(x);\n    ret.0\n}\n\n#[repr(C)]\nstruct _ffi_ret_f32_bool(f32, bool);\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_vec_in_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_ptr_2_usize {\n    const char* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nextern \"C\" {\n\n_ffi_ret_ptr_2_usize _ffi_fn_check_nested(const void* buf_ptr, uintptr_t values_len);\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\nvoid* _ffi_alloc(uintptr_t len);\nuintptr_t _ffi_fn_rust_mem_leaked();\nfloat _ffi_fn_sum_f32(const void* buf_ptr, uintptr_t values_len);\ndouble _ffi_fn_sum_f64(const void* buf_ptr, uintptr_t values_len);\nint16_t _ffi_fn_sum_i16(const void* buf_ptr, uintptr_t values_len);\nint32_t _ffi_fn_sum_i32(const void* buf_ptr, uintptr_t values_len);\nint64_t _ffi_fn_sum_i64(const void* buf_ptr, uintptr_t values_len);\nint8_t _ffi_fn_sum_i8(const void* buf_ptr, uintptr_t values_len);\nintptr_t _ffi_fn_sum_isize(const void* buf_ptr, uintptr_t values_len);\nuint16_t _ffi_fn_sum_u16(const void* buf_ptr, uintptr_t values_len);\nuint32_t _ffi_fn_sum_u32(const void* buf_ptr, uintptr_t values_len);\nuint64_t _ffi_fn_sum_u64(const void* buf_ptr, uintptr_t values_len);\nuint8_t _ffi_fn_sum_u8(const void* buf_ptr, uintptr_t values_len);\nuintptr_t _ffi_fn_sum_usize(const void* buf_ptr, uintptr_t values_len);\n\n} // extern \"C\"\n\nnamespace {\n\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_vec_i32_to_rust(std::vector<int32_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_vec_i32_to_rust(std::vector<std::vector<int32_t>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        auto item_len = item.size();\n        _ffi_write(item_len, buf);\n        _ffi_vec_i32_to_rust(std::move(item), buf);\n    }\n}\n\nvoid _ffi_vec_f32_to_rust(std::vector<float>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_f64_to_rust(std::vector<double>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_i16_to_rust(std::vector<int16_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_i64_to_rust(std::vector<int64_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_i8_to_rust(std::vector<int8_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_isize_to_rust(std::vector<intptr_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_u16_to_rust(std::vector<uint16_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_u32_to_rust(std::vector<uint32_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_u64_to_rust(std::vector<uint64_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_u8_to_rust(std::vector<uint8_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_usize_to_rust(std::vector<uintptr_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\n} // namespace\n\nstd::string rust::check_nested(std::vector<std::vector<int32_t>> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_vec_i32_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_check_nested(buf_ptr, values_len);\n    auto ret_ptr = multi_ret._0;\n    auto ret_len = multi_ret._1;\n    auto ret_cap = multi_ret._2;\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nfloat rust::sum_f32(std::vector<float> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_f32_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_f32(buf_ptr, values_len);\n}\n\ndouble rust::sum_f64(std::vector<double> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_f64_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_f64(buf_ptr, values_len);\n}\n\nint16_t rust::sum_i16(std::vector<int16_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_i16_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_i16(buf_ptr, values_len);\n}\n\nint32_t rust::sum_i32(std::vector<int32_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_i32_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_i32(buf_ptr, values_len);\n}\n\nint64_t rust::sum_i64(std::vector<int64_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_i64_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_i64(buf_ptr, values_len);\n}\n\nint8_t rust::sum_i8(std::vector<int8_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_i8_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_i8(buf_ptr, values_len);\n}\n\nintptr_t rust::sum_isize(std::vector<intptr_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_isize_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_isize(buf_ptr, values_len);\n}\n\nuint16_t rust::sum_u16(std::vector<uint16_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_u16_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_u16(buf_ptr, values_len);\n}\n\nuint32_t rust::sum_u32(std::vector<uint32_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_u32_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_u32(buf_ptr, values_len);\n}\n\nuint64_t rust::sum_u64(std::vector<uint64_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_u64_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_u64(buf_ptr, values_len);\n}\n\nuint8_t rust::sum_u8(std::vector<uint8_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_u8_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_u8(buf_ptr, values_len);\n}\n\nuintptr_t rust::sum_usize(std::vector<uintptr_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_usize_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_usize(buf_ptr, values_len);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_vec_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <string>\n#include <vector>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nuint8_t sum_u8(std::vector<uint8_t> values);\n\nuint16_t sum_u16(std::vector<uint16_t> values);\n\nuint32_t sum_u32(std::vector<uint32_t> values);\n\nuintptr_t sum_usize(std::vector<uintptr_t> values);\n\nuint64_t sum_u64(std::vector<uint64_t> values);\n\nint8_t sum_i8(std::vector<int8_t> values);\n\nint16_t sum_i16(std::vector<int16_t> values);\n\nint32_t sum_i32(std::vector<int32_t> values);\n\nintptr_t sum_isize(std::vector<intptr_t> values);\n\nint64_t sum_i64(std::vector<int64_t> values);\n\nfloat sum_f32(std::vector<float> values);\n\ndouble sum_f64(std::vector<double> values);\n\nstd::string check_nested(std::vector<std::vector<int32_t>> values);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_vec_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_nested(buf_ptr: *const u8, values_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(check_nested(_ffi_vec_vec_i32_from_cpp(values_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_f32(buf_ptr: *const u8, values_len: usize) -> f32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_f32(_ffi_vec_f32_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_f64(buf_ptr: *const u8, values_len: usize) -> f64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_f64(_ffi_vec_f64_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_i16(buf_ptr: *const u8, values_len: usize) -> i16 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i16(_ffi_vec_i16_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_i32(buf_ptr: *const u8, values_len: usize) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i32(_ffi_vec_i32_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_i64(buf_ptr: *const u8, values_len: usize) -> i64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i64(_ffi_vec_i64_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_i8(buf_ptr: *const u8, values_len: usize) -> i8 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i8(_ffi_vec_i8_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_isize(buf_ptr: *const u8, values_len: usize) -> isize {\n    let mut buf_end = buf_ptr;\n    let ret = sum_isize(_ffi_vec_isize_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_u16(buf_ptr: *const u8, values_len: usize) -> u16 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u16(_ffi_vec_u16_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_u32(buf_ptr: *const u8, values_len: usize) -> u32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u32(_ffi_vec_u32_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_u64(buf_ptr: *const u8, values_len: usize) -> u64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u64(_ffi_vec_u64_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_u8(buf_ptr: *const u8, values_len: usize) -> u8 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u8(_ffi_vec_u8_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_usize(buf_ptr: *const u8, values_len: usize) -> usize {\n    let mut buf_end = buf_ptr;\n    let ret = sum_usize(_ffi_vec_usize_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_f32_from_cpp(len: usize, end: &mut *const u8) -> Vec<f32> {\n    let mut items = Vec::<f32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<f32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_f64_from_cpp(len: usize, end: &mut *const u8) -> Vec<f64> {\n    let mut items = Vec::<f64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<f64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i16_from_cpp(len: usize, end: &mut *const u8) -> Vec<i16> {\n    let mut items = Vec::<i16>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i16>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i32_from_cpp(len: usize, end: &mut *const u8) -> Vec<i32> {\n    let mut items = Vec::<i32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i64_from_cpp(len: usize, end: &mut *const u8) -> Vec<i64> {\n    let mut items = Vec::<i64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i8_from_cpp(len: usize, end: &mut *const u8) -> Vec<i8> {\n    let mut items = Vec::<i8>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i8>(end));\n    }\n    items\n}\n\nfn _ffi_vec_isize_from_cpp(len: usize, end: &mut *const u8) -> Vec<isize> {\n    let mut items = Vec::<isize>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<isize>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u16_from_cpp(len: usize, end: &mut *const u8) -> Vec<u16> {\n    let mut items = Vec::<u16>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u16>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u32_from_cpp(len: usize, end: &mut *const u8) -> Vec<u32> {\n    let mut items = Vec::<u32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u64_from_cpp(len: usize, end: &mut *const u8) -> Vec<u64> {\n    let mut items = Vec::<u64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u8_from_cpp(len: usize, end: &mut *const u8) -> Vec<u8> {\n    let mut items = Vec::<u8>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u8>(end));\n    }\n    items\n}\n\nfn _ffi_vec_usize_from_cpp(len: usize, end: &mut *const u8) -> Vec<usize> {\n    let mut items = Vec::<usize>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<usize>(end));\n    }\n    items\n}\n\nfn _ffi_vec_vec_i32_from_cpp(len: usize, end: &mut *const u8) -> Vec<Vec<i32>> {\n    let mut items = Vec::<Vec<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_vec_i32_from_cpp(_ffi_read::<usize>(end), end));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_vec_in_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_ptr_2_usize {\n    const char* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nextern \"C\" {\n\n_ffi_ret_ptr_2_usize _ffi_fn_check_nested(const void* buf_ptr, uintptr_t values_len);\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\nvoid* _ffi_alloc(uintptr_t len);\nuintptr_t _ffi_fn_rust_mem_leaked();\nfloat _ffi_fn_sum_f32(const void* buf_ptr, uintptr_t values_len);\ndouble _ffi_fn_sum_f64(const void* buf_ptr, uintptr_t values_len);\nint16_t _ffi_fn_sum_i16(const void* buf_ptr, uintptr_t values_len);\nint32_t _ffi_fn_sum_i32(const void* buf_ptr, uintptr_t values_len);\nint64_t _ffi_fn_sum_i64(const void* buf_ptr, uintptr_t values_len);\nint8_t _ffi_fn_sum_i8(const void* buf_ptr, uintptr_t values_len);\nintptr_t _ffi_fn_sum_isize(const void* buf_ptr, uintptr_t values_len);\nuint16_t _ffi_fn_sum_u16(const void* buf_ptr, uintptr_t values_len);\nuint32_t _ffi_fn_sum_u32(const void* buf_ptr, uintptr_t values_len);\nuint64_t _ffi_fn_sum_u64(const void* buf_ptr, uintptr_t values_len);\nuint8_t _ffi_fn_sum_u8(const void* buf_ptr, uintptr_t values_len);\nuintptr_t _ffi_fn_sum_usize(const void* buf_ptr, uintptr_t values_len);\n\n} // extern \"C\"\n\nnamespace {\n\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\nconst void* _ffi_vec_to_rust(const std::vector<uint8_t>& vec) {\n    return memcpy(_ffi_alloc(vec.size()), vec.data(), vec.size());\n}\n\ntemplate <typename T>\nvoid _ffi_write(T val, std::vector<uint8_t> &buf) {\n    buf.insert(buf.end(), (const uint8_t*)&val, (const uint8_t*)&val + sizeof(T));\n}\n\nvoid _ffi_vec_i32_to_rust(std::vector<int32_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_vec_i32_to_rust(std::vector<std::vector<int32_t>>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        auto item_len = item.size();\n        _ffi_write(item_len, buf);\n        _ffi_vec_i32_to_rust(std::move(item), buf);\n    }\n}\n\nvoid _ffi_vec_f32_to_rust(std::vector<float>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_f64_to_rust(std::vector<double>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_i16_to_rust(std::vector<int16_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_i64_to_rust(std::vector<int64_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_i8_to_rust(std::vector<int8_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_isize_to_rust(std::vector<intptr_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_u16_to_rust(std::vector<uint16_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_u32_to_rust(std::vector<uint32_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_u64_to_rust(std::vector<uint64_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_u8_to_rust(std::vector<uint8_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\nvoid _ffi_vec_usize_to_rust(std::vector<uintptr_t>&& items, std::vector<uint8_t>& buf) {\n    for (auto&& item : items) {\n        _ffi_write(item, buf);\n    }\n}\n\n} // namespace\n\nstd::string rust::check_nested(std::vector<std::vector<int32_t>> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_vec_i32_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    auto multi_ret = _ffi_fn_check_nested(buf_ptr, values_len);\n    auto ret_ptr = multi_ret._0;\n    auto ret_len = multi_ret._1;\n    auto ret_cap = multi_ret._2;\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nfloat rust::sum_f32(std::vector<float> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_f32_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_f32(buf_ptr, values_len);\n}\n\ndouble rust::sum_f64(std::vector<double> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_f64_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_f64(buf_ptr, values_len);\n}\n\nint16_t rust::sum_i16(std::vector<int16_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_i16_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_i16(buf_ptr, values_len);\n}\n\nint32_t rust::sum_i32(std::vector<int32_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_i32_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_i32(buf_ptr, values_len);\n}\n\nint64_t rust::sum_i64(std::vector<int64_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_i64_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_i64(buf_ptr, values_len);\n}\n\nint8_t rust::sum_i8(std::vector<int8_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_i8_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_i8(buf_ptr, values_len);\n}\n\nintptr_t rust::sum_isize(std::vector<intptr_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_isize_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_isize(buf_ptr, values_len);\n}\n\nuint16_t rust::sum_u16(std::vector<uint16_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_u16_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_u16(buf_ptr, values_len);\n}\n\nuint32_t rust::sum_u32(std::vector<uint32_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_u32_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_u32(buf_ptr, values_len);\n}\n\nuint64_t rust::sum_u64(std::vector<uint64_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_u64_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_u64(buf_ptr, values_len);\n}\n\nuint8_t rust::sum_u8(std::vector<uint8_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_u8_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_u8(buf_ptr, values_len);\n}\n\nuintptr_t rust::sum_usize(std::vector<uintptr_t> values) {\n    std::vector<uint8_t> buf;\n    auto values_len = values.size();\n    _ffi_vec_usize_to_rust(std::move(values), buf);\n    auto buf_ptr = _ffi_vec_to_rust(buf);\n    return _ffi_fn_sum_usize(buf_ptr, values_len);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_vec_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <string>\n#include <vector>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nuint8_t sum_u8(std::vector<uint8_t> values);\n\nuint16_t sum_u16(std::vector<uint16_t> values);\n\nuint32_t sum_u32(std::vector<uint32_t> values);\n\nuintptr_t sum_usize(std::vector<uintptr_t> values);\n\nuint64_t sum_u64(std::vector<uint64_t> values);\n\nint8_t sum_i8(std::vector<int8_t> values);\n\nint16_t sum_i16(std::vector<int16_t> values);\n\nint32_t sum_i32(std::vector<int32_t> values);\n\nintptr_t sum_isize(std::vector<intptr_t> values);\n\nint64_t sum_i64(std::vector<int64_t> values);\n\nfloat sum_f32(std::vector<float> values);\n\ndouble sum_f64(std::vector<double> values);\n\nstd::string check_nested(std::vector<std::vector<int32_t>> values);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_vec_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_nested(buf_ptr: *const u8, values_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(check_nested(_ffi_vec_vec_i32_from_cpp(values_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_f32(buf_ptr: *const u8, values_len: usize) -> f32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_f32(_ffi_vec_f32_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_f64(buf_ptr: *const u8, values_len: usize) -> f64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_f64(_ffi_vec_f64_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_i16(buf_ptr: *const u8, values_len: usize) -> i16 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i16(_ffi_vec_i16_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_i32(buf_ptr: *const u8, values_len: usize) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i32(_ffi_vec_i32_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_i64(buf_ptr: *const u8, values_len: usize) -> i64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i64(_ffi_vec_i64_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_i8(buf_ptr: *const u8, values_len: usize) -> i8 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i8(_ffi_vec_i8_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_isize(buf_ptr: *const u8, values_len: usize) -> isize {\n    let mut buf_end = buf_ptr;\n    let ret = sum_isize(_ffi_vec_isize_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_u16(buf_ptr: *const u8, values_len: usize) -> u16 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u16(_ffi_vec_u16_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_u32(buf_ptr: *const u8, values_len: usize) -> u32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u32(_ffi_vec_u32_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_u64(buf_ptr: *const u8, values_len: usize) -> u64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u64(_ffi_vec_u64_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_u8(buf_ptr: *const u8, values_len: usize) -> u8 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u8(_ffi_vec_u8_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_usize(buf_ptr: *const u8, values_len: usize) -> usize {\n    let mut buf_end = buf_ptr;\n    let ret = sum_usize(_ffi_vec_usize_from_cpp(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_f32_from_cpp(len: usize, end: &mut *const u8) -> Vec<f32> {\n    let mut items = Vec::<f32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<f32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_f64_from_cpp(len: usize, end: &mut *const u8) -> Vec<f64> {\n    let mut items = Vec::<f64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<f64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i16_from_cpp(len: usize, end: &mut *const u8) -> Vec<i16> {\n    let mut items = Vec::<i16>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i16>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i32_from_cpp(len: usize, end: &mut *const u8) -> Vec<i32> {\n    let mut items = Vec::<i32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i64_from_cpp(len: usize, end: &mut *const u8) -> Vec<i64> {\n    let mut items = Vec::<i64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i8_from_cpp(len: usize, end: &mut *const u8) -> Vec<i8> {\n    let mut items = Vec::<i8>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i8>(end));\n    }\n    items\n}\n\nfn _ffi_vec_isize_from_cpp(len: usize, end: &mut *const u8) -> Vec<isize> {\n    let mut items = Vec::<isize>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<isize>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u16_from_cpp(len: usize, end: &mut *const u8) -> Vec<u16> {\n    let mut items = Vec::<u16>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u16>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u32_from_cpp(len: usize, end: &mut *const u8) -> Vec<u32> {\n    let mut items = Vec::<u32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u64_from_cpp(len: usize, end: &mut *const u8) -> Vec<u64> {\n    let mut items = Vec::<u64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u8_from_cpp(len: usize, end: &mut *const u8) -> Vec<u8> {\n    let mut items = Vec::<u8>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u8>(end));\n    }\n    items\n}\n\nfn _ffi_vec_usize_from_cpp(len: usize, end: &mut *const u8) -> Vec<usize> {\n    let mut items = Vec::<usize>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<usize>(end));\n    }\n    items\n}\n\nfn _ffi_vec_vec_i32_from_cpp(len: usize, end: &mut *const u8) -> Vec<Vec<i32>> {\n    let mut items = Vec::<Vec<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_vec_i32_from_cpp(_ffi_read::<usize>(end), end));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_vec_out_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_ptr_2_usize {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nextern \"C\" {\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n_ffi_ret_ptr_2_usize _ffi_fn_check_nested();\n_ffi_ret_ptr_2_usize _ffi_fn_get_vec(int32_t n);\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nstd::vector<int32_t> _ffi_vec_i32_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<int32_t> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item = _ffi_read<int32_t>(end);\n        items.emplace_back(item);\n    }\n    return items;\n}\n\nstd::vector<std::vector<int32_t>> _ffi_vec_vec_i32_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::vector<int32_t>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_len = _ffi_read<uintptr_t>(end);\n        auto item = _ffi_vec_i32_from_rust(item_len, end);\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\n} // namespace\n\nstd::vector<std::vector<int32_t>> rust::check_nested() {\n    auto multi_ret = _ffi_fn_check_nested();\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_len = multi_ret._2;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret = _ffi_vec_vec_i32_from_rust(ret_len, buf_end);\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nstd::vector<int32_t> rust::get_vec(int32_t n) {\n    auto multi_ret = _ffi_fn_get_vec(n);\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_len = multi_ret._2;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret = _ffi_vec_i32_from_rust(ret_len, buf_end);\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_vec_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <vector>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nstd::vector<int32_t> get_vec(int32_t n);\n\nstd::vector<std::vector<int32_t>> check_nested();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_vec_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_nested() -> _ffi_ret_ptr_2_usize {\n    let ret = check_nested();\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_vec_i32_to_cpp(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_vec(n: i32) -> _ffi_ret_ptr_2_usize {\n    let ret = get_vec(n);\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_i32_to_cpp(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\nfn _ffi_vec_i32_to_cpp(items: Vec<i32>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item, buf);\n    }\n}\n\nfn _ffi_vec_vec_i32_to_cpp(items: Vec<Vec<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.len(), buf);\n        _ffi_vec_i32_to_cpp(item, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_vec_out_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_ptr_2_usize {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nextern \"C\" {\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n_ffi_ret_ptr_2_usize _ffi_fn_check_nested();\n_ffi_ret_ptr_2_usize _ffi_fn_get_vec(int32_t n);\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\ntemplate <typename T>\nT _ffi_read(const uint8_t* &ptr) {\n    T val;\n    memcpy(&val, ptr, sizeof(T));\n    ptr += sizeof(T);\n    return val;\n}\n\nstd::vector<int32_t> _ffi_vec_i32_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<int32_t> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item = _ffi_read<int32_t>(end);\n        items.emplace_back(item);\n    }\n    return items;\n}\n\nstd::vector<std::vector<int32_t>> _ffi_vec_vec_i32_from_rust(uintptr_t len, const uint8_t*& end) {\n    std::vector<std::vector<int32_t>> items;\n    items.reserve(len);\n    while (items.size() < len) {\n        auto item_len = _ffi_read<uintptr_t>(end);\n        auto item = _ffi_vec_i32_from_rust(item_len, end);\n        items.emplace_back(std::move(item));\n    }\n    return items;\n}\n\n} // namespace\n\nstd::vector<std::vector<int32_t>> rust::check_nested() {\n    auto multi_ret = _ffi_fn_check_nested();\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_len = multi_ret._2;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret = _ffi_vec_vec_i32_from_rust(ret_len, buf_end);\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nstd::vector<int32_t> rust::get_vec(int32_t n) {\n    auto multi_ret = _ffi_fn_get_vec(n);\n    auto buf_ptr = multi_ret._0;\n    auto buf_cap = multi_ret._1;\n    auto ret_len = multi_ret._2;\n    auto buf_end = (const uint8_t*)buf_ptr;\n    auto ret = _ffi_vec_i32_from_rust(ret_len, buf_end);\n    _ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_vec_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n#include <vector>\n\nnamespace rust {\n\nuintptr_t rust_mem_leaked();\n\nstd::vector<int32_t> get_vec(int32_t n);\n\nstd::vector<std::vector<int32_t>> check_nested();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_fn_vec_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_nested() -> _ffi_ret_ptr_2_usize {\n    let ret = check_nested();\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_vec_i32_to_cpp(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_vec(n: i32) -> _ffi_ret_ptr_2_usize {\n    let ret = get_vec(n);\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_i32_to_cpp(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\nfn _ffi_vec_i32_to_cpp(items: Vec<i32>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item, buf);\n    }\n}\n\nfn _ffi_vec_vec_i32_to_cpp(items: Vec<Vec<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.len(), buf);\n        _ffi_vec_i32_to_cpp(item, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_enum_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nvoid _ffi_drop_Box_Foo(const void* ptr);\nint32_t _ffi_Box_Foo__get_enum(const void* _self);\nvoid _ffi_Box_Foo__set_enum(const void* _self, int32_t bar_raw);\nconst void* _ffi_fn_get_foo();\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\nstruct _ffi_Box_Foo final : rust::Foo {\n    _ffi_Box_Foo(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Box_Foo() { _ffi_drop_Box_Foo(_self); }\n    virtual void set_enum(rust::Bar bar);\n    virtual rust::Bar get_enum();\n    const void* _self;\n};\n\n} // namespace\n\nrust::Bar _ffi_Box_Foo::get_enum() {\n    auto ret_raw = _ffi_Box_Foo__get_enum(_self);\n    return rust::Bar(ret_raw);\n}\n\nvoid _ffi_Box_Foo::set_enum(rust::Bar bar) {\n    _ffi_Box_Foo__set_enum(_self, int32_t(bar));\n}\n\nstd::unique_ptr<rust::Foo> rust::get_foo() {\n    auto ret_ptr = _ffi_fn_get_foo();\n    return std::unique_ptr<rust::Foo>(new _ffi_Box_Foo(ret_ptr));\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_enum_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n\nnamespace rust {\n\nenum struct Bar : int32_t {\n    A = 0,\n    B = 1,\n    C = 2,\n};\n\nstruct Foo {\n    virtual ~Foo() {}\n    virtual void set_enum(Bar bar) = 0;\n    virtual Bar get_enum() = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nstd::unique_ptr<Foo> get_foo();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_enum_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Box_Foo__get_enum(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Foo>) };\n    _self.get_enum() as i32\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Box_Foo__set_enum(_self: *const u8, bar_raw: i32) {\n    let _self = unsafe { &*(_self as *const Box<dyn Foo>) };\n    _self.set_enum(_ffi_enum_Bar_from_cpp(bar_raw));\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_drop_Box_Foo(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Foo>) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Bar_from_cpp(val: i32) -> Bar {\n    match val {\n        0 => Bar::A,\n        1 => Bar::B,\n        2 => Bar::C,\n        _ => panic!(),\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_foo() -> *const u8 {\n    Box::into_raw(Box::new(get_foo())) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_enum_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nvoid _ffi_drop_Box_Foo(const void* ptr);\nint32_t _ffi_Box_Foo__get_enum(const void* _self);\nvoid _ffi_Box_Foo__set_enum(const void* _self, int32_t bar_raw);\nconst void* _ffi_fn_get_foo();\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\nstruct _ffi_Box_Foo final : rust::Foo {\n    _ffi_Box_Foo(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Box_Foo() { _ffi_drop_Box_Foo(_self); }\n    virtual void set_enum(rust::Bar bar);\n    virtual rust::Bar get_enum();\n    const void* _self;\n};\n\n} // namespace\n\nrust::Bar _ffi_Box_Foo::get_enum() {\n    auto ret_raw = _ffi_Box_Foo__get_enum(_self);\n    return rust::Bar(ret_raw);\n}\n\nvoid _ffi_Box_Foo::set_enum(rust::Bar bar) {\n    _ffi_Box_Foo__set_enum(_self, int32_t(bar));\n}\n\nstd::unique_ptr<rust::Foo> rust::get_foo() {\n    auto ret_ptr = _ffi_fn_get_foo();\n    return std::unique_ptr<rust::Foo>(new _ffi_Box_Foo(ret_ptr));\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_enum_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n\nnamespace rust {\n\nenum struct Bar : int32_t {\n    A = 0,\n    B = 1,\n    C = 2,\n};\n\nstruct Foo {\n    virtual ~Foo() {}\n    virtual void set_enum(Bar bar) = 0;\n    virtual Bar get_enum() = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nstd::unique_ptr<Foo> get_foo();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_enum_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Box_Foo__get_enum(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Foo>) };\n    _self.get_enum() as i32\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Box_Foo__set_enum(_self: *const u8, bar_raw: i32) {\n    let _self = unsafe { &*(_self as *const Box<dyn Foo>) };\n    _self.set_enum(_ffi_enum_Bar_from_cpp(bar_raw));\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_drop_Box_Foo(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Foo>) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Bar_from_cpp(val: i32) -> Bar {\n    match val {\n        0 => Bar::A,\n        1 => Bar::B,\n        2 => Bar::C,\n        _ => panic!(),\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_foo() -> *const u8 {\n    Box::into_raw(Box::new(get_foo())) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nvoid _ffi_drop_Box_Adder(const void* ptr);\nvoid _ffi_drop_Rc_Adder(const void* ptr);\nint32_t _ffi_Box_Adder__add(const void* _self, int32_t x);\nint32_t _ffi_Rc_Adder__add(const void* _self, int32_t x);\nconst void* _ffi_fn_get_adder_box(int32_t x);\nconst void* _ffi_fn_get_adder_rc(int32_t x);\nuint32_t _ffi_fn_get_counter();\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\nstruct _ffi_Box_Adder final : rust::Adder {\n    _ffi_Box_Adder(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Box_Adder() { _ffi_drop_Box_Adder(_self); }\n    virtual int32_t add(int32_t x);\n    const void* _self;\n};\n\nstruct _ffi_Rc_Adder final : rust::Adder {\n    _ffi_Rc_Adder(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Rc_Adder() { _ffi_drop_Rc_Adder(_self); }\n    virtual int32_t add(int32_t x);\n    const void* _self;\n};\n\n} // namespace\n\nint32_t _ffi_Box_Adder::add(int32_t x) {\n    return _ffi_Box_Adder__add(_self, x);\n}\n\nint32_t _ffi_Rc_Adder::add(int32_t x) {\n    return _ffi_Rc_Adder__add(_self, x);\n}\n\nstd::unique_ptr<rust::Adder> rust::get_adder_box(int32_t x) {\n    auto ret_ptr = _ffi_fn_get_adder_box(x);\n    return std::unique_ptr<rust::Adder>(new _ffi_Box_Adder(ret_ptr));\n}\n\nstd::shared_ptr<rust::Adder> rust::get_adder_rc(int32_t x) {\n    auto ret_ptr = _ffi_fn_get_adder_rc(x);\n    return std::make_shared<_ffi_Rc_Adder>(ret_ptr);\n}\n\nuint32_t rust::get_counter() {\n    return _ffi_fn_get_counter();\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n\nnamespace rust {\n\nstruct Adder {\n    virtual ~Adder() {}\n    virtual int32_t add(int32_t x) = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nuint32_t get_counter();\n\nstd::shared_ptr<Adder> get_adder_rc(int32_t x);\n\nstd::unique_ptr<Adder> get_adder_box(int32_t x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Box_Adder__add(_self: *const u8, x: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Adder>) };\n    _self.add(x)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Adder__add(_self: *const u8, x: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Adder>) };\n    _self.add(x)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_drop_Box_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Adder>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_drop_Rc_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Adder>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_adder_box(x: i32) -> *const u8 {\n    Box::into_raw(Box::new(get_adder_box(x))) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_adder_rc(x: i32) -> *const u8 {\n    Box::into_raw(Box::new(get_adder_rc(x))) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nvoid _ffi_drop_Box_Adder(const void* ptr);\nvoid _ffi_drop_Rc_Adder(const void* ptr);\nint32_t _ffi_Box_Adder__add(const void* _self, int32_t x);\nint32_t _ffi_Rc_Adder__add(const void* _self, int32_t x);\nconst void* _ffi_fn_get_adder_box(int32_t x);\nconst void* _ffi_fn_get_adder_rc(int32_t x);\nuint32_t _ffi_fn_get_counter();\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\nstruct _ffi_Box_Adder final : rust::Adder {\n    _ffi_Box_Adder(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Box_Adder() { _ffi_drop_Box_Adder(_self); }\n    virtual int32_t add(int32_t x);\n    const void* _self;\n};\n\nstruct _ffi_Rc_Adder final : rust::Adder {\n    _ffi_Rc_Adder(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Rc_Adder() { _ffi_drop_Rc_Adder(_self); }\n    virtual int32_t add(int32_t x);\n    const void* _self;\n};\n\n} // namespace\n\nint32_t _ffi_Box_Adder::add(int32_t x) {\n    return _ffi_Box_Adder__add(_self, x);\n}\n\nint32_t _ffi_Rc_Adder::add(int32_t x) {\n    return _ffi_Rc_Adder__add(_self, x);\n}\n\nstd::unique_ptr<rust::Adder> rust::get_adder_box(int32_t x) {\n    auto ret_ptr = _ffi_fn_get_adder_box(x);\n    return std::unique_ptr<rust::Adder>(new _ffi_Box_Adder(ret_ptr));\n}\n\nstd::shared_ptr<rust::Adder> rust::get_adder_rc(int32_t x) {\n    auto ret_ptr = _ffi_fn_get_adder_rc(x);\n    return std::make_shared<_ffi_Rc_Adder>(ret_ptr);\n}\n\nuint32_t rust::get_counter() {\n    return _ffi_fn_get_counter();\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n\nnamespace rust {\n\nstruct Adder {\n    virtual ~Adder() {}\n    virtual int32_t add(int32_t x) = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nuint32_t get_counter();\n\nstd::shared_ptr<Adder> get_adder_rc(int32_t x);\n\nstd::unique_ptr<Adder> get_adder_box(int32_t x);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Box_Adder__add(_self: *const u8, x: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Adder>) };\n    _self.add(x)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Adder__add(_self: *const u8, x: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Adder>) };\n    _self.add(x)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_drop_Box_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Adder>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_drop_Rc_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Adder>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_adder_box(x: i32) -> *const u8 {\n    Box::into_raw(Box::new(get_adder_box(x))) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_adder_rc(x: i32) -> *const u8 {\n    Box::into_raw(Box::new(get_adder_rc(x))) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_import_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nvoid _ffi_drop_Rc_Exported(const void* ptr);\nint32_t _ffi_Rc_Exported__run(const void* _self, const void* imported_ptr);\nuint32_t _ffi_fn_get_counter();\nconst void* _ffi_fn_get_exported();\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\nstruct _ffi_Rc_Exported final : rust::Exported {\n    _ffi_Rc_Exported(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Rc_Exported() { _ffi_drop_Rc_Exported(_self); }\n    virtual int32_t run(std::shared_ptr<rust::Imported> imported);\n    const void* _self;\n};\n\n} // namespace\n\nextern \"C\" {\n\nint32_t _ffi_cpp_Rc_Imported__add(std::shared_ptr<rust::Imported>* _self, int32_t x, int32_t y) {\n    return _self->get()->add(x, y);\n}\n\nvoid _ffi_cpp_drop_Rc_Imported(std::shared_ptr<rust::Imported>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nint32_t _ffi_Rc_Exported::run(std::shared_ptr<rust::Imported> imported) {\n    auto imported_ptr = new std::shared_ptr<rust::Imported>(imported);\n    return _ffi_Rc_Exported__run(_self, imported_ptr);\n}\n\nuint32_t rust::get_counter() {\n    return _ffi_fn_get_counter();\n}\n\nstd::shared_ptr<rust::Exported> rust::get_exported() {\n    auto ret_ptr = _ffi_fn_get_exported();\n    return std::make_shared<_ffi_Rc_Exported>(ret_ptr);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_import_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n\nnamespace rust {\n\nstruct Imported;\n\nstruct Exported {\n    virtual ~Exported() {}\n    virtual int32_t run(std::shared_ptr<Imported> imported) = 0;\n};\n\nstruct Imported {\n    virtual ~Imported() {}\n    virtual int32_t add(int32_t x, int32_t y) = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nstd::shared_ptr<Exported> get_exported();\n\nuint32_t get_counter();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_import_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Exported__run(_self: *const u8, imported_ptr: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Exported>) };\n    _self.run(std::rc::Rc::new(_ffi_rs_Rc_Imported(imported_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_drop_Rc_Exported(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Exported>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_exported() -> *const u8 {\n    Box::into_raw(Box::new(get_exported())) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Imported(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Imported {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_cpp_drop_Rc_Imported(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Imported(self.0) };\n    }\n}\n\nimpl Imported for _ffi_rs_Rc_Imported {\n    fn add(&self, x: i32, y: i32) -> i32 {\n        extern \"C\" { fn _ffi_cpp_Rc_Imported__add(_: *const u8, x: i32, y: i32) -> i32; }\n        unsafe { _ffi_cpp_Rc_Imported__add(self.0, x, y) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_import_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nvoid _ffi_drop_Rc_Exported(const void* ptr);\nint32_t _ffi_Rc_Exported__run(const void* _self, const void* imported_ptr);\nuint32_t _ffi_fn_get_counter();\nconst void* _ffi_fn_get_exported();\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\nstruct _ffi_Rc_Exported final : rust::Exported {\n    _ffi_Rc_Exported(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Rc_Exported() { _ffi_drop_Rc_Exported(_self); }\n    virtual int32_t run(std::shared_ptr<rust::Imported> imported);\n    const void* _self;\n};\n\n} // namespace\n\nextern \"C\" {\n\nint32_t _ffi_cpp_Rc_Imported__add(std::shared_ptr<rust::Imported>* _self, int32_t x, int32_t y) {\n    return _self->get()->add(x, y);\n}\n\nvoid _ffi_cpp_drop_Rc_Imported(std::shared_ptr<rust::Imported>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nint32_t _ffi_Rc_Exported::run(std::shared_ptr<rust::Imported> imported) {\n    auto imported_ptr = new std::shared_ptr<rust::Imported>(imported);\n    return _ffi_Rc_Exported__run(_self, imported_ptr);\n}\n\nuint32_t rust::get_counter() {\n    return _ffi_fn_get_counter();\n}\n\nstd::shared_ptr<rust::Exported> rust::get_exported() {\n    auto ret_ptr = _ffi_fn_get_exported();\n    return std::make_shared<_ffi_Rc_Exported>(ret_ptr);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_import_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n\nnamespace rust {\n\nstruct Imported;\n\nstruct Exported {\n    virtual ~Exported() {}\n    virtual int32_t run(std::shared_ptr<Imported> imported) = 0;\n};\n\nstruct Imported {\n    virtual ~Imported() {}\n    virtual int32_t add(int32_t x, int32_t y) = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nstd::shared_ptr<Exported> get_exported();\n\nuint32_t get_counter();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_import_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Exported__run(_self: *const u8, imported_ptr: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Exported>) };\n    _self.run(std::rc::Rc::new(_ffi_rs_Rc_Imported(imported_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_drop_Rc_Exported(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Exported>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_exported() -> *const u8 {\n    Box::into_raw(Box::new(get_exported())) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Imported(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Imported {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_cpp_drop_Rc_Imported(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Imported(self.0) };\n    }\n}\n\nimpl Imported for _ffi_rs_Rc_Imported {\n    fn add(&self, x: i32, y: i32) -> i32 {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_Imported__add(_: *const u8, x: i32, y: i32) -> i32; }\n        unsafe { _ffi_cpp_Rc_Imported__add(self.0, x, y) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_nested_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nvoid _ffi_drop_Rc_Adder(const void* ptr);\nvoid _ffi_drop_Rc_Getter(const void* ptr);\nint32_t _ffi_Rc_Adder__add(const void* _self, int32_t x, int32_t y);\nconst void* _ffi_Rc_Getter__get_adder(const void* _self);\nuint32_t _ffi_fn_get_adder_counter();\nconst void* _ffi_fn_get_getter();\nuint32_t _ffi_fn_get_getter_counter();\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\nstruct _ffi_Rc_Adder final : rust::Adder {\n    _ffi_Rc_Adder(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Rc_Adder() { _ffi_drop_Rc_Adder(_self); }\n    virtual int32_t add(int32_t x, int32_t y);\n    const void* _self;\n};\n\nstruct _ffi_Rc_Getter final : rust::Getter {\n    _ffi_Rc_Getter(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Rc_Getter() { _ffi_drop_Rc_Getter(_self); }\n    virtual std::shared_ptr<rust::Adder> get_adder();\n    const void* _self;\n};\n\n} // namespace\n\nint32_t _ffi_Rc_Adder::add(int32_t x, int32_t y) {\n    return _ffi_Rc_Adder__add(_self, x, y);\n}\n\nstd::shared_ptr<rust::Adder> _ffi_Rc_Getter::get_adder() {\n    auto ret_ptr = _ffi_Rc_Getter__get_adder(_self);\n    return std::make_shared<_ffi_Rc_Adder>(ret_ptr);\n}\n\nuint32_t rust::get_adder_counter() {\n    return _ffi_fn_get_adder_counter();\n}\n\nstd::shared_ptr<rust::Getter> rust::get_getter() {\n    auto ret_ptr = _ffi_fn_get_getter();\n    return std::make_shared<_ffi_Rc_Getter>(ret_ptr);\n}\n\nuint32_t rust::get_getter_counter() {\n    return _ffi_fn_get_getter_counter();\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_nested_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n\nnamespace rust {\n\nstruct Adder;\n\nstruct Adder {\n    virtual ~Adder() {}\n    virtual int32_t add(int32_t x, int32_t y) = 0;\n};\n\nstruct Getter {\n    virtual ~Getter() {}\n    virtual std::shared_ptr<Adder> get_adder() = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nuint32_t get_getter_counter();\n\nuint32_t get_adder_counter();\n\nstd::shared_ptr<Getter> get_getter();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_nested_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Adder__add(_self: *const u8, x: i32, y: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Adder>) };\n    _self.add(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Getter__get_adder(_self: *const u8) -> *const u8 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Getter>) };\n    Box::into_raw(Box::new(_self.get_adder())) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_drop_Rc_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Adder>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_drop_Rc_Getter(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Getter>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_adder_counter() -> u32 {\n    get_adder_counter()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_getter() -> *const u8 {\n    Box::into_raw(Box::new(get_getter())) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_getter_counter() -> u32 {\n    get_getter_counter()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_nested_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nvoid _ffi_drop_Rc_Adder(const void* ptr);\nvoid _ffi_drop_Rc_Getter(const void* ptr);\nint32_t _ffi_Rc_Adder__add(const void* _self, int32_t x, int32_t y);\nconst void* _ffi_Rc_Getter__get_adder(const void* _self);\nuint32_t _ffi_fn_get_adder_counter();\nconst void* _ffi_fn_get_getter();\nuint32_t _ffi_fn_get_getter_counter();\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n} // extern \"C\"\n\nnamespace {\n\nstruct _ffi_Rc_Adder final : rust::Adder {\n    _ffi_Rc_Adder(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Rc_Adder() { _ffi_drop_Rc_Adder(_self); }\n    virtual int32_t add(int32_t x, int32_t y);\n    const void* _self;\n};\n\nstruct _ffi_Rc_Getter final : rust::Getter {\n    _ffi_Rc_Getter(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Rc_Getter() { _ffi_drop_Rc_Getter(_self); }\n    virtual std::shared_ptr<rust::Adder> get_adder();\n    const void* _self;\n};\n\n} // namespace\n\nint32_t _ffi_Rc_Adder::add(int32_t x, int32_t y) {\n    return _ffi_Rc_Adder__add(_self, x, y);\n}\n\nstd::shared_ptr<rust::Adder> _ffi_Rc_Getter::get_adder() {\n    auto ret_ptr = _ffi_Rc_Getter__get_adder(_self);\n    return std::make_shared<_ffi_Rc_Adder>(ret_ptr);\n}\n\nuint32_t rust::get_adder_counter() {\n    return _ffi_fn_get_adder_counter();\n}\n\nstd::shared_ptr<rust::Getter> rust::get_getter() {\n    auto ret_ptr = _ffi_fn_get_getter();\n    return std::make_shared<_ffi_Rc_Getter>(ret_ptr);\n}\n\nuint32_t rust::get_getter_counter() {\n    return _ffi_fn_get_getter_counter();\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_nested_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n\nnamespace rust {\n\nstruct Adder;\n\nstruct Adder {\n    virtual ~Adder() {}\n    virtual int32_t add(int32_t x, int32_t y) = 0;\n};\n\nstruct Getter {\n    virtual ~Getter() {}\n    virtual std::shared_ptr<Adder> get_adder() = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nuint32_t get_getter_counter();\n\nuint32_t get_adder_counter();\n\nstd::shared_ptr<Getter> get_getter();\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_export_nested_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Adder__add(_self: *const u8, x: i32, y: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Adder>) };\n    _self.add(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Getter__get_adder(_self: *const u8) -> *const u8 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Getter>) };\n    Box::into_raw(Box::new(_self.get_adder())) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_drop_Rc_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Adder>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_drop_Rc_Getter(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Getter>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_adder_counter() -> u32 {\n    get_adder_counter()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_getter() -> *const u8 {\n    Box::into_raw(Box::new(get_getter())) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_getter_counter() -> u32 {\n    get_getter_counter()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_set_adder_box(const void* adder_ptr);\nint32_t _ffi_fn_set_adder_rc(const void* adder_ptr);\n\n} // extern \"C\"\n\nextern \"C\" {\n\nint32_t _ffi_cpp_Box_Adder__add(rust::Adder* _self, int32_t y) {\n    return _self->add(y);\n}\n\nint32_t _ffi_cpp_Rc_Adder__add(std::shared_ptr<rust::Adder>* _self, int32_t y) {\n    return _self->get()->add(y);\n}\n\nvoid _ffi_cpp_drop_Box_Adder(rust::Adder* self) {\n    delete self;\n}\n\nvoid _ffi_cpp_drop_Rc_Adder(std::shared_ptr<rust::Adder>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::set_adder_box(std::unique_ptr<rust::Adder> adder) {\n    auto adder_ptr = adder.release();\n    return _ffi_fn_set_adder_box(adder_ptr);\n}\n\nint32_t rust::set_adder_rc(std::shared_ptr<rust::Adder> adder) {\n    auto adder_ptr = new std::shared_ptr<rust::Adder>(adder);\n    return _ffi_fn_set_adder_rc(adder_ptr);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n\nnamespace rust {\n\nstruct Adder {\n    virtual ~Adder() {}\n    virtual int32_t add(int32_t y) = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nint32_t set_adder_rc(std::shared_ptr<Adder> adder);\n\nint32_t set_adder_box(std::unique_ptr<Adder> adder);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_adder_box(adder_ptr: *const u8) -> i32 {\n    set_adder_box(Box::new(_ffi_rs_Box_Adder(adder_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_adder_rc(adder_ptr: *const u8) -> i32 {\n    set_adder_rc(std::rc::Rc::new(_ffi_rs_Rc_Adder(adder_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Box_Adder(*const u8);\n\nimpl Drop for _ffi_rs_Box_Adder {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_cpp_drop_Box_Adder(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Box_Adder(self.0) };\n    }\n}\n\nimpl Adder for _ffi_rs_Box_Adder {\n    fn add(&self, y: i32) -> i32 {\n        extern \"C\" { fn _ffi_cpp_Box_Adder__add(_: *const u8, y: i32) -> i32; }\n        unsafe { _ffi_cpp_Box_Adder__add(self.0, y) }\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Adder(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Adder {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_cpp_drop_Rc_Adder(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Adder(self.0) };\n    }\n}\n\nimpl Adder for _ffi_rs_Rc_Adder {\n    fn add(&self, y: i32) -> i32 {\n        extern \"C\" { fn _ffi_cpp_Rc_Adder__add(_: *const u8, y: i32) -> i32; }\n        unsafe { _ffi_cpp_Rc_Adder__add(self.0, y) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_set_adder_box(const void* adder_ptr);\nint32_t _ffi_fn_set_adder_rc(const void* adder_ptr);\n\n} // extern \"C\"\n\nextern \"C\" {\n\nint32_t _ffi_cpp_Box_Adder__add(rust::Adder* _self, int32_t y) {\n    return _self->add(y);\n}\n\nint32_t _ffi_cpp_Rc_Adder__add(std::shared_ptr<rust::Adder>* _self, int32_t y) {\n    return _self->get()->add(y);\n}\n\nvoid _ffi_cpp_drop_Box_Adder(rust::Adder* self) {\n    delete self;\n}\n\nvoid _ffi_cpp_drop_Rc_Adder(std::shared_ptr<rust::Adder>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::set_adder_box(std::unique_ptr<rust::Adder> adder) {\n    auto adder_ptr = adder.release();\n    return _ffi_fn_set_adder_box(adder_ptr);\n}\n\nint32_t rust::set_adder_rc(std::shared_ptr<rust::Adder> adder) {\n    auto adder_ptr = new std::shared_ptr<rust::Adder>(adder);\n    return _ffi_fn_set_adder_rc(adder_ptr);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n\nnamespace rust {\n\nstruct Adder {\n    virtual ~Adder() {}\n    virtual int32_t add(int32_t y) = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nint32_t set_adder_rc(std::shared_ptr<Adder> adder);\n\nint32_t set_adder_box(std::unique_ptr<Adder> adder);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_adder_box(adder_ptr: *const u8) -> i32 {\n    set_adder_box(Box::new(_ffi_rs_Box_Adder(adder_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_adder_rc(adder_ptr: *const u8) -> i32 {\n    set_adder_rc(std::rc::Rc::new(_ffi_rs_Rc_Adder(adder_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Box_Adder(*const u8);\n\nimpl Drop for _ffi_rs_Box_Adder {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_cpp_drop_Box_Adder(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Box_Adder(self.0) };\n    }\n}\n\nimpl Adder for _ffi_rs_Box_Adder {\n    fn add(&self, y: i32) -> i32 {\n        unsafe extern \"C\" { fn _ffi_cpp_Box_Adder__add(_: *const u8, y: i32) -> i32; }\n        unsafe { _ffi_cpp_Box_Adder__add(self.0, y) }\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Adder(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Adder {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_cpp_drop_Rc_Adder(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Adder(self.0) };\n    }\n}\n\nimpl Adder for _ffi_rs_Rc_Adder {\n    fn add(&self, y: i32) -> i32 {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_Adder__add(_: *const u8, y: i32) -> i32; }\n        unsafe { _ffi_cpp_Rc_Adder__add(self.0, y) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_export_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nvoid _ffi_drop_Rc_Exported(const void* ptr);\nint32_t _ffi_Rc_Exported__add(const void* _self, int32_t x, int32_t y);\nuint32_t _ffi_fn_get_counter();\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_set_imported(const void* imported_ptr);\n\n} // extern \"C\"\n\nnamespace {\n\nstruct _ffi_Rc_Exported final : rust::Exported {\n    _ffi_Rc_Exported(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Rc_Exported() { _ffi_drop_Rc_Exported(_self); }\n    virtual int32_t add(int32_t x, int32_t y);\n    const void* _self;\n};\n\n} // namespace\n\nextern \"C\" {\n\nint32_t _ffi_cpp_Rc_Imported__run(std::shared_ptr<rust::Imported>* _self, const void* exported_ptr) {\n    auto exported = std::make_shared<_ffi_Rc_Exported>(exported_ptr);\n    return _self->get()->run(std::move(exported));\n}\n\nvoid _ffi_cpp_drop_Rc_Imported(std::shared_ptr<rust::Imported>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nint32_t _ffi_Rc_Exported::add(int32_t x, int32_t y) {\n    return _ffi_Rc_Exported__add(_self, x, y);\n}\n\nuint32_t rust::get_counter() {\n    return _ffi_fn_get_counter();\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::set_imported(std::shared_ptr<rust::Imported> imported) {\n    auto imported_ptr = new std::shared_ptr<rust::Imported>(imported);\n    return _ffi_fn_set_imported(imported_ptr);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_export_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n\nnamespace rust {\n\nstruct Exported;\n\nstruct Exported {\n    virtual ~Exported() {}\n    virtual int32_t add(int32_t x, int32_t y) = 0;\n};\n\nstruct Imported {\n    virtual ~Imported() {}\n    virtual int32_t run(std::shared_ptr<Exported> exported) = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nuint32_t get_counter();\n\nint32_t set_imported(std::shared_ptr<Imported> imported);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_export_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Exported__add(_self: *const u8, x: i32, y: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Exported>) };\n    _self.add(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_drop_Rc_Exported(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Exported>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_imported(imported_ptr: *const u8) -> i32 {\n    set_imported(std::rc::Rc::new(_ffi_rs_Rc_Imported(imported_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Imported(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Imported {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_cpp_drop_Rc_Imported(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Imported(self.0) };\n    }\n}\n\nimpl Imported for _ffi_rs_Rc_Imported {\n    fn run(&self, exported: std::rc::Rc<dyn Exported>) -> i32 {\n        extern \"C\" { fn _ffi_cpp_Rc_Imported__run(_: *const u8, exported_ptr: *const u8) -> i32; }\n        unsafe { _ffi_cpp_Rc_Imported__run(self.0, Box::into_raw(Box::new(exported)) as *const u8) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_export_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nvoid _ffi_drop_Rc_Exported(const void* ptr);\nint32_t _ffi_Rc_Exported__add(const void* _self, int32_t x, int32_t y);\nuint32_t _ffi_fn_get_counter();\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_set_imported(const void* imported_ptr);\n\n} // extern \"C\"\n\nnamespace {\n\nstruct _ffi_Rc_Exported final : rust::Exported {\n    _ffi_Rc_Exported(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Rc_Exported() { _ffi_drop_Rc_Exported(_self); }\n    virtual int32_t add(int32_t x, int32_t y);\n    const void* _self;\n};\n\n} // namespace\n\nextern \"C\" {\n\nint32_t _ffi_cpp_Rc_Imported__run(std::shared_ptr<rust::Imported>* _self, const void* exported_ptr) {\n    auto exported = std::make_shared<_ffi_Rc_Exported>(exported_ptr);\n    return _self->get()->run(std::move(exported));\n}\n\nvoid _ffi_cpp_drop_Rc_Imported(std::shared_ptr<rust::Imported>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nint32_t _ffi_Rc_Exported::add(int32_t x, int32_t y) {\n    return _ffi_Rc_Exported__add(_self, x, y);\n}\n\nuint32_t rust::get_counter() {\n    return _ffi_fn_get_counter();\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::set_imported(std::shared_ptr<rust::Imported> imported) {\n    auto imported_ptr = new std::shared_ptr<rust::Imported>(imported);\n    return _ffi_fn_set_imported(imported_ptr);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_export_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n\nnamespace rust {\n\nstruct Exported;\n\nstruct Exported {\n    virtual ~Exported() {}\n    virtual int32_t add(int32_t x, int32_t y) = 0;\n};\n\nstruct Imported {\n    virtual ~Imported() {}\n    virtual int32_t run(std::shared_ptr<Exported> exported) = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nuint32_t get_counter();\n\nint32_t set_imported(std::shared_ptr<Imported> imported);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_export_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Exported__add(_self: *const u8, x: i32, y: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Exported>) };\n    _self.add(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_drop_Rc_Exported(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Exported>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_imported(imported_ptr: *const u8) -> i32 {\n    set_imported(std::rc::Rc::new(_ffi_rs_Rc_Imported(imported_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Imported(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Imported {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_cpp_drop_Rc_Imported(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Imported(self.0) };\n    }\n}\n\nimpl Imported for _ffi_rs_Rc_Imported {\n    fn run(&self, exported: std::rc::Rc<dyn Exported>) -> i32 {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_Imported__run(_: *const u8, exported_ptr: *const u8) -> i32; }\n        unsafe { _ffi_cpp_Rc_Imported__run(self.0, Box::into_raw(Box::new(exported)) as *const u8) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_nested_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_set_getter(const void* getter_ptr);\n\n} // extern \"C\"\n\nextern \"C\" {\n\nint32_t _ffi_cpp_Rc_Adder__add(std::shared_ptr<rust::Adder>* _self, int32_t x, int32_t y) {\n    return _self->get()->add(x, y);\n}\n\nconst void* _ffi_cpp_Rc_Getter__get_adder(std::shared_ptr<rust::Getter>* _self) {\n    return new std::shared_ptr<rust::Adder>(_self->get()->get_adder());\n}\n\nvoid _ffi_cpp_drop_Rc_Adder(std::shared_ptr<rust::Adder>* self) {\n    delete self;\n}\n\nvoid _ffi_cpp_drop_Rc_Getter(std::shared_ptr<rust::Getter>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::set_getter(std::shared_ptr<rust::Getter> getter) {\n    auto getter_ptr = new std::shared_ptr<rust::Getter>(getter);\n    return _ffi_fn_set_getter(getter_ptr);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_nested_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n\nnamespace rust {\n\nstruct Adder;\n\nstruct Adder {\n    virtual ~Adder() {}\n    virtual int32_t add(int32_t x, int32_t y) = 0;\n};\n\nstruct Getter {\n    virtual ~Getter() {}\n    virtual std::shared_ptr<Adder> get_adder() = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nint32_t set_getter(std::shared_ptr<Getter> getter);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_nested_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_getter(getter_ptr: *const u8) -> i32 {\n    set_getter(std::rc::Rc::new(_ffi_rs_Rc_Getter(getter_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Adder(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Adder {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_cpp_drop_Rc_Adder(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Adder(self.0) };\n    }\n}\n\nimpl Adder for _ffi_rs_Rc_Adder {\n    fn add(&self, x: i32, y: i32) -> i32 {\n        extern \"C\" { fn _ffi_cpp_Rc_Adder__add(_: *const u8, x: i32, y: i32) -> i32; }\n        unsafe { _ffi_cpp_Rc_Adder__add(self.0, x, y) }\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Getter(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Getter {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_cpp_drop_Rc_Getter(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Getter(self.0) };\n    }\n}\n\nimpl Getter for _ffi_rs_Rc_Getter {\n    fn get_adder(&self) -> std::rc::Rc<dyn Adder> {\n        extern \"C\" { fn _ffi_cpp_Rc_Getter__get_adder(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_cpp_Rc_Getter__get_adder(self.0) };\n        std::rc::Rc::new(_ffi_rs_Rc_Adder(ret_ptr))\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_nested_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_set_getter(const void* getter_ptr);\n\n} // extern \"C\"\n\nextern \"C\" {\n\nint32_t _ffi_cpp_Rc_Adder__add(std::shared_ptr<rust::Adder>* _self, int32_t x, int32_t y) {\n    return _self->get()->add(x, y);\n}\n\nconst void* _ffi_cpp_Rc_Getter__get_adder(std::shared_ptr<rust::Getter>* _self) {\n    return new std::shared_ptr<rust::Adder>(_self->get()->get_adder());\n}\n\nvoid _ffi_cpp_drop_Rc_Adder(std::shared_ptr<rust::Adder>* self) {\n    delete self;\n}\n\nvoid _ffi_cpp_drop_Rc_Getter(std::shared_ptr<rust::Getter>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::set_getter(std::shared_ptr<rust::Getter> getter) {\n    auto getter_ptr = new std::shared_ptr<rust::Getter>(getter);\n    return _ffi_fn_set_getter(getter_ptr);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_nested_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n\nnamespace rust {\n\nstruct Adder;\n\nstruct Adder {\n    virtual ~Adder() {}\n    virtual int32_t add(int32_t x, int32_t y) = 0;\n};\n\nstruct Getter {\n    virtual ~Getter() {}\n    virtual std::shared_ptr<Adder> get_adder() = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nint32_t set_getter(std::shared_ptr<Getter> getter);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_nested_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_getter(getter_ptr: *const u8) -> i32 {\n    set_getter(std::rc::Rc::new(_ffi_rs_Rc_Getter(getter_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Adder(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Adder {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_cpp_drop_Rc_Adder(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Adder(self.0) };\n    }\n}\n\nimpl Adder for _ffi_rs_Rc_Adder {\n    fn add(&self, x: i32, y: i32) -> i32 {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_Adder__add(_: *const u8, x: i32, y: i32) -> i32; }\n        unsafe { _ffi_cpp_Rc_Adder__add(self.0, x, y) }\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Getter(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Getter {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_cpp_drop_Rc_Getter(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Getter(self.0) };\n    }\n}\n\nimpl Getter for _ffi_rs_Rc_Getter {\n    fn get_adder(&self) -> std::rc::Rc<dyn Adder> {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_Getter__get_adder(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_cpp_Rc_Getter__get_adder(self.0) };\n        std::rc::Rc::new(_ffi_rs_Rc_Adder(ret_ptr))\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_struct_in_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_set_empty_struct(const void* struct_in_ptr);\nfloat _ffi_fn_set_multiply_pairs(const void* struct_in_ptr);\nint32_t _ffi_fn_set_single_element_struct(const void* struct_in_ptr);\n\n} // extern \"C\"\n\nextern \"C\" {\n\nint32_t _ffi_cpp_Rc_StructIn__empty_struct(std::shared_ptr<rust::StructIn>* _self, int32_t x, int32_t y) {\n    auto foo = rust::EmptyStruct{};\n    return _self->get()->empty_struct(x, std::move(foo), y);\n}\n\nfloat _ffi_cpp_Rc_StructIn__multiply_pairs(std::shared_ptr<rust::StructIn>* _self, float ab_x, float ab_y, float cd_x, float cd_y) {\n    auto ab = rust::PairStruct{ab_x, ab_y};\n    auto cd = rust::PairStruct{cd_x, cd_y};\n    return _self->get()->multiply_pairs(std::move(ab), std::move(cd));\n}\n\nint32_t _ffi_cpp_Rc_StructIn__single_element_struct(std::shared_ptr<rust::StructIn>* _self, int32_t x_0, int32_t y_0) {\n    auto x = rust::SingleElementStruct{x_0};\n    auto y = rust::SingleElementStruct{y_0};\n    return _self->get()->single_element_struct(std::move(x), std::move(y));\n}\n\nvoid _ffi_cpp_drop_Rc_StructIn(std::shared_ptr<rust::StructIn>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::set_empty_struct(std::shared_ptr<rust::StructIn> struct_in) {\n    auto struct_in_ptr = new std::shared_ptr<rust::StructIn>(struct_in);\n    return _ffi_fn_set_empty_struct(struct_in_ptr);\n}\n\nfloat rust::set_multiply_pairs(std::shared_ptr<rust::StructIn> struct_in) {\n    auto struct_in_ptr = new std::shared_ptr<rust::StructIn>(struct_in);\n    return _ffi_fn_set_multiply_pairs(struct_in_ptr);\n}\n\nint32_t rust::set_single_element_struct(std::shared_ptr<rust::StructIn> struct_in) {\n    auto struct_in_ptr = new std::shared_ptr<rust::StructIn>(struct_in);\n    return _ffi_fn_set_single_element_struct(struct_in_ptr);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_struct_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n\nnamespace rust {\n\nstruct EmptyStruct {\n};\n\nstruct PairStruct {\n    float x = 0.0f;\n    float y = 0.0f;\n};\n\nstruct SingleElementStruct {\n    int32_t _0 = 0;\n};\n\nstruct StructIn {\n    virtual ~StructIn() {}\n    virtual int32_t empty_struct(int32_t x, EmptyStruct foo, int32_t y) = 0;\n    virtual int32_t single_element_struct(SingleElementStruct x, SingleElementStruct y) = 0;\n    virtual float multiply_pairs(PairStruct ab, PairStruct cd) = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nint32_t set_empty_struct(std::shared_ptr<StructIn> struct_in);\n\nint32_t set_single_element_struct(std::shared_ptr<StructIn> struct_in);\n\nfloat set_multiply_pairs(std::shared_ptr<StructIn> struct_in);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_struct_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_empty_struct(struct_in_ptr: *const u8) -> i32 {\n    set_empty_struct(std::rc::Rc::new(_ffi_rs_Rc_StructIn(struct_in_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_multiply_pairs(struct_in_ptr: *const u8) -> f32 {\n    set_multiply_pairs(std::rc::Rc::new(_ffi_rs_Rc_StructIn(struct_in_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_single_element_struct(struct_in_ptr: *const u8) -> i32 {\n    set_single_element_struct(std::rc::Rc::new(_ffi_rs_Rc_StructIn(struct_in_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_StructIn(*const u8);\n\nimpl Drop for _ffi_rs_Rc_StructIn {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_cpp_drop_Rc_StructIn(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_StructIn(self.0) };\n    }\n}\n\nimpl StructIn for _ffi_rs_Rc_StructIn {\n    fn empty_struct(&self, x: i32, foo: EmptyStruct, y: i32) -> i32 {\n        extern \"C\" { fn _ffi_cpp_Rc_StructIn__empty_struct(_: *const u8, x: i32, y: i32) -> i32; }\n        _ = foo;\n        unsafe { _ffi_cpp_Rc_StructIn__empty_struct(self.0, x, y) }\n    }\n\n    fn single_element_struct(&self, x: SingleElementStruct, y: SingleElementStruct) -> i32 {\n        extern \"C\" { fn _ffi_cpp_Rc_StructIn__single_element_struct(_: *const u8, x_0: i32, y_0: i32) -> i32; }\n        unsafe { _ffi_cpp_Rc_StructIn__single_element_struct(self.0, x.0, y.0) }\n    }\n\n    fn multiply_pairs(&self, ab: PairStruct, cd: PairStruct) -> f32 {\n        extern \"C\" { fn _ffi_cpp_Rc_StructIn__multiply_pairs(_: *const u8, ab_x: f32, ab_y: f32, cd_x: f32, cd_y: f32) -> f32; }\n        unsafe { _ffi_cpp_Rc_StructIn__multiply_pairs(self.0, ab.x, ab.y, cd.x, cd.y) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_struct_in_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_set_empty_struct(const void* struct_in_ptr);\nfloat _ffi_fn_set_multiply_pairs(const void* struct_in_ptr);\nint32_t _ffi_fn_set_single_element_struct(const void* struct_in_ptr);\n\n} // extern \"C\"\n\nextern \"C\" {\n\nint32_t _ffi_cpp_Rc_StructIn__empty_struct(std::shared_ptr<rust::StructIn>* _self, int32_t x, int32_t y) {\n    auto foo = rust::EmptyStruct{};\n    return _self->get()->empty_struct(x, std::move(foo), y);\n}\n\nfloat _ffi_cpp_Rc_StructIn__multiply_pairs(std::shared_ptr<rust::StructIn>* _self, float ab_x, float ab_y, float cd_x, float cd_y) {\n    auto ab = rust::PairStruct{ab_x, ab_y};\n    auto cd = rust::PairStruct{cd_x, cd_y};\n    return _self->get()->multiply_pairs(std::move(ab), std::move(cd));\n}\n\nint32_t _ffi_cpp_Rc_StructIn__single_element_struct(std::shared_ptr<rust::StructIn>* _self, int32_t x_0, int32_t y_0) {\n    auto x = rust::SingleElementStruct{x_0};\n    auto y = rust::SingleElementStruct{y_0};\n    return _self->get()->single_element_struct(std::move(x), std::move(y));\n}\n\nvoid _ffi_cpp_drop_Rc_StructIn(std::shared_ptr<rust::StructIn>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::set_empty_struct(std::shared_ptr<rust::StructIn> struct_in) {\n    auto struct_in_ptr = new std::shared_ptr<rust::StructIn>(struct_in);\n    return _ffi_fn_set_empty_struct(struct_in_ptr);\n}\n\nfloat rust::set_multiply_pairs(std::shared_ptr<rust::StructIn> struct_in) {\n    auto struct_in_ptr = new std::shared_ptr<rust::StructIn>(struct_in);\n    return _ffi_fn_set_multiply_pairs(struct_in_ptr);\n}\n\nint32_t rust::set_single_element_struct(std::shared_ptr<rust::StructIn> struct_in) {\n    auto struct_in_ptr = new std::shared_ptr<rust::StructIn>(struct_in);\n    return _ffi_fn_set_single_element_struct(struct_in_ptr);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_struct_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n\nnamespace rust {\n\nstruct EmptyStruct {\n};\n\nstruct PairStruct {\n    float x = 0.0f;\n    float y = 0.0f;\n};\n\nstruct SingleElementStruct {\n    int32_t _0 = 0;\n};\n\nstruct StructIn {\n    virtual ~StructIn() {}\n    virtual int32_t empty_struct(int32_t x, EmptyStruct foo, int32_t y) = 0;\n    virtual int32_t single_element_struct(SingleElementStruct x, SingleElementStruct y) = 0;\n    virtual float multiply_pairs(PairStruct ab, PairStruct cd) = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nint32_t set_empty_struct(std::shared_ptr<StructIn> struct_in);\n\nint32_t set_single_element_struct(std::shared_ptr<StructIn> struct_in);\n\nfloat set_multiply_pairs(std::shared_ptr<StructIn> struct_in);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_struct_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_empty_struct(struct_in_ptr: *const u8) -> i32 {\n    set_empty_struct(std::rc::Rc::new(_ffi_rs_Rc_StructIn(struct_in_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_multiply_pairs(struct_in_ptr: *const u8) -> f32 {\n    set_multiply_pairs(std::rc::Rc::new(_ffi_rs_Rc_StructIn(struct_in_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_single_element_struct(struct_in_ptr: *const u8) -> i32 {\n    set_single_element_struct(std::rc::Rc::new(_ffi_rs_Rc_StructIn(struct_in_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_StructIn(*const u8);\n\nimpl Drop for _ffi_rs_Rc_StructIn {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_cpp_drop_Rc_StructIn(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_StructIn(self.0) };\n    }\n}\n\nimpl StructIn for _ffi_rs_Rc_StructIn {\n    fn empty_struct(&self, x: i32, foo: EmptyStruct, y: i32) -> i32 {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_StructIn__empty_struct(_: *const u8, x: i32, y: i32) -> i32; }\n        _ = foo;\n        unsafe { _ffi_cpp_Rc_StructIn__empty_struct(self.0, x, y) }\n    }\n\n    fn single_element_struct(&self, x: SingleElementStruct, y: SingleElementStruct) -> i32 {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_StructIn__single_element_struct(_: *const u8, x_0: i32, y_0: i32) -> i32; }\n        unsafe { _ffi_cpp_Rc_StructIn__single_element_struct(self.0, x.0, y.0) }\n    }\n\n    fn multiply_pairs(&self, ab: PairStruct, cd: PairStruct) -> f32 {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_StructIn__multiply_pairs(_: *const u8, ab_x: f32, ab_y: f32, cd_x: f32, cd_y: f32) -> f32; }\n        unsafe { _ffi_cpp_Rc_StructIn__multiply_pairs(self.0, ab.x, ab.y, cd.x, cd.y) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_tuple_in_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_set_empty_tuple(const void* tuple_in_ptr);\nfloat _ffi_fn_set_multiply_pairs(const void* tuple_in_ptr);\nint32_t _ffi_fn_set_single_element_tuple(const void* tuple_in_ptr);\n\n} // extern \"C\"\n\nextern \"C\" {\n\nint32_t _ffi_cpp_Rc_TupleIn__empty_tuple(std::shared_ptr<rust::TupleIn>* _self, int32_t x, int32_t y) {\n    auto foo = std::tuple<>();\n    return _self->get()->empty_tuple(x, std::move(foo), y);\n}\n\nfloat _ffi_cpp_Rc_TupleIn__multiply_pairs(std::shared_ptr<rust::TupleIn>* _self, float ab_0, float ab_1, float cd_0, float cd_1) {\n    auto ab = std::make_tuple(ab_0, ab_1);\n    auto cd = std::make_tuple(cd_0, cd_1);\n    return _self->get()->multiply_pairs(std::move(ab), std::move(cd));\n}\n\nint32_t _ffi_cpp_Rc_TupleIn__single_element_tuple(std::shared_ptr<rust::TupleIn>* _self, int32_t x_0, int32_t y_0) {\n    auto x = x_0;\n    auto y = y_0;\n    return _self->get()->single_element_tuple(std::move(x), std::move(y));\n}\n\nvoid _ffi_cpp_drop_Rc_TupleIn(std::shared_ptr<rust::TupleIn>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::set_empty_tuple(std::shared_ptr<rust::TupleIn> tuple_in) {\n    auto tuple_in_ptr = new std::shared_ptr<rust::TupleIn>(tuple_in);\n    return _ffi_fn_set_empty_tuple(tuple_in_ptr);\n}\n\nfloat rust::set_multiply_pairs(std::shared_ptr<rust::TupleIn> tuple_in) {\n    auto tuple_in_ptr = new std::shared_ptr<rust::TupleIn>(tuple_in);\n    return _ffi_fn_set_multiply_pairs(tuple_in_ptr);\n}\n\nint32_t rust::set_single_element_tuple(std::shared_ptr<rust::TupleIn> tuple_in) {\n    auto tuple_in_ptr = new std::shared_ptr<rust::TupleIn>(tuple_in);\n    return _ffi_fn_set_single_element_tuple(tuple_in_ptr);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_tuple_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n#include <tuple>\n\nnamespace rust {\n\nstruct TupleIn {\n    virtual ~TupleIn() {}\n    virtual int32_t empty_tuple(int32_t x, std::tuple<> foo, int32_t y) = 0;\n    virtual int32_t single_element_tuple(std::tuple<int32_t> x, std::tuple<int32_t> y) = 0;\n    virtual float multiply_pairs(std::tuple<float, float> ab, std::tuple<float, float> cd) = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nint32_t set_empty_tuple(std::shared_ptr<TupleIn> tuple_in);\n\nint32_t set_single_element_tuple(std::shared_ptr<TupleIn> tuple_in);\n\nfloat set_multiply_pairs(std::shared_ptr<TupleIn> tuple_in);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_tuple_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_empty_tuple(tuple_in_ptr: *const u8) -> i32 {\n    set_empty_tuple(std::rc::Rc::new(_ffi_rs_Rc_TupleIn(tuple_in_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_multiply_pairs(tuple_in_ptr: *const u8) -> f32 {\n    set_multiply_pairs(std::rc::Rc::new(_ffi_rs_Rc_TupleIn(tuple_in_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_single_element_tuple(tuple_in_ptr: *const u8) -> i32 {\n    set_single_element_tuple(std::rc::Rc::new(_ffi_rs_Rc_TupleIn(tuple_in_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_TupleIn(*const u8);\n\nimpl Drop for _ffi_rs_Rc_TupleIn {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_cpp_drop_Rc_TupleIn(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_TupleIn(self.0) };\n    }\n}\n\nimpl TupleIn for _ffi_rs_Rc_TupleIn {\n    fn empty_tuple(&self, x: i32, foo: (), y: i32) -> i32 {\n        extern \"C\" { fn _ffi_cpp_Rc_TupleIn__empty_tuple(_: *const u8, x: i32, y: i32) -> i32; }\n        _ = foo;\n        unsafe { _ffi_cpp_Rc_TupleIn__empty_tuple(self.0, x, y) }\n    }\n\n    fn single_element_tuple(&self, x: (i32,), y: (i32,)) -> i32 {\n        extern \"C\" { fn _ffi_cpp_Rc_TupleIn__single_element_tuple(_: *const u8, x_0: i32, y_0: i32) -> i32; }\n        unsafe { _ffi_cpp_Rc_TupleIn__single_element_tuple(self.0, x.0, y.0) }\n    }\n\n    fn multiply_pairs(&self, ab: (f32, f32), cd: (f32, f32)) -> f32 {\n        extern \"C\" { fn _ffi_cpp_Rc_TupleIn__multiply_pairs(_: *const u8, ab_0: f32, ab_1: f32, cd_0: f32, cd_1: f32) -> f32; }\n        unsafe { _ffi_cpp_Rc_TupleIn__multiply_pairs(self.0, ab.0, ab.1, cd.0, cd.1) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_tuple_in_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nextern \"C\" {\n\nuintptr_t _ffi_fn_rust_mem_leaked();\nint32_t _ffi_fn_set_empty_tuple(const void* tuple_in_ptr);\nfloat _ffi_fn_set_multiply_pairs(const void* tuple_in_ptr);\nint32_t _ffi_fn_set_single_element_tuple(const void* tuple_in_ptr);\n\n} // extern \"C\"\n\nextern \"C\" {\n\nint32_t _ffi_cpp_Rc_TupleIn__empty_tuple(std::shared_ptr<rust::TupleIn>* _self, int32_t x, int32_t y) {\n    auto foo = std::tuple<>();\n    return _self->get()->empty_tuple(x, std::move(foo), y);\n}\n\nfloat _ffi_cpp_Rc_TupleIn__multiply_pairs(std::shared_ptr<rust::TupleIn>* _self, float ab_0, float ab_1, float cd_0, float cd_1) {\n    auto ab = std::make_tuple(ab_0, ab_1);\n    auto cd = std::make_tuple(cd_0, cd_1);\n    return _self->get()->multiply_pairs(std::move(ab), std::move(cd));\n}\n\nint32_t _ffi_cpp_Rc_TupleIn__single_element_tuple(std::shared_ptr<rust::TupleIn>* _self, int32_t x_0, int32_t y_0) {\n    auto x = x_0;\n    auto y = y_0;\n    return _self->get()->single_element_tuple(std::move(x), std::move(y));\n}\n\nvoid _ffi_cpp_drop_Rc_TupleIn(std::shared_ptr<rust::TupleIn>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nint32_t rust::set_empty_tuple(std::shared_ptr<rust::TupleIn> tuple_in) {\n    auto tuple_in_ptr = new std::shared_ptr<rust::TupleIn>(tuple_in);\n    return _ffi_fn_set_empty_tuple(tuple_in_ptr);\n}\n\nfloat rust::set_multiply_pairs(std::shared_ptr<rust::TupleIn> tuple_in) {\n    auto tuple_in_ptr = new std::shared_ptr<rust::TupleIn>(tuple_in);\n    return _ffi_fn_set_multiply_pairs(tuple_in_ptr);\n}\n\nint32_t rust::set_single_element_tuple(std::shared_ptr<rust::TupleIn> tuple_in) {\n    auto tuple_in_ptr = new std::shared_ptr<rust::TupleIn>(tuple_in);\n    return _ffi_fn_set_single_element_tuple(tuple_in_ptr);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_tuple_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n#include <tuple>\n\nnamespace rust {\n\nstruct TupleIn {\n    virtual ~TupleIn() {}\n    virtual int32_t empty_tuple(int32_t x, std::tuple<> foo, int32_t y) = 0;\n    virtual int32_t single_element_tuple(std::tuple<int32_t> x, std::tuple<int32_t> y) = 0;\n    virtual float multiply_pairs(std::tuple<float, float> ab, std::tuple<float, float> cd) = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nint32_t set_empty_tuple(std::shared_ptr<TupleIn> tuple_in);\n\nint32_t set_single_element_tuple(std::shared_ptr<TupleIn> tuple_in);\n\nfloat set_multiply_pairs(std::shared_ptr<TupleIn> tuple_in);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_import_tuple_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_empty_tuple(tuple_in_ptr: *const u8) -> i32 {\n    set_empty_tuple(std::rc::Rc::new(_ffi_rs_Rc_TupleIn(tuple_in_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_multiply_pairs(tuple_in_ptr: *const u8) -> f32 {\n    set_multiply_pairs(std::rc::Rc::new(_ffi_rs_Rc_TupleIn(tuple_in_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_single_element_tuple(tuple_in_ptr: *const u8) -> i32 {\n    set_single_element_tuple(std::rc::Rc::new(_ffi_rs_Rc_TupleIn(tuple_in_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_TupleIn(*const u8);\n\nimpl Drop for _ffi_rs_Rc_TupleIn {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_cpp_drop_Rc_TupleIn(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_TupleIn(self.0) };\n    }\n}\n\nimpl TupleIn for _ffi_rs_Rc_TupleIn {\n    fn empty_tuple(&self, x: i32, foo: (), y: i32) -> i32 {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_TupleIn__empty_tuple(_: *const u8, x: i32, y: i32) -> i32; }\n        _ = foo;\n        unsafe { _ffi_cpp_Rc_TupleIn__empty_tuple(self.0, x, y) }\n    }\n\n    fn single_element_tuple(&self, x: (i32,), y: (i32,)) -> i32 {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_TupleIn__single_element_tuple(_: *const u8, x_0: i32, y_0: i32) -> i32; }\n        unsafe { _ffi_cpp_Rc_TupleIn__single_element_tuple(self.0, x.0, y.0) }\n    }\n\n    fn multiply_pairs(&self, ab: (f32, f32), cd: (f32, f32)) -> f32 {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_TupleIn__multiply_pairs(_: *const u8, ab_0: f32, ab_1: f32, cd_0: f32, cd_1: f32) -> f32; }\n        unsafe { _ffi_cpp_Rc_TupleIn__multiply_pairs(self.0, ab.0, ab.1, cd.0, cd.1) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_string_2021/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_ptr_2_usize {\n    const char* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nstruct _ffi_ret_ptr_usize {\n    const void* _0;\n    uintptr_t _1;\n};\n\nextern \"C\" {\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\nvoid _ffi_drop_Rc_Test(const void* ptr);\nvoid* _ffi_alloc(uintptr_t len);\n_ffi_ret_ptr_2_usize _ffi_Rc_Test__get_string(const void* _self);\nvoid _ffi_Rc_Test__set_str(const void* _self, const void* x_ptr, uintptr_t x_len);\nvoid _ffi_Rc_Test__set_string(const void* _self, const void* x_ptr, uintptr_t x_len);\nconst void* _ffi_fn_get_test();\nuintptr_t _ffi_fn_rust_mem_leaked();\n_ffi_ret_ptr_2_usize _ffi_fn_set_test(const void* test_ptr);\n\n} // extern \"C\"\n\nnamespace {\n\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\nstruct _ffi_Rc_Test final : rust::Test {\n    _ffi_Rc_Test(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Rc_Test() { _ffi_drop_Rc_Test(_self); }\n    virtual std::string get_string();\n    virtual void set_string(std::string x);\n    virtual void set_str(std::string x);\n    const void* _self;\n};\n\nconst void* _ffi_string_to_rust(const std::string& str, uintptr_t &len) {\n    len = str.size();\n    return memcpy(_ffi_alloc(len), str.data(), len);\n}\n\n} // namespace\n\nextern \"C\" {\n\n_ffi_ret_ptr_usize _ffi_cpp_Rc_Test__get_string(std::shared_ptr<rust::Test>* _self) {\n    uintptr_t ret_len;\n    const void* ret_ptr = _ffi_string_to_rust(_self->get()->get_string(), ret_len);\n    return _ffi_ret_ptr_usize{ret_ptr, ret_len};\n}\n\nvoid _ffi_cpp_Rc_Test__set_str(std::shared_ptr<rust::Test>* _self, const char* x_ptr, uintptr_t x_len, uintptr_t x_cap) {\n    auto x = _ffi_string_from_rust(x_ptr, x_len, x_cap);\n    _self->get()->set_str(std::move(x));\n}\n\nvoid _ffi_cpp_Rc_Test__set_string(std::shared_ptr<rust::Test>* _self, const char* x_ptr, uintptr_t x_len, uintptr_t x_cap) {\n    auto x = _ffi_string_from_rust(x_ptr, x_len, x_cap);\n    _self->get()->set_string(std::move(x));\n}\n\nvoid _ffi_cpp_drop_Rc_Test(std::shared_ptr<rust::Test>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nstd::string _ffi_Rc_Test::get_string() {\n    auto multi_ret = _ffi_Rc_Test__get_string(_self);\n    auto ret_ptr = multi_ret._0;\n    auto ret_len = multi_ret._1;\n    auto ret_cap = multi_ret._2;\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nvoid _ffi_Rc_Test::set_str(std::string x) {\n    uintptr_t x_len;\n    const void* x_ptr = _ffi_string_to_rust(x, x_len);\n    _ffi_Rc_Test__set_str(_self, x_ptr, x_len);\n}\n\nvoid _ffi_Rc_Test::set_string(std::string x) {\n    uintptr_t x_len;\n    const void* x_ptr = _ffi_string_to_rust(x, x_len);\n    _ffi_Rc_Test__set_string(_self, x_ptr, x_len);\n}\n\nstd::shared_ptr<rust::Test> rust::get_test() {\n    auto ret_ptr = _ffi_fn_get_test();\n    return std::make_shared<_ffi_Rc_Test>(ret_ptr);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nstd::string rust::set_test(std::shared_ptr<rust::Test> test) {\n    auto test_ptr = new std::shared_ptr<rust::Test>(test);\n    auto multi_ret = _ffi_fn_set_test(test_ptr);\n    auto ret_ptr = multi_ret._0;\n    auto ret_len = multi_ret._1;\n    auto ret_cap = multi_ret._2;\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_string_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n#include <string>\n\nnamespace rust {\n\nstruct Test {\n    virtual ~Test() {}\n    virtual std::string get_string() = 0;\n    virtual void set_string(std::string x) = 0;\n    virtual void set_str(std::string x) = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nstd::shared_ptr<Test> get_test();\n\nstd::string set_test(std::shared_ptr<Test> test);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_string_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Test__get_string(_self: *const u8) -> _ffi_ret_ptr_2_usize {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(_self.get_string());\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Test__set_str(_self: *const u8, x_ptr: *const u8, x_len: usize) {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    _self.set_str(&_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Test__set_string(_self: *const u8, x_ptr: *const u8, x_len: usize) {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    _self.set_string(_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_drop_Rc_Test(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Test>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_test() -> *const u8 {\n    Box::into_raw(Box::new(get_test())) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_test(test_ptr: *const u8) -> _ffi_ret_ptr_2_usize {\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(set_test(std::rc::Rc::new(_ffi_rs_Rc_Test(test_ptr))));\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Test(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Test {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_cpp_drop_Rc_Test(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Test(self.0) };\n    }\n}\n\nimpl Test for _ffi_rs_Rc_Test {\n    fn get_string(&self) -> String {\n        extern \"C\" { fn _ffi_cpp_Rc_Test__get_string(_: *const u8) -> _ffi_ret_ptr_usize; }\n        let multi_ret = unsafe { _ffi_cpp_Rc_Test__get_string(self.0) };\n        let ret_ptr = multi_ret.0;\n        let ret_len = multi_ret.1;\n        _ffi_string_from_host(ret_ptr, ret_len)\n    }\n\n    fn set_string(&self, x: String) {\n        extern \"C\" { fn _ffi_cpp_Rc_Test__set_string(_: *const u8, x_ptr: *const u8, x_len: usize, x_cap: usize); }\n        let (x_ptr, x_len, x_cap) = _ffi_string_to_host(x);\n        unsafe { _ffi_cpp_Rc_Test__set_string(self.0, x_ptr, x_len, x_cap) };\n    }\n\n    fn set_str(&self, x: &str) {\n        extern \"C\" { fn _ffi_cpp_Rc_Test__set_str(_: *const u8, x_ptr: *const u8, x_len: usize, x_cap: usize); }\n        let (x_ptr, x_len, x_cap) = _ffi_string_to_host(x.into());\n        unsafe { _ffi_cpp_Rc_Test__set_str(self.0, x_ptr, x_len, x_cap) };\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_string_2024/ffi.cpp",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#include \"ffi.h\"\n\nstruct _ffi_ret_ptr_2_usize {\n    const char* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n};\n\nstruct _ffi_ret_ptr_usize {\n    const void* _0;\n    uintptr_t _1;\n};\n\nextern \"C\" {\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\nvoid _ffi_drop_Rc_Test(const void* ptr);\nvoid* _ffi_alloc(uintptr_t len);\n_ffi_ret_ptr_2_usize _ffi_Rc_Test__get_string(const void* _self);\nvoid _ffi_Rc_Test__set_str(const void* _self, const void* x_ptr, uintptr_t x_len);\nvoid _ffi_Rc_Test__set_string(const void* _self, const void* x_ptr, uintptr_t x_len);\nconst void* _ffi_fn_get_test();\nuintptr_t _ffi_fn_rust_mem_leaked();\n_ffi_ret_ptr_2_usize _ffi_fn_set_test(const void* test_ptr);\n\n} // extern \"C\"\n\nnamespace {\n\nstd::string _ffi_string_from_rust(const char* ptr, uintptr_t len, uintptr_t cap) {\n    std::string str(ptr, len);\n    _ffi_dealloc(ptr, cap);\n    return str;\n}\n\nstruct _ffi_Rc_Test final : rust::Test {\n    _ffi_Rc_Test(const void* ptr) : _self(ptr) {}\n    virtual ~_ffi_Rc_Test() { _ffi_drop_Rc_Test(_self); }\n    virtual std::string get_string();\n    virtual void set_string(std::string x);\n    virtual void set_str(std::string x);\n    const void* _self;\n};\n\nconst void* _ffi_string_to_rust(const std::string& str, uintptr_t &len) {\n    len = str.size();\n    return memcpy(_ffi_alloc(len), str.data(), len);\n}\n\n} // namespace\n\nextern \"C\" {\n\n_ffi_ret_ptr_usize _ffi_cpp_Rc_Test__get_string(std::shared_ptr<rust::Test>* _self) {\n    uintptr_t ret_len;\n    const void* ret_ptr = _ffi_string_to_rust(_self->get()->get_string(), ret_len);\n    return _ffi_ret_ptr_usize{ret_ptr, ret_len};\n}\n\nvoid _ffi_cpp_Rc_Test__set_str(std::shared_ptr<rust::Test>* _self, const char* x_ptr, uintptr_t x_len, uintptr_t x_cap) {\n    auto x = _ffi_string_from_rust(x_ptr, x_len, x_cap);\n    _self->get()->set_str(std::move(x));\n}\n\nvoid _ffi_cpp_Rc_Test__set_string(std::shared_ptr<rust::Test>* _self, const char* x_ptr, uintptr_t x_len, uintptr_t x_cap) {\n    auto x = _ffi_string_from_rust(x_ptr, x_len, x_cap);\n    _self->get()->set_string(std::move(x));\n}\n\nvoid _ffi_cpp_drop_Rc_Test(std::shared_ptr<rust::Test>* self) {\n    delete self;\n}\n\n} // extern \"C\"\n\nstd::string _ffi_Rc_Test::get_string() {\n    auto multi_ret = _ffi_Rc_Test__get_string(_self);\n    auto ret_ptr = multi_ret._0;\n    auto ret_len = multi_ret._1;\n    auto ret_cap = multi_ret._2;\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nvoid _ffi_Rc_Test::set_str(std::string x) {\n    uintptr_t x_len;\n    const void* x_ptr = _ffi_string_to_rust(x, x_len);\n    _ffi_Rc_Test__set_str(_self, x_ptr, x_len);\n}\n\nvoid _ffi_Rc_Test::set_string(std::string x) {\n    uintptr_t x_len;\n    const void* x_ptr = _ffi_string_to_rust(x, x_len);\n    _ffi_Rc_Test__set_string(_self, x_ptr, x_len);\n}\n\nstd::shared_ptr<rust::Test> rust::get_test() {\n    auto ret_ptr = _ffi_fn_get_test();\n    return std::make_shared<_ffi_Rc_Test>(ret_ptr);\n}\n\nuintptr_t rust::rust_mem_leaked() {\n    return _ffi_fn_rust_mem_leaked();\n}\n\nstd::string rust::set_test(std::shared_ptr<rust::Test> test) {\n    auto test_ptr = new std::shared_ptr<rust::Test>(test);\n    auto multi_ret = _ffi_fn_set_test(test_ptr);\n    auto ret_ptr = multi_ret._0;\n    auto ret_len = multi_ret._1;\n    auto ret_cap = multi_ret._2;\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_string_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <memory>\n#include <stdint.h>\n#include <string>\n\nnamespace rust {\n\nstruct Test {\n    virtual ~Test() {}\n    virtual std::string get_string() = 0;\n    virtual void set_string(std::string x) = 0;\n    virtual void set_str(std::string x) = 0;\n};\n\nuintptr_t rust_mem_leaked();\n\nstd::shared_ptr<Test> get_test();\n\nstd::string set_test(std::shared_ptr<Test> test);\n\n} // namespace rust\n"
  },
  {
    "path": "src/tests/snapshots/cpp_trait_string_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Test__get_string(_self: *const u8) -> _ffi_ret_ptr_2_usize {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(_self.get_string());\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Test__set_str(_self: *const u8, x_ptr: *const u8, x_len: usize) {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    _self.set_str(&_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Test__set_string(_self: *const u8, x_ptr: *const u8, x_len: usize) {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    _self.set_string(_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_drop_Rc_Test(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Test>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_test() -> *const u8 {\n    Box::into_raw(Box::new(get_test())) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_test(test_ptr: *const u8) -> _ffi_ret_ptr_2_usize {\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(set_test(std::rc::Rc::new(_ffi_rs_Rc_Test(test_ptr))));\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Rc_Test(*const u8);\n\nimpl Drop for _ffi_rs_Rc_Test {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_cpp_drop_Rc_Test(_: *const u8); }\n        unsafe { _ffi_cpp_drop_Rc_Test(self.0) };\n    }\n}\n\nimpl Test for _ffi_rs_Rc_Test {\n    fn get_string(&self) -> String {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_Test__get_string(_: *const u8) -> _ffi_ret_ptr_usize; }\n        let multi_ret = unsafe { _ffi_cpp_Rc_Test__get_string(self.0) };\n        let ret_ptr = multi_ret.0;\n        let ret_len = multi_ret.1;\n        _ffi_string_from_host(ret_ptr, ret_len)\n    }\n\n    fn set_string(&self, x: String) {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_Test__set_string(_: *const u8, x_ptr: *const u8, x_len: usize, x_cap: usize); }\n        let (x_ptr, x_len, x_cap) = _ffi_string_to_host(x);\n        unsafe { _ffi_cpp_Rc_Test__set_string(self.0, x_ptr, x_len, x_cap) };\n    }\n\n    fn set_str(&self, x: &str) {\n        unsafe extern \"C\" { fn _ffi_cpp_Rc_Test__set_str(_: *const u8, x_ptr: *const u8, x_len: usize, x_cap: usize); }\n        let (x_ptr, x_len, x_cap) = _ffi_string_to_host(x.into());\n        unsafe { _ffi_cpp_Rc_Test__set_str(self.0, x_ptr, x_len, x_cap) };\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_app_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_Box_Handler__on_draw(const void*, const void* canvas_ptr);\n\nvoid* _ffi_alloc(intptr_t len);\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\nvoid _ffi_fn_create_app(const void* platform_ptr);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\ntypedef struct {\n    int32_t _0;\n    int32_t _1;\n} _ffi_ret_2_i32;\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n} _ffi_ret_ptr_usize;\n\nvoid _ffi_rs_drop_Box_Handler(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_app_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Platform: AnyObject {\n    func create_window() -> Window\n}\n\nprotocol Window: AnyObject {\n    func get_title() -> String\n    func set_title(_ title: String)\n    func get_size() -> (Int32, Int32)\n    func set_size(_ width: Int32, _ height: Int32)\n    func set_handler(_ handler: Handler)\n    func child_window() -> Window\n}\n\nprotocol Handler: AnyObject {\n    func on_draw(_ canvas: Canvas)\n}\n\nprotocol Canvas: AnyObject {\n    func draw_text_runs(_ runs: [TextRun])\n}\n\nstruct TextRun {\n    var text: String\n    var rect: TextRect\n}\n\nstruct TextRect {\n    var x: Int32\n    var y: Int32\n    var w: Int32\n    var h: Int32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc create_app(_ platform: Platform) {\n    _ffi_fn_create_app(UnsafeRawPointer(Unmanaged.passRetained(platform as AnyObject).toOpaque()))\n}\n\nprivate class _ffi_Box_Handler : Handler {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Box_Handler(_ffi)\n    }\n\n    func on_draw(_ canvas: Canvas) {\n        _ffi_Box_Handler__on_draw(_ffi, UnsafeRawPointer(Unmanaged.passRetained(canvas as AnyObject).toOpaque()))\n    }\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\nprivate func _ffi_string_to_rust(_ str: String) -> (UnsafeRawPointer?, UInt) {\n    var str = str\n    return str.withUTF8 { str in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(str.count), count: str.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: str.baseAddress, count: str.count))\n        return (UnsafeRawPointer(buf.baseAddress), UInt(buf.count))\n    }\n}\n\n@_cdecl(\"_ffi_swift_Canvas__draw_text_runs\")\nfunc _ffi_swift_Canvas__draw_text_runs(_self: UnsafeRawPointer?, buf_ptr: UnsafeRawPointer?, buf_cap: UInt, runs_len: UInt) {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Canvas\n    var buf_end = buf_ptr!\n    _self.draw_text_runs(_ffi_vec_TextRun_from_rust(Int(runs_len), &buf_end))\n    _ffi_dealloc(buf_ptr, buf_cap)\n}\n\n@_cdecl(\"_ffi_swift_Platform__create_window\")\nfunc _ffi_swift_Platform__create_window(_self: UnsafeRawPointer?) -> UnsafeRawPointer? {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Platform\n    return UnsafeRawPointer(Unmanaged.passRetained(_self.create_window() as AnyObject).toOpaque())\n}\n\n@_cdecl(\"_ffi_swift_Window__child_window\")\nfunc _ffi_swift_Window__child_window(_self: UnsafeRawPointer?) -> UnsafeRawPointer? {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Window\n    return UnsafeRawPointer(Unmanaged.passRetained(_self.child_window() as AnyObject).toOpaque())\n}\n\n@_cdecl(\"_ffi_swift_Window__get_size\")\nfunc _ffi_swift_Window__get_size(_self: UnsafeRawPointer?) -> _ffi_ret_2_i32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Window\n    let ret = _self.get_size()\n    return _ffi_ret_2_i32(_0: ret.0, _1: ret.1)\n}\n\n@_cdecl(\"_ffi_swift_Window__get_title\")\nfunc _ffi_swift_Window__get_title(_self: UnsafeRawPointer?) -> _ffi_ret_ptr_usize {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Window\n    let (ret_ptr, ret_len) = _ffi_string_to_rust(_self.get_title());\n    return _ffi_ret_ptr_usize(_0: ret_ptr, _1: ret_len)\n}\n\n@_cdecl(\"_ffi_swift_Window__set_handler\")\nfunc _ffi_swift_Window__set_handler(_self: UnsafeRawPointer?, handler_ptr: UnsafeRawPointer?) {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Window\n    _self.set_handler(_ffi_Box_Handler(handler_ptr))\n}\n\n@_cdecl(\"_ffi_swift_Window__set_size\")\nfunc _ffi_swift_Window__set_size(_self: UnsafeRawPointer?, width: Int32, height: Int32) {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Window\n    _self.set_size(width, height)\n}\n\n@_cdecl(\"_ffi_swift_Window__set_title\")\nfunc _ffi_swift_Window__set_title(_self: UnsafeRawPointer?, title_ptr: UnsafeRawPointer?, title_len: UInt, title_cap: UInt) {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Window\n    _self.set_title(_ffi_string_from_rust(title_ptr, Int(title_len), title_cap))\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n\nprivate func _ffi_vec_TextRun_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [TextRun] {\n    var items: [TextRun] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(TextRun(\n            text: _ffi_string_from_rust(_ffi_read(&end) as UnsafeRawPointer?, Int(_ffi_read(&end) as UInt), _ffi_read(&end) as UInt),\n            rect: TextRect(\n                x: _ffi_read(&end) as Int32,\n                y: _ffi_read(&end) as Int32,\n                w: _ffi_read(&end) as Int32,\n                h: _ffi_read(&end) as Int32\n            )\n        ))\n    }\n    return items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_app_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Box_Handler__on_draw(_self: *const u8, canvas_ptr: *const u8) {\n    let _self = unsafe { &*(_self as *const Box<dyn Handler>) };\n    _self.on_draw(Box::new(_ffi_rs_Canvas(canvas_ptr)));\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_create_app(platform_ptr: *const u8) {\n    create_app(Box::new(_ffi_rs_Platform(platform_ptr)));\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_2_i32(i32, i32);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Canvas(*const u8);\n\nimpl Drop for _ffi_rs_Canvas {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Canvas for _ffi_rs_Canvas {\n    fn draw_text_runs(&self, runs: Vec<TextRun>) {\n        extern \"C\" { fn _ffi_swift_Canvas__draw_text_runs(_: *const u8, buf_ptr: *const u8, buf_cap: usize, runs_len: usize); }\n        let mut buf = Vec::<u8>::new();\n        let runs_len = runs.len();\n        _ffi_vec_TextRun_to_swift(runs, &mut buf);\n        let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n        unsafe { _ffi_swift_Canvas__draw_text_runs(self.0, buf_ptr, buf_cap, runs_len) };\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Platform(*const u8);\n\nimpl Drop for _ffi_rs_Platform {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Platform for _ffi_rs_Platform {\n    fn create_window(&self) -> std::rc::Rc<dyn Window> {\n        extern \"C\" { fn _ffi_swift_Platform__create_window(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_swift_Platform__create_window(self.0) };\n        std::rc::Rc::new(_ffi_rs_Window(ret_ptr))\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Window(*const u8);\n\nimpl Drop for _ffi_rs_Window {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Window for _ffi_rs_Window {\n    fn get_title(&self) -> String {\n        extern \"C\" { fn _ffi_swift_Window__get_title(_: *const u8) -> _ffi_ret_ptr_usize; }\n        let multi_ret = unsafe { _ffi_swift_Window__get_title(self.0) };\n        let ret_ptr = multi_ret.0;\n        let ret_len = multi_ret.1;\n        _ffi_string_from_host(ret_ptr, ret_len)\n    }\n\n    fn set_title(&self, title: &str) {\n        extern \"C\" { fn _ffi_swift_Window__set_title(_: *const u8, title_ptr: *const u8, title_len: usize, title_cap: usize); }\n        let (title_ptr, title_len, title_cap) = _ffi_string_to_host(title.into());\n        unsafe { _ffi_swift_Window__set_title(self.0, title_ptr, title_len, title_cap) };\n    }\n\n    fn get_size(&self) -> (i32, i32) {\n        extern \"C\" { fn _ffi_swift_Window__get_size(_: *const u8) -> _ffi_ret_2_i32; }\n        let multi_ret = unsafe { _ffi_swift_Window__get_size(self.0) };\n        let ret_0 = multi_ret.0;\n        let ret_1 = multi_ret.1;\n        (ret_0, ret_1)\n    }\n\n    fn set_size(&self, width: i32, height: i32) {\n        extern \"C\" { fn _ffi_swift_Window__set_size(_: *const u8, width: i32, height: i32); }\n        unsafe { _ffi_swift_Window__set_size(self.0, width, height) };\n    }\n\n    fn set_handler(&self, handler: Box<dyn Handler>) {\n        extern \"C\" { fn _ffi_swift_Window__set_handler(_: *const u8, handler_ptr: *const u8); }\n        unsafe { _ffi_swift_Window__set_handler(self.0, Box::into_raw(Box::new(handler)) as *const u8) };\n    }\n\n    fn child_window(&self) -> std::rc::Rc<dyn Window> {\n        extern \"C\" { fn _ffi_swift_Window__child_window(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_swift_Window__child_window(self.0) };\n        std::rc::Rc::new(_ffi_rs_Window(ret_ptr))\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Box_Handler(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Handler>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_TextRun_to_swift(items: Vec<TextRun>, buf: &mut Vec<u8>) {\n    for item in items {\n        let (item_text_ptr, item_text_len, item_text_cap) = _ffi_string_to_host(item.text);\n        _ffi_write(item_text_ptr, buf);\n        _ffi_write(item_text_len, buf);\n        _ffi_write(item_text_cap, buf);\n        _ffi_write(item.rect.x, buf);\n        _ffi_write(item.rect.y, buf);\n        _ffi_write(item.rect.w, buf);\n        _ffi_write(item.rect.h, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_app_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_Box_Handler__on_draw(const void*, const void* canvas_ptr);\n\nvoid* _ffi_alloc(intptr_t len);\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\nvoid _ffi_fn_create_app(const void* platform_ptr);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\ntypedef struct {\n    int32_t _0;\n    int32_t _1;\n} _ffi_ret_2_i32;\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n} _ffi_ret_ptr_usize;\n\nvoid _ffi_rs_drop_Box_Handler(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_app_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Platform: AnyObject {\n    func create_window() -> Window\n}\n\nprotocol Window: AnyObject {\n    func get_title() -> String\n    func set_title(_ title: String)\n    func get_size() -> (Int32, Int32)\n    func set_size(_ width: Int32, _ height: Int32)\n    func set_handler(_ handler: Handler)\n    func child_window() -> Window\n}\n\nprotocol Handler: AnyObject {\n    func on_draw(_ canvas: Canvas)\n}\n\nprotocol Canvas: AnyObject {\n    func draw_text_runs(_ runs: [TextRun])\n}\n\nstruct TextRun {\n    var text: String\n    var rect: TextRect\n}\n\nstruct TextRect {\n    var x: Int32\n    var y: Int32\n    var w: Int32\n    var h: Int32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc create_app(_ platform: Platform) {\n    _ffi_fn_create_app(UnsafeRawPointer(Unmanaged.passRetained(platform as AnyObject).toOpaque()))\n}\n\nprivate class _ffi_Box_Handler : Handler {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Box_Handler(_ffi)\n    }\n\n    func on_draw(_ canvas: Canvas) {\n        _ffi_Box_Handler__on_draw(_ffi, UnsafeRawPointer(Unmanaged.passRetained(canvas as AnyObject).toOpaque()))\n    }\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\nprivate func _ffi_string_to_rust(_ str: String) -> (UnsafeRawPointer?, UInt) {\n    var str = str\n    return str.withUTF8 { str in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(str.count), count: str.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: str.baseAddress, count: str.count))\n        return (UnsafeRawPointer(buf.baseAddress), UInt(buf.count))\n    }\n}\n\n@_cdecl(\"_ffi_swift_Canvas__draw_text_runs\")\nfunc _ffi_swift_Canvas__draw_text_runs(_self: UnsafeRawPointer?, buf_ptr: UnsafeRawPointer?, buf_cap: UInt, runs_len: UInt) {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Canvas\n    var buf_end = buf_ptr!\n    _self.draw_text_runs(_ffi_vec_TextRun_from_rust(Int(runs_len), &buf_end))\n    _ffi_dealloc(buf_ptr, buf_cap)\n}\n\n@_cdecl(\"_ffi_swift_Platform__create_window\")\nfunc _ffi_swift_Platform__create_window(_self: UnsafeRawPointer?) -> UnsafeRawPointer? {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Platform\n    return UnsafeRawPointer(Unmanaged.passRetained(_self.create_window() as AnyObject).toOpaque())\n}\n\n@_cdecl(\"_ffi_swift_Window__child_window\")\nfunc _ffi_swift_Window__child_window(_self: UnsafeRawPointer?) -> UnsafeRawPointer? {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Window\n    return UnsafeRawPointer(Unmanaged.passRetained(_self.child_window() as AnyObject).toOpaque())\n}\n\n@_cdecl(\"_ffi_swift_Window__get_size\")\nfunc _ffi_swift_Window__get_size(_self: UnsafeRawPointer?) -> _ffi_ret_2_i32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Window\n    let ret = _self.get_size()\n    return _ffi_ret_2_i32(_0: ret.0, _1: ret.1)\n}\n\n@_cdecl(\"_ffi_swift_Window__get_title\")\nfunc _ffi_swift_Window__get_title(_self: UnsafeRawPointer?) -> _ffi_ret_ptr_usize {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Window\n    let (ret_ptr, ret_len) = _ffi_string_to_rust(_self.get_title());\n    return _ffi_ret_ptr_usize(_0: ret_ptr, _1: ret_len)\n}\n\n@_cdecl(\"_ffi_swift_Window__set_handler\")\nfunc _ffi_swift_Window__set_handler(_self: UnsafeRawPointer?, handler_ptr: UnsafeRawPointer?) {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Window\n    _self.set_handler(_ffi_Box_Handler(handler_ptr))\n}\n\n@_cdecl(\"_ffi_swift_Window__set_size\")\nfunc _ffi_swift_Window__set_size(_self: UnsafeRawPointer?, width: Int32, height: Int32) {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Window\n    _self.set_size(width, height)\n}\n\n@_cdecl(\"_ffi_swift_Window__set_title\")\nfunc _ffi_swift_Window__set_title(_self: UnsafeRawPointer?, title_ptr: UnsafeRawPointer?, title_len: UInt, title_cap: UInt) {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Window\n    _self.set_title(_ffi_string_from_rust(title_ptr, Int(title_len), title_cap))\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n\nprivate func _ffi_vec_TextRun_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [TextRun] {\n    var items: [TextRun] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(TextRun(\n            text: _ffi_string_from_rust(_ffi_read(&end) as UnsafeRawPointer?, Int(_ffi_read(&end) as UInt), _ffi_read(&end) as UInt),\n            rect: TextRect(\n                x: _ffi_read(&end) as Int32,\n                y: _ffi_read(&end) as Int32,\n                w: _ffi_read(&end) as Int32,\n                h: _ffi_read(&end) as Int32\n            )\n        ))\n    }\n    return items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_app_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Box_Handler__on_draw(_self: *const u8, canvas_ptr: *const u8) {\n    let _self = unsafe { &*(_self as *const Box<dyn Handler>) };\n    _self.on_draw(Box::new(_ffi_rs_Canvas(canvas_ptr)));\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_create_app(platform_ptr: *const u8) {\n    create_app(Box::new(_ffi_rs_Platform(platform_ptr)));\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_2_i32(i32, i32);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Canvas(*const u8);\n\nimpl Drop for _ffi_rs_Canvas {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Canvas for _ffi_rs_Canvas {\n    fn draw_text_runs(&self, runs: Vec<TextRun>) {\n        unsafe extern \"C\" { fn _ffi_swift_Canvas__draw_text_runs(_: *const u8, buf_ptr: *const u8, buf_cap: usize, runs_len: usize); }\n        let mut buf = Vec::<u8>::new();\n        let runs_len = runs.len();\n        _ffi_vec_TextRun_to_swift(runs, &mut buf);\n        let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n        unsafe { _ffi_swift_Canvas__draw_text_runs(self.0, buf_ptr, buf_cap, runs_len) };\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Platform(*const u8);\n\nimpl Drop for _ffi_rs_Platform {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Platform for _ffi_rs_Platform {\n    fn create_window(&self) -> std::rc::Rc<dyn Window> {\n        unsafe extern \"C\" { fn _ffi_swift_Platform__create_window(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_swift_Platform__create_window(self.0) };\n        std::rc::Rc::new(_ffi_rs_Window(ret_ptr))\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Window(*const u8);\n\nimpl Drop for _ffi_rs_Window {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Window for _ffi_rs_Window {\n    fn get_title(&self) -> String {\n        unsafe extern \"C\" { fn _ffi_swift_Window__get_title(_: *const u8) -> _ffi_ret_ptr_usize; }\n        let multi_ret = unsafe { _ffi_swift_Window__get_title(self.0) };\n        let ret_ptr = multi_ret.0;\n        let ret_len = multi_ret.1;\n        _ffi_string_from_host(ret_ptr, ret_len)\n    }\n\n    fn set_title(&self, title: &str) {\n        unsafe extern \"C\" { fn _ffi_swift_Window__set_title(_: *const u8, title_ptr: *const u8, title_len: usize, title_cap: usize); }\n        let (title_ptr, title_len, title_cap) = _ffi_string_to_host(title.into());\n        unsafe { _ffi_swift_Window__set_title(self.0, title_ptr, title_len, title_cap) };\n    }\n\n    fn get_size(&self) -> (i32, i32) {\n        unsafe extern \"C\" { fn _ffi_swift_Window__get_size(_: *const u8) -> _ffi_ret_2_i32; }\n        let multi_ret = unsafe { _ffi_swift_Window__get_size(self.0) };\n        let ret_0 = multi_ret.0;\n        let ret_1 = multi_ret.1;\n        (ret_0, ret_1)\n    }\n\n    fn set_size(&self, width: i32, height: i32) {\n        unsafe extern \"C\" { fn _ffi_swift_Window__set_size(_: *const u8, width: i32, height: i32); }\n        unsafe { _ffi_swift_Window__set_size(self.0, width, height) };\n    }\n\n    fn set_handler(&self, handler: Box<dyn Handler>) {\n        unsafe extern \"C\" { fn _ffi_swift_Window__set_handler(_: *const u8, handler_ptr: *const u8); }\n        unsafe { _ffi_swift_Window__set_handler(self.0, Box::into_raw(Box::new(handler)) as *const u8) };\n    }\n\n    fn child_window(&self) -> std::rc::Rc<dyn Window> {\n        unsafe extern \"C\" { fn _ffi_swift_Window__child_window(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_swift_Window__child_window(self.0) };\n        std::rc::Rc::new(_ffi_rs_Window(ret_ptr))\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Box_Handler(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Handler>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_TextRun_to_swift(items: Vec<TextRun>, buf: &mut Vec<u8>) {\n    for item in items {\n        let (item_text_ptr, item_text_len, item_text_cap) = _ffi_string_to_host(item.text);\n        _ffi_write(item_text_ptr, buf);\n        _ffi_write(item_text_len, buf);\n        _ffi_write(item_text_cap, buf);\n        _ffi_write(item.rect.x, buf);\n        _ffi_write(item.rect.y, buf);\n        _ffi_write(item.rect.w, buf);\n        _ffi_write(item.rect.h, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_const_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_const_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nlet CONST_FALSE: Bool = false\nlet CONST_TRUE: Bool = true\nlet CONST_U8_MIN: UInt8 = 0\nlet CONST_U8_MAX: UInt8 = 255\nlet CONST_U16_MIN: UInt16 = 0\nlet CONST_U16_MAX: UInt16 = 65535\nlet CONST_U32_MIN: UInt32 = 0\nlet CONST_U32_MAX: UInt32 = 4294967295\nlet CONST_U64_MIN: UInt64 = 0\nlet CONST_U64_MAX: UInt64 = 18446744073709551615\nlet CONST_I8_MIN: Int8 = -128\nlet CONST_I8_MAX: Int8 = 127\nlet CONST_I16_MIN: Int16 = -32768\nlet CONST_I16_MAX: Int16 = 32767\nlet CONST_I32_MIN: Int32 = -2147483648\nlet CONST_I32_MAX: Int32 = 2147483647\nlet CONST_I64_MIN: Int64 = -9223372036854775808\nlet CONST_I64_MAX: Int64 = 9223372036854775807\nlet CONST_F32_NEG_0: Float32 = -0.0\nlet CONST_F64_NEG_0: Float64 = -0.0\nlet CONST_F32_PI: Float32 = 3.1415927\nlet CONST_F64_PI: Float64 = -3.141592653589793\nlet CONST_STRING: String = \"\\u{0}\\r\\n🦀\"\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_const_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_const_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_const_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nlet CONST_FALSE: Bool = false\nlet CONST_TRUE: Bool = true\nlet CONST_U8_MIN: UInt8 = 0\nlet CONST_U8_MAX: UInt8 = 255\nlet CONST_U16_MIN: UInt16 = 0\nlet CONST_U16_MAX: UInt16 = 65535\nlet CONST_U32_MIN: UInt32 = 0\nlet CONST_U32_MAX: UInt32 = 4294967295\nlet CONST_U64_MIN: UInt64 = 0\nlet CONST_U64_MAX: UInt64 = 18446744073709551615\nlet CONST_I8_MIN: Int8 = -128\nlet CONST_I8_MAX: Int8 = 127\nlet CONST_I16_MIN: Int16 = -32768\nlet CONST_I16_MAX: Int16 = 32767\nlet CONST_I32_MIN: Int32 = -2147483648\nlet CONST_I32_MAX: Int32 = 2147483647\nlet CONST_I64_MIN: Int64 = -9223372036854775808\nlet CONST_I64_MAX: Int64 = 9223372036854775807\nlet CONST_F32_NEG_0: Float32 = -0.0\nlet CONST_F64_NEG_0: Float64 = -0.0\nlet CONST_F32_PI: Float32 = 3.1415927\nlet CONST_F64_PI: Float64 = -3.141592653589793\nlet CONST_STRING: String = \"\\u{0}\\r\\n🦀\"\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_const_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_derive_eq_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n} _ffi_ret_ptr_usize;\n\n_ffi_ret_ptr_usize _ffi_fn_box_opt(const void* buf_ptr);\n\n_ffi_ret_ptr_usize _ffi_fn_box_opt_box(const void* buf_ptr);\n\n_ffi_ret_ptr_usize _ffi_fn_box_tup_0(const void* buf_ptr);\n\n_ffi_ret_ptr_usize _ffi_fn_box_tup_1(const void* buf_ptr);\n\n_ffi_ret_ptr_usize _ffi_fn_box_tup_2(const void* buf_ptr);\n\n_ffi_ret_ptr_usize _ffi_fn_box_vec(const void* buf_ptr);\n\n_ffi_ret_ptr_usize _ffi_fn_box_vec_box(const void* buf_ptr);\n\nvoid _ffi_fn_empty_struct();\n\nvoid _ffi_fn_empty_tuple();\n\n_ffi_ret_ptr_usize _ffi_fn_enum_box_tup(const void* buf_ptr);\n\n_ffi_ret_ptr_usize _ffi_fn_enum_opt_tup(const void* buf_ptr);\n\n_ffi_ret_ptr_usize _ffi_fn_enum_vec_tup(const void* buf_ptr);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    _Bool _2;\n} _ffi_ret_ptr_usize_bool;\n\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_box(const void* buf_ptr, _Bool has_x_0);\n\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_box_opt(const void* buf_ptr, _Bool has_x_0);\n\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_tup_0(const void* buf_ptr, _Bool has_x_0);\n\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_tup_1(const void* buf_ptr, _Bool has_x_0);\n\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_tup_2(const void* buf_ptr, _Bool has_x_0);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n_ffi_ret_ptr_usize _ffi_fn_tup_box(const void* buf_ptr);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_vec_box(const void* buf_ptr, uintptr_t x_0_len);\n\n_ffi_ret_ptr_2_usize _ffi_fn_vec_box_vec(const void* buf_ptr, uintptr_t x_0_len);\n\n_ffi_ret_ptr_2_usize _ffi_fn_vec_tup_0(const void* buf_ptr, uintptr_t x_0_len);\n\n_ffi_ret_ptr_2_usize _ffi_fn_vec_tup_1(const void* buf_ptr, uintptr_t x_0_len);\n\n_ffi_ret_ptr_2_usize _ffi_fn_vec_tup_2(const void* buf_ptr, uintptr_t x_0_len);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_derive_eq_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nenum EnumBoxTup : Equatable {\n    case Foo((Int32, Int32))\n    case Bar\n    case Baz(x: Int32, y: Int32)\n\n    static func == (a: EnumBoxTup, b: EnumBoxTup) -> Bool {\n        switch (a, b) {\n        case let (.Foo(a0), .Foo(b0)):\n            return a0.0 == b0.0 && a0.1 == b0.1\n        case (.Bar, .Bar):\n            return true\n        case let (.Baz(x: ax, y: ay), .Baz(x: bx, y: by)):\n            return ax == bx && ay == by\n        default:\n            return false\n        }\n    }\n}\n\nenum EnumVecTup : Equatable {\n    case Foo([(Int32, Int32)])\n    case Bar\n    case Baz(x: Int32, y: Int32)\n\n    static func == (a: EnumVecTup, b: EnumVecTup) -> Bool {\n        switch (a, b) {\n        case let (.Foo(a0), .Foo(b0)):\n            return a0.elementsEqual(b0, by: { a, b in a.0 == b.0 && a.1 == b.1 })\n        case (.Bar, .Bar):\n            return true\n        case let (.Baz(x: ax, y: ay), .Baz(x: bx, y: by)):\n            return ax == bx && ay == by\n        default:\n            return false\n        }\n    }\n}\n\nenum EnumOptTup : Equatable {\n    case Foo((Int32, Int32)?)\n    case Bar\n    case Baz(x: Int32, y: Int32)\n\n    static func == (a: EnumOptTup, b: EnumOptTup) -> Bool {\n        switch (a, b) {\n        case let (.Foo(a0), .Foo(b0)):\n            return { if let a = a0, let b = b0 { a.0 == b.0 && a.1 == b.1 } else { a0 == nil && b0 == nil } }()\n        case (.Bar, .Bar):\n            return true\n        case let (.Baz(x: ax, y: ay), .Baz(x: bx, y: by)):\n            return ax == bx && ay == by\n        default:\n            return false\n        }\n    }\n}\n\nstruct EmptyStruct : Equatable {\n}\n\nstruct BoxTup0 : Equatable {\n    var _0: ()\n\n    static func == (a: BoxTup0, b: BoxTup0) -> Bool {\n        return true\n    }\n}\n\nstruct BoxTup1 : Equatable {\n    var _0: Int32\n}\n\nstruct BoxTup2 : Equatable {\n    var _0: (Int32, Int32)\n\n    static func == (a: BoxTup2, b: BoxTup2) -> Bool {\n        return a._0.0 == b._0.0 && a._0.1 == b._0.1\n    }\n}\n\nstruct VecTup0 : Equatable {\n    var _0: [()]\n\n    static func == (a: VecTup0, b: VecTup0) -> Bool {\n        return a._0.count == b._0.count\n    }\n}\n\nstruct VecTup1 : Equatable {\n    var _0: [Int32]\n}\n\nstruct VecTup2 : Equatable {\n    var _0: [(Int32, Int32)]\n\n    static func == (a: VecTup2, b: VecTup2) -> Bool {\n        return a._0.elementsEqual(b._0, by: { a, b in a.0 == b.0 && a.1 == b.1 })\n    }\n}\n\nstruct OptTup0 : Equatable {\n    var _0: ()?\n\n    static func == (a: OptTup0, b: OptTup0) -> Bool {\n        return (a._0 != nil) == (b._0 != nil)\n    }\n}\n\nstruct OptTup1 : Equatable {\n    var _0: Int32?\n}\n\nstruct OptTup2 : Equatable {\n    var _0: (Int32, Int32)?\n\n    static func == (a: OptTup2, b: OptTup2) -> Bool {\n        return { if let a = a._0, let b = b._0 { a.0 == b.0 && a.1 == b.1 } else { a._0 == nil && b._0 == nil } }()\n    }\n}\n\nstruct TupBox : Equatable {\n    var _0: (Int32, Bool)\n\n    static func == (a: TupBox, b: TupBox) -> Bool {\n        return a._0.0 == b._0.0 && a._0.1 == b._0.1\n    }\n}\n\nstruct VecBox : Equatable {\n    var _0: [Int32]\n}\n\nstruct BoxVec : Equatable {\n    var _0: [Int32]\n}\n\nstruct OptBox : Equatable {\n    var _0: Int32?\n}\n\nstruct BoxOpt : Equatable {\n    var _0: Int32?\n}\n\nstruct VecBoxVec : Equatable {\n    var _0: [[Int32]]\n}\n\nstruct BoxVecBox : Equatable {\n    var _0: [Int32]\n}\n\nstruct OptBoxOpt : Equatable {\n    var _0: Int32??\n}\n\nstruct BoxOptBox : Equatable {\n    var _0: Int32?\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc empty_tuple(_ x: ()) -> () {\n    _ffi_fn_empty_tuple()\n    return ()\n}\n\nfunc empty_struct(_ x: EmptyStruct) -> EmptyStruct {\n    _ffi_fn_empty_struct()\n    return EmptyStruct()\n}\n\nfunc box_tup_0(_ x: BoxTup0) -> BoxTup0 {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box__to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_box_tup_0(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = BoxTup0(_0: _ffi_box__from_rust(&buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc box_tup_1(_ x: BoxTup1) -> BoxTup1 {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_box_tup_1(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = BoxTup1(_0: _ffi_box_i32_from_rust(&buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc box_tup_2(_ x: BoxTup2) -> BoxTup2 {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box_i32_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_box_tup_2(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = BoxTup2(_0: _ffi_box_i32_i32_from_rust(&buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc vec_tup_0(_ x: VecTup0) -> VecTup0 {\n    var buf = ContiguousArray<UInt8>()\n    let x_0_len = UInt(x._0.count)\n    _ffi_vec__to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_vec_tup_0(_ffi_vec_to_rust(buf), x_0_len)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_0_len = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = VecTup0(_0: _ffi_vec__from_rust(Int(ret_0_len), &buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc vec_tup_1(_ x: VecTup1) -> VecTup1 {\n    var buf = ContiguousArray<UInt8>()\n    let x_0_len = UInt(x._0.count)\n    _ffi_vec_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_vec_tup_1(_ffi_vec_to_rust(buf), x_0_len)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_0_len = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = VecTup1(_0: _ffi_vec_i32_from_rust(Int(ret_0_len), &buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc vec_tup_2(_ x: VecTup2) -> VecTup2 {\n    var buf = ContiguousArray<UInt8>()\n    let x_0_len = UInt(x._0.count)\n    _ffi_vec_i32_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_vec_tup_2(_ffi_vec_to_rust(buf), x_0_len)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_0_len = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = VecTup2(_0: _ffi_vec_i32_i32_from_rust(Int(ret_0_len), &buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc opt_tup_0(_ x: OptTup0) -> OptTup0 {\n    let buf = ContiguousArray<UInt8>()\n    let has_x_0 = x._0 != nil\n    let multi_ret = _ffi_fn_opt_tup_0(_ffi_vec_to_rust(buf), has_x_0)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let has_ret_0 = multi_ret._2\n    let ret = OptTup0(_0: has_ret_0 ? () : nil)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc opt_tup_1(_ x: OptTup1) -> OptTup1 {\n    var buf = ContiguousArray<UInt8>()\n    let has_x_0 = x._0 != nil\n    if let x_0_val = x._0 {\n        _ffi_write(x_0_val, &buf)\n    }\n    let multi_ret = _ffi_fn_opt_tup_1(_ffi_vec_to_rust(buf), has_x_0)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let has_ret_0 = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = OptTup1(_0: has_ret_0 ? _ffi_read(&buf_end2) as Int32 : nil)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc opt_tup_2(_ x: OptTup2) -> OptTup2 {\n    var buf = ContiguousArray<UInt8>()\n    let has_x_0 = x._0 != nil\n    if let x_0_val = x._0 {\n        _ffi_write(x_0_val.0, &buf)\n        _ffi_write(x_0_val.1, &buf)\n    }\n    let multi_ret = _ffi_fn_opt_tup_2(_ffi_vec_to_rust(buf), has_x_0)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let has_ret_0 = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = OptTup2(_0: has_ret_0 ? (_ffi_read(&buf_end2) as Int32, _ffi_read(&buf_end2) as Int32) : nil)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc enum_box_tup(_ x: EnumBoxTup) -> EnumBoxTup {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_enum_EnumBoxTup_to_rust(x, &buf)\n    let multi_ret = _ffi_fn_enum_box_tup(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = _ffi_enum_EnumBoxTup_from_rust(&buf_end2)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc enum_vec_tup(_ x: EnumVecTup) -> EnumVecTup {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_enum_EnumVecTup_to_rust(x, &buf)\n    let multi_ret = _ffi_fn_enum_vec_tup(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = _ffi_enum_EnumVecTup_from_rust(&buf_end2)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc enum_opt_tup(_ x: EnumOptTup) -> EnumOptTup {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_enum_EnumOptTup_to_rust(x, &buf)\n    let multi_ret = _ffi_fn_enum_opt_tup(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = _ffi_enum_EnumOptTup_from_rust(&buf_end2)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc tup_box(_ x: TupBox) -> TupBox {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box_i32_to_rust2(x._0.0, &buf)\n    _ffi_box_bool_to_rust(x._0.1, &buf)\n    let multi_ret = _ffi_fn_tup_box(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = TupBox(_0: (_ffi_box_i32_from_rust2(&buf_end2), _ffi_box_bool_from_rust(&buf_end2)))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc vec_box(_ x: VecBox) -> VecBox {\n    var buf = ContiguousArray<UInt8>()\n    let x_0_len = UInt(x._0.count)\n    _ffi_vec_box_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_vec_box(_ffi_vec_to_rust(buf), x_0_len)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_0_len = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = VecBox(_0: _ffi_vec_box_i32_from_rust(Int(ret_0_len), &buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc box_vec(_ x: BoxVec) -> BoxVec {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box_vec_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_box_vec(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = BoxVec(_0: _ffi_box_vec_i32_from_rust(&buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc opt_box(_ x: OptBox) -> OptBox {\n    var buf = ContiguousArray<UInt8>()\n    let has_x_0 = x._0 != nil\n    if let x_0_val = x._0 {\n        _ffi_box_i32_to_rust2(x_0_val, &buf)\n    }\n    let multi_ret = _ffi_fn_opt_box(_ffi_vec_to_rust(buf), has_x_0)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let has_ret_0 = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = OptBox(_0: has_ret_0 ? _ffi_box_i32_from_rust2(&buf_end2) : nil)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc box_opt(_ x: BoxOpt) -> BoxOpt {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box_option_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_box_opt(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = BoxOpt(_0: _ffi_box_option_i32_from_rust(&buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc vec_box_vec(_ x: VecBoxVec) -> VecBoxVec {\n    var buf = ContiguousArray<UInt8>()\n    let x_0_len = UInt(x._0.count)\n    _ffi_vec_box_vec_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_vec_box_vec(_ffi_vec_to_rust(buf), x_0_len)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_0_len = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = VecBoxVec(_0: _ffi_vec_box_vec_i32_from_rust(Int(ret_0_len), &buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc box_vec_box(_ x: BoxVecBox) -> BoxVecBox {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box_vec_box_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_box_vec_box(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = BoxVecBox(_0: _ffi_box_vec_box_i32_from_rust(&buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc opt_box_opt(_ x: OptBoxOpt) -> OptBoxOpt {\n    var buf = ContiguousArray<UInt8>()\n    let has_x_0 = x._0 != nil\n    if let x_0_val = x._0 {\n        _ffi_box_option_i32_to_rust(x_0_val, &buf)\n    }\n    let multi_ret = _ffi_fn_opt_box_opt(_ffi_vec_to_rust(buf), has_x_0)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let has_ret_0 = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = OptBoxOpt(_0: has_ret_0 ? _ffi_box_option_i32_from_rust(&buf_end2) : nil)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc box_opt_box(_ x: BoxOptBox) -> BoxOptBox {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box_option_box_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_box_opt_box(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = BoxOptBox(_0: _ffi_box_option_box_i32_from_rust(&buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nprivate func _ffi_box__from_rust(_ end: inout UnsafeRawPointer) -> () {\n    return ()\n}\n\nprivate func _ffi_box__to_rust(_ val: (), _ buf: inout ContiguousArray<UInt8>) {\n}\n\nprivate func _ffi_box_bool_from_rust(_ end: inout UnsafeRawPointer) -> Bool {\n    return _ffi_read(&end) as Bool\n}\n\nprivate func _ffi_box_bool_to_rust(_ val: Bool, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(val, &buf)\n}\n\nprivate func _ffi_box_i32_from_rust(_ end: inout UnsafeRawPointer) -> Int32 {\n    return _ffi_read(&end) as Int32\n}\n\nprivate func _ffi_box_i32_from_rust2(_ end: inout UnsafeRawPointer) -> Int32 {\n    return _ffi_read(&end) as Int32\n}\n\nprivate func _ffi_box_i32_i32_from_rust(_ end: inout UnsafeRawPointer) -> (Int32, Int32) {\n    return (_ffi_read(&end) as Int32, _ffi_read(&end) as Int32)\n}\n\nprivate func _ffi_box_i32_i32_to_rust(_ val: (Int32, Int32), _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(val.0, &buf)\n    _ffi_write(val.1, &buf)\n}\n\nprivate func _ffi_box_i32_to_rust(_ val: Int32, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(val, &buf)\n}\n\nprivate func _ffi_box_i32_to_rust2(_ val: Int32, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(val, &buf)\n}\n\nprivate func _ffi_box_option_box_i32_from_rust(_ end: inout UnsafeRawPointer) -> Int32? {\n    return _ffi_read(&end) as Bool ? _ffi_box_i32_from_rust2(&end) : nil\n}\n\nprivate func _ffi_box_option_box_i32_to_rust(_ val: Int32?, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(val != nil, &buf)\n    if let val_val = val {\n        _ffi_box_i32_to_rust2(val_val, &buf)\n    }\n}\n\nprivate func _ffi_box_option_i32_from_rust(_ end: inout UnsafeRawPointer) -> Int32? {\n    return _ffi_read(&end) as Bool ? _ffi_read(&end) as Int32 : nil\n}\n\nprivate func _ffi_box_option_i32_to_rust(_ val: Int32?, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(val != nil, &buf)\n    if let val_val = val {\n        _ffi_write(val_val, &buf)\n    }\n}\n\nprivate func _ffi_box_vec_box_i32_from_rust(_ end: inout UnsafeRawPointer) -> [Int32] {\n    return _ffi_vec_box_i32_from_rust(Int(_ffi_read(&end) as UInt), &end)\n}\n\nprivate func _ffi_box_vec_box_i32_to_rust(_ val: [Int32], _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(UInt(val.count), &buf)\n    _ffi_vec_box_i32_to_rust(val, &buf)\n}\n\nprivate func _ffi_box_vec_i32_from_rust(_ end: inout UnsafeRawPointer) -> [Int32] {\n    return _ffi_vec_i32_from_rust2(Int(_ffi_read(&end) as UInt), &end)\n}\n\nprivate func _ffi_box_vec_i32_to_rust(_ val: [Int32], _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(UInt(val.count), &buf)\n    _ffi_vec_i32_to_rust2(val, &buf)\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\nprivate func _ffi_enum_EnumBoxTup_from_rust(_ end: inout UnsafeRawPointer) -> EnumBoxTup {\n    switch _ffi_read(&end) as Int32 {\n        case 0: return .Foo(_ffi_box_i32_i32_from_rust(&end))\n        case 1: return .Bar\n        case 2: return .Baz(x: _ffi_read(&end) as Int32, y: _ffi_read(&end) as Int32)\n        default: fatalError()\n    }\n}\n\nprivate func _ffi_enum_EnumBoxTup_to_rust(_ val: EnumBoxTup, _ buf: inout ContiguousArray<UInt8>) {\n    switch val {\n    case let .Foo(x):\n        _ffi_write(0 as Int32, &buf)\n        _ffi_box_i32_i32_to_rust(x, &buf)\n    case .Bar:\n        _ffi_write(1 as Int32, &buf)\n    case let .Baz(x, y):\n        _ffi_write(2 as Int32, &buf)\n        _ffi_write(x, &buf)\n        _ffi_write(y, &buf)\n    }\n}\n\nprivate func _ffi_enum_EnumOptTup_from_rust(_ end: inout UnsafeRawPointer) -> EnumOptTup {\n    switch _ffi_read(&end) as Int32 {\n        case 0: return .Foo(_ffi_read(&end) as Bool ? (_ffi_read(&end) as Int32, _ffi_read(&end) as Int32) : nil)\n        case 1: return .Bar\n        case 2: return .Baz(x: _ffi_read(&end) as Int32, y: _ffi_read(&end) as Int32)\n        default: fatalError()\n    }\n}\n\nprivate func _ffi_enum_EnumOptTup_to_rust(_ val: EnumOptTup, _ buf: inout ContiguousArray<UInt8>) {\n    switch val {\n    case let .Foo(x):\n        _ffi_write(0 as Int32, &buf)\n        _ffi_write(x != nil, &buf)\n        if let x_val = x {\n            _ffi_write(x_val.0, &buf)\n            _ffi_write(x_val.1, &buf)\n        }\n    case .Bar:\n        _ffi_write(1 as Int32, &buf)\n    case let .Baz(x, y):\n        _ffi_write(2 as Int32, &buf)\n        _ffi_write(x, &buf)\n        _ffi_write(y, &buf)\n    }\n}\n\nprivate func _ffi_enum_EnumVecTup_from_rust(_ end: inout UnsafeRawPointer) -> EnumVecTup {\n    switch _ffi_read(&end) as Int32 {\n        case 0: return .Foo(_ffi_vec_i32_i32_from_rust(Int(_ffi_read(&end) as UInt), &end))\n        case 1: return .Bar\n        case 2: return .Baz(x: _ffi_read(&end) as Int32, y: _ffi_read(&end) as Int32)\n        default: fatalError()\n    }\n}\n\nprivate func _ffi_enum_EnumVecTup_to_rust(_ val: EnumVecTup, _ buf: inout ContiguousArray<UInt8>) {\n    switch val {\n    case let .Foo(x):\n        _ffi_write(0 as Int32, &buf)\n        _ffi_write(UInt(x.count), &buf)\n        _ffi_vec_i32_i32_to_rust(x, &buf)\n    case .Bar:\n        _ffi_write(1 as Int32, &buf)\n    case let .Baz(x, y):\n        _ffi_write(2 as Int32, &buf)\n        _ffi_write(x, &buf)\n        _ffi_write(y, &buf)\n    }\n}\n\nprivate func _ffi_vec__from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [()] {\n    var items: [()] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(())\n    }\n    return items\n}\n\nprivate func _ffi_vec__to_rust(_ items: [()], _ buf: inout ContiguousArray<UInt8>) {\n}\n\nprivate func _ffi_vec_box_i32_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Int32] {\n    var items: [Int32] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_box_i32_from_rust2(&end))\n    }\n    return items\n}\n\nprivate func _ffi_vec_box_i32_to_rust(_ items: [Int32], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_box_i32_to_rust2(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_box_vec_i32_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [[Int32]] {\n    var items: [[Int32]] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_box_vec_i32_from_rust(&end))\n    }\n    return items\n}\n\nprivate func _ffi_vec_box_vec_i32_to_rust(_ items: [[Int32]], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_box_vec_i32_to_rust(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_i32_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Int32] {\n    var items: [Int32] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_read(&end) as Int32)\n    }\n    return items\n}\n\nprivate func _ffi_vec_i32_from_rust2(_ len: Int, _ end: inout UnsafeRawPointer) -> [Int32] {\n    var items: [Int32] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_read(&end) as Int32)\n    }\n    return items\n}\n\nprivate func _ffi_vec_i32_i32_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [(Int32, Int32)] {\n    var items: [(Int32, Int32)] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append((_ffi_read(&end) as Int32, _ffi_read(&end) as Int32))\n    }\n    return items\n}\n\nprivate func _ffi_vec_i32_i32_to_rust(_ items: [(Int32, Int32)], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item.0, &buf)\n        _ffi_write(item.1, &buf)\n    }\n}\n\nprivate func _ffi_vec_i32_to_rust(_ items: [Int32], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_i32_to_rust2(_ items: [Int32], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_derive_eq_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box__from_swift(_: &mut *const u8) -> Box<()> {\n    Box::new(())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_box__to_swift(val: (), _: &mut Vec<u8>) {\n    _ = val;\n}\n\nfn _ffi_box_bool_from_swift(end: &mut *const u8) -> Box<bool> {\n    Box::new(_ffi_read::<bool>(end))\n}\n\nfn _ffi_box_bool_to_swift(val: bool, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\nfn _ffi_box_i32_from_swift(end: &mut *const u8) -> Box<(i32,)> {\n    Box::new((_ffi_read::<i32>(end),))\n}\n\nfn _ffi_box_i32_from_swift2(end: &mut *const u8) -> Box<i32> {\n    Box::new(_ffi_read::<i32>(end))\n}\n\nfn _ffi_box_i32_i32_from_swift(end: &mut *const u8) -> Box<(i32, i32)> {\n    Box::new((_ffi_read::<i32>(end), _ffi_read::<i32>(end)))\n}\n\nfn _ffi_box_i32_i32_to_swift(val: (i32, i32), buf: &mut Vec<u8>) {\n    _ffi_write(val.0, buf);\n    _ffi_write(val.1, buf);\n}\n\nfn _ffi_box_i32_to_swift(val: (i32,), buf: &mut Vec<u8>) {\n    _ffi_write(val.0, buf);\n}\n\nfn _ffi_box_i32_to_swift2(val: i32, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\nfn _ffi_box_option_box_i32_from_swift(end: &mut *const u8) -> Box<Option<Box<i32>>> {\n    Box::new(_ffi_read::<bool>(end).then(|| _ffi_box_i32_from_swift2(end)))\n}\n\nfn _ffi_box_option_box_i32_to_swift(val: Option<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_write(val.is_some(), buf);\n    if let Some(val_val) = val {\n        _ffi_box_i32_to_swift2(*val_val, buf);\n    }\n}\n\nfn _ffi_box_option_i32_from_swift(end: &mut *const u8) -> Box<Option<i32>> {\n    Box::new(_ffi_read::<bool>(end).then(|| _ffi_read::<i32>(end)))\n}\n\nfn _ffi_box_option_i32_to_swift(val: Option<i32>, buf: &mut Vec<u8>) {\n    _ffi_write(val.is_some(), buf);\n    if let Some(val_val) = val {\n        _ffi_write(val_val, buf);\n    }\n}\n\nfn _ffi_box_vec_box_i32_from_swift(end: &mut *const u8) -> Box<Vec<Box<i32>>> {\n    Box::new(_ffi_vec_box_i32_from_swift(_ffi_read::<usize>(end), end))\n}\n\nfn _ffi_box_vec_box_i32_to_swift(val: Vec<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_write(val.len(), buf);\n    _ffi_vec_box_i32_to_swift(val, buf);\n}\n\nfn _ffi_box_vec_i32_from_swift(end: &mut *const u8) -> Box<Vec<i32>> {\n    Box::new(_ffi_vec_i32_from_swift2(_ffi_read::<usize>(end), end))\n}\n\nfn _ffi_box_vec_i32_to_swift(val: Vec<i32>, buf: &mut Vec<u8>) {\n    _ffi_write(val.len(), buf);\n    _ffi_vec_i32_to_swift2(val, buf);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumBoxTup_from_swift(end: &mut *const u8) -> EnumBoxTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumBoxTup::Foo(_ffi_box_i32_i32_from_swift(end)),\n        1 => EnumBoxTup::Bar,\n        2 => EnumBoxTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumBoxTup_to_swift(val: EnumBoxTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumBoxTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_box_i32_i32_to_swift(*x, buf);\n        }\n        EnumBoxTup::Bar => _ffi_write(1 as i32, buf),\n        EnumBoxTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumOptTup_from_swift(end: &mut *const u8) -> EnumOptTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumOptTup::Foo(_ffi_read::<bool>(end).then(|| (_ffi_read::<i32>(end), _ffi_read::<i32>(end)))),\n        1 => EnumOptTup::Bar,\n        2 => EnumOptTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumOptTup_to_swift(val: EnumOptTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumOptTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_write(x.is_some(), buf);\n            if let Some(x_val) = x {\n                _ffi_write(x_val.0, buf);\n                _ffi_write(x_val.1, buf);\n            }\n        }\n        EnumOptTup::Bar => _ffi_write(1 as i32, buf),\n        EnumOptTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumVecTup_from_swift(end: &mut *const u8) -> EnumVecTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumVecTup::Foo(_ffi_vec_i32_i32_from_swift(_ffi_read::<usize>(end), end)),\n        1 => EnumVecTup::Bar,\n        2 => EnumVecTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumVecTup_to_swift(val: EnumVecTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumVecTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_write(x.len(), buf);\n            _ffi_vec_i32_i32_to_swift(x, buf);\n        }\n        EnumVecTup::Bar => _ffi_write(1 as i32, buf),\n        EnumVecTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_opt(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_opt(BoxOpt(_ffi_box_option_i32_from_swift(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_option_i32_to_swift(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_opt_box(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_opt_box(BoxOptBox(_ffi_box_option_box_i32_from_swift(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_option_box_i32_to_swift(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_tup_0(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_0(BoxTup0(_ffi_box__from_swift(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box__to_swift(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_tup_1(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_1(BoxTup1(_ffi_box_i32_from_swift(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_to_swift(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_tup_2(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_2(BoxTup2(_ffi_box_i32_i32_from_swift(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_i32_to_swift(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_vec(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_vec(BoxVec(_ffi_box_vec_i32_from_swift(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_vec_i32_to_swift(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_vec_box(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_vec_box(BoxVecBox(_ffi_box_vec_box_i32_from_swift(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_vec_box_i32_to_swift(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_empty_struct() {\n    _ = empty_struct(EmptyStruct);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_empty_tuple() {\n    _ = empty_tuple(());\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_enum_box_tup(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumBoxTup_to_swift(enum_box_tup(_ffi_enum_EnumBoxTup_from_swift(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_enum_opt_tup(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumOptTup_to_swift(enum_opt_tup(_ffi_enum_EnumOptTup_from_swift(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_enum_vec_tup(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumVecTup_to_swift(enum_vec_tup(_ffi_enum_EnumVecTup_from_swift(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_box(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_box(OptBox(has_x_0.then(|| _ffi_box_i32_from_swift2(&mut buf_end))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_box_i32_to_swift2(*ret_0_val, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_box_opt(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_box_opt(OptBoxOpt(has_x_0.then(|| _ffi_box_option_i32_from_swift(&mut buf_end))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_box_option_i32_to_swift(*ret_0_val, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_tup_0(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let buf_end = buf_ptr;\n    let ret = opt_tup_0(OptTup0(has_x_0.then(|| ())));\n    let ret_0 = ret.0;\n    let buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ = ret_0_val;\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_tup_1(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_tup_1(OptTup1(has_x_0.then(|| (_ffi_read::<i32>(&mut buf_end),))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_write(ret_0_val.0, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_tup_2(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_tup_2(OptTup2(has_x_0.then(|| (_ffi_read::<i32>(&mut buf_end), _ffi_read::<i32>(&mut buf_end)))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_write(ret_0_val.0, &mut buf2);\n        _ffi_write(ret_0_val.1, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_tup_box(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = tup_box(TupBox((_ffi_box_i32_from_swift2(&mut buf_end), _ffi_box_bool_from_swift(&mut buf_end))));\n    let ret_0 = ret.0;\n    let ret_0_0 = ret_0.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_to_swift2(*ret_0_0, &mut buf2);\n    let ret_0_1 = ret_0.1;\n    _ffi_box_bool_to_swift(*ret_0_1, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_box(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_box(VecBox(_ffi_vec_box_i32_from_swift(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_box_i32_to_swift(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_box_vec(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_box_vec(VecBoxVec(_ffi_vec_box_vec_i32_from_swift(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_box_vec_i32_to_swift(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_tup_0(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_0(VecTup0(_ffi_vec__from_swift(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec__to_swift(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_tup_1(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_1(VecTup1(_ffi_vec_i32_from_swift(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_i32_to_swift(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_tup_2(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_2(VecTup2(_ffi_vec_i32_i32_from_swift(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_i32_i32_to_swift(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize_bool(*const u8, usize, bool);\n\n#[allow(non_snake_case)]\nfn _ffi_vec__from_swift(len: usize, _: &mut *const u8) -> Vec<()> {\n    let mut items = Vec::<()>::with_capacity(len);\n    for _ in 0..len {\n        items.push(());\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__to_swift(items: Vec<()>, _: &mut Vec<u8>) {\n    for item in items {\n        _ = item;\n    }\n}\n\nfn _ffi_vec_box_i32_from_swift(len: usize, end: &mut *const u8) -> Vec<Box<i32>> {\n    let mut items = Vec::<Box<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_box_i32_from_swift2(end));\n    }\n    items\n}\n\nfn _ffi_vec_box_i32_to_swift(items: Vec<Box<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_box_i32_to_swift2(*item, buf);\n    }\n}\n\nfn _ffi_vec_box_vec_i32_from_swift(len: usize, end: &mut *const u8) -> Vec<Box<Vec<i32>>> {\n    let mut items = Vec::<Box<Vec<i32>>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_box_vec_i32_from_swift(end));\n    }\n    items\n}\n\nfn _ffi_vec_box_vec_i32_to_swift(items: Vec<Box<Vec<i32>>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_box_vec_i32_to_swift(*item, buf);\n    }\n}\n\nfn _ffi_vec_i32_from_swift(len: usize, end: &mut *const u8) -> Vec<(i32,)> {\n    let mut items = Vec::<(i32,)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((_ffi_read::<i32>(end),));\n    }\n    items\n}\n\nfn _ffi_vec_i32_from_swift2(len: usize, end: &mut *const u8) -> Vec<i32> {\n    let mut items = Vec::<i32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i32_i32_from_swift(len: usize, end: &mut *const u8) -> Vec<(i32, i32)> {\n    let mut items = Vec::<(i32, i32)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((_ffi_read::<i32>(end), _ffi_read::<i32>(end)));\n    }\n    items\n}\n\nfn _ffi_vec_i32_i32_to_swift(items: Vec<(i32, i32)>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.0, buf);\n        _ffi_write(item.1, buf);\n    }\n}\n\nfn _ffi_vec_i32_to_swift(items: Vec<(i32,)>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.0, buf);\n    }\n}\n\nfn _ffi_vec_i32_to_swift2(items: Vec<i32>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item, buf);\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_derive_eq_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n} _ffi_ret_ptr_usize;\n\n_ffi_ret_ptr_usize _ffi_fn_box_opt(const void* buf_ptr);\n\n_ffi_ret_ptr_usize _ffi_fn_box_opt_box(const void* buf_ptr);\n\n_ffi_ret_ptr_usize _ffi_fn_box_tup_0(const void* buf_ptr);\n\n_ffi_ret_ptr_usize _ffi_fn_box_tup_1(const void* buf_ptr);\n\n_ffi_ret_ptr_usize _ffi_fn_box_tup_2(const void* buf_ptr);\n\n_ffi_ret_ptr_usize _ffi_fn_box_vec(const void* buf_ptr);\n\n_ffi_ret_ptr_usize _ffi_fn_box_vec_box(const void* buf_ptr);\n\nvoid _ffi_fn_empty_struct();\n\nvoid _ffi_fn_empty_tuple();\n\n_ffi_ret_ptr_usize _ffi_fn_enum_box_tup(const void* buf_ptr);\n\n_ffi_ret_ptr_usize _ffi_fn_enum_opt_tup(const void* buf_ptr);\n\n_ffi_ret_ptr_usize _ffi_fn_enum_vec_tup(const void* buf_ptr);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    _Bool _2;\n} _ffi_ret_ptr_usize_bool;\n\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_box(const void* buf_ptr, _Bool has_x_0);\n\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_box_opt(const void* buf_ptr, _Bool has_x_0);\n\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_tup_0(const void* buf_ptr, _Bool has_x_0);\n\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_tup_1(const void* buf_ptr, _Bool has_x_0);\n\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_tup_2(const void* buf_ptr, _Bool has_x_0);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n_ffi_ret_ptr_usize _ffi_fn_tup_box(const void* buf_ptr);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_vec_box(const void* buf_ptr, uintptr_t x_0_len);\n\n_ffi_ret_ptr_2_usize _ffi_fn_vec_box_vec(const void* buf_ptr, uintptr_t x_0_len);\n\n_ffi_ret_ptr_2_usize _ffi_fn_vec_tup_0(const void* buf_ptr, uintptr_t x_0_len);\n\n_ffi_ret_ptr_2_usize _ffi_fn_vec_tup_1(const void* buf_ptr, uintptr_t x_0_len);\n\n_ffi_ret_ptr_2_usize _ffi_fn_vec_tup_2(const void* buf_ptr, uintptr_t x_0_len);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_derive_eq_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nenum EnumBoxTup : Equatable {\n    case Foo((Int32, Int32))\n    case Bar\n    case Baz(x: Int32, y: Int32)\n\n    static func == (a: EnumBoxTup, b: EnumBoxTup) -> Bool {\n        switch (a, b) {\n        case let (.Foo(a0), .Foo(b0)):\n            return a0.0 == b0.0 && a0.1 == b0.1\n        case (.Bar, .Bar):\n            return true\n        case let (.Baz(x: ax, y: ay), .Baz(x: bx, y: by)):\n            return ax == bx && ay == by\n        default:\n            return false\n        }\n    }\n}\n\nenum EnumVecTup : Equatable {\n    case Foo([(Int32, Int32)])\n    case Bar\n    case Baz(x: Int32, y: Int32)\n\n    static func == (a: EnumVecTup, b: EnumVecTup) -> Bool {\n        switch (a, b) {\n        case let (.Foo(a0), .Foo(b0)):\n            return a0.elementsEqual(b0, by: { a, b in a.0 == b.0 && a.1 == b.1 })\n        case (.Bar, .Bar):\n            return true\n        case let (.Baz(x: ax, y: ay), .Baz(x: bx, y: by)):\n            return ax == bx && ay == by\n        default:\n            return false\n        }\n    }\n}\n\nenum EnumOptTup : Equatable {\n    case Foo((Int32, Int32)?)\n    case Bar\n    case Baz(x: Int32, y: Int32)\n\n    static func == (a: EnumOptTup, b: EnumOptTup) -> Bool {\n        switch (a, b) {\n        case let (.Foo(a0), .Foo(b0)):\n            return { if let a = a0, let b = b0 { a.0 == b.0 && a.1 == b.1 } else { a0 == nil && b0 == nil } }()\n        case (.Bar, .Bar):\n            return true\n        case let (.Baz(x: ax, y: ay), .Baz(x: bx, y: by)):\n            return ax == bx && ay == by\n        default:\n            return false\n        }\n    }\n}\n\nstruct EmptyStruct : Equatable {\n}\n\nstruct BoxTup0 : Equatable {\n    var _0: ()\n\n    static func == (a: BoxTup0, b: BoxTup0) -> Bool {\n        return true\n    }\n}\n\nstruct BoxTup1 : Equatable {\n    var _0: Int32\n}\n\nstruct BoxTup2 : Equatable {\n    var _0: (Int32, Int32)\n\n    static func == (a: BoxTup2, b: BoxTup2) -> Bool {\n        return a._0.0 == b._0.0 && a._0.1 == b._0.1\n    }\n}\n\nstruct VecTup0 : Equatable {\n    var _0: [()]\n\n    static func == (a: VecTup0, b: VecTup0) -> Bool {\n        return a._0.count == b._0.count\n    }\n}\n\nstruct VecTup1 : Equatable {\n    var _0: [Int32]\n}\n\nstruct VecTup2 : Equatable {\n    var _0: [(Int32, Int32)]\n\n    static func == (a: VecTup2, b: VecTup2) -> Bool {\n        return a._0.elementsEqual(b._0, by: { a, b in a.0 == b.0 && a.1 == b.1 })\n    }\n}\n\nstruct OptTup0 : Equatable {\n    var _0: ()?\n\n    static func == (a: OptTup0, b: OptTup0) -> Bool {\n        return (a._0 != nil) == (b._0 != nil)\n    }\n}\n\nstruct OptTup1 : Equatable {\n    var _0: Int32?\n}\n\nstruct OptTup2 : Equatable {\n    var _0: (Int32, Int32)?\n\n    static func == (a: OptTup2, b: OptTup2) -> Bool {\n        return { if let a = a._0, let b = b._0 { a.0 == b.0 && a.1 == b.1 } else { a._0 == nil && b._0 == nil } }()\n    }\n}\n\nstruct TupBox : Equatable {\n    var _0: (Int32, Bool)\n\n    static func == (a: TupBox, b: TupBox) -> Bool {\n        return a._0.0 == b._0.0 && a._0.1 == b._0.1\n    }\n}\n\nstruct VecBox : Equatable {\n    var _0: [Int32]\n}\n\nstruct BoxVec : Equatable {\n    var _0: [Int32]\n}\n\nstruct OptBox : Equatable {\n    var _0: Int32?\n}\n\nstruct BoxOpt : Equatable {\n    var _0: Int32?\n}\n\nstruct VecBoxVec : Equatable {\n    var _0: [[Int32]]\n}\n\nstruct BoxVecBox : Equatable {\n    var _0: [Int32]\n}\n\nstruct OptBoxOpt : Equatable {\n    var _0: Int32??\n}\n\nstruct BoxOptBox : Equatable {\n    var _0: Int32?\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc empty_tuple(_ x: ()) -> () {\n    _ffi_fn_empty_tuple()\n    return ()\n}\n\nfunc empty_struct(_ x: EmptyStruct) -> EmptyStruct {\n    _ffi_fn_empty_struct()\n    return EmptyStruct()\n}\n\nfunc box_tup_0(_ x: BoxTup0) -> BoxTup0 {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box__to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_box_tup_0(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = BoxTup0(_0: _ffi_box__from_rust(&buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc box_tup_1(_ x: BoxTup1) -> BoxTup1 {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_box_tup_1(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = BoxTup1(_0: _ffi_box_i32_from_rust(&buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc box_tup_2(_ x: BoxTup2) -> BoxTup2 {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box_i32_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_box_tup_2(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = BoxTup2(_0: _ffi_box_i32_i32_from_rust(&buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc vec_tup_0(_ x: VecTup0) -> VecTup0 {\n    var buf = ContiguousArray<UInt8>()\n    let x_0_len = UInt(x._0.count)\n    _ffi_vec__to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_vec_tup_0(_ffi_vec_to_rust(buf), x_0_len)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_0_len = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = VecTup0(_0: _ffi_vec__from_rust(Int(ret_0_len), &buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc vec_tup_1(_ x: VecTup1) -> VecTup1 {\n    var buf = ContiguousArray<UInt8>()\n    let x_0_len = UInt(x._0.count)\n    _ffi_vec_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_vec_tup_1(_ffi_vec_to_rust(buf), x_0_len)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_0_len = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = VecTup1(_0: _ffi_vec_i32_from_rust(Int(ret_0_len), &buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc vec_tup_2(_ x: VecTup2) -> VecTup2 {\n    var buf = ContiguousArray<UInt8>()\n    let x_0_len = UInt(x._0.count)\n    _ffi_vec_i32_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_vec_tup_2(_ffi_vec_to_rust(buf), x_0_len)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_0_len = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = VecTup2(_0: _ffi_vec_i32_i32_from_rust(Int(ret_0_len), &buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc opt_tup_0(_ x: OptTup0) -> OptTup0 {\n    let buf = ContiguousArray<UInt8>()\n    let has_x_0 = x._0 != nil\n    let multi_ret = _ffi_fn_opt_tup_0(_ffi_vec_to_rust(buf), has_x_0)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let has_ret_0 = multi_ret._2\n    let ret = OptTup0(_0: has_ret_0 ? () : nil)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc opt_tup_1(_ x: OptTup1) -> OptTup1 {\n    var buf = ContiguousArray<UInt8>()\n    let has_x_0 = x._0 != nil\n    if let x_0_val = x._0 {\n        _ffi_write(x_0_val, &buf)\n    }\n    let multi_ret = _ffi_fn_opt_tup_1(_ffi_vec_to_rust(buf), has_x_0)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let has_ret_0 = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = OptTup1(_0: has_ret_0 ? _ffi_read(&buf_end2) as Int32 : nil)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc opt_tup_2(_ x: OptTup2) -> OptTup2 {\n    var buf = ContiguousArray<UInt8>()\n    let has_x_0 = x._0 != nil\n    if let x_0_val = x._0 {\n        _ffi_write(x_0_val.0, &buf)\n        _ffi_write(x_0_val.1, &buf)\n    }\n    let multi_ret = _ffi_fn_opt_tup_2(_ffi_vec_to_rust(buf), has_x_0)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let has_ret_0 = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = OptTup2(_0: has_ret_0 ? (_ffi_read(&buf_end2) as Int32, _ffi_read(&buf_end2) as Int32) : nil)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc enum_box_tup(_ x: EnumBoxTup) -> EnumBoxTup {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_enum_EnumBoxTup_to_rust(x, &buf)\n    let multi_ret = _ffi_fn_enum_box_tup(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = _ffi_enum_EnumBoxTup_from_rust(&buf_end2)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc enum_vec_tup(_ x: EnumVecTup) -> EnumVecTup {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_enum_EnumVecTup_to_rust(x, &buf)\n    let multi_ret = _ffi_fn_enum_vec_tup(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = _ffi_enum_EnumVecTup_from_rust(&buf_end2)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc enum_opt_tup(_ x: EnumOptTup) -> EnumOptTup {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_enum_EnumOptTup_to_rust(x, &buf)\n    let multi_ret = _ffi_fn_enum_opt_tup(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = _ffi_enum_EnumOptTup_from_rust(&buf_end2)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc tup_box(_ x: TupBox) -> TupBox {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box_i32_to_rust2(x._0.0, &buf)\n    _ffi_box_bool_to_rust(x._0.1, &buf)\n    let multi_ret = _ffi_fn_tup_box(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = TupBox(_0: (_ffi_box_i32_from_rust2(&buf_end2), _ffi_box_bool_from_rust(&buf_end2)))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc vec_box(_ x: VecBox) -> VecBox {\n    var buf = ContiguousArray<UInt8>()\n    let x_0_len = UInt(x._0.count)\n    _ffi_vec_box_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_vec_box(_ffi_vec_to_rust(buf), x_0_len)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_0_len = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = VecBox(_0: _ffi_vec_box_i32_from_rust(Int(ret_0_len), &buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc box_vec(_ x: BoxVec) -> BoxVec {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box_vec_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_box_vec(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = BoxVec(_0: _ffi_box_vec_i32_from_rust(&buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc opt_box(_ x: OptBox) -> OptBox {\n    var buf = ContiguousArray<UInt8>()\n    let has_x_0 = x._0 != nil\n    if let x_0_val = x._0 {\n        _ffi_box_i32_to_rust2(x_0_val, &buf)\n    }\n    let multi_ret = _ffi_fn_opt_box(_ffi_vec_to_rust(buf), has_x_0)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let has_ret_0 = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = OptBox(_0: has_ret_0 ? _ffi_box_i32_from_rust2(&buf_end2) : nil)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc box_opt(_ x: BoxOpt) -> BoxOpt {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box_option_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_box_opt(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = BoxOpt(_0: _ffi_box_option_i32_from_rust(&buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc vec_box_vec(_ x: VecBoxVec) -> VecBoxVec {\n    var buf = ContiguousArray<UInt8>()\n    let x_0_len = UInt(x._0.count)\n    _ffi_vec_box_vec_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_vec_box_vec(_ffi_vec_to_rust(buf), x_0_len)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_0_len = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = VecBoxVec(_0: _ffi_vec_box_vec_i32_from_rust(Int(ret_0_len), &buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc box_vec_box(_ x: BoxVecBox) -> BoxVecBox {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box_vec_box_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_box_vec_box(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = BoxVecBox(_0: _ffi_box_vec_box_i32_from_rust(&buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc opt_box_opt(_ x: OptBoxOpt) -> OptBoxOpt {\n    var buf = ContiguousArray<UInt8>()\n    let has_x_0 = x._0 != nil\n    if let x_0_val = x._0 {\n        _ffi_box_option_i32_to_rust(x_0_val, &buf)\n    }\n    let multi_ret = _ffi_fn_opt_box_opt(_ffi_vec_to_rust(buf), has_x_0)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let has_ret_0 = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = OptBoxOpt(_0: has_ret_0 ? _ffi_box_option_i32_from_rust(&buf_end2) : nil)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nfunc box_opt_box(_ x: BoxOptBox) -> BoxOptBox {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box_option_box_i32_to_rust(x._0, &buf)\n    let multi_ret = _ffi_fn_box_opt_box(_ffi_vec_to_rust(buf))\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end2 = buf_ptr2!\n    let ret = BoxOptBox(_0: _ffi_box_option_box_i32_from_rust(&buf_end2))\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nprivate func _ffi_box__from_rust(_ end: inout UnsafeRawPointer) -> () {\n    return ()\n}\n\nprivate func _ffi_box__to_rust(_ val: (), _ buf: inout ContiguousArray<UInt8>) {\n}\n\nprivate func _ffi_box_bool_from_rust(_ end: inout UnsafeRawPointer) -> Bool {\n    return _ffi_read(&end) as Bool\n}\n\nprivate func _ffi_box_bool_to_rust(_ val: Bool, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(val, &buf)\n}\n\nprivate func _ffi_box_i32_from_rust(_ end: inout UnsafeRawPointer) -> Int32 {\n    return _ffi_read(&end) as Int32\n}\n\nprivate func _ffi_box_i32_from_rust2(_ end: inout UnsafeRawPointer) -> Int32 {\n    return _ffi_read(&end) as Int32\n}\n\nprivate func _ffi_box_i32_i32_from_rust(_ end: inout UnsafeRawPointer) -> (Int32, Int32) {\n    return (_ffi_read(&end) as Int32, _ffi_read(&end) as Int32)\n}\n\nprivate func _ffi_box_i32_i32_to_rust(_ val: (Int32, Int32), _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(val.0, &buf)\n    _ffi_write(val.1, &buf)\n}\n\nprivate func _ffi_box_i32_to_rust(_ val: Int32, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(val, &buf)\n}\n\nprivate func _ffi_box_i32_to_rust2(_ val: Int32, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(val, &buf)\n}\n\nprivate func _ffi_box_option_box_i32_from_rust(_ end: inout UnsafeRawPointer) -> Int32? {\n    return _ffi_read(&end) as Bool ? _ffi_box_i32_from_rust2(&end) : nil\n}\n\nprivate func _ffi_box_option_box_i32_to_rust(_ val: Int32?, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(val != nil, &buf)\n    if let val_val = val {\n        _ffi_box_i32_to_rust2(val_val, &buf)\n    }\n}\n\nprivate func _ffi_box_option_i32_from_rust(_ end: inout UnsafeRawPointer) -> Int32? {\n    return _ffi_read(&end) as Bool ? _ffi_read(&end) as Int32 : nil\n}\n\nprivate func _ffi_box_option_i32_to_rust(_ val: Int32?, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(val != nil, &buf)\n    if let val_val = val {\n        _ffi_write(val_val, &buf)\n    }\n}\n\nprivate func _ffi_box_vec_box_i32_from_rust(_ end: inout UnsafeRawPointer) -> [Int32] {\n    return _ffi_vec_box_i32_from_rust(Int(_ffi_read(&end) as UInt), &end)\n}\n\nprivate func _ffi_box_vec_box_i32_to_rust(_ val: [Int32], _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(UInt(val.count), &buf)\n    _ffi_vec_box_i32_to_rust(val, &buf)\n}\n\nprivate func _ffi_box_vec_i32_from_rust(_ end: inout UnsafeRawPointer) -> [Int32] {\n    return _ffi_vec_i32_from_rust2(Int(_ffi_read(&end) as UInt), &end)\n}\n\nprivate func _ffi_box_vec_i32_to_rust(_ val: [Int32], _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(UInt(val.count), &buf)\n    _ffi_vec_i32_to_rust2(val, &buf)\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\nprivate func _ffi_enum_EnumBoxTup_from_rust(_ end: inout UnsafeRawPointer) -> EnumBoxTup {\n    switch _ffi_read(&end) as Int32 {\n        case 0: return .Foo(_ffi_box_i32_i32_from_rust(&end))\n        case 1: return .Bar\n        case 2: return .Baz(x: _ffi_read(&end) as Int32, y: _ffi_read(&end) as Int32)\n        default: fatalError()\n    }\n}\n\nprivate func _ffi_enum_EnumBoxTup_to_rust(_ val: EnumBoxTup, _ buf: inout ContiguousArray<UInt8>) {\n    switch val {\n    case let .Foo(x):\n        _ffi_write(0 as Int32, &buf)\n        _ffi_box_i32_i32_to_rust(x, &buf)\n    case .Bar:\n        _ffi_write(1 as Int32, &buf)\n    case let .Baz(x, y):\n        _ffi_write(2 as Int32, &buf)\n        _ffi_write(x, &buf)\n        _ffi_write(y, &buf)\n    }\n}\n\nprivate func _ffi_enum_EnumOptTup_from_rust(_ end: inout UnsafeRawPointer) -> EnumOptTup {\n    switch _ffi_read(&end) as Int32 {\n        case 0: return .Foo(_ffi_read(&end) as Bool ? (_ffi_read(&end) as Int32, _ffi_read(&end) as Int32) : nil)\n        case 1: return .Bar\n        case 2: return .Baz(x: _ffi_read(&end) as Int32, y: _ffi_read(&end) as Int32)\n        default: fatalError()\n    }\n}\n\nprivate func _ffi_enum_EnumOptTup_to_rust(_ val: EnumOptTup, _ buf: inout ContiguousArray<UInt8>) {\n    switch val {\n    case let .Foo(x):\n        _ffi_write(0 as Int32, &buf)\n        _ffi_write(x != nil, &buf)\n        if let x_val = x {\n            _ffi_write(x_val.0, &buf)\n            _ffi_write(x_val.1, &buf)\n        }\n    case .Bar:\n        _ffi_write(1 as Int32, &buf)\n    case let .Baz(x, y):\n        _ffi_write(2 as Int32, &buf)\n        _ffi_write(x, &buf)\n        _ffi_write(y, &buf)\n    }\n}\n\nprivate func _ffi_enum_EnumVecTup_from_rust(_ end: inout UnsafeRawPointer) -> EnumVecTup {\n    switch _ffi_read(&end) as Int32 {\n        case 0: return .Foo(_ffi_vec_i32_i32_from_rust(Int(_ffi_read(&end) as UInt), &end))\n        case 1: return .Bar\n        case 2: return .Baz(x: _ffi_read(&end) as Int32, y: _ffi_read(&end) as Int32)\n        default: fatalError()\n    }\n}\n\nprivate func _ffi_enum_EnumVecTup_to_rust(_ val: EnumVecTup, _ buf: inout ContiguousArray<UInt8>) {\n    switch val {\n    case let .Foo(x):\n        _ffi_write(0 as Int32, &buf)\n        _ffi_write(UInt(x.count), &buf)\n        _ffi_vec_i32_i32_to_rust(x, &buf)\n    case .Bar:\n        _ffi_write(1 as Int32, &buf)\n    case let .Baz(x, y):\n        _ffi_write(2 as Int32, &buf)\n        _ffi_write(x, &buf)\n        _ffi_write(y, &buf)\n    }\n}\n\nprivate func _ffi_vec__from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [()] {\n    var items: [()] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(())\n    }\n    return items\n}\n\nprivate func _ffi_vec__to_rust(_ items: [()], _ buf: inout ContiguousArray<UInt8>) {\n}\n\nprivate func _ffi_vec_box_i32_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Int32] {\n    var items: [Int32] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_box_i32_from_rust2(&end))\n    }\n    return items\n}\n\nprivate func _ffi_vec_box_i32_to_rust(_ items: [Int32], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_box_i32_to_rust2(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_box_vec_i32_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [[Int32]] {\n    var items: [[Int32]] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_box_vec_i32_from_rust(&end))\n    }\n    return items\n}\n\nprivate func _ffi_vec_box_vec_i32_to_rust(_ items: [[Int32]], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_box_vec_i32_to_rust(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_i32_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Int32] {\n    var items: [Int32] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_read(&end) as Int32)\n    }\n    return items\n}\n\nprivate func _ffi_vec_i32_from_rust2(_ len: Int, _ end: inout UnsafeRawPointer) -> [Int32] {\n    var items: [Int32] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_read(&end) as Int32)\n    }\n    return items\n}\n\nprivate func _ffi_vec_i32_i32_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [(Int32, Int32)] {\n    var items: [(Int32, Int32)] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append((_ffi_read(&end) as Int32, _ffi_read(&end) as Int32))\n    }\n    return items\n}\n\nprivate func _ffi_vec_i32_i32_to_rust(_ items: [(Int32, Int32)], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item.0, &buf)\n        _ffi_write(item.1, &buf)\n    }\n}\n\nprivate func _ffi_vec_i32_to_rust(_ items: [Int32], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_i32_to_rust2(_ items: [Int32], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_derive_eq_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box__from_swift(_: &mut *const u8) -> Box<()> {\n    Box::new(())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_box__to_swift(val: (), _: &mut Vec<u8>) {\n    _ = val;\n}\n\nfn _ffi_box_bool_from_swift(end: &mut *const u8) -> Box<bool> {\n    Box::new(_ffi_read::<bool>(end))\n}\n\nfn _ffi_box_bool_to_swift(val: bool, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\nfn _ffi_box_i32_from_swift(end: &mut *const u8) -> Box<(i32,)> {\n    Box::new((_ffi_read::<i32>(end),))\n}\n\nfn _ffi_box_i32_from_swift2(end: &mut *const u8) -> Box<i32> {\n    Box::new(_ffi_read::<i32>(end))\n}\n\nfn _ffi_box_i32_i32_from_swift(end: &mut *const u8) -> Box<(i32, i32)> {\n    Box::new((_ffi_read::<i32>(end), _ffi_read::<i32>(end)))\n}\n\nfn _ffi_box_i32_i32_to_swift(val: (i32, i32), buf: &mut Vec<u8>) {\n    _ffi_write(val.0, buf);\n    _ffi_write(val.1, buf);\n}\n\nfn _ffi_box_i32_to_swift(val: (i32,), buf: &mut Vec<u8>) {\n    _ffi_write(val.0, buf);\n}\n\nfn _ffi_box_i32_to_swift2(val: i32, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\nfn _ffi_box_option_box_i32_from_swift(end: &mut *const u8) -> Box<Option<Box<i32>>> {\n    Box::new(_ffi_read::<bool>(end).then(|| _ffi_box_i32_from_swift2(end)))\n}\n\nfn _ffi_box_option_box_i32_to_swift(val: Option<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_write(val.is_some(), buf);\n    if let Some(val_val) = val {\n        _ffi_box_i32_to_swift2(*val_val, buf);\n    }\n}\n\nfn _ffi_box_option_i32_from_swift(end: &mut *const u8) -> Box<Option<i32>> {\n    Box::new(_ffi_read::<bool>(end).then(|| _ffi_read::<i32>(end)))\n}\n\nfn _ffi_box_option_i32_to_swift(val: Option<i32>, buf: &mut Vec<u8>) {\n    _ffi_write(val.is_some(), buf);\n    if let Some(val_val) = val {\n        _ffi_write(val_val, buf);\n    }\n}\n\nfn _ffi_box_vec_box_i32_from_swift(end: &mut *const u8) -> Box<Vec<Box<i32>>> {\n    Box::new(_ffi_vec_box_i32_from_swift(_ffi_read::<usize>(end), end))\n}\n\nfn _ffi_box_vec_box_i32_to_swift(val: Vec<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_write(val.len(), buf);\n    _ffi_vec_box_i32_to_swift(val, buf);\n}\n\nfn _ffi_box_vec_i32_from_swift(end: &mut *const u8) -> Box<Vec<i32>> {\n    Box::new(_ffi_vec_i32_from_swift2(_ffi_read::<usize>(end), end))\n}\n\nfn _ffi_box_vec_i32_to_swift(val: Vec<i32>, buf: &mut Vec<u8>) {\n    _ffi_write(val.len(), buf);\n    _ffi_vec_i32_to_swift2(val, buf);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumBoxTup_from_swift(end: &mut *const u8) -> EnumBoxTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumBoxTup::Foo(_ffi_box_i32_i32_from_swift(end)),\n        1 => EnumBoxTup::Bar,\n        2 => EnumBoxTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumBoxTup_to_swift(val: EnumBoxTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumBoxTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_box_i32_i32_to_swift(*x, buf);\n        }\n        EnumBoxTup::Bar => _ffi_write(1 as i32, buf),\n        EnumBoxTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumOptTup_from_swift(end: &mut *const u8) -> EnumOptTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumOptTup::Foo(_ffi_read::<bool>(end).then(|| (_ffi_read::<i32>(end), _ffi_read::<i32>(end)))),\n        1 => EnumOptTup::Bar,\n        2 => EnumOptTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumOptTup_to_swift(val: EnumOptTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumOptTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_write(x.is_some(), buf);\n            if let Some(x_val) = x {\n                _ffi_write(x_val.0, buf);\n                _ffi_write(x_val.1, buf);\n            }\n        }\n        EnumOptTup::Bar => _ffi_write(1 as i32, buf),\n        EnumOptTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumVecTup_from_swift(end: &mut *const u8) -> EnumVecTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumVecTup::Foo(_ffi_vec_i32_i32_from_swift(_ffi_read::<usize>(end), end)),\n        1 => EnumVecTup::Bar,\n        2 => EnumVecTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumVecTup_to_swift(val: EnumVecTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumVecTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_write(x.len(), buf);\n            _ffi_vec_i32_i32_to_swift(x, buf);\n        }\n        EnumVecTup::Bar => _ffi_write(1 as i32, buf),\n        EnumVecTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_opt(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_opt(BoxOpt(_ffi_box_option_i32_from_swift(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_option_i32_to_swift(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_opt_box(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_opt_box(BoxOptBox(_ffi_box_option_box_i32_from_swift(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_option_box_i32_to_swift(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_tup_0(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_0(BoxTup0(_ffi_box__from_swift(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box__to_swift(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_tup_1(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_1(BoxTup1(_ffi_box_i32_from_swift(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_to_swift(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_tup_2(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_2(BoxTup2(_ffi_box_i32_i32_from_swift(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_i32_to_swift(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_vec(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_vec(BoxVec(_ffi_box_vec_i32_from_swift(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_vec_i32_to_swift(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_vec_box(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_vec_box(BoxVecBox(_ffi_box_vec_box_i32_from_swift(&mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_vec_box_i32_to_swift(*ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_empty_struct() {\n    _ = empty_struct(EmptyStruct);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_empty_tuple() {\n    _ = empty_tuple(());\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_enum_box_tup(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumBoxTup_to_swift(enum_box_tup(_ffi_enum_EnumBoxTup_from_swift(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_enum_opt_tup(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumOptTup_to_swift(enum_opt_tup(_ffi_enum_EnumOptTup_from_swift(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_enum_vec_tup(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumVecTup_to_swift(enum_vec_tup(_ffi_enum_EnumVecTup_from_swift(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_box(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_box(OptBox(has_x_0.then(|| _ffi_box_i32_from_swift2(&mut buf_end))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_box_i32_to_swift2(*ret_0_val, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_box_opt(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_box_opt(OptBoxOpt(has_x_0.then(|| _ffi_box_option_i32_from_swift(&mut buf_end))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_box_option_i32_to_swift(*ret_0_val, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_tup_0(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let buf_end = buf_ptr;\n    let ret = opt_tup_0(OptTup0(has_x_0.then(|| ())));\n    let ret_0 = ret.0;\n    let buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ = ret_0_val;\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_tup_1(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_tup_1(OptTup1(has_x_0.then(|| (_ffi_read::<i32>(&mut buf_end),))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_write(ret_0_val.0, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_tup_2(buf_ptr: *const u8, has_x_0: bool) -> _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_tup_2(OptTup2(has_x_0.then(|| (_ffi_read::<i32>(&mut buf_end), _ffi_read::<i32>(&mut buf_end)))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_write(ret_0_val.0, &mut buf2);\n        _ffi_write(ret_0_val.1, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_tup_box(buf_ptr: *const u8) -> _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = tup_box(TupBox((_ffi_box_i32_from_swift2(&mut buf_end), _ffi_box_bool_from_swift(&mut buf_end))));\n    let ret_0 = ret.0;\n    let ret_0_0 = ret_0.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_to_swift2(*ret_0_0, &mut buf2);\n    let ret_0_1 = ret_0.1;\n    _ffi_box_bool_to_swift(*ret_0_1, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_usize(buf_ptr2, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_box(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_box(VecBox(_ffi_vec_box_i32_from_swift(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_box_i32_to_swift(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_box_vec(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_box_vec(VecBoxVec(_ffi_vec_box_vec_i32_from_swift(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_box_vec_i32_to_swift(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_tup_0(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_0(VecTup0(_ffi_vec__from_swift(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec__to_swift(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_tup_1(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_1(VecTup1(_ffi_vec_i32_from_swift(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_i32_to_swift(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_tup_2(buf_ptr: *const u8, x_0_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_2(VecTup2(_ffi_vec_i32_i32_from_swift(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_i32_i32_to_swift(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len)\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize_bool(*const u8, usize, bool);\n\n#[allow(non_snake_case)]\nfn _ffi_vec__from_swift(len: usize, _: &mut *const u8) -> Vec<()> {\n    let mut items = Vec::<()>::with_capacity(len);\n    for _ in 0..len {\n        items.push(());\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__to_swift(items: Vec<()>, _: &mut Vec<u8>) {\n    for item in items {\n        _ = item;\n    }\n}\n\nfn _ffi_vec_box_i32_from_swift(len: usize, end: &mut *const u8) -> Vec<Box<i32>> {\n    let mut items = Vec::<Box<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_box_i32_from_swift2(end));\n    }\n    items\n}\n\nfn _ffi_vec_box_i32_to_swift(items: Vec<Box<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_box_i32_to_swift2(*item, buf);\n    }\n}\n\nfn _ffi_vec_box_vec_i32_from_swift(len: usize, end: &mut *const u8) -> Vec<Box<Vec<i32>>> {\n    let mut items = Vec::<Box<Vec<i32>>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_box_vec_i32_from_swift(end));\n    }\n    items\n}\n\nfn _ffi_vec_box_vec_i32_to_swift(items: Vec<Box<Vec<i32>>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_box_vec_i32_to_swift(*item, buf);\n    }\n}\n\nfn _ffi_vec_i32_from_swift(len: usize, end: &mut *const u8) -> Vec<(i32,)> {\n    let mut items = Vec::<(i32,)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((_ffi_read::<i32>(end),));\n    }\n    items\n}\n\nfn _ffi_vec_i32_from_swift2(len: usize, end: &mut *const u8) -> Vec<i32> {\n    let mut items = Vec::<i32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i32_i32_from_swift(len: usize, end: &mut *const u8) -> Vec<(i32, i32)> {\n    let mut items = Vec::<(i32, i32)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((_ffi_read::<i32>(end), _ffi_read::<i32>(end)));\n    }\n    items\n}\n\nfn _ffi_vec_i32_i32_to_swift(items: Vec<(i32, i32)>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.0, buf);\n        _ffi_write(item.1, buf);\n    }\n}\n\nfn _ffi_vec_i32_to_swift(items: Vec<(i32,)>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.0, buf);\n    }\n}\n\nfn _ffi_vec_i32_to_swift2(items: Vec<i32>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item, buf);\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_enum_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_enum_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nenum NestedBox {\n    case Foo\n    indirect case Bar(NestedBox)\n}\n\nenum NestedVec {\n    case Foo\n    case Bar([NestedVec])\n}\n\nenum NestedOption {\n    case Foo\n    indirect case Bar(NestedOption?)\n}\n\nenum NestedTuple {\n    case Foo\n    indirect case Bar((Int32, NestedTuple))\n}\n\nenum NestedStruct {\n    case Foo\n    indirect case Bar((Int32, InnerStruct))\n}\n\nenum NestedEnum {\n    case Foo\n    indirect case Bar((Int32, InnerEnum))\n}\n\nenum InnerEnum {\n    indirect case Foo(NestedEnum)\n}\n\nstruct InnerStruct {\n    var x: NestedStruct\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_enum_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_enum_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_enum_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nenum NestedBox {\n    case Foo\n    indirect case Bar(NestedBox)\n}\n\nenum NestedVec {\n    case Foo\n    case Bar([NestedVec])\n}\n\nenum NestedOption {\n    case Foo\n    indirect case Bar(NestedOption?)\n}\n\nenum NestedTuple {\n    case Foo\n    indirect case Bar((Int32, NestedTuple))\n}\n\nenum NestedStruct {\n    case Foo\n    indirect case Bar((Int32, InnerStruct))\n}\n\nenum NestedEnum {\n    case Foo\n    indirect case Bar((Int32, InnerEnum))\n}\n\nenum InnerEnum {\n    indirect case Foo(NestedEnum)\n}\n\nstruct InnerStruct {\n    var x: NestedStruct\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_enum_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_keyword_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_test_alignas(int32_t alignas2);\n\nint32_t _ffi_fn_test_alignof(int32_t alignof2);\n\nint32_t _ffi_fn_test_and(int32_t and2);\n\nint32_t _ffi_fn_test_and_eq(int32_t and_eq2);\n\nint32_t _ffi_fn_test_asm(int32_t asm2);\n\nint32_t _ffi_fn_test_associatedtype(int32_t associatedtype2);\n\nint32_t _ffi_fn_test_associativity(int32_t associativity2);\n\nint32_t _ffi_fn_test_atomic_cancel(int32_t atomic_cancel2);\n\nint32_t _ffi_fn_test_atomic_commit(int32_t atomic_commit2);\n\nint32_t _ffi_fn_test_atomic_noexcept(int32_t atomic_noexcept2);\n\nint32_t _ffi_fn_test_auto(int32_t auto2);\n\nint32_t _ffi_fn_test_bitand(int32_t bitand2);\n\nint32_t _ffi_fn_test_bitor(int32_t bitor2);\n\nint32_t _ffi_fn_test_bool(int32_t bool2);\n\nint32_t _ffi_fn_test_boolean(int32_t boolean);\n\nint32_t _ffi_fn_test_borrowing(int32_t borrowing2);\n\nint32_t _ffi_fn_test_byte(int32_t byte);\n\nint32_t _ffi_fn_test_case(int32_t case2);\n\nint32_t _ffi_fn_test_catch(int32_t catch2);\n\nint32_t _ffi_fn_test_char(int32_t char2);\n\nint32_t _ffi_fn_test_char16_t(int32_t char16_t2);\n\nint32_t _ffi_fn_test_char32_t(int32_t char32_t2);\n\nint32_t _ffi_fn_test_char8_t(int32_t char8_t2);\n\nint32_t _ffi_fn_test_class(int32_t class2);\n\nint32_t _ffi_fn_test_co_await(int32_t co_await2);\n\nint32_t _ffi_fn_test_co_return(int32_t co_return2);\n\nint32_t _ffi_fn_test_co_yield(int32_t co_yield2);\n\nint32_t _ffi_fn_test_compl(int32_t compl2);\n\nint32_t _ffi_fn_test_concept(int32_t concept2);\n\nint32_t _ffi_fn_test_const_cast(int32_t const_cast2);\n\nint32_t _ffi_fn_test_consteval(int32_t consteval2);\n\nint32_t _ffi_fn_test_constexpr(int32_t constexpr2);\n\nint32_t _ffi_fn_test_constinit(int32_t constinit2);\n\nint32_t _ffi_fn_test_consuming(int32_t consuming2);\n\nint32_t _ffi_fn_test_contract_assert(int32_t contract_assert2);\n\nint32_t _ffi_fn_test_convenience(int32_t convenience2);\n\nint32_t _ffi_fn_test_debugger(int32_t debugger);\n\nint32_t _ffi_fn_test_decltype(int32_t decltype2);\n\nint32_t _ffi_fn_test_default(int32_t default2);\n\nint32_t _ffi_fn_test_defer(int32_t defer2);\n\nint32_t _ffi_fn_test_deinit(int32_t deinit2);\n\nint32_t _ffi_fn_test_delete(int32_t delete2);\n\nint32_t _ffi_fn_test_double(int32_t double2);\n\nint32_t _ffi_fn_test_dynamic(int32_t dynamic2);\n\nint32_t _ffi_fn_test_dynamic_cast(int32_t dynamic_cast2);\n\nint32_t _ffi_fn_test_explicit(int32_t explicit2);\n\nint32_t _ffi_fn_test_export(int32_t export2);\n\nint32_t _ffi_fn_test_extends(int32_t extends);\n\nint32_t _ffi_fn_test_extension(int32_t extension2);\n\nint32_t _ffi_fn_test_fallthrough(int32_t fallthrough2);\n\nint32_t _ffi_fn_test_fileprivate(int32_t fileprivate2);\n\nint32_t _ffi_fn_test_finally(int32_t finally);\n\nint32_t _ffi_fn_test_float(int32_t float2);\n\nint32_t _ffi_fn_test_friend(int32_t friend2);\n\nint32_t _ffi_fn_test_func(int32_t func2);\n\nint32_t _ffi_fn_test_function(int32_t function);\n\nint32_t _ffi_fn_test_get(int32_t get2);\n\nint32_t _ffi_fn_test_goto(int32_t goto2);\n\nint32_t _ffi_fn_test_guard(int32_t guard2);\n\nint32_t _ffi_fn_test_implements(int32_t implements);\n\nint32_t _ffi_fn_test_import(int32_t import2);\n\nint32_t _ffi_fn_test_indirect(int32_t indirect2);\n\nint32_t _ffi_fn_test_infix(int32_t infix2);\n\nint32_t _ffi_fn_test_init(int32_t init2);\n\nint32_t _ffi_fn_test_inline(int32_t inline2);\n\nint32_t _ffi_fn_test_inout(int32_t inout2);\n\nint32_t _ffi_fn_test_instanceof(int32_t instanceof);\n\nint32_t _ffi_fn_test_int(int32_t int2);\n\nint32_t _ffi_fn_test_interface(int32_t interface);\n\nint32_t _ffi_fn_test_internal(int32_t internal2);\n\nint32_t _ffi_fn_test_is(int32_t is2);\n\nint32_t _ffi_fn_test_lazy(int32_t lazy2);\n\nint32_t _ffi_fn_test_left(int32_t left2);\n\nint32_t _ffi_fn_test_long(int32_t long2);\n\nint32_t _ffi_fn_test_mutable(int32_t mutable2);\n\nint32_t _ffi_fn_test_mutating(int32_t mutating2);\n\nint32_t _ffi_fn_test_namespace(int32_t namespace2);\n\nint32_t _ffi_fn_test_native(int32_t native);\n\nint32_t _ffi_fn_test_new(int32_t new2);\n\nint32_t _ffi_fn_test_nil(int32_t nil2);\n\nint32_t _ffi_fn_test_noexcept(int32_t noexcept2);\n\nint32_t _ffi_fn_test_none(int32_t none2);\n\nint32_t _ffi_fn_test_nonisolated(int32_t nonisolated2);\n\nint32_t _ffi_fn_test_nonmutating(int32_t nonmutating2);\n\nint32_t _ffi_fn_test_not(int32_t not2);\n\nint32_t _ffi_fn_test_not_eq(int32_t not_eq2);\n\nint32_t _ffi_fn_test_null(int32_t null);\n\nint32_t _ffi_fn_test_nullptr(int32_t nullptr2);\n\nint32_t _ffi_fn_test_open(int32_t open2);\n\nint32_t _ffi_fn_test_operator(int32_t operator2);\n\nint32_t _ffi_fn_test_optional(int32_t optional2);\n\nint32_t _ffi_fn_test_or(int32_t or2);\n\nint32_t _ffi_fn_test_or_eq(int32_t or_eq2);\n\nint32_t _ffi_fn_test_package(int32_t package2);\n\nint32_t _ffi_fn_test_postfix(int32_t postfix2);\n\nint32_t _ffi_fn_test_precedence(int32_t precedence2);\n\nint32_t _ffi_fn_test_precedencegroup(int32_t precedencegroup2);\n\nint32_t _ffi_fn_test_prefix(int32_t prefix2);\n\nint32_t _ffi_fn_test_private(int32_t private2);\n\nint32_t _ffi_fn_test_protected(int32_t protected2);\n\nint32_t _ffi_fn_test_protocol(int32_t protocol2);\n\nint32_t _ffi_fn_test_public(int32_t public2);\n\nint32_t _ffi_fn_test_reflexpr(int32_t reflexpr2);\n\nint32_t _ffi_fn_test_register(int32_t register2);\n\nint32_t _ffi_fn_test_reinterpret_cast(int32_t reinterpret_cast2);\n\nint32_t _ffi_fn_test_repeat(int32_t repeat2);\n\nint32_t _ffi_fn_test_required(int32_t required2);\n\nint32_t _ffi_fn_test_requires(int32_t requires2);\n\nint32_t _ffi_fn_test_rethrows(int32_t rethrows2);\n\nint32_t _ffi_fn_test_right(int32_t right2);\n\nint32_t _ffi_fn_test_set(int32_t set2);\n\nint32_t _ffi_fn_test_short(int32_t short2);\n\nint32_t _ffi_fn_test_signed(int32_t signed2);\n\nint32_t _ffi_fn_test_sizeof(int32_t sizeof2);\n\nint32_t _ffi_fn_test_some(int32_t some2);\n\nint32_t _ffi_fn_test_static_assert(int32_t static_assert2);\n\nint32_t _ffi_fn_test_static_cast(int32_t static_cast2);\n\nint32_t _ffi_fn_test_subscript(int32_t subscript2);\n\nint32_t _ffi_fn_test_switch(int32_t switch2);\n\nint32_t _ffi_fn_test_synchronized(int32_t synchronized2);\n\nint32_t _ffi_fn_test_template(int32_t template2);\n\nint32_t _ffi_fn_test_this(int32_t this2);\n\nint32_t _ffi_fn_test_thread_local(int32_t thread_local2);\n\nint32_t _ffi_fn_test_throw(int32_t throw2);\n\nint32_t _ffi_fn_test_throws(int32_t throws2);\n\nint32_t _ffi_fn_test_transient(int32_t transient);\n\nint32_t _ffi_fn_test_typealias(int32_t typealias2);\n\nint32_t _ffi_fn_test_typedef(int32_t typedef2);\n\nint32_t _ffi_fn_test_typeid(int32_t typeid2);\n\nint32_t _ffi_fn_test_typename(int32_t typename2);\n\nint32_t _ffi_fn_test_undefined(int32_t undefined);\n\nint32_t _ffi_fn_test_union(int32_t union2);\n\nint32_t _ffi_fn_test_unowned(int32_t unowned2);\n\nint32_t _ffi_fn_test_unsigned(int32_t unsigned2);\n\nint32_t _ffi_fn_test_using(int32_t using2);\n\nint32_t _ffi_fn_test_var(int32_t var2);\n\nint32_t _ffi_fn_test_void(int32_t void2);\n\nint32_t _ffi_fn_test_volatile(int32_t volatile2);\n\nint32_t _ffi_fn_test_wchar_t(int32_t wchar_t2);\n\nint32_t _ffi_fn_test_weak(int32_t weak2);\n\nint32_t _ffi_fn_test_with(int32_t with);\n\nint32_t _ffi_fn_test_xor(int32_t xor2);\n\nint32_t _ffi_fn_test_xor_eq(int32_t xor_eq2);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_keyword_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc test_alignas(_ alignas2: Int32) -> Int32 {\n    return _ffi_fn_test_alignas(alignas2)\n}\n\nfunc test_alignof(_ alignof2: Int32) -> Int32 {\n    return _ffi_fn_test_alignof(alignof2)\n}\n\nfunc test_and(_ and2: Int32) -> Int32 {\n    return _ffi_fn_test_and(and2)\n}\n\nfunc test_and_eq(_ and_eq2: Int32) -> Int32 {\n    return _ffi_fn_test_and_eq(and_eq2)\n}\n\nfunc test_asm(_ asm2: Int32) -> Int32 {\n    return _ffi_fn_test_asm(asm2)\n}\n\nfunc test_associatedtype(_ associatedtype2: Int32) -> Int32 {\n    return _ffi_fn_test_associatedtype(associatedtype2)\n}\n\nfunc test_associativity(_ associativity2: Int32) -> Int32 {\n    return _ffi_fn_test_associativity(associativity2)\n}\n\nfunc test_atomic_cancel(_ atomic_cancel2: Int32) -> Int32 {\n    return _ffi_fn_test_atomic_cancel(atomic_cancel2)\n}\n\nfunc test_atomic_commit(_ atomic_commit2: Int32) -> Int32 {\n    return _ffi_fn_test_atomic_commit(atomic_commit2)\n}\n\nfunc test_atomic_noexcept(_ atomic_noexcept2: Int32) -> Int32 {\n    return _ffi_fn_test_atomic_noexcept(atomic_noexcept2)\n}\n\nfunc test_auto(_ auto2: Int32) -> Int32 {\n    return _ffi_fn_test_auto(auto2)\n}\n\nfunc test_bitand(_ bitand2: Int32) -> Int32 {\n    return _ffi_fn_test_bitand(bitand2)\n}\n\nfunc test_bitor(_ bitor2: Int32) -> Int32 {\n    return _ffi_fn_test_bitor(bitor2)\n}\n\nfunc test_bool(_ bool2: Int32) -> Int32 {\n    return _ffi_fn_test_bool(bool2)\n}\n\nfunc test_boolean(_ boolean: Int32) -> Int32 {\n    return _ffi_fn_test_boolean(boolean)\n}\n\nfunc test_borrowing(_ borrowing2: Int32) -> Int32 {\n    return _ffi_fn_test_borrowing(borrowing2)\n}\n\nfunc test_byte(_ byte: Int32) -> Int32 {\n    return _ffi_fn_test_byte(byte)\n}\n\nfunc test_case(_ case2: Int32) -> Int32 {\n    return _ffi_fn_test_case(case2)\n}\n\nfunc test_catch(_ catch2: Int32) -> Int32 {\n    return _ffi_fn_test_catch(catch2)\n}\n\nfunc test_char(_ char2: Int32) -> Int32 {\n    return _ffi_fn_test_char(char2)\n}\n\nfunc test_char16_t(_ char16_t2: Int32) -> Int32 {\n    return _ffi_fn_test_char16_t(char16_t2)\n}\n\nfunc test_char32_t(_ char32_t2: Int32) -> Int32 {\n    return _ffi_fn_test_char32_t(char32_t2)\n}\n\nfunc test_char8_t(_ char8_t2: Int32) -> Int32 {\n    return _ffi_fn_test_char8_t(char8_t2)\n}\n\nfunc test_class(_ class2: Int32) -> Int32 {\n    return _ffi_fn_test_class(class2)\n}\n\nfunc test_co_await(_ co_await2: Int32) -> Int32 {\n    return _ffi_fn_test_co_await(co_await2)\n}\n\nfunc test_co_return(_ co_return2: Int32) -> Int32 {\n    return _ffi_fn_test_co_return(co_return2)\n}\n\nfunc test_co_yield(_ co_yield2: Int32) -> Int32 {\n    return _ffi_fn_test_co_yield(co_yield2)\n}\n\nfunc test_compl(_ compl2: Int32) -> Int32 {\n    return _ffi_fn_test_compl(compl2)\n}\n\nfunc test_concept(_ concept2: Int32) -> Int32 {\n    return _ffi_fn_test_concept(concept2)\n}\n\nfunc test_const_cast(_ const_cast2: Int32) -> Int32 {\n    return _ffi_fn_test_const_cast(const_cast2)\n}\n\nfunc test_consteval(_ consteval2: Int32) -> Int32 {\n    return _ffi_fn_test_consteval(consteval2)\n}\n\nfunc test_constexpr(_ constexpr2: Int32) -> Int32 {\n    return _ffi_fn_test_constexpr(constexpr2)\n}\n\nfunc test_constinit(_ constinit2: Int32) -> Int32 {\n    return _ffi_fn_test_constinit(constinit2)\n}\n\nfunc test_consuming(_ consuming2: Int32) -> Int32 {\n    return _ffi_fn_test_consuming(consuming2)\n}\n\nfunc test_contract_assert(_ contract_assert2: Int32) -> Int32 {\n    return _ffi_fn_test_contract_assert(contract_assert2)\n}\n\nfunc test_convenience(_ convenience2: Int32) -> Int32 {\n    return _ffi_fn_test_convenience(convenience2)\n}\n\nfunc test_debugger(_ debugger: Int32) -> Int32 {\n    return _ffi_fn_test_debugger(debugger)\n}\n\nfunc test_decltype(_ decltype2: Int32) -> Int32 {\n    return _ffi_fn_test_decltype(decltype2)\n}\n\nfunc test_default(_ default2: Int32) -> Int32 {\n    return _ffi_fn_test_default(default2)\n}\n\nfunc test_defer(_ defer2: Int32) -> Int32 {\n    return _ffi_fn_test_defer(defer2)\n}\n\nfunc test_deinit(_ deinit2: Int32) -> Int32 {\n    return _ffi_fn_test_deinit(deinit2)\n}\n\nfunc test_delete(_ delete2: Int32) -> Int32 {\n    return _ffi_fn_test_delete(delete2)\n}\n\nfunc test_double(_ double2: Int32) -> Int32 {\n    return _ffi_fn_test_double(double2)\n}\n\nfunc test_dynamic(_ dynamic2: Int32) -> Int32 {\n    return _ffi_fn_test_dynamic(dynamic2)\n}\n\nfunc test_dynamic_cast(_ dynamic_cast2: Int32) -> Int32 {\n    return _ffi_fn_test_dynamic_cast(dynamic_cast2)\n}\n\nfunc test_explicit(_ explicit2: Int32) -> Int32 {\n    return _ffi_fn_test_explicit(explicit2)\n}\n\nfunc test_export(_ export2: Int32) -> Int32 {\n    return _ffi_fn_test_export(export2)\n}\n\nfunc test_extends(_ extends: Int32) -> Int32 {\n    return _ffi_fn_test_extends(extends)\n}\n\nfunc test_extension(_ extension2: Int32) -> Int32 {\n    return _ffi_fn_test_extension(extension2)\n}\n\nfunc test_fallthrough(_ fallthrough2: Int32) -> Int32 {\n    return _ffi_fn_test_fallthrough(fallthrough2)\n}\n\nfunc test_fileprivate(_ fileprivate2: Int32) -> Int32 {\n    return _ffi_fn_test_fileprivate(fileprivate2)\n}\n\nfunc test_finally(_ finally: Int32) -> Int32 {\n    return _ffi_fn_test_finally(finally)\n}\n\nfunc test_float(_ float2: Int32) -> Int32 {\n    return _ffi_fn_test_float(float2)\n}\n\nfunc test_friend(_ friend2: Int32) -> Int32 {\n    return _ffi_fn_test_friend(friend2)\n}\n\nfunc test_func(_ func2: Int32) -> Int32 {\n    return _ffi_fn_test_func(func2)\n}\n\nfunc test_function(_ function: Int32) -> Int32 {\n    return _ffi_fn_test_function(function)\n}\n\nfunc test_get(_ get2: Int32) -> Int32 {\n    return _ffi_fn_test_get(get2)\n}\n\nfunc test_goto(_ goto2: Int32) -> Int32 {\n    return _ffi_fn_test_goto(goto2)\n}\n\nfunc test_guard(_ guard2: Int32) -> Int32 {\n    return _ffi_fn_test_guard(guard2)\n}\n\nfunc test_implements(_ implements: Int32) -> Int32 {\n    return _ffi_fn_test_implements(implements)\n}\n\nfunc test_import(_ import2: Int32) -> Int32 {\n    return _ffi_fn_test_import(import2)\n}\n\nfunc test_indirect(_ indirect2: Int32) -> Int32 {\n    return _ffi_fn_test_indirect(indirect2)\n}\n\nfunc test_infix(_ infix2: Int32) -> Int32 {\n    return _ffi_fn_test_infix(infix2)\n}\n\nfunc test_init(_ init2: Int32) -> Int32 {\n    return _ffi_fn_test_init(init2)\n}\n\nfunc test_inline(_ inline2: Int32) -> Int32 {\n    return _ffi_fn_test_inline(inline2)\n}\n\nfunc test_inout(_ inout2: Int32) -> Int32 {\n    return _ffi_fn_test_inout(inout2)\n}\n\nfunc test_instanceof(_ instanceof: Int32) -> Int32 {\n    return _ffi_fn_test_instanceof(instanceof)\n}\n\nfunc test_int(_ int2: Int32) -> Int32 {\n    return _ffi_fn_test_int(int2)\n}\n\nfunc test_interface(_ interface: Int32) -> Int32 {\n    return _ffi_fn_test_interface(interface)\n}\n\nfunc test_internal(_ internal2: Int32) -> Int32 {\n    return _ffi_fn_test_internal(internal2)\n}\n\nfunc test_is(_ is2: Int32) -> Int32 {\n    return _ffi_fn_test_is(is2)\n}\n\nfunc test_lazy(_ lazy2: Int32) -> Int32 {\n    return _ffi_fn_test_lazy(lazy2)\n}\n\nfunc test_left(_ left2: Int32) -> Int32 {\n    return _ffi_fn_test_left(left2)\n}\n\nfunc test_long(_ long2: Int32) -> Int32 {\n    return _ffi_fn_test_long(long2)\n}\n\nfunc test_mutable(_ mutable2: Int32) -> Int32 {\n    return _ffi_fn_test_mutable(mutable2)\n}\n\nfunc test_mutating(_ mutating2: Int32) -> Int32 {\n    return _ffi_fn_test_mutating(mutating2)\n}\n\nfunc test_namespace(_ namespace2: Int32) -> Int32 {\n    return _ffi_fn_test_namespace(namespace2)\n}\n\nfunc test_native(_ native: Int32) -> Int32 {\n    return _ffi_fn_test_native(native)\n}\n\nfunc test_new(_ new2: Int32) -> Int32 {\n    return _ffi_fn_test_new(new2)\n}\n\nfunc test_nil(_ nil2: Int32) -> Int32 {\n    return _ffi_fn_test_nil(nil2)\n}\n\nfunc test_noexcept(_ noexcept2: Int32) -> Int32 {\n    return _ffi_fn_test_noexcept(noexcept2)\n}\n\nfunc test_none(_ none2: Int32) -> Int32 {\n    return _ffi_fn_test_none(none2)\n}\n\nfunc test_nonisolated(_ nonisolated2: Int32) -> Int32 {\n    return _ffi_fn_test_nonisolated(nonisolated2)\n}\n\nfunc test_nonmutating(_ nonmutating2: Int32) -> Int32 {\n    return _ffi_fn_test_nonmutating(nonmutating2)\n}\n\nfunc test_not(_ not2: Int32) -> Int32 {\n    return _ffi_fn_test_not(not2)\n}\n\nfunc test_not_eq(_ not_eq2: Int32) -> Int32 {\n    return _ffi_fn_test_not_eq(not_eq2)\n}\n\nfunc test_null(_ null: Int32) -> Int32 {\n    return _ffi_fn_test_null(null)\n}\n\nfunc test_nullptr(_ nullptr2: Int32) -> Int32 {\n    return _ffi_fn_test_nullptr(nullptr2)\n}\n\nfunc test_open(_ open2: Int32) -> Int32 {\n    return _ffi_fn_test_open(open2)\n}\n\nfunc test_operator(_ operator2: Int32) -> Int32 {\n    return _ffi_fn_test_operator(operator2)\n}\n\nfunc test_optional(_ optional2: Int32) -> Int32 {\n    return _ffi_fn_test_optional(optional2)\n}\n\nfunc test_or(_ or2: Int32) -> Int32 {\n    return _ffi_fn_test_or(or2)\n}\n\nfunc test_or_eq(_ or_eq2: Int32) -> Int32 {\n    return _ffi_fn_test_or_eq(or_eq2)\n}\n\nfunc test_package(_ package2: Int32) -> Int32 {\n    return _ffi_fn_test_package(package2)\n}\n\nfunc test_postfix(_ postfix2: Int32) -> Int32 {\n    return _ffi_fn_test_postfix(postfix2)\n}\n\nfunc test_precedence(_ precedence2: Int32) -> Int32 {\n    return _ffi_fn_test_precedence(precedence2)\n}\n\nfunc test_precedencegroup(_ precedencegroup2: Int32) -> Int32 {\n    return _ffi_fn_test_precedencegroup(precedencegroup2)\n}\n\nfunc test_prefix(_ prefix2: Int32) -> Int32 {\n    return _ffi_fn_test_prefix(prefix2)\n}\n\nfunc test_private(_ private2: Int32) -> Int32 {\n    return _ffi_fn_test_private(private2)\n}\n\nfunc test_protected(_ protected2: Int32) -> Int32 {\n    return _ffi_fn_test_protected(protected2)\n}\n\nfunc test_protocol(_ protocol2: Int32) -> Int32 {\n    return _ffi_fn_test_protocol(protocol2)\n}\n\nfunc test_public(_ public2: Int32) -> Int32 {\n    return _ffi_fn_test_public(public2)\n}\n\nfunc test_reflexpr(_ reflexpr2: Int32) -> Int32 {\n    return _ffi_fn_test_reflexpr(reflexpr2)\n}\n\nfunc test_register(_ register2: Int32) -> Int32 {\n    return _ffi_fn_test_register(register2)\n}\n\nfunc test_reinterpret_cast(_ reinterpret_cast2: Int32) -> Int32 {\n    return _ffi_fn_test_reinterpret_cast(reinterpret_cast2)\n}\n\nfunc test_repeat(_ repeat2: Int32) -> Int32 {\n    return _ffi_fn_test_repeat(repeat2)\n}\n\nfunc test_required(_ required2: Int32) -> Int32 {\n    return _ffi_fn_test_required(required2)\n}\n\nfunc test_requires(_ requires2: Int32) -> Int32 {\n    return _ffi_fn_test_requires(requires2)\n}\n\nfunc test_rethrows(_ rethrows2: Int32) -> Int32 {\n    return _ffi_fn_test_rethrows(rethrows2)\n}\n\nfunc test_right(_ right2: Int32) -> Int32 {\n    return _ffi_fn_test_right(right2)\n}\n\nfunc test_set(_ set2: Int32) -> Int32 {\n    return _ffi_fn_test_set(set2)\n}\n\nfunc test_short(_ short2: Int32) -> Int32 {\n    return _ffi_fn_test_short(short2)\n}\n\nfunc test_signed(_ signed2: Int32) -> Int32 {\n    return _ffi_fn_test_signed(signed2)\n}\n\nfunc test_sizeof(_ sizeof2: Int32) -> Int32 {\n    return _ffi_fn_test_sizeof(sizeof2)\n}\n\nfunc test_some(_ some2: Int32) -> Int32 {\n    return _ffi_fn_test_some(some2)\n}\n\nfunc test_static_assert(_ static_assert2: Int32) -> Int32 {\n    return _ffi_fn_test_static_assert(static_assert2)\n}\n\nfunc test_static_cast(_ static_cast2: Int32) -> Int32 {\n    return _ffi_fn_test_static_cast(static_cast2)\n}\n\nfunc test_subscript(_ subscript2: Int32) -> Int32 {\n    return _ffi_fn_test_subscript(subscript2)\n}\n\nfunc test_switch(_ switch2: Int32) -> Int32 {\n    return _ffi_fn_test_switch(switch2)\n}\n\nfunc test_synchronized(_ synchronized2: Int32) -> Int32 {\n    return _ffi_fn_test_synchronized(synchronized2)\n}\n\nfunc test_template(_ template2: Int32) -> Int32 {\n    return _ffi_fn_test_template(template2)\n}\n\nfunc test_this(_ this2: Int32) -> Int32 {\n    return _ffi_fn_test_this(this2)\n}\n\nfunc test_thread_local(_ thread_local2: Int32) -> Int32 {\n    return _ffi_fn_test_thread_local(thread_local2)\n}\n\nfunc test_throw(_ throw2: Int32) -> Int32 {\n    return _ffi_fn_test_throw(throw2)\n}\n\nfunc test_throws(_ throws2: Int32) -> Int32 {\n    return _ffi_fn_test_throws(throws2)\n}\n\nfunc test_transient(_ transient: Int32) -> Int32 {\n    return _ffi_fn_test_transient(transient)\n}\n\nfunc test_typealias(_ typealias2: Int32) -> Int32 {\n    return _ffi_fn_test_typealias(typealias2)\n}\n\nfunc test_typedef(_ typedef2: Int32) -> Int32 {\n    return _ffi_fn_test_typedef(typedef2)\n}\n\nfunc test_typeid(_ typeid2: Int32) -> Int32 {\n    return _ffi_fn_test_typeid(typeid2)\n}\n\nfunc test_typename(_ typename2: Int32) -> Int32 {\n    return _ffi_fn_test_typename(typename2)\n}\n\nfunc test_undefined(_ undefined: Int32) -> Int32 {\n    return _ffi_fn_test_undefined(undefined)\n}\n\nfunc test_union(_ union2: Int32) -> Int32 {\n    return _ffi_fn_test_union(union2)\n}\n\nfunc test_unowned(_ unowned2: Int32) -> Int32 {\n    return _ffi_fn_test_unowned(unowned2)\n}\n\nfunc test_unsigned(_ unsigned2: Int32) -> Int32 {\n    return _ffi_fn_test_unsigned(unsigned2)\n}\n\nfunc test_using(_ using2: Int32) -> Int32 {\n    return _ffi_fn_test_using(using2)\n}\n\nfunc test_var(_ var2: Int32) -> Int32 {\n    return _ffi_fn_test_var(var2)\n}\n\nfunc test_void(_ void2: Int32) -> Int32 {\n    return _ffi_fn_test_void(void2)\n}\n\nfunc test_volatile(_ volatile2: Int32) -> Int32 {\n    return _ffi_fn_test_volatile(volatile2)\n}\n\nfunc test_wchar_t(_ wchar_t2: Int32) -> Int32 {\n    return _ffi_fn_test_wchar_t(wchar_t2)\n}\n\nfunc test_weak(_ weak2: Int32) -> Int32 {\n    return _ffi_fn_test_weak(weak2)\n}\n\nfunc test_with(_ with: Int32) -> Int32 {\n    return _ffi_fn_test_with(with)\n}\n\nfunc test_xor(_ xor2: Int32) -> Int32 {\n    return _ffi_fn_test_xor(xor2)\n}\n\nfunc test_xor_eq(_ xor_eq2: Int32) -> Int32 {\n    return _ffi_fn_test_xor_eq(xor_eq2)\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_keyword_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_alignas(alignas2: i32) -> i32 {\n    test_alignas(alignas2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_alignof(alignof2: i32) -> i32 {\n    test_alignof(alignof2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_and(and2: i32) -> i32 {\n    test_and(and2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_and_eq(and_eq2: i32) -> i32 {\n    test_and_eq(and_eq2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_asm(asm2: i32) -> i32 {\n    test_asm(asm2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_associatedtype(associatedtype2: i32) -> i32 {\n    test_associatedtype(associatedtype2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_associativity(associativity2: i32) -> i32 {\n    test_associativity(associativity2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_atomic_cancel(atomic_cancel2: i32) -> i32 {\n    test_atomic_cancel(atomic_cancel2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_atomic_commit(atomic_commit2: i32) -> i32 {\n    test_atomic_commit(atomic_commit2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_atomic_noexcept(atomic_noexcept2: i32) -> i32 {\n    test_atomic_noexcept(atomic_noexcept2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_auto(auto2: i32) -> i32 {\n    test_auto(auto2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_bitand(bitand2: i32) -> i32 {\n    test_bitand(bitand2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_bitor(bitor2: i32) -> i32 {\n    test_bitor(bitor2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_bool(bool2: i32) -> i32 {\n    test_bool(bool2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_boolean(boolean: i32) -> i32 {\n    test_boolean(boolean)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_borrowing(borrowing2: i32) -> i32 {\n    test_borrowing(borrowing2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_byte(byte: i32) -> i32 {\n    test_byte(byte)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_case(case2: i32) -> i32 {\n    test_case(case2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_catch(catch2: i32) -> i32 {\n    test_catch(catch2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_char(char2: i32) -> i32 {\n    test_char(char2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_char16_t(char16_t2: i32) -> i32 {\n    test_char16_t(char16_t2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_char32_t(char32_t2: i32) -> i32 {\n    test_char32_t(char32_t2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_char8_t(char8_t2: i32) -> i32 {\n    test_char8_t(char8_t2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_class(class2: i32) -> i32 {\n    test_class(class2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_co_await(co_await2: i32) -> i32 {\n    test_co_await(co_await2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_co_return(co_return2: i32) -> i32 {\n    test_co_return(co_return2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_co_yield(co_yield2: i32) -> i32 {\n    test_co_yield(co_yield2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_compl(compl2: i32) -> i32 {\n    test_compl(compl2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_concept(concept2: i32) -> i32 {\n    test_concept(concept2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_const_cast(const_cast2: i32) -> i32 {\n    test_const_cast(const_cast2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_consteval(consteval2: i32) -> i32 {\n    test_consteval(consteval2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_constexpr(constexpr2: i32) -> i32 {\n    test_constexpr(constexpr2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_constinit(constinit2: i32) -> i32 {\n    test_constinit(constinit2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_consuming(consuming2: i32) -> i32 {\n    test_consuming(consuming2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_contract_assert(contract_assert2: i32) -> i32 {\n    test_contract_assert(contract_assert2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_convenience(convenience2: i32) -> i32 {\n    test_convenience(convenience2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_debugger(debugger: i32) -> i32 {\n    test_debugger(debugger)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_decltype(decltype2: i32) -> i32 {\n    test_decltype(decltype2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_default(default2: i32) -> i32 {\n    test_default(default2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_defer(defer2: i32) -> i32 {\n    test_defer(defer2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_deinit(deinit2: i32) -> i32 {\n    test_deinit(deinit2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_delete(delete2: i32) -> i32 {\n    test_delete(delete2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_double(double2: i32) -> i32 {\n    test_double(double2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_dynamic(dynamic2: i32) -> i32 {\n    test_dynamic(dynamic2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_dynamic_cast(dynamic_cast2: i32) -> i32 {\n    test_dynamic_cast(dynamic_cast2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_explicit(explicit2: i32) -> i32 {\n    test_explicit(explicit2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_export(export2: i32) -> i32 {\n    test_export(export2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_extends(extends: i32) -> i32 {\n    test_extends(extends)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_extension(extension2: i32) -> i32 {\n    test_extension(extension2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_fallthrough(fallthrough2: i32) -> i32 {\n    test_fallthrough(fallthrough2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_fileprivate(fileprivate2: i32) -> i32 {\n    test_fileprivate(fileprivate2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_finally(finally: i32) -> i32 {\n    test_finally(finally)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_float(float2: i32) -> i32 {\n    test_float(float2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_friend(friend2: i32) -> i32 {\n    test_friend(friend2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_func(func2: i32) -> i32 {\n    test_func(func2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_function(function: i32) -> i32 {\n    test_function(function)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_get(get2: i32) -> i32 {\n    test_get(get2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_goto(goto2: i32) -> i32 {\n    test_goto(goto2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_guard(guard2: i32) -> i32 {\n    test_guard(guard2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_implements(implements: i32) -> i32 {\n    test_implements(implements)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_import(import2: i32) -> i32 {\n    test_import(import2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_indirect(indirect2: i32) -> i32 {\n    test_indirect(indirect2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_infix(infix2: i32) -> i32 {\n    test_infix(infix2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_init(init2: i32) -> i32 {\n    test_init(init2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_inline(inline2: i32) -> i32 {\n    test_inline(inline2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_inout(inout2: i32) -> i32 {\n    test_inout(inout2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_instanceof(instanceof: i32) -> i32 {\n    test_instanceof(instanceof)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_int(int2: i32) -> i32 {\n    test_int(int2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_interface(interface: i32) -> i32 {\n    test_interface(interface)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_internal(internal2: i32) -> i32 {\n    test_internal(internal2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_is(is2: i32) -> i32 {\n    test_is(is2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_lazy(lazy2: i32) -> i32 {\n    test_lazy(lazy2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_left(left2: i32) -> i32 {\n    test_left(left2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_long(long2: i32) -> i32 {\n    test_long(long2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_mutable(mutable2: i32) -> i32 {\n    test_mutable(mutable2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_mutating(mutating2: i32) -> i32 {\n    test_mutating(mutating2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_namespace(namespace2: i32) -> i32 {\n    test_namespace(namespace2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_native(native: i32) -> i32 {\n    test_native(native)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_new(new2: i32) -> i32 {\n    test_new(new2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_nil(nil2: i32) -> i32 {\n    test_nil(nil2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_noexcept(noexcept2: i32) -> i32 {\n    test_noexcept(noexcept2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_none(none2: i32) -> i32 {\n    test_none(none2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_nonisolated(nonisolated2: i32) -> i32 {\n    test_nonisolated(nonisolated2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_nonmutating(nonmutating2: i32) -> i32 {\n    test_nonmutating(nonmutating2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_not(not2: i32) -> i32 {\n    test_not(not2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_not_eq(not_eq2: i32) -> i32 {\n    test_not_eq(not_eq2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_null(null: i32) -> i32 {\n    test_null(null)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_nullptr(nullptr2: i32) -> i32 {\n    test_nullptr(nullptr2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_open(open2: i32) -> i32 {\n    test_open(open2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_operator(operator2: i32) -> i32 {\n    test_operator(operator2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_optional(optional2: i32) -> i32 {\n    test_optional(optional2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_or(or2: i32) -> i32 {\n    test_or(or2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_or_eq(or_eq2: i32) -> i32 {\n    test_or_eq(or_eq2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_package(package2: i32) -> i32 {\n    test_package(package2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_postfix(postfix2: i32) -> i32 {\n    test_postfix(postfix2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_precedence(precedence2: i32) -> i32 {\n    test_precedence(precedence2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_precedencegroup(precedencegroup2: i32) -> i32 {\n    test_precedencegroup(precedencegroup2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_prefix(prefix2: i32) -> i32 {\n    test_prefix(prefix2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_private(private2: i32) -> i32 {\n    test_private(private2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_protected(protected2: i32) -> i32 {\n    test_protected(protected2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_protocol(protocol2: i32) -> i32 {\n    test_protocol(protocol2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_public(public2: i32) -> i32 {\n    test_public(public2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_reflexpr(reflexpr2: i32) -> i32 {\n    test_reflexpr(reflexpr2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_register(register2: i32) -> i32 {\n    test_register(register2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_reinterpret_cast(reinterpret_cast2: i32) -> i32 {\n    test_reinterpret_cast(reinterpret_cast2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_repeat(repeat2: i32) -> i32 {\n    test_repeat(repeat2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_required(required2: i32) -> i32 {\n    test_required(required2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_requires(requires2: i32) -> i32 {\n    test_requires(requires2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_rethrows(rethrows2: i32) -> i32 {\n    test_rethrows(rethrows2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_right(right2: i32) -> i32 {\n    test_right(right2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_set(set2: i32) -> i32 {\n    test_set(set2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_short(short2: i32) -> i32 {\n    test_short(short2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_signed(signed2: i32) -> i32 {\n    test_signed(signed2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_sizeof(sizeof2: i32) -> i32 {\n    test_sizeof(sizeof2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_some(some2: i32) -> i32 {\n    test_some(some2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_static_assert(static_assert2: i32) -> i32 {\n    test_static_assert(static_assert2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_static_cast(static_cast2: i32) -> i32 {\n    test_static_cast(static_cast2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_subscript(subscript2: i32) -> i32 {\n    test_subscript(subscript2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_switch(switch2: i32) -> i32 {\n    test_switch(switch2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_synchronized(synchronized2: i32) -> i32 {\n    test_synchronized(synchronized2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_template(template2: i32) -> i32 {\n    test_template(template2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_this(this2: i32) -> i32 {\n    test_this(this2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_thread_local(thread_local2: i32) -> i32 {\n    test_thread_local(thread_local2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_throw(throw2: i32) -> i32 {\n    test_throw(throw2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_throws(throws2: i32) -> i32 {\n    test_throws(throws2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_transient(transient: i32) -> i32 {\n    test_transient(transient)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_typealias(typealias2: i32) -> i32 {\n    test_typealias(typealias2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_typedef(typedef2: i32) -> i32 {\n    test_typedef(typedef2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_typeid(typeid2: i32) -> i32 {\n    test_typeid(typeid2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_typename(typename2: i32) -> i32 {\n    test_typename(typename2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_undefined(undefined: i32) -> i32 {\n    test_undefined(undefined)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_union(union2: i32) -> i32 {\n    test_union(union2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_unowned(unowned2: i32) -> i32 {\n    test_unowned(unowned2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_unsigned(unsigned2: i32) -> i32 {\n    test_unsigned(unsigned2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_using(using2: i32) -> i32 {\n    test_using(using2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_var(var2: i32) -> i32 {\n    test_var(var2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_void(void2: i32) -> i32 {\n    test_void(void2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_volatile(volatile2: i32) -> i32 {\n    test_volatile(volatile2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_wchar_t(wchar_t2: i32) -> i32 {\n    test_wchar_t(wchar_t2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_weak(weak2: i32) -> i32 {\n    test_weak(weak2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_with(with: i32) -> i32 {\n    test_with(with)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_xor(xor2: i32) -> i32 {\n    test_xor(xor2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_xor_eq(xor_eq2: i32) -> i32 {\n    test_xor_eq(xor_eq2)\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_keyword_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_test_alignas(int32_t alignas2);\n\nint32_t _ffi_fn_test_alignof(int32_t alignof2);\n\nint32_t _ffi_fn_test_and(int32_t and2);\n\nint32_t _ffi_fn_test_and_eq(int32_t and_eq2);\n\nint32_t _ffi_fn_test_asm(int32_t asm2);\n\nint32_t _ffi_fn_test_associatedtype(int32_t associatedtype2);\n\nint32_t _ffi_fn_test_associativity(int32_t associativity2);\n\nint32_t _ffi_fn_test_atomic_cancel(int32_t atomic_cancel2);\n\nint32_t _ffi_fn_test_atomic_commit(int32_t atomic_commit2);\n\nint32_t _ffi_fn_test_atomic_noexcept(int32_t atomic_noexcept2);\n\nint32_t _ffi_fn_test_auto(int32_t auto2);\n\nint32_t _ffi_fn_test_bitand(int32_t bitand2);\n\nint32_t _ffi_fn_test_bitor(int32_t bitor2);\n\nint32_t _ffi_fn_test_bool(int32_t bool2);\n\nint32_t _ffi_fn_test_boolean(int32_t boolean);\n\nint32_t _ffi_fn_test_borrowing(int32_t borrowing2);\n\nint32_t _ffi_fn_test_byte(int32_t byte);\n\nint32_t _ffi_fn_test_case(int32_t case2);\n\nint32_t _ffi_fn_test_catch(int32_t catch2);\n\nint32_t _ffi_fn_test_char(int32_t char2);\n\nint32_t _ffi_fn_test_char16_t(int32_t char16_t2);\n\nint32_t _ffi_fn_test_char32_t(int32_t char32_t2);\n\nint32_t _ffi_fn_test_char8_t(int32_t char8_t2);\n\nint32_t _ffi_fn_test_class(int32_t class2);\n\nint32_t _ffi_fn_test_co_await(int32_t co_await2);\n\nint32_t _ffi_fn_test_co_return(int32_t co_return2);\n\nint32_t _ffi_fn_test_co_yield(int32_t co_yield2);\n\nint32_t _ffi_fn_test_compl(int32_t compl2);\n\nint32_t _ffi_fn_test_concept(int32_t concept2);\n\nint32_t _ffi_fn_test_const_cast(int32_t const_cast2);\n\nint32_t _ffi_fn_test_consteval(int32_t consteval2);\n\nint32_t _ffi_fn_test_constexpr(int32_t constexpr2);\n\nint32_t _ffi_fn_test_constinit(int32_t constinit2);\n\nint32_t _ffi_fn_test_consuming(int32_t consuming2);\n\nint32_t _ffi_fn_test_contract_assert(int32_t contract_assert2);\n\nint32_t _ffi_fn_test_convenience(int32_t convenience2);\n\nint32_t _ffi_fn_test_debugger(int32_t debugger);\n\nint32_t _ffi_fn_test_decltype(int32_t decltype2);\n\nint32_t _ffi_fn_test_default(int32_t default2);\n\nint32_t _ffi_fn_test_defer(int32_t defer2);\n\nint32_t _ffi_fn_test_deinit(int32_t deinit2);\n\nint32_t _ffi_fn_test_delete(int32_t delete2);\n\nint32_t _ffi_fn_test_double(int32_t double2);\n\nint32_t _ffi_fn_test_dynamic(int32_t dynamic2);\n\nint32_t _ffi_fn_test_dynamic_cast(int32_t dynamic_cast2);\n\nint32_t _ffi_fn_test_explicit(int32_t explicit2);\n\nint32_t _ffi_fn_test_export(int32_t export2);\n\nint32_t _ffi_fn_test_extends(int32_t extends);\n\nint32_t _ffi_fn_test_extension(int32_t extension2);\n\nint32_t _ffi_fn_test_fallthrough(int32_t fallthrough2);\n\nint32_t _ffi_fn_test_fileprivate(int32_t fileprivate2);\n\nint32_t _ffi_fn_test_finally(int32_t finally);\n\nint32_t _ffi_fn_test_float(int32_t float2);\n\nint32_t _ffi_fn_test_friend(int32_t friend2);\n\nint32_t _ffi_fn_test_func(int32_t func2);\n\nint32_t _ffi_fn_test_function(int32_t function);\n\nint32_t _ffi_fn_test_get(int32_t get2);\n\nint32_t _ffi_fn_test_goto(int32_t goto2);\n\nint32_t _ffi_fn_test_guard(int32_t guard2);\n\nint32_t _ffi_fn_test_implements(int32_t implements);\n\nint32_t _ffi_fn_test_import(int32_t import2);\n\nint32_t _ffi_fn_test_indirect(int32_t indirect2);\n\nint32_t _ffi_fn_test_infix(int32_t infix2);\n\nint32_t _ffi_fn_test_init(int32_t init2);\n\nint32_t _ffi_fn_test_inline(int32_t inline2);\n\nint32_t _ffi_fn_test_inout(int32_t inout2);\n\nint32_t _ffi_fn_test_instanceof(int32_t instanceof);\n\nint32_t _ffi_fn_test_int(int32_t int2);\n\nint32_t _ffi_fn_test_interface(int32_t interface);\n\nint32_t _ffi_fn_test_internal(int32_t internal2);\n\nint32_t _ffi_fn_test_is(int32_t is2);\n\nint32_t _ffi_fn_test_lazy(int32_t lazy2);\n\nint32_t _ffi_fn_test_left(int32_t left2);\n\nint32_t _ffi_fn_test_long(int32_t long2);\n\nint32_t _ffi_fn_test_mutable(int32_t mutable2);\n\nint32_t _ffi_fn_test_mutating(int32_t mutating2);\n\nint32_t _ffi_fn_test_namespace(int32_t namespace2);\n\nint32_t _ffi_fn_test_native(int32_t native);\n\nint32_t _ffi_fn_test_new(int32_t new2);\n\nint32_t _ffi_fn_test_nil(int32_t nil2);\n\nint32_t _ffi_fn_test_noexcept(int32_t noexcept2);\n\nint32_t _ffi_fn_test_none(int32_t none2);\n\nint32_t _ffi_fn_test_nonisolated(int32_t nonisolated2);\n\nint32_t _ffi_fn_test_nonmutating(int32_t nonmutating2);\n\nint32_t _ffi_fn_test_not(int32_t not2);\n\nint32_t _ffi_fn_test_not_eq(int32_t not_eq2);\n\nint32_t _ffi_fn_test_null(int32_t null);\n\nint32_t _ffi_fn_test_nullptr(int32_t nullptr2);\n\nint32_t _ffi_fn_test_open(int32_t open2);\n\nint32_t _ffi_fn_test_operator(int32_t operator2);\n\nint32_t _ffi_fn_test_optional(int32_t optional2);\n\nint32_t _ffi_fn_test_or(int32_t or2);\n\nint32_t _ffi_fn_test_or_eq(int32_t or_eq2);\n\nint32_t _ffi_fn_test_package(int32_t package2);\n\nint32_t _ffi_fn_test_postfix(int32_t postfix2);\n\nint32_t _ffi_fn_test_precedence(int32_t precedence2);\n\nint32_t _ffi_fn_test_precedencegroup(int32_t precedencegroup2);\n\nint32_t _ffi_fn_test_prefix(int32_t prefix2);\n\nint32_t _ffi_fn_test_private(int32_t private2);\n\nint32_t _ffi_fn_test_protected(int32_t protected2);\n\nint32_t _ffi_fn_test_protocol(int32_t protocol2);\n\nint32_t _ffi_fn_test_public(int32_t public2);\n\nint32_t _ffi_fn_test_reflexpr(int32_t reflexpr2);\n\nint32_t _ffi_fn_test_register(int32_t register2);\n\nint32_t _ffi_fn_test_reinterpret_cast(int32_t reinterpret_cast2);\n\nint32_t _ffi_fn_test_repeat(int32_t repeat2);\n\nint32_t _ffi_fn_test_required(int32_t required2);\n\nint32_t _ffi_fn_test_requires(int32_t requires2);\n\nint32_t _ffi_fn_test_rethrows(int32_t rethrows2);\n\nint32_t _ffi_fn_test_right(int32_t right2);\n\nint32_t _ffi_fn_test_set(int32_t set2);\n\nint32_t _ffi_fn_test_short(int32_t short2);\n\nint32_t _ffi_fn_test_signed(int32_t signed2);\n\nint32_t _ffi_fn_test_sizeof(int32_t sizeof2);\n\nint32_t _ffi_fn_test_some(int32_t some2);\n\nint32_t _ffi_fn_test_static_assert(int32_t static_assert2);\n\nint32_t _ffi_fn_test_static_cast(int32_t static_cast2);\n\nint32_t _ffi_fn_test_subscript(int32_t subscript2);\n\nint32_t _ffi_fn_test_switch(int32_t switch2);\n\nint32_t _ffi_fn_test_synchronized(int32_t synchronized2);\n\nint32_t _ffi_fn_test_template(int32_t template2);\n\nint32_t _ffi_fn_test_this(int32_t this2);\n\nint32_t _ffi_fn_test_thread_local(int32_t thread_local2);\n\nint32_t _ffi_fn_test_throw(int32_t throw2);\n\nint32_t _ffi_fn_test_throws(int32_t throws2);\n\nint32_t _ffi_fn_test_transient(int32_t transient);\n\nint32_t _ffi_fn_test_typealias(int32_t typealias2);\n\nint32_t _ffi_fn_test_typedef(int32_t typedef2);\n\nint32_t _ffi_fn_test_typeid(int32_t typeid2);\n\nint32_t _ffi_fn_test_typename(int32_t typename2);\n\nint32_t _ffi_fn_test_undefined(int32_t undefined);\n\nint32_t _ffi_fn_test_union(int32_t union2);\n\nint32_t _ffi_fn_test_unowned(int32_t unowned2);\n\nint32_t _ffi_fn_test_unsigned(int32_t unsigned2);\n\nint32_t _ffi_fn_test_using(int32_t using2);\n\nint32_t _ffi_fn_test_var(int32_t var2);\n\nint32_t _ffi_fn_test_void(int32_t void2);\n\nint32_t _ffi_fn_test_volatile(int32_t volatile2);\n\nint32_t _ffi_fn_test_wchar_t(int32_t wchar_t2);\n\nint32_t _ffi_fn_test_weak(int32_t weak2);\n\nint32_t _ffi_fn_test_with(int32_t with);\n\nint32_t _ffi_fn_test_xor(int32_t xor2);\n\nint32_t _ffi_fn_test_xor_eq(int32_t xor_eq2);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_keyword_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc test_alignas(_ alignas2: Int32) -> Int32 {\n    return _ffi_fn_test_alignas(alignas2)\n}\n\nfunc test_alignof(_ alignof2: Int32) -> Int32 {\n    return _ffi_fn_test_alignof(alignof2)\n}\n\nfunc test_and(_ and2: Int32) -> Int32 {\n    return _ffi_fn_test_and(and2)\n}\n\nfunc test_and_eq(_ and_eq2: Int32) -> Int32 {\n    return _ffi_fn_test_and_eq(and_eq2)\n}\n\nfunc test_asm(_ asm2: Int32) -> Int32 {\n    return _ffi_fn_test_asm(asm2)\n}\n\nfunc test_associatedtype(_ associatedtype2: Int32) -> Int32 {\n    return _ffi_fn_test_associatedtype(associatedtype2)\n}\n\nfunc test_associativity(_ associativity2: Int32) -> Int32 {\n    return _ffi_fn_test_associativity(associativity2)\n}\n\nfunc test_atomic_cancel(_ atomic_cancel2: Int32) -> Int32 {\n    return _ffi_fn_test_atomic_cancel(atomic_cancel2)\n}\n\nfunc test_atomic_commit(_ atomic_commit2: Int32) -> Int32 {\n    return _ffi_fn_test_atomic_commit(atomic_commit2)\n}\n\nfunc test_atomic_noexcept(_ atomic_noexcept2: Int32) -> Int32 {\n    return _ffi_fn_test_atomic_noexcept(atomic_noexcept2)\n}\n\nfunc test_auto(_ auto2: Int32) -> Int32 {\n    return _ffi_fn_test_auto(auto2)\n}\n\nfunc test_bitand(_ bitand2: Int32) -> Int32 {\n    return _ffi_fn_test_bitand(bitand2)\n}\n\nfunc test_bitor(_ bitor2: Int32) -> Int32 {\n    return _ffi_fn_test_bitor(bitor2)\n}\n\nfunc test_bool(_ bool2: Int32) -> Int32 {\n    return _ffi_fn_test_bool(bool2)\n}\n\nfunc test_boolean(_ boolean: Int32) -> Int32 {\n    return _ffi_fn_test_boolean(boolean)\n}\n\nfunc test_borrowing(_ borrowing2: Int32) -> Int32 {\n    return _ffi_fn_test_borrowing(borrowing2)\n}\n\nfunc test_byte(_ byte: Int32) -> Int32 {\n    return _ffi_fn_test_byte(byte)\n}\n\nfunc test_case(_ case2: Int32) -> Int32 {\n    return _ffi_fn_test_case(case2)\n}\n\nfunc test_catch(_ catch2: Int32) -> Int32 {\n    return _ffi_fn_test_catch(catch2)\n}\n\nfunc test_char(_ char2: Int32) -> Int32 {\n    return _ffi_fn_test_char(char2)\n}\n\nfunc test_char16_t(_ char16_t2: Int32) -> Int32 {\n    return _ffi_fn_test_char16_t(char16_t2)\n}\n\nfunc test_char32_t(_ char32_t2: Int32) -> Int32 {\n    return _ffi_fn_test_char32_t(char32_t2)\n}\n\nfunc test_char8_t(_ char8_t2: Int32) -> Int32 {\n    return _ffi_fn_test_char8_t(char8_t2)\n}\n\nfunc test_class(_ class2: Int32) -> Int32 {\n    return _ffi_fn_test_class(class2)\n}\n\nfunc test_co_await(_ co_await2: Int32) -> Int32 {\n    return _ffi_fn_test_co_await(co_await2)\n}\n\nfunc test_co_return(_ co_return2: Int32) -> Int32 {\n    return _ffi_fn_test_co_return(co_return2)\n}\n\nfunc test_co_yield(_ co_yield2: Int32) -> Int32 {\n    return _ffi_fn_test_co_yield(co_yield2)\n}\n\nfunc test_compl(_ compl2: Int32) -> Int32 {\n    return _ffi_fn_test_compl(compl2)\n}\n\nfunc test_concept(_ concept2: Int32) -> Int32 {\n    return _ffi_fn_test_concept(concept2)\n}\n\nfunc test_const_cast(_ const_cast2: Int32) -> Int32 {\n    return _ffi_fn_test_const_cast(const_cast2)\n}\n\nfunc test_consteval(_ consteval2: Int32) -> Int32 {\n    return _ffi_fn_test_consteval(consteval2)\n}\n\nfunc test_constexpr(_ constexpr2: Int32) -> Int32 {\n    return _ffi_fn_test_constexpr(constexpr2)\n}\n\nfunc test_constinit(_ constinit2: Int32) -> Int32 {\n    return _ffi_fn_test_constinit(constinit2)\n}\n\nfunc test_consuming(_ consuming2: Int32) -> Int32 {\n    return _ffi_fn_test_consuming(consuming2)\n}\n\nfunc test_contract_assert(_ contract_assert2: Int32) -> Int32 {\n    return _ffi_fn_test_contract_assert(contract_assert2)\n}\n\nfunc test_convenience(_ convenience2: Int32) -> Int32 {\n    return _ffi_fn_test_convenience(convenience2)\n}\n\nfunc test_debugger(_ debugger: Int32) -> Int32 {\n    return _ffi_fn_test_debugger(debugger)\n}\n\nfunc test_decltype(_ decltype2: Int32) -> Int32 {\n    return _ffi_fn_test_decltype(decltype2)\n}\n\nfunc test_default(_ default2: Int32) -> Int32 {\n    return _ffi_fn_test_default(default2)\n}\n\nfunc test_defer(_ defer2: Int32) -> Int32 {\n    return _ffi_fn_test_defer(defer2)\n}\n\nfunc test_deinit(_ deinit2: Int32) -> Int32 {\n    return _ffi_fn_test_deinit(deinit2)\n}\n\nfunc test_delete(_ delete2: Int32) -> Int32 {\n    return _ffi_fn_test_delete(delete2)\n}\n\nfunc test_double(_ double2: Int32) -> Int32 {\n    return _ffi_fn_test_double(double2)\n}\n\nfunc test_dynamic(_ dynamic2: Int32) -> Int32 {\n    return _ffi_fn_test_dynamic(dynamic2)\n}\n\nfunc test_dynamic_cast(_ dynamic_cast2: Int32) -> Int32 {\n    return _ffi_fn_test_dynamic_cast(dynamic_cast2)\n}\n\nfunc test_explicit(_ explicit2: Int32) -> Int32 {\n    return _ffi_fn_test_explicit(explicit2)\n}\n\nfunc test_export(_ export2: Int32) -> Int32 {\n    return _ffi_fn_test_export(export2)\n}\n\nfunc test_extends(_ extends: Int32) -> Int32 {\n    return _ffi_fn_test_extends(extends)\n}\n\nfunc test_extension(_ extension2: Int32) -> Int32 {\n    return _ffi_fn_test_extension(extension2)\n}\n\nfunc test_fallthrough(_ fallthrough2: Int32) -> Int32 {\n    return _ffi_fn_test_fallthrough(fallthrough2)\n}\n\nfunc test_fileprivate(_ fileprivate2: Int32) -> Int32 {\n    return _ffi_fn_test_fileprivate(fileprivate2)\n}\n\nfunc test_finally(_ finally: Int32) -> Int32 {\n    return _ffi_fn_test_finally(finally)\n}\n\nfunc test_float(_ float2: Int32) -> Int32 {\n    return _ffi_fn_test_float(float2)\n}\n\nfunc test_friend(_ friend2: Int32) -> Int32 {\n    return _ffi_fn_test_friend(friend2)\n}\n\nfunc test_func(_ func2: Int32) -> Int32 {\n    return _ffi_fn_test_func(func2)\n}\n\nfunc test_function(_ function: Int32) -> Int32 {\n    return _ffi_fn_test_function(function)\n}\n\nfunc test_get(_ get2: Int32) -> Int32 {\n    return _ffi_fn_test_get(get2)\n}\n\nfunc test_goto(_ goto2: Int32) -> Int32 {\n    return _ffi_fn_test_goto(goto2)\n}\n\nfunc test_guard(_ guard2: Int32) -> Int32 {\n    return _ffi_fn_test_guard(guard2)\n}\n\nfunc test_implements(_ implements: Int32) -> Int32 {\n    return _ffi_fn_test_implements(implements)\n}\n\nfunc test_import(_ import2: Int32) -> Int32 {\n    return _ffi_fn_test_import(import2)\n}\n\nfunc test_indirect(_ indirect2: Int32) -> Int32 {\n    return _ffi_fn_test_indirect(indirect2)\n}\n\nfunc test_infix(_ infix2: Int32) -> Int32 {\n    return _ffi_fn_test_infix(infix2)\n}\n\nfunc test_init(_ init2: Int32) -> Int32 {\n    return _ffi_fn_test_init(init2)\n}\n\nfunc test_inline(_ inline2: Int32) -> Int32 {\n    return _ffi_fn_test_inline(inline2)\n}\n\nfunc test_inout(_ inout2: Int32) -> Int32 {\n    return _ffi_fn_test_inout(inout2)\n}\n\nfunc test_instanceof(_ instanceof: Int32) -> Int32 {\n    return _ffi_fn_test_instanceof(instanceof)\n}\n\nfunc test_int(_ int2: Int32) -> Int32 {\n    return _ffi_fn_test_int(int2)\n}\n\nfunc test_interface(_ interface: Int32) -> Int32 {\n    return _ffi_fn_test_interface(interface)\n}\n\nfunc test_internal(_ internal2: Int32) -> Int32 {\n    return _ffi_fn_test_internal(internal2)\n}\n\nfunc test_is(_ is2: Int32) -> Int32 {\n    return _ffi_fn_test_is(is2)\n}\n\nfunc test_lazy(_ lazy2: Int32) -> Int32 {\n    return _ffi_fn_test_lazy(lazy2)\n}\n\nfunc test_left(_ left2: Int32) -> Int32 {\n    return _ffi_fn_test_left(left2)\n}\n\nfunc test_long(_ long2: Int32) -> Int32 {\n    return _ffi_fn_test_long(long2)\n}\n\nfunc test_mutable(_ mutable2: Int32) -> Int32 {\n    return _ffi_fn_test_mutable(mutable2)\n}\n\nfunc test_mutating(_ mutating2: Int32) -> Int32 {\n    return _ffi_fn_test_mutating(mutating2)\n}\n\nfunc test_namespace(_ namespace2: Int32) -> Int32 {\n    return _ffi_fn_test_namespace(namespace2)\n}\n\nfunc test_native(_ native: Int32) -> Int32 {\n    return _ffi_fn_test_native(native)\n}\n\nfunc test_new(_ new2: Int32) -> Int32 {\n    return _ffi_fn_test_new(new2)\n}\n\nfunc test_nil(_ nil2: Int32) -> Int32 {\n    return _ffi_fn_test_nil(nil2)\n}\n\nfunc test_noexcept(_ noexcept2: Int32) -> Int32 {\n    return _ffi_fn_test_noexcept(noexcept2)\n}\n\nfunc test_none(_ none2: Int32) -> Int32 {\n    return _ffi_fn_test_none(none2)\n}\n\nfunc test_nonisolated(_ nonisolated2: Int32) -> Int32 {\n    return _ffi_fn_test_nonisolated(nonisolated2)\n}\n\nfunc test_nonmutating(_ nonmutating2: Int32) -> Int32 {\n    return _ffi_fn_test_nonmutating(nonmutating2)\n}\n\nfunc test_not(_ not2: Int32) -> Int32 {\n    return _ffi_fn_test_not(not2)\n}\n\nfunc test_not_eq(_ not_eq2: Int32) -> Int32 {\n    return _ffi_fn_test_not_eq(not_eq2)\n}\n\nfunc test_null(_ null: Int32) -> Int32 {\n    return _ffi_fn_test_null(null)\n}\n\nfunc test_nullptr(_ nullptr2: Int32) -> Int32 {\n    return _ffi_fn_test_nullptr(nullptr2)\n}\n\nfunc test_open(_ open2: Int32) -> Int32 {\n    return _ffi_fn_test_open(open2)\n}\n\nfunc test_operator(_ operator2: Int32) -> Int32 {\n    return _ffi_fn_test_operator(operator2)\n}\n\nfunc test_optional(_ optional2: Int32) -> Int32 {\n    return _ffi_fn_test_optional(optional2)\n}\n\nfunc test_or(_ or2: Int32) -> Int32 {\n    return _ffi_fn_test_or(or2)\n}\n\nfunc test_or_eq(_ or_eq2: Int32) -> Int32 {\n    return _ffi_fn_test_or_eq(or_eq2)\n}\n\nfunc test_package(_ package2: Int32) -> Int32 {\n    return _ffi_fn_test_package(package2)\n}\n\nfunc test_postfix(_ postfix2: Int32) -> Int32 {\n    return _ffi_fn_test_postfix(postfix2)\n}\n\nfunc test_precedence(_ precedence2: Int32) -> Int32 {\n    return _ffi_fn_test_precedence(precedence2)\n}\n\nfunc test_precedencegroup(_ precedencegroup2: Int32) -> Int32 {\n    return _ffi_fn_test_precedencegroup(precedencegroup2)\n}\n\nfunc test_prefix(_ prefix2: Int32) -> Int32 {\n    return _ffi_fn_test_prefix(prefix2)\n}\n\nfunc test_private(_ private2: Int32) -> Int32 {\n    return _ffi_fn_test_private(private2)\n}\n\nfunc test_protected(_ protected2: Int32) -> Int32 {\n    return _ffi_fn_test_protected(protected2)\n}\n\nfunc test_protocol(_ protocol2: Int32) -> Int32 {\n    return _ffi_fn_test_protocol(protocol2)\n}\n\nfunc test_public(_ public2: Int32) -> Int32 {\n    return _ffi_fn_test_public(public2)\n}\n\nfunc test_reflexpr(_ reflexpr2: Int32) -> Int32 {\n    return _ffi_fn_test_reflexpr(reflexpr2)\n}\n\nfunc test_register(_ register2: Int32) -> Int32 {\n    return _ffi_fn_test_register(register2)\n}\n\nfunc test_reinterpret_cast(_ reinterpret_cast2: Int32) -> Int32 {\n    return _ffi_fn_test_reinterpret_cast(reinterpret_cast2)\n}\n\nfunc test_repeat(_ repeat2: Int32) -> Int32 {\n    return _ffi_fn_test_repeat(repeat2)\n}\n\nfunc test_required(_ required2: Int32) -> Int32 {\n    return _ffi_fn_test_required(required2)\n}\n\nfunc test_requires(_ requires2: Int32) -> Int32 {\n    return _ffi_fn_test_requires(requires2)\n}\n\nfunc test_rethrows(_ rethrows2: Int32) -> Int32 {\n    return _ffi_fn_test_rethrows(rethrows2)\n}\n\nfunc test_right(_ right2: Int32) -> Int32 {\n    return _ffi_fn_test_right(right2)\n}\n\nfunc test_set(_ set2: Int32) -> Int32 {\n    return _ffi_fn_test_set(set2)\n}\n\nfunc test_short(_ short2: Int32) -> Int32 {\n    return _ffi_fn_test_short(short2)\n}\n\nfunc test_signed(_ signed2: Int32) -> Int32 {\n    return _ffi_fn_test_signed(signed2)\n}\n\nfunc test_sizeof(_ sizeof2: Int32) -> Int32 {\n    return _ffi_fn_test_sizeof(sizeof2)\n}\n\nfunc test_some(_ some2: Int32) -> Int32 {\n    return _ffi_fn_test_some(some2)\n}\n\nfunc test_static_assert(_ static_assert2: Int32) -> Int32 {\n    return _ffi_fn_test_static_assert(static_assert2)\n}\n\nfunc test_static_cast(_ static_cast2: Int32) -> Int32 {\n    return _ffi_fn_test_static_cast(static_cast2)\n}\n\nfunc test_subscript(_ subscript2: Int32) -> Int32 {\n    return _ffi_fn_test_subscript(subscript2)\n}\n\nfunc test_switch(_ switch2: Int32) -> Int32 {\n    return _ffi_fn_test_switch(switch2)\n}\n\nfunc test_synchronized(_ synchronized2: Int32) -> Int32 {\n    return _ffi_fn_test_synchronized(synchronized2)\n}\n\nfunc test_template(_ template2: Int32) -> Int32 {\n    return _ffi_fn_test_template(template2)\n}\n\nfunc test_this(_ this2: Int32) -> Int32 {\n    return _ffi_fn_test_this(this2)\n}\n\nfunc test_thread_local(_ thread_local2: Int32) -> Int32 {\n    return _ffi_fn_test_thread_local(thread_local2)\n}\n\nfunc test_throw(_ throw2: Int32) -> Int32 {\n    return _ffi_fn_test_throw(throw2)\n}\n\nfunc test_throws(_ throws2: Int32) -> Int32 {\n    return _ffi_fn_test_throws(throws2)\n}\n\nfunc test_transient(_ transient: Int32) -> Int32 {\n    return _ffi_fn_test_transient(transient)\n}\n\nfunc test_typealias(_ typealias2: Int32) -> Int32 {\n    return _ffi_fn_test_typealias(typealias2)\n}\n\nfunc test_typedef(_ typedef2: Int32) -> Int32 {\n    return _ffi_fn_test_typedef(typedef2)\n}\n\nfunc test_typeid(_ typeid2: Int32) -> Int32 {\n    return _ffi_fn_test_typeid(typeid2)\n}\n\nfunc test_typename(_ typename2: Int32) -> Int32 {\n    return _ffi_fn_test_typename(typename2)\n}\n\nfunc test_undefined(_ undefined: Int32) -> Int32 {\n    return _ffi_fn_test_undefined(undefined)\n}\n\nfunc test_union(_ union2: Int32) -> Int32 {\n    return _ffi_fn_test_union(union2)\n}\n\nfunc test_unowned(_ unowned2: Int32) -> Int32 {\n    return _ffi_fn_test_unowned(unowned2)\n}\n\nfunc test_unsigned(_ unsigned2: Int32) -> Int32 {\n    return _ffi_fn_test_unsigned(unsigned2)\n}\n\nfunc test_using(_ using2: Int32) -> Int32 {\n    return _ffi_fn_test_using(using2)\n}\n\nfunc test_var(_ var2: Int32) -> Int32 {\n    return _ffi_fn_test_var(var2)\n}\n\nfunc test_void(_ void2: Int32) -> Int32 {\n    return _ffi_fn_test_void(void2)\n}\n\nfunc test_volatile(_ volatile2: Int32) -> Int32 {\n    return _ffi_fn_test_volatile(volatile2)\n}\n\nfunc test_wchar_t(_ wchar_t2: Int32) -> Int32 {\n    return _ffi_fn_test_wchar_t(wchar_t2)\n}\n\nfunc test_weak(_ weak2: Int32) -> Int32 {\n    return _ffi_fn_test_weak(weak2)\n}\n\nfunc test_with(_ with: Int32) -> Int32 {\n    return _ffi_fn_test_with(with)\n}\n\nfunc test_xor(_ xor2: Int32) -> Int32 {\n    return _ffi_fn_test_xor(xor2)\n}\n\nfunc test_xor_eq(_ xor_eq2: Int32) -> Int32 {\n    return _ffi_fn_test_xor_eq(xor_eq2)\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_keyword_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_alignas(alignas2: i32) -> i32 {\n    test_alignas(alignas2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_alignof(alignof2: i32) -> i32 {\n    test_alignof(alignof2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_and(and2: i32) -> i32 {\n    test_and(and2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_and_eq(and_eq2: i32) -> i32 {\n    test_and_eq(and_eq2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_asm(asm2: i32) -> i32 {\n    test_asm(asm2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_associatedtype(associatedtype2: i32) -> i32 {\n    test_associatedtype(associatedtype2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_associativity(associativity2: i32) -> i32 {\n    test_associativity(associativity2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_atomic_cancel(atomic_cancel2: i32) -> i32 {\n    test_atomic_cancel(atomic_cancel2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_atomic_commit(atomic_commit2: i32) -> i32 {\n    test_atomic_commit(atomic_commit2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_atomic_noexcept(atomic_noexcept2: i32) -> i32 {\n    test_atomic_noexcept(atomic_noexcept2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_auto(auto2: i32) -> i32 {\n    test_auto(auto2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_bitand(bitand2: i32) -> i32 {\n    test_bitand(bitand2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_bitor(bitor2: i32) -> i32 {\n    test_bitor(bitor2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_bool(bool2: i32) -> i32 {\n    test_bool(bool2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_boolean(boolean: i32) -> i32 {\n    test_boolean(boolean)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_borrowing(borrowing2: i32) -> i32 {\n    test_borrowing(borrowing2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_byte(byte: i32) -> i32 {\n    test_byte(byte)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_case(case2: i32) -> i32 {\n    test_case(case2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_catch(catch2: i32) -> i32 {\n    test_catch(catch2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_char(char2: i32) -> i32 {\n    test_char(char2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_char16_t(char16_t2: i32) -> i32 {\n    test_char16_t(char16_t2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_char32_t(char32_t2: i32) -> i32 {\n    test_char32_t(char32_t2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_char8_t(char8_t2: i32) -> i32 {\n    test_char8_t(char8_t2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_class(class2: i32) -> i32 {\n    test_class(class2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_co_await(co_await2: i32) -> i32 {\n    test_co_await(co_await2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_co_return(co_return2: i32) -> i32 {\n    test_co_return(co_return2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_co_yield(co_yield2: i32) -> i32 {\n    test_co_yield(co_yield2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_compl(compl2: i32) -> i32 {\n    test_compl(compl2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_concept(concept2: i32) -> i32 {\n    test_concept(concept2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_const_cast(const_cast2: i32) -> i32 {\n    test_const_cast(const_cast2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_consteval(consteval2: i32) -> i32 {\n    test_consteval(consteval2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_constexpr(constexpr2: i32) -> i32 {\n    test_constexpr(constexpr2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_constinit(constinit2: i32) -> i32 {\n    test_constinit(constinit2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_consuming(consuming2: i32) -> i32 {\n    test_consuming(consuming2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_contract_assert(contract_assert2: i32) -> i32 {\n    test_contract_assert(contract_assert2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_convenience(convenience2: i32) -> i32 {\n    test_convenience(convenience2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_debugger(debugger: i32) -> i32 {\n    test_debugger(debugger)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_decltype(decltype2: i32) -> i32 {\n    test_decltype(decltype2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_default(default2: i32) -> i32 {\n    test_default(default2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_defer(defer2: i32) -> i32 {\n    test_defer(defer2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_deinit(deinit2: i32) -> i32 {\n    test_deinit(deinit2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_delete(delete2: i32) -> i32 {\n    test_delete(delete2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_double(double2: i32) -> i32 {\n    test_double(double2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_dynamic(dynamic2: i32) -> i32 {\n    test_dynamic(dynamic2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_dynamic_cast(dynamic_cast2: i32) -> i32 {\n    test_dynamic_cast(dynamic_cast2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_explicit(explicit2: i32) -> i32 {\n    test_explicit(explicit2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_export(export2: i32) -> i32 {\n    test_export(export2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_extends(extends: i32) -> i32 {\n    test_extends(extends)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_extension(extension2: i32) -> i32 {\n    test_extension(extension2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_fallthrough(fallthrough2: i32) -> i32 {\n    test_fallthrough(fallthrough2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_fileprivate(fileprivate2: i32) -> i32 {\n    test_fileprivate(fileprivate2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_finally(finally: i32) -> i32 {\n    test_finally(finally)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_float(float2: i32) -> i32 {\n    test_float(float2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_friend(friend2: i32) -> i32 {\n    test_friend(friend2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_func(func2: i32) -> i32 {\n    test_func(func2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_function(function: i32) -> i32 {\n    test_function(function)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_get(get2: i32) -> i32 {\n    test_get(get2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_goto(goto2: i32) -> i32 {\n    test_goto(goto2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_guard(guard2: i32) -> i32 {\n    test_guard(guard2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_implements(implements: i32) -> i32 {\n    test_implements(implements)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_import(import2: i32) -> i32 {\n    test_import(import2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_indirect(indirect2: i32) -> i32 {\n    test_indirect(indirect2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_infix(infix2: i32) -> i32 {\n    test_infix(infix2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_init(init2: i32) -> i32 {\n    test_init(init2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_inline(inline2: i32) -> i32 {\n    test_inline(inline2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_inout(inout2: i32) -> i32 {\n    test_inout(inout2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_instanceof(instanceof: i32) -> i32 {\n    test_instanceof(instanceof)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_int(int2: i32) -> i32 {\n    test_int(int2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_interface(interface: i32) -> i32 {\n    test_interface(interface)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_internal(internal2: i32) -> i32 {\n    test_internal(internal2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_is(is2: i32) -> i32 {\n    test_is(is2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_lazy(lazy2: i32) -> i32 {\n    test_lazy(lazy2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_left(left2: i32) -> i32 {\n    test_left(left2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_long(long2: i32) -> i32 {\n    test_long(long2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_mutable(mutable2: i32) -> i32 {\n    test_mutable(mutable2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_mutating(mutating2: i32) -> i32 {\n    test_mutating(mutating2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_namespace(namespace2: i32) -> i32 {\n    test_namespace(namespace2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_native(native: i32) -> i32 {\n    test_native(native)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_new(new2: i32) -> i32 {\n    test_new(new2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_nil(nil2: i32) -> i32 {\n    test_nil(nil2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_noexcept(noexcept2: i32) -> i32 {\n    test_noexcept(noexcept2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_none(none2: i32) -> i32 {\n    test_none(none2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_nonisolated(nonisolated2: i32) -> i32 {\n    test_nonisolated(nonisolated2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_nonmutating(nonmutating2: i32) -> i32 {\n    test_nonmutating(nonmutating2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_not(not2: i32) -> i32 {\n    test_not(not2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_not_eq(not_eq2: i32) -> i32 {\n    test_not_eq(not_eq2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_null(null: i32) -> i32 {\n    test_null(null)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_nullptr(nullptr2: i32) -> i32 {\n    test_nullptr(nullptr2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_open(open2: i32) -> i32 {\n    test_open(open2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_operator(operator2: i32) -> i32 {\n    test_operator(operator2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_optional(optional2: i32) -> i32 {\n    test_optional(optional2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_or(or2: i32) -> i32 {\n    test_or(or2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_or_eq(or_eq2: i32) -> i32 {\n    test_or_eq(or_eq2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_package(package2: i32) -> i32 {\n    test_package(package2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_postfix(postfix2: i32) -> i32 {\n    test_postfix(postfix2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_precedence(precedence2: i32) -> i32 {\n    test_precedence(precedence2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_precedencegroup(precedencegroup2: i32) -> i32 {\n    test_precedencegroup(precedencegroup2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_prefix(prefix2: i32) -> i32 {\n    test_prefix(prefix2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_private(private2: i32) -> i32 {\n    test_private(private2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_protected(protected2: i32) -> i32 {\n    test_protected(protected2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_protocol(protocol2: i32) -> i32 {\n    test_protocol(protocol2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_public(public2: i32) -> i32 {\n    test_public(public2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_reflexpr(reflexpr2: i32) -> i32 {\n    test_reflexpr(reflexpr2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_register(register2: i32) -> i32 {\n    test_register(register2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_reinterpret_cast(reinterpret_cast2: i32) -> i32 {\n    test_reinterpret_cast(reinterpret_cast2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_repeat(repeat2: i32) -> i32 {\n    test_repeat(repeat2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_required(required2: i32) -> i32 {\n    test_required(required2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_requires(requires2: i32) -> i32 {\n    test_requires(requires2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_rethrows(rethrows2: i32) -> i32 {\n    test_rethrows(rethrows2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_right(right2: i32) -> i32 {\n    test_right(right2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_set(set2: i32) -> i32 {\n    test_set(set2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_short(short2: i32) -> i32 {\n    test_short(short2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_signed(signed2: i32) -> i32 {\n    test_signed(signed2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_sizeof(sizeof2: i32) -> i32 {\n    test_sizeof(sizeof2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_some(some2: i32) -> i32 {\n    test_some(some2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_static_assert(static_assert2: i32) -> i32 {\n    test_static_assert(static_assert2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_static_cast(static_cast2: i32) -> i32 {\n    test_static_cast(static_cast2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_subscript(subscript2: i32) -> i32 {\n    test_subscript(subscript2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_switch(switch2: i32) -> i32 {\n    test_switch(switch2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_synchronized(synchronized2: i32) -> i32 {\n    test_synchronized(synchronized2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_template(template2: i32) -> i32 {\n    test_template(template2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_this(this2: i32) -> i32 {\n    test_this(this2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_thread_local(thread_local2: i32) -> i32 {\n    test_thread_local(thread_local2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_throw(throw2: i32) -> i32 {\n    test_throw(throw2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_throws(throws2: i32) -> i32 {\n    test_throws(throws2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_transient(transient: i32) -> i32 {\n    test_transient(transient)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_typealias(typealias2: i32) -> i32 {\n    test_typealias(typealias2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_typedef(typedef2: i32) -> i32 {\n    test_typedef(typedef2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_typeid(typeid2: i32) -> i32 {\n    test_typeid(typeid2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_typename(typename2: i32) -> i32 {\n    test_typename(typename2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_undefined(undefined: i32) -> i32 {\n    test_undefined(undefined)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_union(union2: i32) -> i32 {\n    test_union(union2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_unowned(unowned2: i32) -> i32 {\n    test_unowned(unowned2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_unsigned(unsigned2: i32) -> i32 {\n    test_unsigned(unsigned2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_using(using2: i32) -> i32 {\n    test_using(using2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_var(var2: i32) -> i32 {\n    test_var(var2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_void(void2: i32) -> i32 {\n    test_void(void2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_volatile(volatile2: i32) -> i32 {\n    test_volatile(volatile2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_wchar_t(wchar_t2: i32) -> i32 {\n    test_wchar_t(wchar_t2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_weak(weak2: i32) -> i32 {\n    test_weak(weak2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_with(with: i32) -> i32 {\n    test_with(with)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_xor(xor2: i32) -> i32 {\n    test_xor(xor2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_xor_eq(xor_eq2: i32) -> i32 {\n    test_xor_eq(xor_eq2)\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_order_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_order_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol FirstTrait: AnyObject {\n    func second() -> SecondTrait\n}\n\nprotocol SecondTrait: AnyObject {\n    func first() -> FirstTrait\n}\n\nenum EarlyInsideEnum {\n    case Value(Bool)\n}\n\nenum LaterOutsideEnum {\n    case Value(EarlyInsideEnum)\n}\n\nenum EarlyOutsideEnum {\n    case Value(LaterInsideEnum)\n}\n\nenum LaterInsideEnum {\n    case Value(Bool)\n}\n\nenum FirstEnum {\n    case Second([SecondEnum])\n}\n\nenum SecondEnum {\n    case First([FirstEnum])\n}\n\nstruct EarlyInsideStruct {\n    var y: Bool\n}\n\nstruct LaterOutsideStruct {\n    var x: EarlyInsideStruct\n}\n\nstruct EarlyOutsideStruct {\n    var x: LaterInsideStruct\n}\n\nstruct LaterInsideStruct {\n    var y: Bool\n}\n\nstruct FirstStruct {\n    var second: [SecondStruct]\n}\n\nstruct SecondStruct {\n    var first: [FirstStruct]\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_order_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_order_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_order_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol FirstTrait: AnyObject {\n    func second() -> SecondTrait\n}\n\nprotocol SecondTrait: AnyObject {\n    func first() -> FirstTrait\n}\n\nenum EarlyInsideEnum {\n    case Value(Bool)\n}\n\nenum LaterOutsideEnum {\n    case Value(EarlyInsideEnum)\n}\n\nenum EarlyOutsideEnum {\n    case Value(LaterInsideEnum)\n}\n\nenum LaterInsideEnum {\n    case Value(Bool)\n}\n\nenum FirstEnum {\n    case Second([SecondEnum])\n}\n\nenum SecondEnum {\n    case First([FirstEnum])\n}\n\nstruct EarlyInsideStruct {\n    var y: Bool\n}\n\nstruct LaterOutsideStruct {\n    var x: EarlyInsideStruct\n}\n\nstruct EarlyOutsideStruct {\n    var x: LaterInsideStruct\n}\n\nstruct LaterInsideStruct {\n    var y: Bool\n}\n\nstruct FirstStruct {\n    var second: [SecondStruct]\n}\n\nstruct SecondStruct {\n    var first: [FirstStruct]\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_order_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_trait_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_Box_Trait__get(const void*);\n\nint32_t _ffi_Rc_Trait__get(const void*);\n\nvoid* _ffi_alloc(intptr_t len);\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_test(const void* buf_ptr, uintptr_t vec_len);\n\nvoid _ffi_rs_drop_Box_Trait(const void* ptr);\n\nvoid _ffi_rs_drop_Rc_Trait(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_trait_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Trait: AnyObject {\n    func get() -> Int32\n}\n\nstruct Example {\n    var box_ptr: Trait\n    var rc_ptr: Trait\n    var text: String\n    var vec_box: [Trait]\n    var vec_rc: [Trait]\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc test(_ vec: [Example]) -> [Example] {\n    var buf = ContiguousArray<UInt8>()\n    let vec_len = UInt(vec.count)\n    _ffi_vec_Example_to_rust(vec, &buf)\n    let multi_ret = _ffi_fn_test(_ffi_vec_to_rust(buf), vec_len)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_len = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = _ffi_vec_Example_from_rust(Int(ret_len), &buf_end2)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nprivate class _ffi_Box_Trait : Trait {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Box_Trait(_ffi)\n    }\n\n    func get() -> Int32 {\n        return _ffi_Box_Trait__get(_ffi)\n    }\n}\n\nprivate class _ffi_Rc_Trait : Trait {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Rc_Trait(_ffi)\n    }\n\n    func get() -> Int32 {\n        return _ffi_Rc_Trait__get(_ffi)\n    }\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\nprivate func _ffi_string_to_rust(_ str: String) -> (UnsafeRawPointer?, UInt) {\n    var str = str\n    return str.withUTF8 { str in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(str.count), count: str.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: str.baseAddress, count: str.count))\n        return (UnsafeRawPointer(buf.baseAddress), UInt(buf.count))\n    }\n}\n\n@_cdecl(\"_ffi_swift_Trait__get\")\nfunc _ffi_swift_Trait__get(_self: UnsafeRawPointer?) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Trait\n    return _self.get()\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n\nprivate func _ffi_vec_Example_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Example] {\n    var items: [Example] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(Example(\n            box_ptr: _ffi_Box_Trait(_ffi_read(&end) as UnsafeRawPointer?),\n            rc_ptr: _ffi_Rc_Trait(_ffi_read(&end) as UnsafeRawPointer?),\n            text: _ffi_string_from_rust(_ffi_read(&end) as UnsafeRawPointer?, Int(_ffi_read(&end) as UInt), _ffi_read(&end) as UInt),\n            vec_box: _ffi_vec_box_dyn_Trait_from_rust(Int(_ffi_read(&end) as UInt), &end),\n            vec_rc: _ffi_vec_rc_dyn_Trait_from_rust(Int(_ffi_read(&end) as UInt), &end)\n        ))\n    }\n    return items\n}\n\nprivate func _ffi_vec_Example_to_rust(_ items: [Example], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(UnsafeRawPointer(Unmanaged.passRetained(item.box_ptr as AnyObject).toOpaque()), &buf)\n        _ffi_write(UnsafeRawPointer(Unmanaged.passRetained(item.rc_ptr as AnyObject).toOpaque()), &buf)\n        let (item_text_ptr, item_text_len) = _ffi_string_to_rust(item.text);\n        _ffi_write(item_text_ptr, &buf)\n        _ffi_write(item_text_len, &buf)\n        _ffi_write(UInt(item.vec_box.count), &buf)\n        _ffi_vec_box_dyn_Trait_to_rust(item.vec_box, &buf)\n        _ffi_write(UInt(item.vec_rc.count), &buf)\n        _ffi_vec_rc_dyn_Trait_to_rust(item.vec_rc, &buf)\n    }\n}\n\nprivate func _ffi_vec_box_dyn_Trait_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Trait] {\n    var items: [Trait] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_Box_Trait(_ffi_read(&end) as UnsafeRawPointer?))\n    }\n    return items\n}\n\nprivate func _ffi_vec_box_dyn_Trait_to_rust(_ items: [Trait], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(UnsafeRawPointer(Unmanaged.passRetained(item as AnyObject).toOpaque()), &buf)\n    }\n}\n\nprivate func _ffi_vec_rc_dyn_Trait_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Trait] {\n    var items: [Trait] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_Rc_Trait(_ffi_read(&end) as UnsafeRawPointer?))\n    }\n    return items\n}\n\nprivate func _ffi_vec_rc_dyn_Trait_to_rust(_ items: [Trait], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(UnsafeRawPointer(Unmanaged.passRetained(item as AnyObject).toOpaque()), &buf)\n    }\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_trait_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Box_Trait__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Trait>) };\n    _self.get()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Trait__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Trait>) };\n    _self.get()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test(buf_ptr: *const u8, vec_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = test(_ffi_vec_Example_from_swift(vec_len, &mut buf_end));\n    let mut buf2 = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_Example_to_swift(ret, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_len)\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Trait(*const u8);\n\nimpl Drop for _ffi_rs_Trait {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Trait for _ffi_rs_Trait {\n    fn get(&self) -> i32 {\n        extern \"C\" { fn _ffi_swift_Trait__get(_: *const u8) -> i32; }\n        unsafe { _ffi_swift_Trait__get(self.0) }\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Box_Trait(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Trait>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Rc_Trait(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Trait>) });\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Example_from_swift(len: usize, end: &mut *const u8) -> Vec<Example> {\n    let mut items = Vec::<Example>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Example {\n            box_ptr: Box::new(_ffi_rs_Trait(_ffi_read::<*const u8>(end))),\n            rc_ptr: std::rc::Rc::new(_ffi_rs_Trait(_ffi_read::<*const u8>(end))),\n            text: _ffi_string_from_host(_ffi_read::<*const u8>(end), _ffi_read::<usize>(end)),\n            vec_box: _ffi_vec_box_dyn_Trait_from_swift(_ffi_read::<usize>(end), end),\n            vec_rc: _ffi_vec_rc_dyn_Trait_from_swift(_ffi_read::<usize>(end), end)\n        });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Example_to_swift(items: Vec<Example>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item.box_ptr)) as *const u8, buf);\n        _ffi_write(Box::into_raw(Box::new(item.rc_ptr)) as *const u8, buf);\n        let (item_text_ptr, item_text_len, item_text_cap) = _ffi_string_to_host(item.text);\n        _ffi_write(item_text_ptr, buf);\n        _ffi_write(item_text_len, buf);\n        _ffi_write(item_text_cap, buf);\n        _ffi_write(item.vec_box.len(), buf);\n        _ffi_vec_box_dyn_Trait_to_swift(item.vec_box, buf);\n        _ffi_write(item.vec_rc.len(), buf);\n        _ffi_vec_rc_dyn_Trait_to_swift(item.vec_rc, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_box_dyn_Trait_from_swift(len: usize, end: &mut *const u8) -> Vec<Box<dyn Trait>> {\n    let mut items = Vec::<Box<dyn Trait>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Box::new(_ffi_rs_Trait(_ffi_read::<*const u8>(end))));\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_box_dyn_Trait_to_swift(items: Vec<Box<dyn Trait>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item)) as *const u8, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_rc_dyn_Trait_from_swift(len: usize, end: &mut *const u8) -> Vec<std::rc::Rc<dyn Trait>> {\n    let mut items = Vec::<std::rc::Rc<dyn Trait>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(std::rc::Rc::new(_ffi_rs_Trait(_ffi_read::<*const u8>(end))));\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_rc_dyn_Trait_to_swift(items: Vec<std::rc::Rc<dyn Trait>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item)) as *const u8, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_trait_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_Box_Trait__get(const void*);\n\nint32_t _ffi_Rc_Trait__get(const void*);\n\nvoid* _ffi_alloc(intptr_t len);\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_test(const void* buf_ptr, uintptr_t vec_len);\n\nvoid _ffi_rs_drop_Box_Trait(const void* ptr);\n\nvoid _ffi_rs_drop_Rc_Trait(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_trait_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Trait: AnyObject {\n    func get() -> Int32\n}\n\nstruct Example {\n    var box_ptr: Trait\n    var rc_ptr: Trait\n    var text: String\n    var vec_box: [Trait]\n    var vec_rc: [Trait]\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc test(_ vec: [Example]) -> [Example] {\n    var buf = ContiguousArray<UInt8>()\n    let vec_len = UInt(vec.count)\n    _ffi_vec_Example_to_rust(vec, &buf)\n    let multi_ret = _ffi_fn_test(_ffi_vec_to_rust(buf), vec_len)\n    let buf_ptr2 = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_len = multi_ret._2\n    var buf_end2 = buf_ptr2!\n    let ret = _ffi_vec_Example_from_rust(Int(ret_len), &buf_end2)\n    _ffi_dealloc(buf_ptr2, buf_cap)\n    return ret\n}\n\nprivate class _ffi_Box_Trait : Trait {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Box_Trait(_ffi)\n    }\n\n    func get() -> Int32 {\n        return _ffi_Box_Trait__get(_ffi)\n    }\n}\n\nprivate class _ffi_Rc_Trait : Trait {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Rc_Trait(_ffi)\n    }\n\n    func get() -> Int32 {\n        return _ffi_Rc_Trait__get(_ffi)\n    }\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\nprivate func _ffi_string_to_rust(_ str: String) -> (UnsafeRawPointer?, UInt) {\n    var str = str\n    return str.withUTF8 { str in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(str.count), count: str.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: str.baseAddress, count: str.count))\n        return (UnsafeRawPointer(buf.baseAddress), UInt(buf.count))\n    }\n}\n\n@_cdecl(\"_ffi_swift_Trait__get\")\nfunc _ffi_swift_Trait__get(_self: UnsafeRawPointer?) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Trait\n    return _self.get()\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n\nprivate func _ffi_vec_Example_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Example] {\n    var items: [Example] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(Example(\n            box_ptr: _ffi_Box_Trait(_ffi_read(&end) as UnsafeRawPointer?),\n            rc_ptr: _ffi_Rc_Trait(_ffi_read(&end) as UnsafeRawPointer?),\n            text: _ffi_string_from_rust(_ffi_read(&end) as UnsafeRawPointer?, Int(_ffi_read(&end) as UInt), _ffi_read(&end) as UInt),\n            vec_box: _ffi_vec_box_dyn_Trait_from_rust(Int(_ffi_read(&end) as UInt), &end),\n            vec_rc: _ffi_vec_rc_dyn_Trait_from_rust(Int(_ffi_read(&end) as UInt), &end)\n        ))\n    }\n    return items\n}\n\nprivate func _ffi_vec_Example_to_rust(_ items: [Example], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(UnsafeRawPointer(Unmanaged.passRetained(item.box_ptr as AnyObject).toOpaque()), &buf)\n        _ffi_write(UnsafeRawPointer(Unmanaged.passRetained(item.rc_ptr as AnyObject).toOpaque()), &buf)\n        let (item_text_ptr, item_text_len) = _ffi_string_to_rust(item.text);\n        _ffi_write(item_text_ptr, &buf)\n        _ffi_write(item_text_len, &buf)\n        _ffi_write(UInt(item.vec_box.count), &buf)\n        _ffi_vec_box_dyn_Trait_to_rust(item.vec_box, &buf)\n        _ffi_write(UInt(item.vec_rc.count), &buf)\n        _ffi_vec_rc_dyn_Trait_to_rust(item.vec_rc, &buf)\n    }\n}\n\nprivate func _ffi_vec_box_dyn_Trait_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Trait] {\n    var items: [Trait] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_Box_Trait(_ffi_read(&end) as UnsafeRawPointer?))\n    }\n    return items\n}\n\nprivate func _ffi_vec_box_dyn_Trait_to_rust(_ items: [Trait], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(UnsafeRawPointer(Unmanaged.passRetained(item as AnyObject).toOpaque()), &buf)\n    }\n}\n\nprivate func _ffi_vec_rc_dyn_Trait_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Trait] {\n    var items: [Trait] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_Rc_Trait(_ffi_read(&end) as UnsafeRawPointer?))\n    }\n    return items\n}\n\nprivate func _ffi_vec_rc_dyn_Trait_to_rust(_ items: [Trait], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(UnsafeRawPointer(Unmanaged.passRetained(item as AnyObject).toOpaque()), &buf)\n    }\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_demo_trait_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Box_Trait__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Trait>) };\n    _self.get()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Trait__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Trait>) };\n    _self.get()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test(buf_ptr: *const u8, vec_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = test(_ffi_vec_Example_from_swift(vec_len, &mut buf_end));\n    let mut buf2 = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_Example_to_swift(ret, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_len)\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Trait(*const u8);\n\nimpl Drop for _ffi_rs_Trait {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Trait for _ffi_rs_Trait {\n    fn get(&self) -> i32 {\n        unsafe extern \"C\" { fn _ffi_swift_Trait__get(_: *const u8) -> i32; }\n        unsafe { _ffi_swift_Trait__get(self.0) }\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Box_Trait(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Trait>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Rc_Trait(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Trait>) });\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Example_from_swift(len: usize, end: &mut *const u8) -> Vec<Example> {\n    let mut items = Vec::<Example>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Example {\n            box_ptr: Box::new(_ffi_rs_Trait(_ffi_read::<*const u8>(end))),\n            rc_ptr: std::rc::Rc::new(_ffi_rs_Trait(_ffi_read::<*const u8>(end))),\n            text: _ffi_string_from_host(_ffi_read::<*const u8>(end), _ffi_read::<usize>(end)),\n            vec_box: _ffi_vec_box_dyn_Trait_from_swift(_ffi_read::<usize>(end), end),\n            vec_rc: _ffi_vec_rc_dyn_Trait_from_swift(_ffi_read::<usize>(end), end)\n        });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Example_to_swift(items: Vec<Example>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item.box_ptr)) as *const u8, buf);\n        _ffi_write(Box::into_raw(Box::new(item.rc_ptr)) as *const u8, buf);\n        let (item_text_ptr, item_text_len, item_text_cap) = _ffi_string_to_host(item.text);\n        _ffi_write(item_text_ptr, buf);\n        _ffi_write(item_text_len, buf);\n        _ffi_write(item_text_cap, buf);\n        _ffi_write(item.vec_box.len(), buf);\n        _ffi_vec_box_dyn_Trait_to_swift(item.vec_box, buf);\n        _ffi_write(item.vec_rc.len(), buf);\n        _ffi_vec_rc_dyn_Trait_to_swift(item.vec_rc, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_box_dyn_Trait_from_swift(len: usize, end: &mut *const u8) -> Vec<Box<dyn Trait>> {\n    let mut items = Vec::<Box<dyn Trait>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Box::new(_ffi_rs_Trait(_ffi_read::<*const u8>(end))));\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_box_dyn_Trait_to_swift(items: Vec<Box<dyn Trait>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item)) as *const u8, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_rc_dyn_Trait_from_swift(len: usize, end: &mut *const u8) -> Vec<std::rc::Rc<dyn Trait>> {\n    let mut items = Vec::<std::rc::Rc<dyn Trait>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(std::rc::Rc::new(_ffi_rs_Trait(_ffi_read::<*const u8>(end))));\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_rc_dyn_Trait_to_swift(items: Vec<std::rc::Rc<dyn Trait>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item)) as *const u8, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_basic_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n_Bool _ffi_fn_add_bool(_Bool x, _Bool y);\n\nfloat _ffi_fn_add_f32(float x, float y);\n\ndouble _ffi_fn_add_f64(double x, double y);\n\nint16_t _ffi_fn_add_i16(int16_t x, int16_t y);\n\nint32_t _ffi_fn_add_i32(int32_t x, int32_t y);\n\nint64_t _ffi_fn_add_i64(int64_t x, int64_t y);\n\nint8_t _ffi_fn_add_i8(int8_t x, int8_t y);\n\nintptr_t _ffi_fn_add_isize(intptr_t x, intptr_t y);\n\nuint16_t _ffi_fn_add_u16(uint16_t x, uint16_t y);\n\nuint32_t _ffi_fn_add_u32(uint32_t x, uint32_t y);\n\nuint64_t _ffi_fn_add_u64(uint64_t x, uint64_t y);\n\nuint8_t _ffi_fn_add_u8(uint8_t x, uint8_t y);\n\nuintptr_t _ffi_fn_add_usize(uintptr_t x, uintptr_t y);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_basic_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc add_bool(_ x: Bool, _ y: Bool) -> Bool {\n    return _ffi_fn_add_bool(x, y)\n}\n\nfunc add_u8(_ x: UInt8, _ y: UInt8) -> UInt8 {\n    return _ffi_fn_add_u8(x, y)\n}\n\nfunc add_u16(_ x: UInt16, _ y: UInt16) -> UInt16 {\n    return _ffi_fn_add_u16(x, y)\n}\n\nfunc add_u32(_ x: UInt32, _ y: UInt32) -> UInt32 {\n    return _ffi_fn_add_u32(x, y)\n}\n\nfunc add_usize(_ x: UInt, _ y: UInt) -> UInt {\n    return _ffi_fn_add_usize(x, y)\n}\n\nfunc add_u64(_ x: UInt64, _ y: UInt64) -> UInt64 {\n    return _ffi_fn_add_u64(x, y)\n}\n\nfunc add_i8(_ x: Int8, _ y: Int8) -> Int8 {\n    return _ffi_fn_add_i8(x, y)\n}\n\nfunc add_i16(_ x: Int16, _ y: Int16) -> Int16 {\n    return _ffi_fn_add_i16(x, y)\n}\n\nfunc add_i32(_ x: Int32, _ y: Int32) -> Int32 {\n    return _ffi_fn_add_i32(x, y)\n}\n\nfunc add_isize(_ x: Int, _ y: Int) -> Int {\n    return _ffi_fn_add_isize(x, y)\n}\n\nfunc add_i64(_ x: Int64, _ y: Int64) -> Int64 {\n    return _ffi_fn_add_i64(x, y)\n}\n\nfunc add_f32(_ x: Float32, _ y: Float32) -> Float32 {\n    return _ffi_fn_add_f32(x, y)\n}\n\nfunc add_f64(_ x: Float64, _ y: Float64) -> Float64 {\n    return _ffi_fn_add_f64(x, y)\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_basic_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_bool(x: bool, y: bool) -> bool {\n    add_bool(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_f32(x: f32, y: f32) -> f32 {\n    add_f32(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_f64(x: f64, y: f64) -> f64 {\n    add_f64(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_i16(x: i16, y: i16) -> i16 {\n    add_i16(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_i32(x: i32, y: i32) -> i32 {\n    add_i32(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_i64(x: i64, y: i64) -> i64 {\n    add_i64(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_i8(x: i8, y: i8) -> i8 {\n    add_i8(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_isize(x: isize, y: isize) -> isize {\n    add_isize(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_u16(x: u16, y: u16) -> u16 {\n    add_u16(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_u32(x: u32, y: u32) -> u32 {\n    add_u32(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_u64(x: u64, y: u64) -> u64 {\n    add_u64(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_u8(x: u8, y: u8) -> u8 {\n    add_u8(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_usize(x: usize, y: usize) -> usize {\n    add_usize(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_basic_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n_Bool _ffi_fn_add_bool(_Bool x, _Bool y);\n\nfloat _ffi_fn_add_f32(float x, float y);\n\ndouble _ffi_fn_add_f64(double x, double y);\n\nint16_t _ffi_fn_add_i16(int16_t x, int16_t y);\n\nint32_t _ffi_fn_add_i32(int32_t x, int32_t y);\n\nint64_t _ffi_fn_add_i64(int64_t x, int64_t y);\n\nint8_t _ffi_fn_add_i8(int8_t x, int8_t y);\n\nintptr_t _ffi_fn_add_isize(intptr_t x, intptr_t y);\n\nuint16_t _ffi_fn_add_u16(uint16_t x, uint16_t y);\n\nuint32_t _ffi_fn_add_u32(uint32_t x, uint32_t y);\n\nuint64_t _ffi_fn_add_u64(uint64_t x, uint64_t y);\n\nuint8_t _ffi_fn_add_u8(uint8_t x, uint8_t y);\n\nuintptr_t _ffi_fn_add_usize(uintptr_t x, uintptr_t y);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_basic_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc add_bool(_ x: Bool, _ y: Bool) -> Bool {\n    return _ffi_fn_add_bool(x, y)\n}\n\nfunc add_u8(_ x: UInt8, _ y: UInt8) -> UInt8 {\n    return _ffi_fn_add_u8(x, y)\n}\n\nfunc add_u16(_ x: UInt16, _ y: UInt16) -> UInt16 {\n    return _ffi_fn_add_u16(x, y)\n}\n\nfunc add_u32(_ x: UInt32, _ y: UInt32) -> UInt32 {\n    return _ffi_fn_add_u32(x, y)\n}\n\nfunc add_usize(_ x: UInt, _ y: UInt) -> UInt {\n    return _ffi_fn_add_usize(x, y)\n}\n\nfunc add_u64(_ x: UInt64, _ y: UInt64) -> UInt64 {\n    return _ffi_fn_add_u64(x, y)\n}\n\nfunc add_i8(_ x: Int8, _ y: Int8) -> Int8 {\n    return _ffi_fn_add_i8(x, y)\n}\n\nfunc add_i16(_ x: Int16, _ y: Int16) -> Int16 {\n    return _ffi_fn_add_i16(x, y)\n}\n\nfunc add_i32(_ x: Int32, _ y: Int32) -> Int32 {\n    return _ffi_fn_add_i32(x, y)\n}\n\nfunc add_isize(_ x: Int, _ y: Int) -> Int {\n    return _ffi_fn_add_isize(x, y)\n}\n\nfunc add_i64(_ x: Int64, _ y: Int64) -> Int64 {\n    return _ffi_fn_add_i64(x, y)\n}\n\nfunc add_f32(_ x: Float32, _ y: Float32) -> Float32 {\n    return _ffi_fn_add_f32(x, y)\n}\n\nfunc add_f64(_ x: Float64, _ y: Float64) -> Float64 {\n    return _ffi_fn_add_f64(x, y)\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_basic_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_bool(x: bool, y: bool) -> bool {\n    add_bool(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_f32(x: f32, y: f32) -> f32 {\n    add_f32(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_f64(x: f64, y: f64) -> f64 {\n    add_f64(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_i16(x: i16, y: i16) -> i16 {\n    add_i16(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_i32(x: i32, y: i32) -> i32 {\n    add_i32(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_i64(x: i64, y: i64) -> i64 {\n    add_i64(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_i8(x: i8, y: i8) -> i8 {\n    add_i8(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_isize(x: isize, y: isize) -> isize {\n    add_isize(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_u16(x: u16, y: u16) -> u16 {\n    add_u16(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_u32(x: u32, y: u32) -> u32 {\n    add_u32(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_u64(x: u64, y: u64) -> u64 {\n    add_u64(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_u8(x: u8, y: u8) -> u8 {\n    add_u8(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_usize(x: usize, y: usize) -> usize {\n    add_usize(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_basic_void_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_fn_add_empty_tuple(int32_t x, int32_t y);\n\nvoid _ffi_fn_add_void(int32_t x, int32_t y);\n\nint32_t _ffi_fn_get_result();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nvoid _ffi_fn_wild_arg(int32_t _1, int32_t _3);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_basic_void_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc add_void(_ x: Int32, _ y: Int32) {\n    _ffi_fn_add_void(x, y)\n}\n\nfunc add_empty_tuple(_ x: Int32, _ y: Int32) -> () {\n    _ffi_fn_add_empty_tuple(x, y)\n    return ()\n}\n\nfunc get_result() -> Int32 {\n    return _ffi_fn_get_result()\n}\n\nfunc wild_arg(_ _1: Int32, _ _2: (), _ _3: Int32) -> () {\n    _ffi_fn_wild_arg(_1, _3)\n    return ()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_basic_void_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_empty_tuple(x: i32, y: i32) {\n    _ = add_empty_tuple(x, y);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_void(x: i32, y: i32) {\n    add_void(x, y);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_result() -> i32 {\n    get_result()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_wild_arg(_1: i32, _3: i32) {\n    _ = wild_arg(_1, (), _3);\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_basic_void_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_fn_add_empty_tuple(int32_t x, int32_t y);\n\nvoid _ffi_fn_add_void(int32_t x, int32_t y);\n\nint32_t _ffi_fn_get_result();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nvoid _ffi_fn_wild_arg(int32_t _1, int32_t _3);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_basic_void_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc add_void(_ x: Int32, _ y: Int32) {\n    _ffi_fn_add_void(x, y)\n}\n\nfunc add_empty_tuple(_ x: Int32, _ y: Int32) -> () {\n    _ffi_fn_add_empty_tuple(x, y)\n    return ()\n}\n\nfunc get_result() -> Int32 {\n    return _ffi_fn_get_result()\n}\n\nfunc wild_arg(_ _1: Int32, _ _2: (), _ _3: Int32) -> () {\n    _ffi_fn_wild_arg(_1, _3)\n    return ()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_basic_void_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_empty_tuple(x: i32, y: i32) {\n    _ = add_empty_tuple(x, y);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_void(x: i32, y: i32) {\n    add_void(x, y);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_result() -> i32 {\n    get_result()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_wild_arg(_1: i32, _3: i32) {\n    _ = wild_arg(_1, (), _3);\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_box_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nint32_t _ffi_fn_check_nested(const void* buf_ptr);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_sum_tree(int32_t tree_value, const void* buf_ptr, _Bool has_tree_left, _Bool has_tree_right);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_box_in_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nclass Tree : Equatable {\n    var value: Int32\n    var left: Tree?\n    var right: Tree?\n\n    init(value: Int32, left: Tree?, right: Tree?) {\n        self.value = value\n        self.left = left\n        self.right = right\n    }\n\n    static func == (a: Tree, b: Tree) -> Bool {\n        return a.value == b.value && a.left == b.left && a.right == b.right\n    }\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc sum_tree(_ tree: Tree) -> Int32 {\n    var buf = ContiguousArray<UInt8>()\n    let has_tree_left = tree.left != nil\n    if let tree_left_val = tree.left {\n        _ffi_box_Tree_to_rust(tree_left_val, &buf)\n    }\n    let has_tree_right = tree.right != nil\n    if let tree_right_val = tree.right {\n        _ffi_box_Tree_to_rust(tree_right_val, &buf)\n    }\n    return _ffi_fn_sum_tree(tree.value, _ffi_vec_to_rust(buf), has_tree_left, has_tree_right)\n}\n\nfunc check_nested(_ x: Int32) -> Int32 {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box_box_box_i32_to_rust(x, &buf)\n    return _ffi_fn_check_nested(_ffi_vec_to_rust(buf))\n}\n\nprivate func _ffi_box_Tree_to_rust(_ val: Tree, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(val.value, &buf)\n    _ffi_write(val.left != nil, &buf)\n    if let val_left_val = val.left {\n        _ffi_box_Tree_to_rust(val_left_val, &buf)\n    }\n    _ffi_write(val.right != nil, &buf)\n    if let val_right_val = val.right {\n        _ffi_box_Tree_to_rust(val_right_val, &buf)\n    }\n}\n\nprivate func _ffi_box_box_box_i32_to_rust(_ val: Int32, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_box_box_i32_to_rust(val, &buf)\n}\n\nprivate func _ffi_box_box_i32_to_rust(_ val: Int32, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_box_i32_to_rust(val, &buf)\n}\n\nprivate func _ffi_box_i32_to_rust(_ val: Int32, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(val, &buf)\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_box_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Tree_from_swift(end: &mut *const u8) -> Box<Tree> {\n    Box::new(Tree {\n        value: _ffi_read::<i32>(end),\n        left: _ffi_read::<bool>(end).then(|| _ffi_box_Tree_from_swift(end)),\n        right: _ffi_read::<bool>(end).then(|| _ffi_box_Tree_from_swift(end))\n    })\n}\n\nfn _ffi_box_box_box_i32_from_swift(end: &mut *const u8) -> Box<Box<Box<i32>>> {\n    Box::new(_ffi_box_box_i32_from_swift(end))\n}\n\nfn _ffi_box_box_i32_from_swift(end: &mut *const u8) -> Box<Box<i32>> {\n    Box::new(_ffi_box_i32_from_swift(end))\n}\n\nfn _ffi_box_i32_from_swift(end: &mut *const u8) -> Box<i32> {\n    Box::new(_ffi_read::<i32>(end))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_nested(buf_ptr: *const u8) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = check_nested(_ffi_box_box_box_i32_from_swift(&mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_tree(tree_value: i32, buf_ptr: *const u8, has_tree_left: bool, has_tree_right: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_tree(Tree {\n        value: tree_value,\n        left: has_tree_left.then(|| _ffi_box_Tree_from_swift(&mut buf_end)),\n        right: has_tree_right.then(|| _ffi_box_Tree_from_swift(&mut buf_end))\n    });\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_box_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nint32_t _ffi_fn_check_nested(const void* buf_ptr);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_sum_tree(int32_t tree_value, const void* buf_ptr, _Bool has_tree_left, _Bool has_tree_right);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_box_in_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nclass Tree : Equatable {\n    var value: Int32\n    var left: Tree?\n    var right: Tree?\n\n    init(value: Int32, left: Tree?, right: Tree?) {\n        self.value = value\n        self.left = left\n        self.right = right\n    }\n\n    static func == (a: Tree, b: Tree) -> Bool {\n        return a.value == b.value && a.left == b.left && a.right == b.right\n    }\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc sum_tree(_ tree: Tree) -> Int32 {\n    var buf = ContiguousArray<UInt8>()\n    let has_tree_left = tree.left != nil\n    if let tree_left_val = tree.left {\n        _ffi_box_Tree_to_rust(tree_left_val, &buf)\n    }\n    let has_tree_right = tree.right != nil\n    if let tree_right_val = tree.right {\n        _ffi_box_Tree_to_rust(tree_right_val, &buf)\n    }\n    return _ffi_fn_sum_tree(tree.value, _ffi_vec_to_rust(buf), has_tree_left, has_tree_right)\n}\n\nfunc check_nested(_ x: Int32) -> Int32 {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_box_box_box_i32_to_rust(x, &buf)\n    return _ffi_fn_check_nested(_ffi_vec_to_rust(buf))\n}\n\nprivate func _ffi_box_Tree_to_rust(_ val: Tree, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(val.value, &buf)\n    _ffi_write(val.left != nil, &buf)\n    if let val_left_val = val.left {\n        _ffi_box_Tree_to_rust(val_left_val, &buf)\n    }\n    _ffi_write(val.right != nil, &buf)\n    if let val_right_val = val.right {\n        _ffi_box_Tree_to_rust(val_right_val, &buf)\n    }\n}\n\nprivate func _ffi_box_box_box_i32_to_rust(_ val: Int32, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_box_box_i32_to_rust(val, &buf)\n}\n\nprivate func _ffi_box_box_i32_to_rust(_ val: Int32, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_box_i32_to_rust(val, &buf)\n}\n\nprivate func _ffi_box_i32_to_rust(_ val: Int32, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_write(val, &buf)\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_box_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Tree_from_swift(end: &mut *const u8) -> Box<Tree> {\n    Box::new(Tree {\n        value: _ffi_read::<i32>(end),\n        left: _ffi_read::<bool>(end).then(|| _ffi_box_Tree_from_swift(end)),\n        right: _ffi_read::<bool>(end).then(|| _ffi_box_Tree_from_swift(end))\n    })\n}\n\nfn _ffi_box_box_box_i32_from_swift(end: &mut *const u8) -> Box<Box<Box<i32>>> {\n    Box::new(_ffi_box_box_i32_from_swift(end))\n}\n\nfn _ffi_box_box_i32_from_swift(end: &mut *const u8) -> Box<Box<i32>> {\n    Box::new(_ffi_box_i32_from_swift(end))\n}\n\nfn _ffi_box_i32_from_swift(end: &mut *const u8) -> Box<i32> {\n    Box::new(_ffi_read::<i32>(end))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_nested(buf_ptr: *const u8) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = check_nested(_ffi_box_box_box_i32_from_swift(&mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_tree(tree_value: i32, buf_ptr: *const u8, has_tree_left: bool, has_tree_right: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_tree(Tree {\n        value: tree_value,\n        left: has_tree_left.then(|| _ffi_box_Tree_from_swift(&mut buf_end)),\n        right: has_tree_right.then(|| _ffi_box_Tree_from_swift(&mut buf_end))\n    });\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_box_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n} _ffi_ret_ptr_usize;\n\n_ffi_ret_ptr_usize _ffi_fn_check_nested(int32_t x);\n\ntypedef struct {\n    int32_t _0;\n    const void* _1;\n    uintptr_t _2;\n    _Bool _3;\n    _Bool _4;\n} _ffi_ret_i32_ptr_usize_2_bool;\n\n_ffi_ret_i32_ptr_usize_2_bool _ffi_fn_get_tree();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_box_out_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nclass Tree : Equatable {\n    var value: Int32\n    var left: Tree?\n    var right: Tree?\n\n    init(value: Int32, left: Tree?, right: Tree?) {\n        self.value = value\n        self.left = left\n        self.right = right\n    }\n\n    static func == (a: Tree, b: Tree) -> Bool {\n        return a.value == b.value && a.left == b.left && a.right == b.right\n    }\n}\n\nstruct Nested : Equatable {\n    var _0: Int32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_tree() -> Tree {\n    let multi_ret = _ffi_fn_get_tree()\n    let ret_value = multi_ret._0\n    let buf_ptr = multi_ret._1\n    let buf_cap = multi_ret._2\n    let has_ret_left = multi_ret._3\n    let has_ret_right = multi_ret._4\n    var buf_end = buf_ptr!\n    let ret = Tree(\n        value: ret_value,\n        left: has_ret_left ? _ffi_box_Tree_from_rust(&buf_end) : nil,\n        right: has_ret_right ? _ffi_box_Tree_from_rust(&buf_end) : nil\n    )\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nfunc check_nested(_ x: Int32) -> Nested {\n    let multi_ret = _ffi_fn_check_nested(x)\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end = buf_ptr!\n    let ret = Nested(_0: _ffi_box_box_box_i32_from_rust(&buf_end))\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nprivate func _ffi_box_Tree_from_rust(_ end: inout UnsafeRawPointer) -> Tree {\n    return Tree(\n        value: _ffi_read(&end) as Int32,\n        left: _ffi_read(&end) as Bool ? _ffi_box_Tree_from_rust(&end) : nil,\n        right: _ffi_read(&end) as Bool ? _ffi_box_Tree_from_rust(&end) : nil\n    )\n}\n\nprivate func _ffi_box_box_box_i32_from_rust(_ end: inout UnsafeRawPointer) -> Int32 {\n    return _ffi_box_box_i32_from_rust(&end)\n}\n\nprivate func _ffi_box_box_i32_from_rust(_ end: inout UnsafeRawPointer) -> Int32 {\n    return _ffi_box_i32_from_rust(&end)\n}\n\nprivate func _ffi_box_i32_from_rust(_ end: inout UnsafeRawPointer) -> Int32 {\n    return _ffi_read(&end) as Int32\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_box_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Tree_to_swift(val: Tree, buf: &mut Vec<u8>) {\n    _ffi_write(val.value, buf);\n    _ffi_write(val.left.is_some(), buf);\n    if let Some(val_left_val) = val.left {\n        _ffi_box_Tree_to_swift(*val_left_val, buf);\n    }\n    _ffi_write(val.right.is_some(), buf);\n    if let Some(val_right_val) = val.right {\n        _ffi_box_Tree_to_swift(*val_right_val, buf);\n    }\n}\n\nfn _ffi_box_box_box_i32_to_swift(val: Box<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_box_box_i32_to_swift(*val, buf);\n}\n\nfn _ffi_box_box_i32_to_swift(val: Box<i32>, buf: &mut Vec<u8>) {\n    _ffi_box_i32_to_swift(*val, buf);\n}\n\nfn _ffi_box_i32_to_swift(val: i32, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_nested(x: i32) -> _ffi_ret_ptr_usize {\n    let ret = check_nested(x);\n    let ret_0 = ret.0;\n    let mut buf = Vec::<u8>::new();\n    _ffi_box_box_box_i32_to_swift(*ret_0, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize(buf_ptr, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_tree() -> _ffi_ret_i32_ptr_usize_2_bool {\n    let ret = get_tree();\n    let ret_value = ret.value;\n    let ret_left = ret.left;\n    let mut buf = Vec::<u8>::new();\n    let has_ret_left = ret_left.is_some();\n    if let Some(ret_left_val) = ret_left {\n        _ffi_box_Tree_to_swift(*ret_left_val, &mut buf);\n    }\n    let ret_right = ret.right;\n    let has_ret_right = ret_right.is_some();\n    if let Some(ret_right_val) = ret_right {\n        _ffi_box_Tree_to_swift(*ret_right_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_i32_ptr_usize_2_bool(ret_value, buf_ptr, buf_cap, has_ret_left, has_ret_right)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr_usize_2_bool(i32, *const u8, usize, bool, bool);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_box_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n} _ffi_ret_ptr_usize;\n\n_ffi_ret_ptr_usize _ffi_fn_check_nested(int32_t x);\n\ntypedef struct {\n    int32_t _0;\n    const void* _1;\n    uintptr_t _2;\n    _Bool _3;\n    _Bool _4;\n} _ffi_ret_i32_ptr_usize_2_bool;\n\n_ffi_ret_i32_ptr_usize_2_bool _ffi_fn_get_tree();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_box_out_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nclass Tree : Equatable {\n    var value: Int32\n    var left: Tree?\n    var right: Tree?\n\n    init(value: Int32, left: Tree?, right: Tree?) {\n        self.value = value\n        self.left = left\n        self.right = right\n    }\n\n    static func == (a: Tree, b: Tree) -> Bool {\n        return a.value == b.value && a.left == b.left && a.right == b.right\n    }\n}\n\nstruct Nested : Equatable {\n    var _0: Int32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_tree() -> Tree {\n    let multi_ret = _ffi_fn_get_tree()\n    let ret_value = multi_ret._0\n    let buf_ptr = multi_ret._1\n    let buf_cap = multi_ret._2\n    let has_ret_left = multi_ret._3\n    let has_ret_right = multi_ret._4\n    var buf_end = buf_ptr!\n    let ret = Tree(\n        value: ret_value,\n        left: has_ret_left ? _ffi_box_Tree_from_rust(&buf_end) : nil,\n        right: has_ret_right ? _ffi_box_Tree_from_rust(&buf_end) : nil\n    )\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nfunc check_nested(_ x: Int32) -> Nested {\n    let multi_ret = _ffi_fn_check_nested(x)\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end = buf_ptr!\n    let ret = Nested(_0: _ffi_box_box_box_i32_from_rust(&buf_end))\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nprivate func _ffi_box_Tree_from_rust(_ end: inout UnsafeRawPointer) -> Tree {\n    return Tree(\n        value: _ffi_read(&end) as Int32,\n        left: _ffi_read(&end) as Bool ? _ffi_box_Tree_from_rust(&end) : nil,\n        right: _ffi_read(&end) as Bool ? _ffi_box_Tree_from_rust(&end) : nil\n    )\n}\n\nprivate func _ffi_box_box_box_i32_from_rust(_ end: inout UnsafeRawPointer) -> Int32 {\n    return _ffi_box_box_i32_from_rust(&end)\n}\n\nprivate func _ffi_box_box_i32_from_rust(_ end: inout UnsafeRawPointer) -> Int32 {\n    return _ffi_box_i32_from_rust(&end)\n}\n\nprivate func _ffi_box_i32_from_rust(_ end: inout UnsafeRawPointer) -> Int32 {\n    return _ffi_read(&end) as Int32\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_box_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Tree_to_swift(val: Tree, buf: &mut Vec<u8>) {\n    _ffi_write(val.value, buf);\n    _ffi_write(val.left.is_some(), buf);\n    if let Some(val_left_val) = val.left {\n        _ffi_box_Tree_to_swift(*val_left_val, buf);\n    }\n    _ffi_write(val.right.is_some(), buf);\n    if let Some(val_right_val) = val.right {\n        _ffi_box_Tree_to_swift(*val_right_val, buf);\n    }\n}\n\nfn _ffi_box_box_box_i32_to_swift(val: Box<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_box_box_i32_to_swift(*val, buf);\n}\n\nfn _ffi_box_box_i32_to_swift(val: Box<i32>, buf: &mut Vec<u8>) {\n    _ffi_box_i32_to_swift(*val, buf);\n}\n\nfn _ffi_box_i32_to_swift(val: i32, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_nested(x: i32) -> _ffi_ret_ptr_usize {\n    let ret = check_nested(x);\n    let ret_0 = ret.0;\n    let mut buf = Vec::<u8>::new();\n    _ffi_box_box_box_i32_to_swift(*ret_0, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize(buf_ptr, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_tree() -> _ffi_ret_i32_ptr_usize_2_bool {\n    let ret = get_tree();\n    let ret_value = ret.value;\n    let ret_left = ret.left;\n    let mut buf = Vec::<u8>::new();\n    let has_ret_left = ret_left.is_some();\n    if let Some(ret_left_val) = ret_left {\n        _ffi_box_Tree_to_swift(*ret_left_val, &mut buf);\n    }\n    let ret_right = ret.right;\n    let has_ret_right = ret_right.is_some();\n    if let Some(ret_right_val) = ret_right {\n        _ffi_box_Tree_to_swift(*ret_right_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_i32_ptr_usize_2_bool(ret_value, buf_ptr, buf_cap, has_ret_left, has_ret_right)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr_usize_2_bool(i32, *const u8, usize, bool, bool);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_combo_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_check_combo(int32_t foo_x_0_x, const void* buf_ptr, uintptr_t foo_x_0_y_len, uintptr_t foo_x_1_len, uintptr_t foo_y_len);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_combo_in_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nstruct Foo {\n    var x: (Bar, [Bar])\n    var y: [((), Int32, (Float32, Bool))]\n}\n\nstruct Bar {\n    var x: Int32\n    var y: [Foo]\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc check_combo(_ foo: Foo) -> String {\n    var buf = ContiguousArray<UInt8>()\n    let foo_x_0_y_len = UInt(foo.x.0.y.count)\n    _ffi_vec_Foo_to_rust(foo.x.0.y, &buf)\n    let foo_x_1_len = UInt(foo.x.1.count)\n    _ffi_vec_Bar_to_rust(foo.x.1, &buf)\n    let foo_y_len = UInt(foo.y.count)\n    _ffi_vec__i32_f32_bool_to_rust(foo.y, &buf)\n    let multi_ret = _ffi_fn_check_combo(foo.x.0.x, _ffi_vec_to_rust(buf), foo_x_0_y_len, foo_x_1_len, foo_y_len)\n    let ret_ptr = multi_ret._0\n    let ret_len = multi_ret._1\n    let ret_cap = multi_ret._2\n    return _ffi_string_from_rust(ret_ptr, Int(ret_len), ret_cap)\n}\n\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\nprivate func _ffi_vec_Bar_to_rust(_ items: [Bar], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item.x, &buf)\n        _ffi_write(UInt(item.y.count), &buf)\n        _ffi_vec_Foo_to_rust(item.y, &buf)\n    }\n}\n\nprivate func _ffi_vec_Foo_to_rust(_ items: [Foo], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item.x.0.x, &buf)\n        _ffi_write(UInt(item.x.0.y.count), &buf)\n        _ffi_vec_Foo_to_rust(item.x.0.y, &buf)\n        _ffi_write(UInt(item.x.1.count), &buf)\n        _ffi_vec_Bar_to_rust(item.x.1, &buf)\n        _ffi_write(UInt(item.y.count), &buf)\n        _ffi_vec__i32_f32_bool_to_rust(item.y, &buf)\n    }\n}\n\nprivate func _ffi_vec__i32_f32_bool_to_rust(_ items: [((), Int32, (Float32, Bool))], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item.1, &buf)\n        _ffi_write(item.2.0, &buf)\n        _ffi_write(item.2.1, &buf)\n    }\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_combo_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_combo(foo_x_0_x: i32, buf_ptr: *const u8, foo_x_0_y_len: usize, foo_x_1_len: usize, foo_y_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(check_combo(Foo {\n        x: (\n            Bar { x: foo_x_0_x, y: _ffi_vec_Foo_from_swift(foo_x_0_y_len, &mut buf_end) },\n            _ffi_vec_Bar_from_swift(foo_x_1_len, &mut buf_end)\n        ),\n        y: _ffi_vec__i32_f32_bool_from_swift(foo_y_len, &mut buf_end)\n    }));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Bar_from_swift(len: usize, end: &mut *const u8) -> Vec<Bar> {\n    let mut items = Vec::<Bar>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Bar { x: _ffi_read::<i32>(end), y: _ffi_vec_Foo_from_swift(_ffi_read::<usize>(end), end) });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_from_swift(len: usize, end: &mut *const u8) -> Vec<Foo> {\n    let mut items = Vec::<Foo>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Foo {\n            x: (\n                Bar { x: _ffi_read::<i32>(end), y: _ffi_vec_Foo_from_swift(_ffi_read::<usize>(end), end) },\n                _ffi_vec_Bar_from_swift(_ffi_read::<usize>(end), end)\n            ),\n            y: _ffi_vec__i32_f32_bool_from_swift(_ffi_read::<usize>(end), end)\n        });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__i32_f32_bool_from_swift(len: usize, end: &mut *const u8) -> Vec<((), (i32,), (f32, bool))> {\n    let mut items = Vec::<((), (i32,), (f32, bool))>::with_capacity(len);\n    for _ in 0..len {\n        items.push(((), (_ffi_read::<i32>(end),), (_ffi_read::<f32>(end), _ffi_read::<bool>(end))));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_combo_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_check_combo(int32_t foo_x_0_x, const void* buf_ptr, uintptr_t foo_x_0_y_len, uintptr_t foo_x_1_len, uintptr_t foo_y_len);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_combo_in_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nstruct Foo {\n    var x: (Bar, [Bar])\n    var y: [((), Int32, (Float32, Bool))]\n}\n\nstruct Bar {\n    var x: Int32\n    var y: [Foo]\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc check_combo(_ foo: Foo) -> String {\n    var buf = ContiguousArray<UInt8>()\n    let foo_x_0_y_len = UInt(foo.x.0.y.count)\n    _ffi_vec_Foo_to_rust(foo.x.0.y, &buf)\n    let foo_x_1_len = UInt(foo.x.1.count)\n    _ffi_vec_Bar_to_rust(foo.x.1, &buf)\n    let foo_y_len = UInt(foo.y.count)\n    _ffi_vec__i32_f32_bool_to_rust(foo.y, &buf)\n    let multi_ret = _ffi_fn_check_combo(foo.x.0.x, _ffi_vec_to_rust(buf), foo_x_0_y_len, foo_x_1_len, foo_y_len)\n    let ret_ptr = multi_ret._0\n    let ret_len = multi_ret._1\n    let ret_cap = multi_ret._2\n    return _ffi_string_from_rust(ret_ptr, Int(ret_len), ret_cap)\n}\n\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\nprivate func _ffi_vec_Bar_to_rust(_ items: [Bar], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item.x, &buf)\n        _ffi_write(UInt(item.y.count), &buf)\n        _ffi_vec_Foo_to_rust(item.y, &buf)\n    }\n}\n\nprivate func _ffi_vec_Foo_to_rust(_ items: [Foo], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item.x.0.x, &buf)\n        _ffi_write(UInt(item.x.0.y.count), &buf)\n        _ffi_vec_Foo_to_rust(item.x.0.y, &buf)\n        _ffi_write(UInt(item.x.1.count), &buf)\n        _ffi_vec_Bar_to_rust(item.x.1, &buf)\n        _ffi_write(UInt(item.y.count), &buf)\n        _ffi_vec__i32_f32_bool_to_rust(item.y, &buf)\n    }\n}\n\nprivate func _ffi_vec__i32_f32_bool_to_rust(_ items: [((), Int32, (Float32, Bool))], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item.1, &buf)\n        _ffi_write(item.2.0, &buf)\n        _ffi_write(item.2.1, &buf)\n    }\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_combo_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_combo(foo_x_0_x: i32, buf_ptr: *const u8, foo_x_0_y_len: usize, foo_x_1_len: usize, foo_y_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(check_combo(Foo {\n        x: (\n            Bar { x: foo_x_0_x, y: _ffi_vec_Foo_from_swift(foo_x_0_y_len, &mut buf_end) },\n            _ffi_vec_Bar_from_swift(foo_x_1_len, &mut buf_end)\n        ),\n        y: _ffi_vec__i32_f32_bool_from_swift(foo_y_len, &mut buf_end)\n    }));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Bar_from_swift(len: usize, end: &mut *const u8) -> Vec<Bar> {\n    let mut items = Vec::<Bar>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Bar { x: _ffi_read::<i32>(end), y: _ffi_vec_Foo_from_swift(_ffi_read::<usize>(end), end) });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_from_swift(len: usize, end: &mut *const u8) -> Vec<Foo> {\n    let mut items = Vec::<Foo>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Foo {\n            x: (\n                Bar { x: _ffi_read::<i32>(end), y: _ffi_vec_Foo_from_swift(_ffi_read::<usize>(end), end) },\n                _ffi_vec_Bar_from_swift(_ffi_read::<usize>(end), end)\n            ),\n            y: _ffi_vec__i32_f32_bool_from_swift(_ffi_read::<usize>(end), end)\n        });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__i32_f32_bool_from_swift(len: usize, end: &mut *const u8) -> Vec<((), (i32,), (f32, bool))> {\n    let mut items = Vec::<((), (i32,), (f32, bool))>::with_capacity(len);\n    for _ in 0..len {\n        items.push(((), (_ffi_read::<i32>(end),), (_ffi_read::<f32>(end), _ffi_read::<bool>(end))));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_combo_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    int32_t _0;\n    const void* _1;\n    uintptr_t _2;\n    uintptr_t _3;\n    uintptr_t _4;\n    uintptr_t _5;\n} _ffi_ret_i32_ptr_4_usize;\n\n_ffi_ret_i32_ptr_4_usize _ffi_fn_check_combo1();\n\n_ffi_ret_i32_ptr_4_usize _ffi_fn_check_combo2();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_combo_out_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nstruct Foo : Equatable {\n    var x: (Bar, [Bar])\n    var y: [((), Int32, (Float32, Bool))]\n\n    static func == (a: Foo, b: Foo) -> Bool {\n        return (\n            a.x.0 == b.x.0 &&\n            a.x.1 == b.x.1 &&\n            a.y.elementsEqual(b.y, by: { a, b in a.1 == b.1 && a.2.0 == b.2.0 && a.2.1 == b.2.1 })\n        )\n    }\n}\n\nstruct Bar : Equatable {\n    var x: Int32\n    var y: [Foo]\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc check_combo1() -> Foo {\n    let multi_ret = _ffi_fn_check_combo1()\n    let ret_x_0_x = multi_ret._0\n    let buf_ptr = multi_ret._1\n    let buf_cap = multi_ret._2\n    let ret_x_0_y_len = multi_ret._3\n    let ret_x_1_len = multi_ret._4\n    let ret_y_len = multi_ret._5\n    var buf_end = buf_ptr!\n    let ret = Foo(\n        x: (\n            Bar(x: ret_x_0_x, y: _ffi_vec_Foo_from_rust(Int(ret_x_0_y_len), &buf_end)),\n            _ffi_vec_Bar_from_rust(Int(ret_x_1_len), &buf_end)\n        ),\n        y: _ffi_vec__i32_f32_bool_from_rust(Int(ret_y_len), &buf_end)\n    )\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nfunc check_combo2() -> Foo {\n    let multi_ret = _ffi_fn_check_combo2()\n    let ret_x_0_x = multi_ret._0\n    let buf_ptr = multi_ret._1\n    let buf_cap = multi_ret._2\n    let ret_x_0_y_len = multi_ret._3\n    let ret_x_1_len = multi_ret._4\n    let ret_y_len = multi_ret._5\n    var buf_end = buf_ptr!\n    let ret = Foo(\n        x: (\n            Bar(x: ret_x_0_x, y: _ffi_vec_Foo_from_rust(Int(ret_x_0_y_len), &buf_end)),\n            _ffi_vec_Bar_from_rust(Int(ret_x_1_len), &buf_end)\n        ),\n        y: _ffi_vec__i32_f32_bool_from_rust(Int(ret_y_len), &buf_end)\n    )\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\nprivate func _ffi_vec_Bar_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Bar] {\n    var items: [Bar] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(Bar(x: _ffi_read(&end) as Int32, y: _ffi_vec_Foo_from_rust(Int(_ffi_read(&end) as UInt), &end)))\n    }\n    return items\n}\n\nprivate func _ffi_vec_Foo_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Foo] {\n    var items: [Foo] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(Foo(\n            x: (\n                Bar(x: _ffi_read(&end) as Int32, y: _ffi_vec_Foo_from_rust(Int(_ffi_read(&end) as UInt), &end)),\n                _ffi_vec_Bar_from_rust(Int(_ffi_read(&end) as UInt), &end)\n            ),\n            y: _ffi_vec__i32_f32_bool_from_rust(Int(_ffi_read(&end) as UInt), &end)\n        ))\n    }\n    return items\n}\n\nprivate func _ffi_vec__i32_f32_bool_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [((), Int32, (Float32, Bool))] {\n    var items: [((), Int32, (Float32, Bool))] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(((), _ffi_read(&end) as Int32, (_ffi_read(&end) as Float32, _ffi_read(&end) as Bool)))\n    }\n    return items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_combo_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_combo1() -> _ffi_ret_i32_ptr_4_usize {\n    let ret = check_combo1();\n    let ret_x = ret.x;\n    let ret_x_0 = ret_x.0;\n    let ret_x_0_x = ret_x_0.x;\n    let ret_x_0_y = ret_x_0.y;\n    let mut buf = Vec::<u8>::new();\n    let ret_x_0_y_len = ret_x_0_y.len();\n    _ffi_vec_Foo_to_swift(ret_x_0_y, &mut buf);\n    let ret_x_1 = ret_x.1;\n    let ret_x_1_len = ret_x_1.len();\n    _ffi_vec_Bar_to_swift(ret_x_1, &mut buf);\n    let ret_y = ret.y;\n    let ret_y_len = ret_y.len();\n    _ffi_vec__i32_f32_bool_to_swift(ret_y, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_i32_ptr_4_usize(ret_x_0_x, buf_ptr, buf_cap, ret_x_0_y_len, ret_x_1_len, ret_y_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_combo2() -> _ffi_ret_i32_ptr_4_usize {\n    let ret = check_combo2();\n    let ret_x = ret.x;\n    let ret_x_0 = ret_x.0;\n    let ret_x_0_x = ret_x_0.x;\n    let ret_x_0_y = ret_x_0.y;\n    let mut buf = Vec::<u8>::new();\n    let ret_x_0_y_len = ret_x_0_y.len();\n    _ffi_vec_Foo_to_swift(ret_x_0_y, &mut buf);\n    let ret_x_1 = ret_x.1;\n    let ret_x_1_len = ret_x_1.len();\n    _ffi_vec_Bar_to_swift(ret_x_1, &mut buf);\n    let ret_y = ret.y;\n    let ret_y_len = ret_y.len();\n    _ffi_vec__i32_f32_bool_to_swift(ret_y, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_i32_ptr_4_usize(ret_x_0_x, buf_ptr, buf_cap, ret_x_0_y_len, ret_x_1_len, ret_y_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr_4_usize(i32, *const u8, usize, usize, usize, usize);\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Bar_to_swift(items: Vec<Bar>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.x, buf);\n        _ffi_write(item.y.len(), buf);\n        _ffi_vec_Foo_to_swift(item.y, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_to_swift(items: Vec<Foo>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.x.0.x, buf);\n        _ffi_write(item.x.0.y.len(), buf);\n        _ffi_vec_Foo_to_swift(item.x.0.y, buf);\n        _ffi_write(item.x.1.len(), buf);\n        _ffi_vec_Bar_to_swift(item.x.1, buf);\n        _ffi_write(item.y.len(), buf);\n        _ffi_vec__i32_f32_bool_to_swift(item.y, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__i32_f32_bool_to_swift(items: Vec<((), (i32,), (f32, bool))>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ = item.0;\n        _ffi_write(item.1.0, buf);\n        _ffi_write(item.2.0, buf);\n        _ffi_write(item.2.1, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_combo_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    int32_t _0;\n    const void* _1;\n    uintptr_t _2;\n    uintptr_t _3;\n    uintptr_t _4;\n    uintptr_t _5;\n} _ffi_ret_i32_ptr_4_usize;\n\n_ffi_ret_i32_ptr_4_usize _ffi_fn_check_combo1();\n\n_ffi_ret_i32_ptr_4_usize _ffi_fn_check_combo2();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_combo_out_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nstruct Foo : Equatable {\n    var x: (Bar, [Bar])\n    var y: [((), Int32, (Float32, Bool))]\n\n    static func == (a: Foo, b: Foo) -> Bool {\n        return (\n            a.x.0 == b.x.0 &&\n            a.x.1 == b.x.1 &&\n            a.y.elementsEqual(b.y, by: { a, b in a.1 == b.1 && a.2.0 == b.2.0 && a.2.1 == b.2.1 })\n        )\n    }\n}\n\nstruct Bar : Equatable {\n    var x: Int32\n    var y: [Foo]\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc check_combo1() -> Foo {\n    let multi_ret = _ffi_fn_check_combo1()\n    let ret_x_0_x = multi_ret._0\n    let buf_ptr = multi_ret._1\n    let buf_cap = multi_ret._2\n    let ret_x_0_y_len = multi_ret._3\n    let ret_x_1_len = multi_ret._4\n    let ret_y_len = multi_ret._5\n    var buf_end = buf_ptr!\n    let ret = Foo(\n        x: (\n            Bar(x: ret_x_0_x, y: _ffi_vec_Foo_from_rust(Int(ret_x_0_y_len), &buf_end)),\n            _ffi_vec_Bar_from_rust(Int(ret_x_1_len), &buf_end)\n        ),\n        y: _ffi_vec__i32_f32_bool_from_rust(Int(ret_y_len), &buf_end)\n    )\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nfunc check_combo2() -> Foo {\n    let multi_ret = _ffi_fn_check_combo2()\n    let ret_x_0_x = multi_ret._0\n    let buf_ptr = multi_ret._1\n    let buf_cap = multi_ret._2\n    let ret_x_0_y_len = multi_ret._3\n    let ret_x_1_len = multi_ret._4\n    let ret_y_len = multi_ret._5\n    var buf_end = buf_ptr!\n    let ret = Foo(\n        x: (\n            Bar(x: ret_x_0_x, y: _ffi_vec_Foo_from_rust(Int(ret_x_0_y_len), &buf_end)),\n            _ffi_vec_Bar_from_rust(Int(ret_x_1_len), &buf_end)\n        ),\n        y: _ffi_vec__i32_f32_bool_from_rust(Int(ret_y_len), &buf_end)\n    )\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\nprivate func _ffi_vec_Bar_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Bar] {\n    var items: [Bar] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(Bar(x: _ffi_read(&end) as Int32, y: _ffi_vec_Foo_from_rust(Int(_ffi_read(&end) as UInt), &end)))\n    }\n    return items\n}\n\nprivate func _ffi_vec_Foo_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Foo] {\n    var items: [Foo] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(Foo(\n            x: (\n                Bar(x: _ffi_read(&end) as Int32, y: _ffi_vec_Foo_from_rust(Int(_ffi_read(&end) as UInt), &end)),\n                _ffi_vec_Bar_from_rust(Int(_ffi_read(&end) as UInt), &end)\n            ),\n            y: _ffi_vec__i32_f32_bool_from_rust(Int(_ffi_read(&end) as UInt), &end)\n        ))\n    }\n    return items\n}\n\nprivate func _ffi_vec__i32_f32_bool_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [((), Int32, (Float32, Bool))] {\n    var items: [((), Int32, (Float32, Bool))] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(((), _ffi_read(&end) as Int32, (_ffi_read(&end) as Float32, _ffi_read(&end) as Bool)))\n    }\n    return items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_combo_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_combo1() -> _ffi_ret_i32_ptr_4_usize {\n    let ret = check_combo1();\n    let ret_x = ret.x;\n    let ret_x_0 = ret_x.0;\n    let ret_x_0_x = ret_x_0.x;\n    let ret_x_0_y = ret_x_0.y;\n    let mut buf = Vec::<u8>::new();\n    let ret_x_0_y_len = ret_x_0_y.len();\n    _ffi_vec_Foo_to_swift(ret_x_0_y, &mut buf);\n    let ret_x_1 = ret_x.1;\n    let ret_x_1_len = ret_x_1.len();\n    _ffi_vec_Bar_to_swift(ret_x_1, &mut buf);\n    let ret_y = ret.y;\n    let ret_y_len = ret_y.len();\n    _ffi_vec__i32_f32_bool_to_swift(ret_y, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_i32_ptr_4_usize(ret_x_0_x, buf_ptr, buf_cap, ret_x_0_y_len, ret_x_1_len, ret_y_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_combo2() -> _ffi_ret_i32_ptr_4_usize {\n    let ret = check_combo2();\n    let ret_x = ret.x;\n    let ret_x_0 = ret_x.0;\n    let ret_x_0_x = ret_x_0.x;\n    let ret_x_0_y = ret_x_0.y;\n    let mut buf = Vec::<u8>::new();\n    let ret_x_0_y_len = ret_x_0_y.len();\n    _ffi_vec_Foo_to_swift(ret_x_0_y, &mut buf);\n    let ret_x_1 = ret_x.1;\n    let ret_x_1_len = ret_x_1.len();\n    _ffi_vec_Bar_to_swift(ret_x_1, &mut buf);\n    let ret_y = ret.y;\n    let ret_y_len = ret_y.len();\n    _ffi_vec__i32_f32_bool_to_swift(ret_y, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_i32_ptr_4_usize(ret_x_0_x, buf_ptr, buf_cap, ret_x_0_y_len, ret_x_1_len, ret_y_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr_4_usize(i32, *const u8, usize, usize, usize, usize);\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Bar_to_swift(items: Vec<Bar>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.x, buf);\n        _ffi_write(item.y.len(), buf);\n        _ffi_vec_Foo_to_swift(item.y, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_to_swift(items: Vec<Foo>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.x.0.x, buf);\n        _ffi_write(item.x.0.y.len(), buf);\n        _ffi_vec_Foo_to_swift(item.x.0.y, buf);\n        _ffi_write(item.x.1.len(), buf);\n        _ffi_vec_Bar_to_swift(item.x.1, buf);\n        _ffi_write(item.y.len(), buf);\n        _ffi_vec__i32_f32_bool_to_swift(item.y, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__i32_f32_bool_to_swift(items: Vec<((), (i32,), (f32, bool))>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ = item.0;\n        _ffi_write(item.1.0, buf);\n        _ffi_write(item.2.0, buf);\n        _ffi_write(item.2.1, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_enum_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nint32_t _ffi_fn_big_to_i32(int32_t big_raw);\n\nint32_t _ffi_fn_foo_to_i32(int32_t foo_raw);\n\nvoid _ffi_fn_long_in(const void* buf_ptr);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_enum_in_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nenum Foo: Int32 {\n    case Zero = 0\n    case One = 1\n    case Hundred = 100\n}\n\nenum Big: Int32 {\n    case Min = -2147483648\n    case Max = 2147483647\n}\n\nenum LongEnum {\n    case Empty\n    case ShortTuple(Int32)\n    case ShortStruct(a: Int32)\n    case LongTuple(Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32)\n    case LongStruct(a: Int32, b: Int32, c: Int32, d: Int32, e: Int32, f: Int32)\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc foo_to_i32(_ foo: Foo) -> Int32 {\n    return _ffi_fn_foo_to_i32(foo.rawValue)\n}\n\nfunc big_to_i32(_ big: Big) -> Int32 {\n    return _ffi_fn_big_to_i32(big.rawValue)\n}\n\nfunc long_in(_ _1: LongEnum) {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_enum_LongEnum_to_rust(_1, &buf)\n    _ffi_fn_long_in(_ffi_vec_to_rust(buf))\n}\n\nprivate func _ffi_enum_LongEnum_to_rust(_ val: LongEnum, _ buf: inout ContiguousArray<UInt8>) {\n    switch val {\n    case .Empty:\n        _ffi_write(0 as Int32, &buf)\n    case let .ShortTuple(x):\n        _ffi_write(1 as Int32, &buf)\n        _ffi_write(x, &buf)\n    case let .ShortStruct(a):\n        _ffi_write(2 as Int32, &buf)\n        _ffi_write(a, &buf)\n    case let .LongTuple(x0, x1, x2, x3, x4, x5, x6, x7):\n        _ffi_write(3 as Int32, &buf)\n        _ffi_write(x0, &buf)\n        _ffi_write(x1, &buf)\n        _ffi_write(x2, &buf)\n        _ffi_write(x3, &buf)\n        _ffi_write(x4, &buf)\n        _ffi_write(x5, &buf)\n        _ffi_write(x6, &buf)\n        _ffi_write(x7, &buf)\n    case let .LongStruct(a, b, c, d, e, f):\n        _ffi_write(4 as Int32, &buf)\n        _ffi_write(a, &buf)\n        _ffi_write(b, &buf)\n        _ffi_write(c, &buf)\n        _ffi_write(d, &buf)\n        _ffi_write(e, &buf)\n        _ffi_write(f, &buf)\n    }\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_enum_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Big_from_swift(val: i32) -> Big {\n    match val {\n        -2147483648 => Big::Min,\n        2147483647 => Big::Max,\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_from_swift(val: i32) -> Foo {\n    match val {\n        0 => Foo::Zero,\n        1 => Foo::One,\n        100 => Foo::Hundred,\n        _ => panic!(),\n    }\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_LongEnum_from_swift(end: &mut *const u8) -> LongEnum {\n    match _ffi_read::<i32>(end) {\n        0 => LongEnum::Empty,\n        1 => LongEnum::ShortTuple(_ffi_read::<i32>(end)),\n        2 => LongEnum::ShortStruct { a: _ffi_read::<i32>(end) },\n        3 => LongEnum::LongTuple(\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end)\n        ),\n        4 => LongEnum::LongStruct {\n            a: _ffi_read::<i32>(end),\n            b: _ffi_read::<i32>(end),\n            c: _ffi_read::<i32>(end),\n            d: _ffi_read::<i32>(end),\n            e: _ffi_read::<i32>(end),\n            f: _ffi_read::<i32>(end)\n        },\n        _ => panic!(),\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_big_to_i32(big_raw: i32) -> i32 {\n    big_to_i32(_ffi_enum_Big_from_swift(big_raw))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_foo_to_i32(foo_raw: i32) -> i32 {\n    foo_to_i32(_ffi_enum_Foo_from_swift(foo_raw))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_long_in(buf_ptr: *const u8) {\n    let mut buf_end = buf_ptr;\n    long_in(_ffi_enum_LongEnum_from_swift(&mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_enum_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nint32_t _ffi_fn_big_to_i32(int32_t big_raw);\n\nint32_t _ffi_fn_foo_to_i32(int32_t foo_raw);\n\nvoid _ffi_fn_long_in(const void* buf_ptr);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_enum_in_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nenum Foo: Int32 {\n    case Zero = 0\n    case One = 1\n    case Hundred = 100\n}\n\nenum Big: Int32 {\n    case Min = -2147483648\n    case Max = 2147483647\n}\n\nenum LongEnum {\n    case Empty\n    case ShortTuple(Int32)\n    case ShortStruct(a: Int32)\n    case LongTuple(Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32)\n    case LongStruct(a: Int32, b: Int32, c: Int32, d: Int32, e: Int32, f: Int32)\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc foo_to_i32(_ foo: Foo) -> Int32 {\n    return _ffi_fn_foo_to_i32(foo.rawValue)\n}\n\nfunc big_to_i32(_ big: Big) -> Int32 {\n    return _ffi_fn_big_to_i32(big.rawValue)\n}\n\nfunc long_in(_ _1: LongEnum) {\n    var buf = ContiguousArray<UInt8>()\n    _ffi_enum_LongEnum_to_rust(_1, &buf)\n    _ffi_fn_long_in(_ffi_vec_to_rust(buf))\n}\n\nprivate func _ffi_enum_LongEnum_to_rust(_ val: LongEnum, _ buf: inout ContiguousArray<UInt8>) {\n    switch val {\n    case .Empty:\n        _ffi_write(0 as Int32, &buf)\n    case let .ShortTuple(x):\n        _ffi_write(1 as Int32, &buf)\n        _ffi_write(x, &buf)\n    case let .ShortStruct(a):\n        _ffi_write(2 as Int32, &buf)\n        _ffi_write(a, &buf)\n    case let .LongTuple(x0, x1, x2, x3, x4, x5, x6, x7):\n        _ffi_write(3 as Int32, &buf)\n        _ffi_write(x0, &buf)\n        _ffi_write(x1, &buf)\n        _ffi_write(x2, &buf)\n        _ffi_write(x3, &buf)\n        _ffi_write(x4, &buf)\n        _ffi_write(x5, &buf)\n        _ffi_write(x6, &buf)\n        _ffi_write(x7, &buf)\n    case let .LongStruct(a, b, c, d, e, f):\n        _ffi_write(4 as Int32, &buf)\n        _ffi_write(a, &buf)\n        _ffi_write(b, &buf)\n        _ffi_write(c, &buf)\n        _ffi_write(d, &buf)\n        _ffi_write(e, &buf)\n        _ffi_write(f, &buf)\n    }\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_enum_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Big_from_swift(val: i32) -> Big {\n    match val {\n        -2147483648 => Big::Min,\n        2147483647 => Big::Max,\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_from_swift(val: i32) -> Foo {\n    match val {\n        0 => Foo::Zero,\n        1 => Foo::One,\n        100 => Foo::Hundred,\n        _ => panic!(),\n    }\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_LongEnum_from_swift(end: &mut *const u8) -> LongEnum {\n    match _ffi_read::<i32>(end) {\n        0 => LongEnum::Empty,\n        1 => LongEnum::ShortTuple(_ffi_read::<i32>(end)),\n        2 => LongEnum::ShortStruct { a: _ffi_read::<i32>(end) },\n        3 => LongEnum::LongTuple(\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end)\n        ),\n        4 => LongEnum::LongStruct {\n            a: _ffi_read::<i32>(end),\n            b: _ffi_read::<i32>(end),\n            c: _ffi_read::<i32>(end),\n            d: _ffi_read::<i32>(end),\n            e: _ffi_read::<i32>(end),\n            f: _ffi_read::<i32>(end)\n        },\n        _ => panic!(),\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_big_to_i32(big_raw: i32) -> i32 {\n    big_to_i32(_ffi_enum_Big_from_swift(big_raw))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_foo_to_i32(foo_raw: i32) -> i32 {\n    foo_to_i32(_ffi_enum_Foo_from_swift(foo_raw))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_long_in(buf_ptr: *const u8) {\n    let mut buf_end = buf_ptr;\n    long_in(_ffi_enum_LongEnum_from_swift(&mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_enum_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\nint32_t _ffi_fn_i32_to_big(int32_t big);\n\nint32_t _ffi_fn_i32_to_foo(int32_t foo);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n} _ffi_ret_ptr_usize;\n\n_ffi_ret_ptr_usize _ffi_fn_long_out();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_enum_out_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nenum Foo: Int32 {\n    case Zero = 0\n    case One = 1\n    case Hundred = 100\n}\n\nenum Big: Int32 {\n    case Min = -2147483648\n    case Max = 2147483647\n}\n\nenum LongEnum {\n    case Empty\n    case ShortTuple(Int32)\n    case ShortStruct(a: Int32)\n    case LongTuple(Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32)\n    case LongStruct(a: Int32, b: Int32, c: Int32, d: Int32, e: Int32, f: Int32)\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc i32_to_foo(_ foo: Int32) -> Foo {\n    let ret_raw = _ffi_fn_i32_to_foo(foo)\n    return Foo(rawValue: ret_raw)!\n}\n\nfunc i32_to_big(_ big: Int32) -> Big {\n    let ret_raw = _ffi_fn_i32_to_big(big)\n    return Big(rawValue: ret_raw)!\n}\n\nfunc long_out() -> LongEnum {\n    let multi_ret = _ffi_fn_long_out()\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end = buf_ptr!\n    let ret = _ffi_enum_LongEnum_from_rust(&buf_end)\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\nprivate func _ffi_enum_LongEnum_from_rust(_ end: inout UnsafeRawPointer) -> LongEnum {\n    switch _ffi_read(&end) as Int32 {\n        case 0: return .Empty\n        case 1: return .ShortTuple(_ffi_read(&end) as Int32)\n        case 2: return .ShortStruct(a: _ffi_read(&end) as Int32)\n        case 3: return .LongTuple(\n            _ffi_read(&end) as Int32,\n            _ffi_read(&end) as Int32,\n            _ffi_read(&end) as Int32,\n            _ffi_read(&end) as Int32,\n            _ffi_read(&end) as Int32,\n            _ffi_read(&end) as Int32,\n            _ffi_read(&end) as Int32,\n            _ffi_read(&end) as Int32\n        )\n        case 4: return .LongStruct(\n            a: _ffi_read(&end) as Int32,\n            b: _ffi_read(&end) as Int32,\n            c: _ffi_read(&end) as Int32,\n            d: _ffi_read(&end) as Int32,\n            e: _ffi_read(&end) as Int32,\n            f: _ffi_read(&end) as Int32\n        )\n        default: fatalError()\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_enum_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_LongEnum_to_swift(val: LongEnum, buf: &mut Vec<u8>) {\n    match val {\n        LongEnum::Empty => _ffi_write(0 as i32, buf),\n        LongEnum::ShortTuple(x) => {\n            _ffi_write(1 as i32, buf);\n            _ffi_write(x, buf);\n        }\n        LongEnum::ShortStruct { a } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(a, buf);\n        }\n        LongEnum::LongTuple(x0, x1, x2, x3, x4, x5, x6, x7) => {\n            _ffi_write(3 as i32, buf);\n            _ffi_write(x0, buf);\n            _ffi_write(x1, buf);\n            _ffi_write(x2, buf);\n            _ffi_write(x3, buf);\n            _ffi_write(x4, buf);\n            _ffi_write(x5, buf);\n            _ffi_write(x6, buf);\n            _ffi_write(x7, buf);\n        }\n        LongEnum::LongStruct { a, b, c, d, e, f } => {\n            _ffi_write(4 as i32, buf);\n            _ffi_write(a, buf);\n            _ffi_write(b, buf);\n            _ffi_write(c, buf);\n            _ffi_write(d, buf);\n            _ffi_write(e, buf);\n            _ffi_write(f, buf);\n        }\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_i32_to_big(big: i32) -> i32 {\n    i32_to_big(big) as i32\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_i32_to_foo(foo: i32) -> i32 {\n    i32_to_foo(foo) as i32\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_long_out() -> _ffi_ret_ptr_usize {\n    let mut buf = Vec::<u8>::new();\n    _ffi_enum_LongEnum_to_swift(long_out(), &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize(buf_ptr, buf_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_enum_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\nint32_t _ffi_fn_i32_to_big(int32_t big);\n\nint32_t _ffi_fn_i32_to_foo(int32_t foo);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n} _ffi_ret_ptr_usize;\n\n_ffi_ret_ptr_usize _ffi_fn_long_out();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_enum_out_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nenum Foo: Int32 {\n    case Zero = 0\n    case One = 1\n    case Hundred = 100\n}\n\nenum Big: Int32 {\n    case Min = -2147483648\n    case Max = 2147483647\n}\n\nenum LongEnum {\n    case Empty\n    case ShortTuple(Int32)\n    case ShortStruct(a: Int32)\n    case LongTuple(Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32)\n    case LongStruct(a: Int32, b: Int32, c: Int32, d: Int32, e: Int32, f: Int32)\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc i32_to_foo(_ foo: Int32) -> Foo {\n    let ret_raw = _ffi_fn_i32_to_foo(foo)\n    return Foo(rawValue: ret_raw)!\n}\n\nfunc i32_to_big(_ big: Int32) -> Big {\n    let ret_raw = _ffi_fn_i32_to_big(big)\n    return Big(rawValue: ret_raw)!\n}\n\nfunc long_out() -> LongEnum {\n    let multi_ret = _ffi_fn_long_out()\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    var buf_end = buf_ptr!\n    let ret = _ffi_enum_LongEnum_from_rust(&buf_end)\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\nprivate func _ffi_enum_LongEnum_from_rust(_ end: inout UnsafeRawPointer) -> LongEnum {\n    switch _ffi_read(&end) as Int32 {\n        case 0: return .Empty\n        case 1: return .ShortTuple(_ffi_read(&end) as Int32)\n        case 2: return .ShortStruct(a: _ffi_read(&end) as Int32)\n        case 3: return .LongTuple(\n            _ffi_read(&end) as Int32,\n            _ffi_read(&end) as Int32,\n            _ffi_read(&end) as Int32,\n            _ffi_read(&end) as Int32,\n            _ffi_read(&end) as Int32,\n            _ffi_read(&end) as Int32,\n            _ffi_read(&end) as Int32,\n            _ffi_read(&end) as Int32\n        )\n        case 4: return .LongStruct(\n            a: _ffi_read(&end) as Int32,\n            b: _ffi_read(&end) as Int32,\n            c: _ffi_read(&end) as Int32,\n            d: _ffi_read(&end) as Int32,\n            e: _ffi_read(&end) as Int32,\n            f: _ffi_read(&end) as Int32\n        )\n        default: fatalError()\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_enum_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_LongEnum_to_swift(val: LongEnum, buf: &mut Vec<u8>) {\n    match val {\n        LongEnum::Empty => _ffi_write(0 as i32, buf),\n        LongEnum::ShortTuple(x) => {\n            _ffi_write(1 as i32, buf);\n            _ffi_write(x, buf);\n        }\n        LongEnum::ShortStruct { a } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(a, buf);\n        }\n        LongEnum::LongTuple(x0, x1, x2, x3, x4, x5, x6, x7) => {\n            _ffi_write(3 as i32, buf);\n            _ffi_write(x0, buf);\n            _ffi_write(x1, buf);\n            _ffi_write(x2, buf);\n            _ffi_write(x3, buf);\n            _ffi_write(x4, buf);\n            _ffi_write(x5, buf);\n            _ffi_write(x6, buf);\n            _ffi_write(x7, buf);\n        }\n        LongEnum::LongStruct { a, b, c, d, e, f } => {\n            _ffi_write(4 as i32, buf);\n            _ffi_write(a, buf);\n            _ffi_write(b, buf);\n            _ffi_write(c, buf);\n            _ffi_write(d, buf);\n            _ffi_write(e, buf);\n            _ffi_write(f, buf);\n        }\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_i32_to_big(big: i32) -> i32 {\n    i32_to_big(big) as i32\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_i32_to_foo(foo: i32) -> i32 {\n    i32_to_foo(foo) as i32\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_long_out() -> _ffi_ret_ptr_usize {\n    let mut buf = Vec::<u8>::new();\n    _ffi_enum_LongEnum_to_swift(long_out(), &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize(buf_ptr, buf_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_nested_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_test(int32_t x_0, const void* x_1_ptr_ptr, const void* buf_ptr, uintptr_t x_2_len);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_nested_in_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Bar: AnyObject {\n    func get() -> Int32\n}\n\nstruct Foo {\n    var empty: ()\n    var ptr: Bar\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc test(_ x: (Int32, Foo, [(Int32, Foo)])) -> Int32 {\n    let x_1_ptr_ptr = UnsafeRawPointer(Unmanaged.passRetained(x.1.ptr as AnyObject).toOpaque())\n    var buf = ContiguousArray<UInt8>()\n    let x_2_len = UInt(x.2.count)\n    _ffi_vec_i32_Foo_to_rust(x.2, &buf)\n    return _ffi_fn_test(x.0, x_1_ptr_ptr, _ffi_vec_to_rust(buf), x_2_len)\n}\n\n@_cdecl(\"_ffi_swift_Bar__get\")\nfunc _ffi_swift_Bar__get(_self: UnsafeRawPointer?) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Bar\n    return _self.get()\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n\nprivate func _ffi_vec_i32_Foo_to_rust(_ items: [(Int32, Foo)], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item.0, &buf)\n        _ffi_write(UnsafeRawPointer(Unmanaged.passRetained(item.1.ptr as AnyObject).toOpaque()), &buf)\n    }\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_nested_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test(x_0: i32, x_1_ptr_ptr: *const u8, buf_ptr: *const u8, x_2_len: usize) -> i32 {\n    let x_1 = Foo { empty: (), ptr: std::rc::Rc::new(_ffi_rs_Bar(x_1_ptr_ptr)) };\n    let mut buf_end = buf_ptr;\n    let ret = test((x_0, x_1, _ffi_vec_i32_Foo_from_swift(x_2_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Bar(*const u8);\n\nimpl Drop for _ffi_rs_Bar {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Bar for _ffi_rs_Bar {\n    fn get(&self) -> i32 {\n        extern \"C\" { fn _ffi_swift_Bar__get(_: *const u8) -> i32; }\n        unsafe { _ffi_swift_Bar__get(self.0) }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_i32_Foo_from_swift(len: usize, end: &mut *const u8) -> Vec<(i32, Foo)> {\n    let mut items = Vec::<(i32, Foo)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((\n            _ffi_read::<i32>(end),\n            Foo { empty: (), ptr: std::rc::Rc::new(_ffi_rs_Bar(_ffi_read::<*const u8>(end))) }\n        ));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_nested_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_test(int32_t x_0, const void* x_1_ptr_ptr, const void* buf_ptr, uintptr_t x_2_len);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_nested_in_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Bar: AnyObject {\n    func get() -> Int32\n}\n\nstruct Foo {\n    var empty: ()\n    var ptr: Bar\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc test(_ x: (Int32, Foo, [(Int32, Foo)])) -> Int32 {\n    let x_1_ptr_ptr = UnsafeRawPointer(Unmanaged.passRetained(x.1.ptr as AnyObject).toOpaque())\n    var buf = ContiguousArray<UInt8>()\n    let x_2_len = UInt(x.2.count)\n    _ffi_vec_i32_Foo_to_rust(x.2, &buf)\n    return _ffi_fn_test(x.0, x_1_ptr_ptr, _ffi_vec_to_rust(buf), x_2_len)\n}\n\n@_cdecl(\"_ffi_swift_Bar__get\")\nfunc _ffi_swift_Bar__get(_self: UnsafeRawPointer?) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Bar\n    return _self.get()\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n\nprivate func _ffi_vec_i32_Foo_to_rust(_ items: [(Int32, Foo)], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item.0, &buf)\n        _ffi_write(UnsafeRawPointer(Unmanaged.passRetained(item.1.ptr as AnyObject).toOpaque()), &buf)\n    }\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_nested_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test(x_0: i32, x_1_ptr_ptr: *const u8, buf_ptr: *const u8, x_2_len: usize) -> i32 {\n    let x_1 = Foo { empty: (), ptr: std::rc::Rc::new(_ffi_rs_Bar(x_1_ptr_ptr)) };\n    let mut buf_end = buf_ptr;\n    let ret = test((x_0, x_1, _ffi_vec_i32_Foo_from_swift(x_2_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Bar(*const u8);\n\nimpl Drop for _ffi_rs_Bar {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Bar for _ffi_rs_Bar {\n    fn get(&self) -> i32 {\n        unsafe extern \"C\" { fn _ffi_swift_Bar__get(_: *const u8) -> i32; }\n        unsafe { _ffi_swift_Bar__get(self.0) }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_i32_Foo_from_swift(len: usize, end: &mut *const u8) -> Vec<(i32, Foo)> {\n    let mut items = Vec::<(i32, Foo)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((\n            _ffi_read::<i32>(end),\n            Foo { empty: (), ptr: std::rc::Rc::new(_ffi_rs_Bar(_ffi_read::<*const u8>(end))) }\n        ));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_nested_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_Rc_Bar__get(const void*);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\ntypedef struct {\n    int32_t _0;\n    const void* _1;\n} _ffi_ret_i32_ptr;\n\n_ffi_ret_i32_ptr _ffi_fn_test(int32_t x);\n\nvoid _ffi_rs_drop_Rc_Bar(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_nested_out_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Bar: AnyObject {\n    func get() -> Int32\n}\n\nstruct Foo {\n    var ptr: Bar\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc test(_ x: Int32) -> (Int32, Foo) {\n    let multi_ret = _ffi_fn_test(x)\n    let ret_0 = multi_ret._0\n    let ret_1_ptr_ptr = multi_ret._1\n    return (ret_0, Foo(ptr: _ffi_Rc_Bar(ret_1_ptr_ptr)))\n}\n\nprivate class _ffi_Rc_Bar : Bar {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Rc_Bar(_ffi)\n    }\n\n    func get() -> Int32 {\n        return _ffi_Rc_Bar__get(_ffi)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_nested_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Bar__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Bar>) };\n    _self.get()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test(x: i32) -> _ffi_ret_i32_ptr {\n    let ret = test(x);\n    let ret_0 = ret.0;\n    let ret_1 = ret.1;\n    _ffi_ret_i32_ptr(ret_0, Box::into_raw(Box::new(ret_1.ptr)) as *const u8)\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr(i32, *const u8);\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Rc_Bar(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Bar>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_nested_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_Rc_Bar__get(const void*);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\ntypedef struct {\n    int32_t _0;\n    const void* _1;\n} _ffi_ret_i32_ptr;\n\n_ffi_ret_i32_ptr _ffi_fn_test(int32_t x);\n\nvoid _ffi_rs_drop_Rc_Bar(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_nested_out_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Bar: AnyObject {\n    func get() -> Int32\n}\n\nstruct Foo {\n    var ptr: Bar\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc test(_ x: Int32) -> (Int32, Foo) {\n    let multi_ret = _ffi_fn_test(x)\n    let ret_0 = multi_ret._0\n    let ret_1_ptr_ptr = multi_ret._1\n    return (ret_0, Foo(ptr: _ffi_Rc_Bar(ret_1_ptr_ptr)))\n}\n\nprivate class _ffi_Rc_Bar : Bar {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Rc_Bar(_ffi)\n    }\n\n    func get() -> Int32 {\n        return _ffi_Rc_Bar__get(_ffi)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_nested_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Bar__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Bar>) };\n    _self.get()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test(x: i32) -> _ffi_ret_i32_ptr {\n    let ret = test(x);\n    let ret_0 = ret.0;\n    let ret_1 = ret.1;\n    _ffi_ret_i32_ptr(ret_0, Box::into_raw(Box::new(ret_1.ptr)) as *const u8)\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr(i32, *const u8);\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Rc_Bar(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Bar>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_option_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\nint32_t _ffi_fn_add_all(const void* buf_ptr, uintptr_t x_len);\n\nint32_t _ffi_fn_add_nested(const void* buf_ptr, _Bool has_x, _Bool has_y);\n\nint32_t _ffi_fn_add_option(const void* buf_ptr, _Bool has_x, _Bool has_y);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_join_all(const void* buf_ptr, uintptr_t x_len);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_option_in_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc add_option(_ x: Int32?, _ y: Int32?) -> Int32 {\n    var buf = ContiguousArray<UInt8>()\n    let has_x = x != nil\n    if let x_val = x {\n        _ffi_write(x_val, &buf)\n    }\n    let has_y = y != nil\n    if let y_val = y {\n        _ffi_write(y_val, &buf)\n    }\n    return _ffi_fn_add_option(_ffi_vec_to_rust(buf), has_x, has_y)\n}\n\nfunc add_nested(_ x: Int32??, _ y: Int32??) -> Int32 {\n    var buf = ContiguousArray<UInt8>()\n    let has_x = x != nil\n    if let x_val = x {\n        _ffi_write(x_val != nil, &buf)\n        if let x_val_val = x_val {\n            _ffi_write(x_val_val, &buf)\n        }\n    }\n    let has_y = y != nil\n    if let y_val = y {\n        _ffi_write(y_val != nil, &buf)\n        if let y_val_val = y_val {\n            _ffi_write(y_val_val, &buf)\n        }\n    }\n    return _ffi_fn_add_nested(_ffi_vec_to_rust(buf), has_x, has_y)\n}\n\nfunc add_all(_ x: [Int32?]) -> Int32 {\n    var buf = ContiguousArray<UInt8>()\n    let x_len = UInt(x.count)\n    _ffi_vec_option_i32_to_rust(x, &buf)\n    return _ffi_fn_add_all(_ffi_vec_to_rust(buf), x_len)\n}\n\nfunc join_all(_ x: [String?]) -> String {\n    var buf = ContiguousArray<UInt8>()\n    let x_len = UInt(x.count)\n    _ffi_vec_option_string_to_rust(x, &buf)\n    let multi_ret = _ffi_fn_join_all(_ffi_vec_to_rust(buf), x_len)\n    let ret_ptr = multi_ret._0\n    let ret_len = multi_ret._1\n    let ret_cap = multi_ret._2\n    return _ffi_string_from_rust(ret_ptr, Int(ret_len), ret_cap)\n}\n\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\nprivate func _ffi_string_to_rust(_ str: String) -> (UnsafeRawPointer?, UInt) {\n    var str = str\n    return str.withUTF8 { str in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(str.count), count: str.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: str.baseAddress, count: str.count))\n        return (UnsafeRawPointer(buf.baseAddress), UInt(buf.count))\n    }\n}\n\nprivate func _ffi_vec_option_i32_to_rust(_ items: [Int32?], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item != nil, &buf)\n        if let item_val = item {\n            _ffi_write(item_val, &buf)\n        }\n    }\n}\n\nprivate func _ffi_vec_option_string_to_rust(_ items: [String?], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item != nil, &buf)\n        if let item_val = item {\n            let (item_val_ptr, item_val_len) = _ffi_string_to_rust(item_val);\n            _ffi_write(item_val_ptr, &buf)\n            _ffi_write(item_val_len, &buf)\n        }\n    }\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_option_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_all(buf_ptr: *const u8, x_len: usize) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_all(_ffi_vec_option_i32_from_swift(x_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_nested(buf_ptr: *const u8, has_x: bool, has_y: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_nested(\n        has_x.then(|| _ffi_read::<bool>(&mut buf_end).then(|| _ffi_read::<i32>(&mut buf_end))),\n        has_y.then(|| _ffi_read::<bool>(&mut buf_end).then(|| _ffi_read::<i32>(&mut buf_end)))\n    );\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_option(buf_ptr: *const u8, has_x: bool, has_y: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_option(has_x.then(|| _ffi_read::<i32>(&mut buf_end)), has_y.then(|| _ffi_read::<i32>(&mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_join_all(buf_ptr: *const u8, x_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(join_all(_ffi_vec_option_string_from_swift(x_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_option_i32_from_swift(len: usize, end: &mut *const u8) -> Vec<Option<i32>> {\n    let mut items = Vec::<Option<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<bool>(end).then(|| _ffi_read::<i32>(end)));\n    }\n    items\n}\n\nfn _ffi_vec_option_string_from_swift(len: usize, end: &mut *const u8) -> Vec<Option<String>> {\n    let mut items = Vec::<Option<String>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<bool>(end).then(|| _ffi_string_from_host(_ffi_read::<*const u8>(end), _ffi_read::<usize>(end))));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_option_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\nint32_t _ffi_fn_add_all(const void* buf_ptr, uintptr_t x_len);\n\nint32_t _ffi_fn_add_nested(const void* buf_ptr, _Bool has_x, _Bool has_y);\n\nint32_t _ffi_fn_add_option(const void* buf_ptr, _Bool has_x, _Bool has_y);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_join_all(const void* buf_ptr, uintptr_t x_len);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_option_in_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc add_option(_ x: Int32?, _ y: Int32?) -> Int32 {\n    var buf = ContiguousArray<UInt8>()\n    let has_x = x != nil\n    if let x_val = x {\n        _ffi_write(x_val, &buf)\n    }\n    let has_y = y != nil\n    if let y_val = y {\n        _ffi_write(y_val, &buf)\n    }\n    return _ffi_fn_add_option(_ffi_vec_to_rust(buf), has_x, has_y)\n}\n\nfunc add_nested(_ x: Int32??, _ y: Int32??) -> Int32 {\n    var buf = ContiguousArray<UInt8>()\n    let has_x = x != nil\n    if let x_val = x {\n        _ffi_write(x_val != nil, &buf)\n        if let x_val_val = x_val {\n            _ffi_write(x_val_val, &buf)\n        }\n    }\n    let has_y = y != nil\n    if let y_val = y {\n        _ffi_write(y_val != nil, &buf)\n        if let y_val_val = y_val {\n            _ffi_write(y_val_val, &buf)\n        }\n    }\n    return _ffi_fn_add_nested(_ffi_vec_to_rust(buf), has_x, has_y)\n}\n\nfunc add_all(_ x: [Int32?]) -> Int32 {\n    var buf = ContiguousArray<UInt8>()\n    let x_len = UInt(x.count)\n    _ffi_vec_option_i32_to_rust(x, &buf)\n    return _ffi_fn_add_all(_ffi_vec_to_rust(buf), x_len)\n}\n\nfunc join_all(_ x: [String?]) -> String {\n    var buf = ContiguousArray<UInt8>()\n    let x_len = UInt(x.count)\n    _ffi_vec_option_string_to_rust(x, &buf)\n    let multi_ret = _ffi_fn_join_all(_ffi_vec_to_rust(buf), x_len)\n    let ret_ptr = multi_ret._0\n    let ret_len = multi_ret._1\n    let ret_cap = multi_ret._2\n    return _ffi_string_from_rust(ret_ptr, Int(ret_len), ret_cap)\n}\n\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\nprivate func _ffi_string_to_rust(_ str: String) -> (UnsafeRawPointer?, UInt) {\n    var str = str\n    return str.withUTF8 { str in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(str.count), count: str.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: str.baseAddress, count: str.count))\n        return (UnsafeRawPointer(buf.baseAddress), UInt(buf.count))\n    }\n}\n\nprivate func _ffi_vec_option_i32_to_rust(_ items: [Int32?], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item != nil, &buf)\n        if let item_val = item {\n            _ffi_write(item_val, &buf)\n        }\n    }\n}\n\nprivate func _ffi_vec_option_string_to_rust(_ items: [String?], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item != nil, &buf)\n        if let item_val = item {\n            let (item_val_ptr, item_val_len) = _ffi_string_to_rust(item_val);\n            _ffi_write(item_val_ptr, &buf)\n            _ffi_write(item_val_len, &buf)\n        }\n    }\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_option_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_all(buf_ptr: *const u8, x_len: usize) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_all(_ffi_vec_option_i32_from_swift(x_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_nested(buf_ptr: *const u8, has_x: bool, has_y: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_nested(\n        has_x.then(|| _ffi_read::<bool>(&mut buf_end).then(|| _ffi_read::<i32>(&mut buf_end))),\n        has_y.then(|| _ffi_read::<bool>(&mut buf_end).then(|| _ffi_read::<i32>(&mut buf_end)))\n    );\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_option(buf_ptr: *const u8, has_x: bool, has_y: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_option(has_x.then(|| _ffi_read::<i32>(&mut buf_end)), has_y.then(|| _ffi_read::<i32>(&mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_join_all(buf_ptr: *const u8, x_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(join_all(_ffi_vec_option_string_from_swift(x_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_option_i32_from_swift(len: usize, end: &mut *const u8) -> Vec<Option<i32>> {\n    let mut items = Vec::<Option<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<bool>(end).then(|| _ffi_read::<i32>(end)));\n    }\n    items\n}\n\nfn _ffi_vec_option_string_from_swift(len: usize, end: &mut *const u8) -> Vec<Option<String>> {\n    let mut items = Vec::<Option<String>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<bool>(end).then(|| _ffi_string_from_host(_ffi_read::<*const u8>(end), _ffi_read::<usize>(end))));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_option_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    _Bool _2;\n} _ffi_ret_ptr_usize_bool;\n\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_int(_Bool x, int32_t y);\n\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_opt_int(_Bool x, _Bool y, int32_t z);\n\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_vec_opt_string(int32_t n);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_vec_opt_int(int32_t n);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_option_out_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc opt_int(_ x: Bool, _ y: Int32) -> Int32? {\n    let multi_ret = _ffi_fn_opt_int(x, y)\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    let has_ret = multi_ret._2\n    var buf_end = buf_ptr!\n    let ret = has_ret ? _ffi_read(&buf_end) as Int32 : nil\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nfunc opt_opt_int(_ x: Bool, _ y: Bool, _ z: Int32) -> Int32?? {\n    let multi_ret = _ffi_fn_opt_opt_int(x, y, z)\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    let has_ret = multi_ret._2\n    var buf_end = buf_ptr!\n    let ret = has_ret ? Optional.some(_ffi_read(&buf_end) as Bool ? _ffi_read(&buf_end) as Int32 : nil) : nil\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nfunc vec_opt_int(_ n: Int32) -> [Int32?] {\n    let multi_ret = _ffi_fn_vec_opt_int(n)\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_len = multi_ret._2\n    var buf_end = buf_ptr!\n    let ret = _ffi_vec_option_i32_from_rust(Int(ret_len), &buf_end)\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nfunc opt_vec_opt_string(_ n: Int32) -> [String?]? {\n    let multi_ret = _ffi_fn_opt_vec_opt_string(n)\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    let has_ret = multi_ret._2\n    var buf_end = buf_ptr!\n    let ret = has_ret ? _ffi_vec_option_string_from_rust(Int(_ffi_read(&buf_end) as UInt), &buf_end) : nil\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\nprivate func _ffi_vec_option_i32_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Int32?] {\n    var items: [Int32?] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_read(&end) as Bool ? _ffi_read(&end) as Int32 : nil)\n    }\n    return items\n}\n\nprivate func _ffi_vec_option_string_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [String?] {\n    var items: [String?] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_read(&end) as Bool ? _ffi_string_from_rust(_ffi_read(&end) as UnsafeRawPointer?, Int(_ffi_read(&end) as UInt), _ffi_read(&end) as UInt) : nil)\n    }\n    return items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_option_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_int(x: bool, y: i32) -> _ffi_ret_ptr_usize_bool {\n    let ret = opt_int(x, y);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_opt_int(x: bool, y: bool, z: i32) -> _ffi_ret_ptr_usize_bool {\n    let ret = opt_opt_int(x, y, z);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val.is_some(), &mut buf);\n        if let Some(ret_val_val) = ret_val {\n            _ffi_write(ret_val_val, &mut buf);\n        }\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_vec_opt_string(n: i32) -> _ffi_ret_ptr_usize_bool {\n    let ret = opt_vec_opt_string(n);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val.len(), &mut buf);\n        _ffi_vec_option_string_to_swift(ret_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_opt_int(n: i32) -> _ffi_ret_ptr_2_usize {\n    let ret = vec_opt_int(n);\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_option_i32_to_swift(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len)\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize_bool(*const u8, usize, bool);\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_option_i32_to_swift(items: Vec<Option<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.is_some(), buf);\n        if let Some(item_val) = item {\n            _ffi_write(item_val, buf);\n        }\n    }\n}\n\nfn _ffi_vec_option_string_to_swift(items: Vec<Option<String>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.is_some(), buf);\n        if let Some(item_val) = item {\n            let (item_val_ptr, item_val_len, item_val_cap) = _ffi_string_to_host(item_val);\n            _ffi_write(item_val_ptr, buf);\n            _ffi_write(item_val_len, buf);\n            _ffi_write(item_val_cap, buf);\n        }\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_option_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    _Bool _2;\n} _ffi_ret_ptr_usize_bool;\n\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_int(_Bool x, int32_t y);\n\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_opt_int(_Bool x, _Bool y, int32_t z);\n\n_ffi_ret_ptr_usize_bool _ffi_fn_opt_vec_opt_string(int32_t n);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_vec_opt_int(int32_t n);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_option_out_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc opt_int(_ x: Bool, _ y: Int32) -> Int32? {\n    let multi_ret = _ffi_fn_opt_int(x, y)\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    let has_ret = multi_ret._2\n    var buf_end = buf_ptr!\n    let ret = has_ret ? _ffi_read(&buf_end) as Int32 : nil\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nfunc opt_opt_int(_ x: Bool, _ y: Bool, _ z: Int32) -> Int32?? {\n    let multi_ret = _ffi_fn_opt_opt_int(x, y, z)\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    let has_ret = multi_ret._2\n    var buf_end = buf_ptr!\n    let ret = has_ret ? Optional.some(_ffi_read(&buf_end) as Bool ? _ffi_read(&buf_end) as Int32 : nil) : nil\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nfunc vec_opt_int(_ n: Int32) -> [Int32?] {\n    let multi_ret = _ffi_fn_vec_opt_int(n)\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_len = multi_ret._2\n    var buf_end = buf_ptr!\n    let ret = _ffi_vec_option_i32_from_rust(Int(ret_len), &buf_end)\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nfunc opt_vec_opt_string(_ n: Int32) -> [String?]? {\n    let multi_ret = _ffi_fn_opt_vec_opt_string(n)\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    let has_ret = multi_ret._2\n    var buf_end = buf_ptr!\n    let ret = has_ret ? _ffi_vec_option_string_from_rust(Int(_ffi_read(&buf_end) as UInt), &buf_end) : nil\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\nprivate func _ffi_vec_option_i32_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Int32?] {\n    var items: [Int32?] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_read(&end) as Bool ? _ffi_read(&end) as Int32 : nil)\n    }\n    return items\n}\n\nprivate func _ffi_vec_option_string_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [String?] {\n    var items: [String?] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_read(&end) as Bool ? _ffi_string_from_rust(_ffi_read(&end) as UnsafeRawPointer?, Int(_ffi_read(&end) as UInt), _ffi_read(&end) as UInt) : nil)\n    }\n    return items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_option_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_int(x: bool, y: i32) -> _ffi_ret_ptr_usize_bool {\n    let ret = opt_int(x, y);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_opt_int(x: bool, y: bool, z: i32) -> _ffi_ret_ptr_usize_bool {\n    let ret = opt_opt_int(x, y, z);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val.is_some(), &mut buf);\n        if let Some(ret_val_val) = ret_val {\n            _ffi_write(ret_val_val, &mut buf);\n        }\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_vec_opt_string(n: i32) -> _ffi_ret_ptr_usize_bool {\n    let ret = opt_vec_opt_string(n);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val.len(), &mut buf);\n        _ffi_vec_option_string_to_swift(ret_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_opt_int(n: i32) -> _ffi_ret_ptr_2_usize {\n    let ret = vec_opt_int(n);\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_option_i32_to_swift(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len)\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize_bool(*const u8, usize, bool);\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_option_i32_to_swift(items: Vec<Option<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.is_some(), buf);\n        if let Some(item_val) = item {\n            _ffi_write(item_val, buf);\n        }\n    }\n}\n\nfn _ffi_vec_option_string_to_swift(items: Vec<Option<String>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.is_some(), buf);\n        if let Some(item_val) = item {\n            let (item_val_ptr, item_val_len, item_val_cap) = _ffi_string_to_host(item_val);\n            _ffi_write(item_val_ptr, buf);\n            _ffi_write(item_val_len, buf);\n            _ffi_write(item_val_cap, buf);\n        }\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_payload_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n_Bool _ffi_fn_set_tests(const void* buf_ptr, uintptr_t tests_len);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_payload_in_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nenum Foo : Equatable {\n    case Empty\n    case Single(Int32)\n    case Point(x: Int32, y: Int32)\n    indirect case Nested(Foo)\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc set_tests(_ tests: [Foo]) -> Bool {\n    var buf = ContiguousArray<UInt8>()\n    let tests_len = UInt(tests.count)\n    _ffi_vec_Foo_to_rust(tests, &buf)\n    return _ffi_fn_set_tests(_ffi_vec_to_rust(buf), tests_len)\n}\n\nprivate func _ffi_box_Foo_to_rust(_ val: Foo, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_enum_Foo_to_rust(val, &buf)\n}\n\nprivate func _ffi_enum_Foo_to_rust(_ val: Foo, _ buf: inout ContiguousArray<UInt8>) {\n    switch val {\n    case .Empty:\n        _ffi_write(0 as Int32, &buf)\n    case let .Single(x):\n        _ffi_write(1 as Int32, &buf)\n        _ffi_write(x, &buf)\n    case let .Point(x, y):\n        _ffi_write(2 as Int32, &buf)\n        _ffi_write(x, &buf)\n        _ffi_write(y, &buf)\n    case let .Nested(x):\n        _ffi_write(3 as Int32, &buf)\n        _ffi_box_Foo_to_rust(x, &buf)\n    }\n}\n\nprivate func _ffi_vec_Foo_to_rust(_ items: [Foo], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_enum_Foo_to_rust(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_payload_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Foo_from_swift(end: &mut *const u8) -> Box<Foo> {\n    Box::new(_ffi_enum_Foo_from_swift(end))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_from_swift(end: &mut *const u8) -> Foo {\n    match _ffi_read::<i32>(end) {\n        0 => Foo::Empty,\n        1 => Foo::Single(_ffi_read::<i32>(end)),\n        2 => Foo::Point { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        3 => Foo::Nested(_ffi_box_Foo_from_swift(end)),\n        _ => panic!(),\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_tests(buf_ptr: *const u8, tests_len: usize) -> bool {\n    let mut buf_end = buf_ptr;\n    let ret = set_tests(_ffi_vec_Foo_from_swift(tests_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_from_swift(len: usize, end: &mut *const u8) -> Vec<Foo> {\n    let mut items = Vec::<Foo>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_enum_Foo_from_swift(end));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_payload_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n_Bool _ffi_fn_set_tests(const void* buf_ptr, uintptr_t tests_len);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_payload_in_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nenum Foo : Equatable {\n    case Empty\n    case Single(Int32)\n    case Point(x: Int32, y: Int32)\n    indirect case Nested(Foo)\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc set_tests(_ tests: [Foo]) -> Bool {\n    var buf = ContiguousArray<UInt8>()\n    let tests_len = UInt(tests.count)\n    _ffi_vec_Foo_to_rust(tests, &buf)\n    return _ffi_fn_set_tests(_ffi_vec_to_rust(buf), tests_len)\n}\n\nprivate func _ffi_box_Foo_to_rust(_ val: Foo, _ buf: inout ContiguousArray<UInt8>) {\n    _ffi_enum_Foo_to_rust(val, &buf)\n}\n\nprivate func _ffi_enum_Foo_to_rust(_ val: Foo, _ buf: inout ContiguousArray<UInt8>) {\n    switch val {\n    case .Empty:\n        _ffi_write(0 as Int32, &buf)\n    case let .Single(x):\n        _ffi_write(1 as Int32, &buf)\n        _ffi_write(x, &buf)\n    case let .Point(x, y):\n        _ffi_write(2 as Int32, &buf)\n        _ffi_write(x, &buf)\n        _ffi_write(y, &buf)\n    case let .Nested(x):\n        _ffi_write(3 as Int32, &buf)\n        _ffi_box_Foo_to_rust(x, &buf)\n    }\n}\n\nprivate func _ffi_vec_Foo_to_rust(_ items: [Foo], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_enum_Foo_to_rust(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_payload_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Foo_from_swift(end: &mut *const u8) -> Box<Foo> {\n    Box::new(_ffi_enum_Foo_from_swift(end))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_from_swift(end: &mut *const u8) -> Foo {\n    match _ffi_read::<i32>(end) {\n        0 => Foo::Empty,\n        1 => Foo::Single(_ffi_read::<i32>(end)),\n        2 => Foo::Point { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        3 => Foo::Nested(_ffi_box_Foo_from_swift(end)),\n        _ => panic!(),\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_tests(buf_ptr: *const u8, tests_len: usize) -> bool {\n    let mut buf_end = buf_ptr;\n    let ret = set_tests(_ffi_vec_Foo_from_swift(tests_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_from_swift(len: usize, end: &mut *const u8) -> Vec<Foo> {\n    let mut items = Vec::<Foo>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_enum_Foo_from_swift(end));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_payload_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_get_tests();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_payload_out_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nenum Foo : Equatable {\n    case Empty\n    case Single(Int32)\n    case Point(x: Int32, y: Int32)\n    indirect case Nested(Foo)\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_tests() -> [Foo] {\n    let multi_ret = _ffi_fn_get_tests()\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_len = multi_ret._2\n    var buf_end = buf_ptr!\n    let ret = _ffi_vec_Foo_from_rust(Int(ret_len), &buf_end)\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nprivate func _ffi_box_Foo_from_rust(_ end: inout UnsafeRawPointer) -> Foo {\n    return _ffi_enum_Foo_from_rust(&end)\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\nprivate func _ffi_enum_Foo_from_rust(_ end: inout UnsafeRawPointer) -> Foo {\n    switch _ffi_read(&end) as Int32 {\n        case 0: return .Empty\n        case 1: return .Single(_ffi_read(&end) as Int32)\n        case 2: return .Point(x: _ffi_read(&end) as Int32, y: _ffi_read(&end) as Int32)\n        case 3: return .Nested(_ffi_box_Foo_from_rust(&end))\n        default: fatalError()\n    }\n}\n\nprivate func _ffi_vec_Foo_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Foo] {\n    var items: [Foo] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_enum_Foo_from_rust(&end))\n    }\n    return items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_payload_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Foo_to_swift(val: Foo, buf: &mut Vec<u8>) {\n    _ffi_enum_Foo_to_swift(val, buf);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_to_swift(val: Foo, buf: &mut Vec<u8>) {\n    match val {\n        Foo::Empty => _ffi_write(0 as i32, buf),\n        Foo::Single(x) => {\n            _ffi_write(1 as i32, buf);\n            _ffi_write(x, buf);\n        }\n        Foo::Point { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n        Foo::Nested(x) => {\n            _ffi_write(3 as i32, buf);\n            _ffi_box_Foo_to_swift(*x, buf);\n        }\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_tests() -> _ffi_ret_ptr_2_usize {\n    let ret = get_tests();\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_Foo_to_swift(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_to_swift(items: Vec<Foo>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_enum_Foo_to_swift(item, buf);\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_payload_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_get_tests();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_payload_out_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nenum Foo : Equatable {\n    case Empty\n    case Single(Int32)\n    case Point(x: Int32, y: Int32)\n    indirect case Nested(Foo)\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_tests() -> [Foo] {\n    let multi_ret = _ffi_fn_get_tests()\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_len = multi_ret._2\n    var buf_end = buf_ptr!\n    let ret = _ffi_vec_Foo_from_rust(Int(ret_len), &buf_end)\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nprivate func _ffi_box_Foo_from_rust(_ end: inout UnsafeRawPointer) -> Foo {\n    return _ffi_enum_Foo_from_rust(&end)\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\nprivate func _ffi_enum_Foo_from_rust(_ end: inout UnsafeRawPointer) -> Foo {\n    switch _ffi_read(&end) as Int32 {\n        case 0: return .Empty\n        case 1: return .Single(_ffi_read(&end) as Int32)\n        case 2: return .Point(x: _ffi_read(&end) as Int32, y: _ffi_read(&end) as Int32)\n        case 3: return .Nested(_ffi_box_Foo_from_rust(&end))\n        default: fatalError()\n    }\n}\n\nprivate func _ffi_vec_Foo_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Foo] {\n    var items: [Foo] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_enum_Foo_from_rust(&end))\n    }\n    return items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_payload_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Foo_to_swift(val: Foo, buf: &mut Vec<u8>) {\n    _ffi_enum_Foo_to_swift(val, buf);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_to_swift(val: Foo, buf: &mut Vec<u8>) {\n    match val {\n        Foo::Empty => _ffi_write(0 as i32, buf),\n        Foo::Single(x) => {\n            _ffi_write(1 as i32, buf);\n            _ffi_write(x, buf);\n        }\n        Foo::Point { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n        Foo::Nested(x) => {\n            _ffi_write(3 as i32, buf);\n            _ffi_box_Foo_to_swift(*x, buf);\n        }\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_tests() -> _ffi_ret_ptr_2_usize {\n    let ret = get_tests();\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_Foo_to_swift(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_to_swift(items: Vec<Foo>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_enum_Foo_to_swift(item, buf);\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_string_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_get_string();\n\nint32_t _ffi_fn_get_string_len();\n\nvoid _ffi_fn_reset();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nvoid _ffi_fn_set_str(const void* x_ptr, uintptr_t x_len);\n\nvoid _ffi_fn_set_string(const void* x_ptr, uintptr_t x_len);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_string_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc reset() {\n    _ffi_fn_reset()\n}\n\nfunc get_string_len() -> Int32 {\n    return _ffi_fn_get_string_len()\n}\n\nfunc get_string() -> String {\n    let multi_ret = _ffi_fn_get_string()\n    let ret_ptr = multi_ret._0\n    let ret_len = multi_ret._1\n    let ret_cap = multi_ret._2\n    return _ffi_string_from_rust(ret_ptr, Int(ret_len), ret_cap)\n}\n\nfunc set_string(_ x: String) {\n    let (x_ptr, x_len) = _ffi_string_to_rust(x);\n    _ffi_fn_set_string(x_ptr, x_len)\n}\n\nfunc set_str(_ x: String) {\n    let (x_ptr, x_len) = _ffi_string_to_rust(x);\n    _ffi_fn_set_str(x_ptr, x_len)\n}\n\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\nprivate func _ffi_string_to_rust(_ str: String) -> (UnsafeRawPointer?, UInt) {\n    var str = str\n    return str.withUTF8 { str in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(str.count), count: str.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: str.baseAddress, count: str.count))\n        return (UnsafeRawPointer(buf.baseAddress), UInt(buf.count))\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_string_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_string() -> _ffi_ret_ptr_2_usize {\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(get_string());\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_string_len() -> i32 {\n    get_string_len()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_reset() {\n    reset();\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_str(x_ptr: *const u8, x_len: usize) {\n    set_str(&_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_string(x_ptr: *const u8, x_len: usize) {\n    set_string(_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_string_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_get_string();\n\nint32_t _ffi_fn_get_string_len();\n\nvoid _ffi_fn_reset();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nvoid _ffi_fn_set_str(const void* x_ptr, uintptr_t x_len);\n\nvoid _ffi_fn_set_string(const void* x_ptr, uintptr_t x_len);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_string_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc reset() {\n    _ffi_fn_reset()\n}\n\nfunc get_string_len() -> Int32 {\n    return _ffi_fn_get_string_len()\n}\n\nfunc get_string() -> String {\n    let multi_ret = _ffi_fn_get_string()\n    let ret_ptr = multi_ret._0\n    let ret_len = multi_ret._1\n    let ret_cap = multi_ret._2\n    return _ffi_string_from_rust(ret_ptr, Int(ret_len), ret_cap)\n}\n\nfunc set_string(_ x: String) {\n    let (x_ptr, x_len) = _ffi_string_to_rust(x);\n    _ffi_fn_set_string(x_ptr, x_len)\n}\n\nfunc set_str(_ x: String) {\n    let (x_ptr, x_len) = _ffi_string_to_rust(x);\n    _ffi_fn_set_str(x_ptr, x_len)\n}\n\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\nprivate func _ffi_string_to_rust(_ str: String) -> (UnsafeRawPointer?, UInt) {\n    var str = str\n    return str.withUTF8 { str in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(str.count), count: str.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: str.baseAddress, count: str.count))\n        return (UnsafeRawPointer(buf.baseAddress), UInt(buf.count))\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_string_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_string() -> _ffi_ret_ptr_2_usize {\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(get_string());\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_string_len() -> i32 {\n    get_string_len()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_reset() {\n    reset();\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_str(x_ptr: *const u8, x_len: usize) {\n    set_str(&_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_string(x_ptr: *const u8, x_len: usize) {\n    set_string(_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_struct_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_fn_empty_tuple(int32_t x, int32_t y);\n\nfloat _ffi_fn_multiply_pairs(float ab_x, float ab_y, float cd_x, float cd_y);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_single_element_tuple(int32_t x_0, int32_t y_0);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_struct_in_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nstruct EmptyStruct {\n}\n\nstruct SingleElementStruct {\n    var _0: Int32\n}\n\nstruct PairStruct {\n    var x: Float32\n    var y: Float32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc empty_tuple(_ x: Int32, _ foo: EmptyStruct, _ y: Int32) -> Int32 {\n    return _ffi_fn_empty_tuple(x, y)\n}\n\nfunc single_element_tuple(_ x: SingleElementStruct, _ y: SingleElementStruct) -> Int32 {\n    return _ffi_fn_single_element_tuple(x._0, y._0)\n}\n\nfunc multiply_pairs(_ ab: PairStruct, _ cd: PairStruct) -> Float32 {\n    return _ffi_fn_multiply_pairs(ab.x, ab.y, cd.x, cd.y)\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_struct_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_empty_tuple(x: i32, y: i32) -> i32 {\n    empty_tuple(x, EmptyStruct, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_multiply_pairs(ab_x: f32, ab_y: f32, cd_x: f32, cd_y: f32) -> f32 {\n    multiply_pairs(PairStruct { x: ab_x, y: ab_y }, PairStruct { x: cd_x, y: cd_y })\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_single_element_tuple(x_0: i32, y_0: i32) -> i32 {\n    single_element_tuple(SingleElementStruct(x_0), SingleElementStruct(y_0))\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_struct_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_fn_empty_tuple(int32_t x, int32_t y);\n\nfloat _ffi_fn_multiply_pairs(float ab_x, float ab_y, float cd_x, float cd_y);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_single_element_tuple(int32_t x_0, int32_t y_0);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_struct_in_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nstruct EmptyStruct {\n}\n\nstruct SingleElementStruct {\n    var _0: Int32\n}\n\nstruct PairStruct {\n    var x: Float32\n    var y: Float32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc empty_tuple(_ x: Int32, _ foo: EmptyStruct, _ y: Int32) -> Int32 {\n    return _ffi_fn_empty_tuple(x, y)\n}\n\nfunc single_element_tuple(_ x: SingleElementStruct, _ y: SingleElementStruct) -> Int32 {\n    return _ffi_fn_single_element_tuple(x._0, y._0)\n}\n\nfunc multiply_pairs(_ ab: PairStruct, _ cd: PairStruct) -> Float32 {\n    return _ffi_fn_multiply_pairs(ab.x, ab.y, cd.x, cd.y)\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_struct_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_empty_tuple(x: i32, y: i32) -> i32 {\n    empty_tuple(x, EmptyStruct, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_multiply_pairs(ab_x: f32, ab_y: f32, cd_x: f32, cd_y: f32) -> f32 {\n    multiply_pairs(PairStruct { x: ab_x, y: ab_y }, PairStruct { x: cd_x, y: cd_y })\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_single_element_tuple(x_0: i32, y_0: i32) -> i32 {\n    single_element_tuple(SingleElementStruct(x_0), SingleElementStruct(y_0))\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_struct_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_fn_empty_struct();\n\ntypedef struct {\n    float _0;\n    float _1;\n} _ffi_ret_2_f32;\n\n_ffi_ret_2_f32 _ffi_fn_make_pair(float x, float y);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_single_element_struct(int32_t x);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_struct_out_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nstruct EmptyStruct : Equatable {\n}\n\nstruct SingleElementStruct : Equatable {\n    var _0: Int32\n}\n\nstruct PairStruct : Equatable {\n    var x: Float32\n    var y: Float32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc empty_struct() -> EmptyStruct {\n    _ffi_fn_empty_struct()\n    return EmptyStruct()\n}\n\nfunc single_element_struct(_ x: Int32) -> SingleElementStruct {\n    let ret_0 = _ffi_fn_single_element_struct(x)\n    return SingleElementStruct(_0: ret_0)\n}\n\nfunc make_pair(_ x: Float32, _ y: Float32) -> PairStruct {\n    let multi_ret = _ffi_fn_make_pair(x, y)\n    let ret_x = multi_ret._0\n    let ret_y = multi_ret._1\n    return PairStruct(x: ret_x, y: ret_y)\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_struct_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_empty_struct() {\n    _ = empty_struct();\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_make_pair(x: f32, y: f32) -> _ffi_ret_2_f32 {\n    let ret = make_pair(x, y);\n    _ffi_ret_2_f32(ret.x, ret.y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_single_element_struct(x: i32) -> i32 {\n    let ret = single_element_struct(x);\n    ret.0\n}\n\n#[repr(C)]\nstruct _ffi_ret_2_f32(f32, f32);\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_struct_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_fn_empty_struct();\n\ntypedef struct {\n    float _0;\n    float _1;\n} _ffi_ret_2_f32;\n\n_ffi_ret_2_f32 _ffi_fn_make_pair(float x, float y);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_single_element_struct(int32_t x);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_struct_out_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nstruct EmptyStruct : Equatable {\n}\n\nstruct SingleElementStruct : Equatable {\n    var _0: Int32\n}\n\nstruct PairStruct : Equatable {\n    var x: Float32\n    var y: Float32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc empty_struct() -> EmptyStruct {\n    _ffi_fn_empty_struct()\n    return EmptyStruct()\n}\n\nfunc single_element_struct(_ x: Int32) -> SingleElementStruct {\n    let ret_0 = _ffi_fn_single_element_struct(x)\n    return SingleElementStruct(_0: ret_0)\n}\n\nfunc make_pair(_ x: Float32, _ y: Float32) -> PairStruct {\n    let multi_ret = _ffi_fn_make_pair(x, y)\n    let ret_x = multi_ret._0\n    let ret_y = multi_ret._1\n    return PairStruct(x: ret_x, y: ret_y)\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_struct_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_empty_struct() {\n    _ = empty_struct();\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_make_pair(x: f32, y: f32) -> _ffi_ret_2_f32 {\n    let ret = make_pair(x, y);\n    _ffi_ret_2_f32(ret.x, ret.y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_single_element_struct(x: i32) -> i32 {\n    let ret = single_element_struct(x);\n    ret.0\n}\n\n#[repr(C)]\nstruct _ffi_ret_2_f32(f32, f32);\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_tuple_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_fn_empty_tuple(int32_t x, int32_t y);\n\nfloat _ffi_fn_multiply_pairs(float ab_0, float ab_1, float cd_0, float cd_1);\n\nint32_t _ffi_fn_nesting(int32_t x_0, int32_t x_2_0, int32_t x_2_1_0);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_single_element_tuple(int32_t x_0, int32_t y_0);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_tuple_in_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc empty_tuple(_ x: Int32, _ foo: (), _ y: Int32) -> Int32 {\n    return _ffi_fn_empty_tuple(x, y)\n}\n\nfunc single_element_tuple(_ x: Int32, _ y: Int32) -> Int32 {\n    return _ffi_fn_single_element_tuple(x, y)\n}\n\nfunc multiply_pairs(_ ab: (Float32, Float32), _ cd: (Float32, Float32)) -> Float32 {\n    return _ffi_fn_multiply_pairs(ab.0, ab.1, cd.0, cd.1)\n}\n\nfunc nesting(_ x: (Int32, (), (Int32, Int32))) -> Int32 {\n    return _ffi_fn_nesting(x.0, x.2.0, x.2.1)\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_tuple_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_empty_tuple(x: i32, y: i32) -> i32 {\n    empty_tuple(x, (), y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_multiply_pairs(ab_0: f32, ab_1: f32, cd_0: f32, cd_1: f32) -> f32 {\n    multiply_pairs((ab_0, ab_1), (cd_0, cd_1))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_nesting(x_0: i32, x_2_0: i32, x_2_1_0: i32) -> i32 {\n    nesting((x_0, (), (x_2_0, (x_2_1_0,))))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_single_element_tuple(x_0: i32, y_0: i32) -> i32 {\n    single_element_tuple((x_0,), (y_0,))\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_tuple_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_fn_empty_tuple(int32_t x, int32_t y);\n\nfloat _ffi_fn_multiply_pairs(float ab_0, float ab_1, float cd_0, float cd_1);\n\nint32_t _ffi_fn_nesting(int32_t x_0, int32_t x_2_0, int32_t x_2_1_0);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_single_element_tuple(int32_t x_0, int32_t y_0);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_tuple_in_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc empty_tuple(_ x: Int32, _ foo: (), _ y: Int32) -> Int32 {\n    return _ffi_fn_empty_tuple(x, y)\n}\n\nfunc single_element_tuple(_ x: Int32, _ y: Int32) -> Int32 {\n    return _ffi_fn_single_element_tuple(x, y)\n}\n\nfunc multiply_pairs(_ ab: (Float32, Float32), _ cd: (Float32, Float32)) -> Float32 {\n    return _ffi_fn_multiply_pairs(ab.0, ab.1, cd.0, cd.1)\n}\n\nfunc nesting(_ x: (Int32, (), (Int32, Int32))) -> Int32 {\n    return _ffi_fn_nesting(x.0, x.2.0, x.2.1)\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_tuple_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_empty_tuple(x: i32, y: i32) -> i32 {\n    empty_tuple(x, (), y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_multiply_pairs(ab_0: f32, ab_1: f32, cd_0: f32, cd_1: f32) -> f32 {\n    multiply_pairs((ab_0, ab_1), (cd_0, cd_1))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_nesting(x_0: i32, x_2_0: i32, x_2_1_0: i32) -> i32 {\n    nesting((x_0, (), (x_2_0, (x_2_1_0,))))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_single_element_tuple(x_0: i32, y_0: i32) -> i32 {\n    single_element_tuple((x_0,), (y_0,))\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_tuple_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct {\n    float _0;\n    _Bool _1;\n} _ffi_ret_f32_bool;\n\n_ffi_ret_f32_bool _ffi_fn_return_pair(float x, _Bool y);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_single_element_tuple(int32_t x);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_tuple_out_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc single_element_tuple(_ x: Int32) -> Int32 {\n    let ret_0 = _ffi_fn_single_element_tuple(x)\n    return ret_0\n}\n\nfunc return_pair(_ x: Float32, _ y: Bool) -> (Float32, Bool) {\n    let multi_ret = _ffi_fn_return_pair(x, y)\n    let ret_0 = multi_ret._0\n    let ret_1 = multi_ret._1\n    return (ret_0, ret_1)\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_tuple_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_return_pair(x: f32, y: bool) -> _ffi_ret_f32_bool {\n    let ret = return_pair(x, y);\n    _ffi_ret_f32_bool(ret.0, ret.1)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_single_element_tuple(x: i32) -> i32 {\n    let ret = single_element_tuple(x);\n    ret.0\n}\n\n#[repr(C)]\nstruct _ffi_ret_f32_bool(f32, bool);\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_tuple_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct {\n    float _0;\n    _Bool _1;\n} _ffi_ret_f32_bool;\n\n_ffi_ret_f32_bool _ffi_fn_return_pair(float x, _Bool y);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_single_element_tuple(int32_t x);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_tuple_out_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc single_element_tuple(_ x: Int32) -> Int32 {\n    let ret_0 = _ffi_fn_single_element_tuple(x)\n    return ret_0\n}\n\nfunc return_pair(_ x: Float32, _ y: Bool) -> (Float32, Bool) {\n    let multi_ret = _ffi_fn_return_pair(x, y)\n    let ret_0 = multi_ret._0\n    let ret_1 = multi_ret._1\n    return (ret_0, ret_1)\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_tuple_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_return_pair(x: f32, y: bool) -> _ffi_ret_f32_bool {\n    let ret = return_pair(x, y);\n    _ffi_ret_f32_bool(ret.0, ret.1)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_single_element_tuple(x: i32) -> i32 {\n    let ret = single_element_tuple(x);\n    ret.0\n}\n\n#[repr(C)]\nstruct _ffi_ret_f32_bool(f32, bool);\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_vec_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_check_nested(const void* buf_ptr, uintptr_t values_len);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nfloat _ffi_fn_sum_f32(const void* buf_ptr, uintptr_t values_len);\n\ndouble _ffi_fn_sum_f64(const void* buf_ptr, uintptr_t values_len);\n\nint16_t _ffi_fn_sum_i16(const void* buf_ptr, uintptr_t values_len);\n\nint32_t _ffi_fn_sum_i32(const void* buf_ptr, uintptr_t values_len);\n\nint64_t _ffi_fn_sum_i64(const void* buf_ptr, uintptr_t values_len);\n\nint8_t _ffi_fn_sum_i8(const void* buf_ptr, uintptr_t values_len);\n\nintptr_t _ffi_fn_sum_isize(const void* buf_ptr, uintptr_t values_len);\n\nuint16_t _ffi_fn_sum_u16(const void* buf_ptr, uintptr_t values_len);\n\nuint32_t _ffi_fn_sum_u32(const void* buf_ptr, uintptr_t values_len);\n\nuint64_t _ffi_fn_sum_u64(const void* buf_ptr, uintptr_t values_len);\n\nuint8_t _ffi_fn_sum_u8(const void* buf_ptr, uintptr_t values_len);\n\nuintptr_t _ffi_fn_sum_usize(const void* buf_ptr, uintptr_t values_len);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_vec_in_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc sum_u8(_ values: [UInt8]) -> UInt8 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_u8_to_rust(values, &buf)\n    return _ffi_fn_sum_u8(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_u16(_ values: [UInt16]) -> UInt16 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_u16_to_rust(values, &buf)\n    return _ffi_fn_sum_u16(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_u32(_ values: [UInt32]) -> UInt32 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_u32_to_rust(values, &buf)\n    return _ffi_fn_sum_u32(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_usize(_ values: [UInt]) -> UInt {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_usize_to_rust(values, &buf)\n    return _ffi_fn_sum_usize(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_u64(_ values: [UInt64]) -> UInt64 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_u64_to_rust(values, &buf)\n    return _ffi_fn_sum_u64(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_i8(_ values: [Int8]) -> Int8 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_i8_to_rust(values, &buf)\n    return _ffi_fn_sum_i8(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_i16(_ values: [Int16]) -> Int16 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_i16_to_rust(values, &buf)\n    return _ffi_fn_sum_i16(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_i32(_ values: [Int32]) -> Int32 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_i32_to_rust(values, &buf)\n    return _ffi_fn_sum_i32(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_isize(_ values: [Int]) -> Int {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_isize_to_rust(values, &buf)\n    return _ffi_fn_sum_isize(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_i64(_ values: [Int64]) -> Int64 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_i64_to_rust(values, &buf)\n    return _ffi_fn_sum_i64(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_f32(_ values: [Float32]) -> Float32 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_f32_to_rust(values, &buf)\n    return _ffi_fn_sum_f32(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_f64(_ values: [Float64]) -> Float64 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_f64_to_rust(values, &buf)\n    return _ffi_fn_sum_f64(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc check_nested(_ values: [[Int32]]) -> String {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_vec_i32_to_rust(values, &buf)\n    let multi_ret = _ffi_fn_check_nested(_ffi_vec_to_rust(buf), values_len)\n    let ret_ptr = multi_ret._0\n    let ret_len = multi_ret._1\n    let ret_cap = multi_ret._2\n    return _ffi_string_from_rust(ret_ptr, Int(ret_len), ret_cap)\n}\n\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\nprivate func _ffi_vec_f32_to_rust(_ items: [Float32], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_f64_to_rust(_ items: [Float64], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_i16_to_rust(_ items: [Int16], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_i32_to_rust(_ items: [Int32], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_i64_to_rust(_ items: [Int64], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_i8_to_rust(_ items: [Int8], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_isize_to_rust(_ items: [Int], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_vec_u16_to_rust(_ items: [UInt16], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_u32_to_rust(_ items: [UInt32], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_u64_to_rust(_ items: [UInt64], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_u8_to_rust(_ items: [UInt8], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_usize_to_rust(_ items: [UInt], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_vec_i32_to_rust(_ items: [[Int32]], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(UInt(item.count), &buf)\n        _ffi_vec_i32_to_rust(item, &buf)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_vec_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_nested(buf_ptr: *const u8, values_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(check_nested(_ffi_vec_vec_i32_from_swift(values_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_f32(buf_ptr: *const u8, values_len: usize) -> f32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_f32(_ffi_vec_f32_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_f64(buf_ptr: *const u8, values_len: usize) -> f64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_f64(_ffi_vec_f64_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_i16(buf_ptr: *const u8, values_len: usize) -> i16 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i16(_ffi_vec_i16_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_i32(buf_ptr: *const u8, values_len: usize) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i32(_ffi_vec_i32_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_i64(buf_ptr: *const u8, values_len: usize) -> i64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i64(_ffi_vec_i64_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_i8(buf_ptr: *const u8, values_len: usize) -> i8 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i8(_ffi_vec_i8_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_isize(buf_ptr: *const u8, values_len: usize) -> isize {\n    let mut buf_end = buf_ptr;\n    let ret = sum_isize(_ffi_vec_isize_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_u16(buf_ptr: *const u8, values_len: usize) -> u16 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u16(_ffi_vec_u16_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_u32(buf_ptr: *const u8, values_len: usize) -> u32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u32(_ffi_vec_u32_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_u64(buf_ptr: *const u8, values_len: usize) -> u64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u64(_ffi_vec_u64_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_u8(buf_ptr: *const u8, values_len: usize) -> u8 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u8(_ffi_vec_u8_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_usize(buf_ptr: *const u8, values_len: usize) -> usize {\n    let mut buf_end = buf_ptr;\n    let ret = sum_usize(_ffi_vec_usize_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_f32_from_swift(len: usize, end: &mut *const u8) -> Vec<f32> {\n    let mut items = Vec::<f32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<f32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_f64_from_swift(len: usize, end: &mut *const u8) -> Vec<f64> {\n    let mut items = Vec::<f64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<f64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i16_from_swift(len: usize, end: &mut *const u8) -> Vec<i16> {\n    let mut items = Vec::<i16>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i16>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i32_from_swift(len: usize, end: &mut *const u8) -> Vec<i32> {\n    let mut items = Vec::<i32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i64_from_swift(len: usize, end: &mut *const u8) -> Vec<i64> {\n    let mut items = Vec::<i64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i8_from_swift(len: usize, end: &mut *const u8) -> Vec<i8> {\n    let mut items = Vec::<i8>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i8>(end));\n    }\n    items\n}\n\nfn _ffi_vec_isize_from_swift(len: usize, end: &mut *const u8) -> Vec<isize> {\n    let mut items = Vec::<isize>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<isize>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u16_from_swift(len: usize, end: &mut *const u8) -> Vec<u16> {\n    let mut items = Vec::<u16>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u16>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u32_from_swift(len: usize, end: &mut *const u8) -> Vec<u32> {\n    let mut items = Vec::<u32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u64_from_swift(len: usize, end: &mut *const u8) -> Vec<u64> {\n    let mut items = Vec::<u64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u8_from_swift(len: usize, end: &mut *const u8) -> Vec<u8> {\n    let mut items = Vec::<u8>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u8>(end));\n    }\n    items\n}\n\nfn _ffi_vec_usize_from_swift(len: usize, end: &mut *const u8) -> Vec<usize> {\n    let mut items = Vec::<usize>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<usize>(end));\n    }\n    items\n}\n\nfn _ffi_vec_vec_i32_from_swift(len: usize, end: &mut *const u8) -> Vec<Vec<i32>> {\n    let mut items = Vec::<Vec<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_vec_i32_from_swift(_ffi_read::<usize>(end), end));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_vec_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* _ffi_alloc(intptr_t len);\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_check_nested(const void* buf_ptr, uintptr_t values_len);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nfloat _ffi_fn_sum_f32(const void* buf_ptr, uintptr_t values_len);\n\ndouble _ffi_fn_sum_f64(const void* buf_ptr, uintptr_t values_len);\n\nint16_t _ffi_fn_sum_i16(const void* buf_ptr, uintptr_t values_len);\n\nint32_t _ffi_fn_sum_i32(const void* buf_ptr, uintptr_t values_len);\n\nint64_t _ffi_fn_sum_i64(const void* buf_ptr, uintptr_t values_len);\n\nint8_t _ffi_fn_sum_i8(const void* buf_ptr, uintptr_t values_len);\n\nintptr_t _ffi_fn_sum_isize(const void* buf_ptr, uintptr_t values_len);\n\nuint16_t _ffi_fn_sum_u16(const void* buf_ptr, uintptr_t values_len);\n\nuint32_t _ffi_fn_sum_u32(const void* buf_ptr, uintptr_t values_len);\n\nuint64_t _ffi_fn_sum_u64(const void* buf_ptr, uintptr_t values_len);\n\nuint8_t _ffi_fn_sum_u8(const void* buf_ptr, uintptr_t values_len);\n\nuintptr_t _ffi_fn_sum_usize(const void* buf_ptr, uintptr_t values_len);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_vec_in_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc sum_u8(_ values: [UInt8]) -> UInt8 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_u8_to_rust(values, &buf)\n    return _ffi_fn_sum_u8(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_u16(_ values: [UInt16]) -> UInt16 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_u16_to_rust(values, &buf)\n    return _ffi_fn_sum_u16(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_u32(_ values: [UInt32]) -> UInt32 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_u32_to_rust(values, &buf)\n    return _ffi_fn_sum_u32(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_usize(_ values: [UInt]) -> UInt {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_usize_to_rust(values, &buf)\n    return _ffi_fn_sum_usize(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_u64(_ values: [UInt64]) -> UInt64 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_u64_to_rust(values, &buf)\n    return _ffi_fn_sum_u64(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_i8(_ values: [Int8]) -> Int8 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_i8_to_rust(values, &buf)\n    return _ffi_fn_sum_i8(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_i16(_ values: [Int16]) -> Int16 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_i16_to_rust(values, &buf)\n    return _ffi_fn_sum_i16(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_i32(_ values: [Int32]) -> Int32 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_i32_to_rust(values, &buf)\n    return _ffi_fn_sum_i32(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_isize(_ values: [Int]) -> Int {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_isize_to_rust(values, &buf)\n    return _ffi_fn_sum_isize(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_i64(_ values: [Int64]) -> Int64 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_i64_to_rust(values, &buf)\n    return _ffi_fn_sum_i64(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_f32(_ values: [Float32]) -> Float32 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_f32_to_rust(values, &buf)\n    return _ffi_fn_sum_f32(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc sum_f64(_ values: [Float64]) -> Float64 {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_f64_to_rust(values, &buf)\n    return _ffi_fn_sum_f64(_ffi_vec_to_rust(buf), values_len)\n}\n\nfunc check_nested(_ values: [[Int32]]) -> String {\n    var buf = ContiguousArray<UInt8>()\n    let values_len = UInt(values.count)\n    _ffi_vec_vec_i32_to_rust(values, &buf)\n    let multi_ret = _ffi_fn_check_nested(_ffi_vec_to_rust(buf), values_len)\n    let ret_ptr = multi_ret._0\n    let ret_len = multi_ret._1\n    let ret_cap = multi_ret._2\n    return _ffi_string_from_rust(ret_ptr, Int(ret_len), ret_cap)\n}\n\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\nprivate func _ffi_vec_f32_to_rust(_ items: [Float32], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_f64_to_rust(_ items: [Float64], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_i16_to_rust(_ items: [Int16], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_i32_to_rust(_ items: [Int32], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_i64_to_rust(_ items: [Int64], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_i8_to_rust(_ items: [Int8], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_isize_to_rust(_ items: [Int], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_to_rust(_ vec: ContiguousArray<UInt8>) -> UnsafeRawPointer? {\n    vec.withUnsafeBytes { vec in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(vec.count), count: vec.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: vec.baseAddress, count: vec.count))\n        return UnsafeRawPointer(buf.baseAddress)\n    }\n}\n\nprivate func _ffi_vec_u16_to_rust(_ items: [UInt16], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_u32_to_rust(_ items: [UInt32], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_u64_to_rust(_ items: [UInt64], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_u8_to_rust(_ items: [UInt8], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_usize_to_rust(_ items: [UInt], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(item, &buf)\n    }\n}\n\nprivate func _ffi_vec_vec_i32_to_rust(_ items: [[Int32]], _ buf: inout ContiguousArray<UInt8>) {\n    for item in items {\n        _ffi_write(UInt(item.count), &buf)\n        _ffi_vec_i32_to_rust(item, &buf)\n    }\n}\n\nprivate func _ffi_write<T>(_ val: T, _ buf: inout ContiguousArray<UInt8>) {\n    var val = val\n    withUnsafeBytes(of: &val) { val in\n        buf.append(contentsOf: val)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_vec_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_nested(buf_ptr: *const u8, values_len: usize) -> _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(check_nested(_ffi_vec_vec_i32_from_swift(values_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_f32(buf_ptr: *const u8, values_len: usize) -> f32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_f32(_ffi_vec_f32_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_f64(buf_ptr: *const u8, values_len: usize) -> f64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_f64(_ffi_vec_f64_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_i16(buf_ptr: *const u8, values_len: usize) -> i16 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i16(_ffi_vec_i16_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_i32(buf_ptr: *const u8, values_len: usize) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i32(_ffi_vec_i32_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_i64(buf_ptr: *const u8, values_len: usize) -> i64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i64(_ffi_vec_i64_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_i8(buf_ptr: *const u8, values_len: usize) -> i8 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i8(_ffi_vec_i8_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_isize(buf_ptr: *const u8, values_len: usize) -> isize {\n    let mut buf_end = buf_ptr;\n    let ret = sum_isize(_ffi_vec_isize_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_u16(buf_ptr: *const u8, values_len: usize) -> u16 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u16(_ffi_vec_u16_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_u32(buf_ptr: *const u8, values_len: usize) -> u32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u32(_ffi_vec_u32_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_u64(buf_ptr: *const u8, values_len: usize) -> u64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u64(_ffi_vec_u64_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_u8(buf_ptr: *const u8, values_len: usize) -> u8 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u8(_ffi_vec_u8_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_usize(buf_ptr: *const u8, values_len: usize) -> usize {\n    let mut buf_end = buf_ptr;\n    let ret = sum_usize(_ffi_vec_usize_from_swift(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_f32_from_swift(len: usize, end: &mut *const u8) -> Vec<f32> {\n    let mut items = Vec::<f32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<f32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_f64_from_swift(len: usize, end: &mut *const u8) -> Vec<f64> {\n    let mut items = Vec::<f64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<f64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i16_from_swift(len: usize, end: &mut *const u8) -> Vec<i16> {\n    let mut items = Vec::<i16>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i16>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i32_from_swift(len: usize, end: &mut *const u8) -> Vec<i32> {\n    let mut items = Vec::<i32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i64_from_swift(len: usize, end: &mut *const u8) -> Vec<i64> {\n    let mut items = Vec::<i64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i8_from_swift(len: usize, end: &mut *const u8) -> Vec<i8> {\n    let mut items = Vec::<i8>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i8>(end));\n    }\n    items\n}\n\nfn _ffi_vec_isize_from_swift(len: usize, end: &mut *const u8) -> Vec<isize> {\n    let mut items = Vec::<isize>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<isize>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u16_from_swift(len: usize, end: &mut *const u8) -> Vec<u16> {\n    let mut items = Vec::<u16>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u16>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u32_from_swift(len: usize, end: &mut *const u8) -> Vec<u32> {\n    let mut items = Vec::<u32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u64_from_swift(len: usize, end: &mut *const u8) -> Vec<u64> {\n    let mut items = Vec::<u64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u8_from_swift(len: usize, end: &mut *const u8) -> Vec<u8> {\n    let mut items = Vec::<u8>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u8>(end));\n    }\n    items\n}\n\nfn _ffi_vec_usize_from_swift(len: usize, end: &mut *const u8) -> Vec<usize> {\n    let mut items = Vec::<usize>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<usize>(end));\n    }\n    items\n}\n\nfn _ffi_vec_vec_i32_from_swift(len: usize, end: &mut *const u8) -> Vec<Vec<i32>> {\n    let mut items = Vec::<Vec<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_vec_i32_from_swift(_ffi_read::<usize>(end), end));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_vec_out_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_check_nested();\n\n_ffi_ret_ptr_2_usize _ffi_fn_get_vec(int32_t n);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_vec_out_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_vec(_ n: Int32) -> [Int32] {\n    let multi_ret = _ffi_fn_get_vec(n)\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_len = multi_ret._2\n    var buf_end = buf_ptr!\n    let ret = _ffi_vec_i32_from_rust(Int(ret_len), &buf_end)\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nfunc check_nested() -> [[Int32]] {\n    let multi_ret = _ffi_fn_check_nested()\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_len = multi_ret._2\n    var buf_end = buf_ptr!\n    let ret = _ffi_vec_vec_i32_from_rust(Int(ret_len), &buf_end)\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\nprivate func _ffi_vec_i32_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Int32] {\n    var items: [Int32] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_read(&end) as Int32)\n    }\n    return items\n}\n\nprivate func _ffi_vec_vec_i32_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [[Int32]] {\n    var items: [[Int32]] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_vec_i32_from_rust(Int(_ffi_read(&end) as UInt), &end))\n    }\n    return items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_vec_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_nested() -> _ffi_ret_ptr_2_usize {\n    let ret = check_nested();\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_vec_i32_to_swift(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_vec(n: i32) -> _ffi_ret_ptr_2_usize {\n    let ret = get_vec(n);\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_i32_to_swift(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\nfn _ffi_vec_i32_to_swift(items: Vec<i32>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item, buf);\n    }\n}\n\nfn _ffi_vec_vec_i32_to_swift(items: Vec<Vec<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.len(), buf);\n        _ffi_vec_i32_to_swift(item, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_vec_out_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_fn_check_nested();\n\n_ffi_ret_ptr_2_usize _ffi_fn_get_vec(int32_t n);\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_vec_out_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_vec(_ n: Int32) -> [Int32] {\n    let multi_ret = _ffi_fn_get_vec(n)\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_len = multi_ret._2\n    var buf_end = buf_ptr!\n    let ret = _ffi_vec_i32_from_rust(Int(ret_len), &buf_end)\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nfunc check_nested() -> [[Int32]] {\n    let multi_ret = _ffi_fn_check_nested()\n    let buf_ptr = multi_ret._0\n    let buf_cap = multi_ret._1\n    let ret_len = multi_ret._2\n    var buf_end = buf_ptr!\n    let ret = _ffi_vec_vec_i32_from_rust(Int(ret_len), &buf_end)\n    _ffi_dealloc(buf_ptr, buf_cap)\n    return ret\n}\n\nprivate func _ffi_read<T>(_ ptr: inout UnsafeRawPointer) -> T {\n    let val = ptr.loadUnaligned(fromByteOffset: 0, as: T.self)\n    ptr = ptr.advanced(by: MemoryLayout<T>.size)\n    return val\n}\n\nprivate func _ffi_vec_i32_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [Int32] {\n    var items: [Int32] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_read(&end) as Int32)\n    }\n    return items\n}\n\nprivate func _ffi_vec_vec_i32_from_rust(_ len: Int, _ end: inout UnsafeRawPointer) -> [[Int32]] {\n    var items: [[Int32]] = []\n    items.reserveCapacity(len)\n    while items.count < len {\n        items.append(_ffi_vec_i32_from_rust(Int(_ffi_read(&end) as UInt), &end))\n    }\n    return items\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_fn_vec_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_nested() -> _ffi_ret_ptr_2_usize {\n    let ret = check_nested();\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_vec_i32_to_swift(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_vec(n: i32) -> _ffi_ret_ptr_2_usize {\n    let ret = get_vec(n);\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_i32_to_swift(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\nfn _ffi_vec_i32_to_swift(items: Vec<i32>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item, buf);\n    }\n}\n\nfn _ffi_vec_vec_i32_to_swift(items: Vec<Vec<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.len(), buf);\n        _ffi_vec_i32_to_swift(item, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_enum_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_Box_Foo__get_enum(const void*);\n\nvoid _ffi_Box_Foo__set_enum(const void*, int32_t bar_raw);\n\nconst void* _ffi_fn_get_foo();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nvoid _ffi_rs_drop_Box_Foo(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_enum_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Foo: AnyObject {\n    func set_enum(_ bar: Bar)\n    func get_enum() -> Bar\n}\n\nenum Bar: Int32 {\n    case A = 0\n    case B = 1\n    case C = 2\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_foo() -> Foo {\n    let ret_ptr = _ffi_fn_get_foo()\n    return _ffi_Box_Foo(ret_ptr)\n}\n\nprivate class _ffi_Box_Foo : Foo {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Box_Foo(_ffi)\n    }\n\n    func set_enum(_ bar: Bar) {\n        _ffi_Box_Foo__set_enum(_ffi, bar.rawValue)\n    }\n\n    func get_enum() -> Bar {\n        let ret_raw = _ffi_Box_Foo__get_enum(_ffi)\n        return Bar(rawValue: ret_raw)!\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_enum_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Box_Foo__get_enum(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Foo>) };\n    _self.get_enum() as i32\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Box_Foo__set_enum(_self: *const u8, bar_raw: i32) {\n    let _self = unsafe { &*(_self as *const Box<dyn Foo>) };\n    _self.set_enum(_ffi_enum_Bar_from_swift(bar_raw));\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Bar_from_swift(val: i32) -> Bar {\n    match val {\n        0 => Bar::A,\n        1 => Bar::B,\n        2 => Bar::C,\n        _ => panic!(),\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_foo() -> *const u8 {\n    Box::into_raw(Box::new(get_foo())) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Box_Foo(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Foo>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_enum_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_Box_Foo__get_enum(const void*);\n\nvoid _ffi_Box_Foo__set_enum(const void*, int32_t bar_raw);\n\nconst void* _ffi_fn_get_foo();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nvoid _ffi_rs_drop_Box_Foo(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_enum_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Foo: AnyObject {\n    func set_enum(_ bar: Bar)\n    func get_enum() -> Bar\n}\n\nenum Bar: Int32 {\n    case A = 0\n    case B = 1\n    case C = 2\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_foo() -> Foo {\n    let ret_ptr = _ffi_fn_get_foo()\n    return _ffi_Box_Foo(ret_ptr)\n}\n\nprivate class _ffi_Box_Foo : Foo {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Box_Foo(_ffi)\n    }\n\n    func set_enum(_ bar: Bar) {\n        _ffi_Box_Foo__set_enum(_ffi, bar.rawValue)\n    }\n\n    func get_enum() -> Bar {\n        let ret_raw = _ffi_Box_Foo__get_enum(_ffi)\n        return Bar(rawValue: ret_raw)!\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_enum_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Box_Foo__get_enum(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Foo>) };\n    _self.get_enum() as i32\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Box_Foo__set_enum(_self: *const u8, bar_raw: i32) {\n    let _self = unsafe { &*(_self as *const Box<dyn Foo>) };\n    _self.set_enum(_ffi_enum_Bar_from_swift(bar_raw));\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Bar_from_swift(val: i32) -> Bar {\n    match val {\n        0 => Bar::A,\n        1 => Bar::B,\n        2 => Bar::C,\n        _ => panic!(),\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_foo() -> *const u8 {\n    Box::into_raw(Box::new(get_foo())) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Box_Foo(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Foo>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_Box_Adder__add(const void*, int32_t x);\n\nint32_t _ffi_Rc_Adder__add(const void*, int32_t x);\n\nconst void* _ffi_fn_get_adder_box(int32_t x);\n\nconst void* _ffi_fn_get_adder_rc(int32_t x);\n\nuint32_t _ffi_fn_get_counter();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nvoid _ffi_rs_drop_Box_Adder(const void* ptr);\n\nvoid _ffi_rs_drop_Rc_Adder(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Adder: AnyObject {\n    func add(_ x: Int32) -> Int32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_counter() -> UInt32 {\n    return _ffi_fn_get_counter()\n}\n\nfunc get_adder_rc(_ x: Int32) -> Adder {\n    let ret_ptr = _ffi_fn_get_adder_rc(x)\n    return _ffi_Rc_Adder(ret_ptr)\n}\n\nfunc get_adder_box(_ x: Int32) -> Adder {\n    let ret_ptr = _ffi_fn_get_adder_box(x)\n    return _ffi_Box_Adder(ret_ptr)\n}\n\nprivate class _ffi_Box_Adder : Adder {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Box_Adder(_ffi)\n    }\n\n    func add(_ x: Int32) -> Int32 {\n        return _ffi_Box_Adder__add(_ffi, x)\n    }\n}\n\nprivate class _ffi_Rc_Adder : Adder {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Rc_Adder(_ffi)\n    }\n\n    func add(_ x: Int32) -> Int32 {\n        return _ffi_Rc_Adder__add(_ffi, x)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Box_Adder__add(_self: *const u8, x: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Adder>) };\n    _self.add(x)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Adder__add(_self: *const u8, x: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Adder>) };\n    _self.add(x)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_adder_box(x: i32) -> *const u8 {\n    Box::into_raw(Box::new(get_adder_box(x))) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_adder_rc(x: i32) -> *const u8 {\n    Box::into_raw(Box::new(get_adder_rc(x))) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Box_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Adder>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Rc_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Adder>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_Box_Adder__add(const void*, int32_t x);\n\nint32_t _ffi_Rc_Adder__add(const void*, int32_t x);\n\nconst void* _ffi_fn_get_adder_box(int32_t x);\n\nconst void* _ffi_fn_get_adder_rc(int32_t x);\n\nuint32_t _ffi_fn_get_counter();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nvoid _ffi_rs_drop_Box_Adder(const void* ptr);\n\nvoid _ffi_rs_drop_Rc_Adder(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Adder: AnyObject {\n    func add(_ x: Int32) -> Int32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_counter() -> UInt32 {\n    return _ffi_fn_get_counter()\n}\n\nfunc get_adder_rc(_ x: Int32) -> Adder {\n    let ret_ptr = _ffi_fn_get_adder_rc(x)\n    return _ffi_Rc_Adder(ret_ptr)\n}\n\nfunc get_adder_box(_ x: Int32) -> Adder {\n    let ret_ptr = _ffi_fn_get_adder_box(x)\n    return _ffi_Box_Adder(ret_ptr)\n}\n\nprivate class _ffi_Box_Adder : Adder {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Box_Adder(_ffi)\n    }\n\n    func add(_ x: Int32) -> Int32 {\n        return _ffi_Box_Adder__add(_ffi, x)\n    }\n}\n\nprivate class _ffi_Rc_Adder : Adder {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Rc_Adder(_ffi)\n    }\n\n    func add(_ x: Int32) -> Int32 {\n        return _ffi_Rc_Adder__add(_ffi, x)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Box_Adder__add(_self: *const u8, x: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Adder>) };\n    _self.add(x)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Adder__add(_self: *const u8, x: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Adder>) };\n    _self.add(x)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_adder_box(x: i32) -> *const u8 {\n    Box::into_raw(Box::new(get_adder_box(x))) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_adder_rc(x: i32) -> *const u8 {\n    Box::into_raw(Box::new(get_adder_rc(x))) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Box_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Adder>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Rc_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Adder>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_import_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_Rc_Exported__run(const void*, const void* imported_ptr);\n\nuint32_t _ffi_fn_get_counter();\n\nconst void* _ffi_fn_get_exported();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nvoid _ffi_rs_drop_Rc_Exported(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_import_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Imported: AnyObject {\n    func add(_ x: Int32, _ y: Int32) -> Int32\n}\n\nprotocol Exported: AnyObject {\n    func run(_ imported: Imported) -> Int32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_exported() -> Exported {\n    let ret_ptr = _ffi_fn_get_exported()\n    return _ffi_Rc_Exported(ret_ptr)\n}\n\nfunc get_counter() -> UInt32 {\n    return _ffi_fn_get_counter()\n}\n\nprivate class _ffi_Rc_Exported : Exported {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Rc_Exported(_ffi)\n    }\n\n    func run(_ imported: Imported) -> Int32 {\n        return _ffi_Rc_Exported__run(_ffi, UnsafeRawPointer(Unmanaged.passRetained(imported as AnyObject).toOpaque()))\n    }\n}\n\n@_cdecl(\"_ffi_swift_Imported__add\")\nfunc _ffi_swift_Imported__add(_self: UnsafeRawPointer?, x: Int32, y: Int32) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Imported\n    return _self.add(x, y)\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_import_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Exported__run(_self: *const u8, imported_ptr: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Exported>) };\n    _self.run(std::rc::Rc::new(_ffi_rs_Imported(imported_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_exported() -> *const u8 {\n    Box::into_raw(Box::new(get_exported())) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Imported(*const u8);\n\nimpl Drop for _ffi_rs_Imported {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Imported for _ffi_rs_Imported {\n    fn add(&self, x: i32, y: i32) -> i32 {\n        extern \"C\" { fn _ffi_swift_Imported__add(_: *const u8, x: i32, y: i32) -> i32; }\n        unsafe { _ffi_swift_Imported__add(self.0, x, y) }\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Rc_Exported(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Exported>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_import_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_Rc_Exported__run(const void*, const void* imported_ptr);\n\nuint32_t _ffi_fn_get_counter();\n\nconst void* _ffi_fn_get_exported();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nvoid _ffi_rs_drop_Rc_Exported(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_import_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Imported: AnyObject {\n    func add(_ x: Int32, _ y: Int32) -> Int32\n}\n\nprotocol Exported: AnyObject {\n    func run(_ imported: Imported) -> Int32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_exported() -> Exported {\n    let ret_ptr = _ffi_fn_get_exported()\n    return _ffi_Rc_Exported(ret_ptr)\n}\n\nfunc get_counter() -> UInt32 {\n    return _ffi_fn_get_counter()\n}\n\nprivate class _ffi_Rc_Exported : Exported {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Rc_Exported(_ffi)\n    }\n\n    func run(_ imported: Imported) -> Int32 {\n        return _ffi_Rc_Exported__run(_ffi, UnsafeRawPointer(Unmanaged.passRetained(imported as AnyObject).toOpaque()))\n    }\n}\n\n@_cdecl(\"_ffi_swift_Imported__add\")\nfunc _ffi_swift_Imported__add(_self: UnsafeRawPointer?, x: Int32, y: Int32) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Imported\n    return _self.add(x, y)\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_import_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Exported__run(_self: *const u8, imported_ptr: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Exported>) };\n    _self.run(std::rc::Rc::new(_ffi_rs_Imported(imported_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_exported() -> *const u8 {\n    Box::into_raw(Box::new(get_exported())) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Imported(*const u8);\n\nimpl Drop for _ffi_rs_Imported {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Imported for _ffi_rs_Imported {\n    fn add(&self, x: i32, y: i32) -> i32 {\n        unsafe extern \"C\" { fn _ffi_swift_Imported__add(_: *const u8, x: i32, y: i32) -> i32; }\n        unsafe { _ffi_swift_Imported__add(self.0, x, y) }\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Rc_Exported(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Exported>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_nested_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_Rc_Adder__add(const void*, int32_t x, int32_t y);\n\nconst void* _ffi_Rc_Getter__get_adder(const void*);\n\nuint32_t _ffi_fn_get_adder_counter();\n\nconst void* _ffi_fn_get_getter();\n\nuint32_t _ffi_fn_get_getter_counter();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nvoid _ffi_rs_drop_Rc_Adder(const void* ptr);\n\nvoid _ffi_rs_drop_Rc_Getter(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_nested_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Getter: AnyObject {\n    func get_adder() -> Adder\n}\n\nprotocol Adder: AnyObject {\n    func add(_ x: Int32, _ y: Int32) -> Int32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_getter_counter() -> UInt32 {\n    return _ffi_fn_get_getter_counter()\n}\n\nfunc get_adder_counter() -> UInt32 {\n    return _ffi_fn_get_adder_counter()\n}\n\nfunc get_getter() -> Getter {\n    let ret_ptr = _ffi_fn_get_getter()\n    return _ffi_Rc_Getter(ret_ptr)\n}\n\nprivate class _ffi_Rc_Adder : Adder {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Rc_Adder(_ffi)\n    }\n\n    func add(_ x: Int32, _ y: Int32) -> Int32 {\n        return _ffi_Rc_Adder__add(_ffi, x, y)\n    }\n}\n\nprivate class _ffi_Rc_Getter : Getter {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Rc_Getter(_ffi)\n    }\n\n    func get_adder() -> Adder {\n        let ret_ptr = _ffi_Rc_Getter__get_adder(_ffi)\n        return _ffi_Rc_Adder(ret_ptr)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_nested_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Adder__add(_self: *const u8, x: i32, y: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Adder>) };\n    _self.add(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Getter__get_adder(_self: *const u8) -> *const u8 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Getter>) };\n    Box::into_raw(Box::new(_self.get_adder())) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_adder_counter() -> u32 {\n    get_adder_counter()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_getter() -> *const u8 {\n    Box::into_raw(Box::new(get_getter())) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_getter_counter() -> u32 {\n    get_getter_counter()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Rc_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Adder>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Rc_Getter(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Getter>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_nested_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_Rc_Adder__add(const void*, int32_t x, int32_t y);\n\nconst void* _ffi_Rc_Getter__get_adder(const void*);\n\nuint32_t _ffi_fn_get_adder_counter();\n\nconst void* _ffi_fn_get_getter();\n\nuint32_t _ffi_fn_get_getter_counter();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nvoid _ffi_rs_drop_Rc_Adder(const void* ptr);\n\nvoid _ffi_rs_drop_Rc_Getter(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_nested_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Getter: AnyObject {\n    func get_adder() -> Adder\n}\n\nprotocol Adder: AnyObject {\n    func add(_ x: Int32, _ y: Int32) -> Int32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_getter_counter() -> UInt32 {\n    return _ffi_fn_get_getter_counter()\n}\n\nfunc get_adder_counter() -> UInt32 {\n    return _ffi_fn_get_adder_counter()\n}\n\nfunc get_getter() -> Getter {\n    let ret_ptr = _ffi_fn_get_getter()\n    return _ffi_Rc_Getter(ret_ptr)\n}\n\nprivate class _ffi_Rc_Adder : Adder {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Rc_Adder(_ffi)\n    }\n\n    func add(_ x: Int32, _ y: Int32) -> Int32 {\n        return _ffi_Rc_Adder__add(_ffi, x, y)\n    }\n}\n\nprivate class _ffi_Rc_Getter : Getter {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Rc_Getter(_ffi)\n    }\n\n    func get_adder() -> Adder {\n        let ret_ptr = _ffi_Rc_Getter__get_adder(_ffi)\n        return _ffi_Rc_Adder(ret_ptr)\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_export_nested_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Adder__add(_self: *const u8, x: i32, y: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Adder>) };\n    _self.add(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Getter__get_adder(_self: *const u8) -> *const u8 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Getter>) };\n    Box::into_raw(Box::new(_self.get_adder())) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_adder_counter() -> u32 {\n    get_adder_counter()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_getter() -> *const u8 {\n    Box::into_raw(Box::new(get_getter())) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_getter_counter() -> u32 {\n    get_getter_counter()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Rc_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Adder>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Rc_Getter(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Getter>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_set_adder_box(const void* adder_ptr);\n\nint32_t _ffi_fn_set_adder_rc(const void* adder_ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Adder: AnyObject {\n    func add(_ y: Int32) -> Int32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc set_adder_rc(_ adder: Adder) -> Int32 {\n    return _ffi_fn_set_adder_rc(UnsafeRawPointer(Unmanaged.passRetained(adder as AnyObject).toOpaque()))\n}\n\nfunc set_adder_box(_ adder: Adder) -> Int32 {\n    return _ffi_fn_set_adder_box(UnsafeRawPointer(Unmanaged.passRetained(adder as AnyObject).toOpaque()))\n}\n\n@_cdecl(\"_ffi_swift_Adder__add\")\nfunc _ffi_swift_Adder__add(_self: UnsafeRawPointer?, y: Int32) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Adder\n    return _self.add(y)\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_adder_box(adder_ptr: *const u8) -> i32 {\n    set_adder_box(Box::new(_ffi_rs_Adder(adder_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_adder_rc(adder_ptr: *const u8) -> i32 {\n    set_adder_rc(std::rc::Rc::new(_ffi_rs_Adder(adder_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Adder(*const u8);\n\nimpl Drop for _ffi_rs_Adder {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Adder for _ffi_rs_Adder {\n    fn add(&self, y: i32) -> i32 {\n        extern \"C\" { fn _ffi_swift_Adder__add(_: *const u8, y: i32) -> i32; }\n        unsafe { _ffi_swift_Adder__add(self.0, y) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_set_adder_box(const void* adder_ptr);\n\nint32_t _ffi_fn_set_adder_rc(const void* adder_ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Adder: AnyObject {\n    func add(_ y: Int32) -> Int32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc set_adder_rc(_ adder: Adder) -> Int32 {\n    return _ffi_fn_set_adder_rc(UnsafeRawPointer(Unmanaged.passRetained(adder as AnyObject).toOpaque()))\n}\n\nfunc set_adder_box(_ adder: Adder) -> Int32 {\n    return _ffi_fn_set_adder_box(UnsafeRawPointer(Unmanaged.passRetained(adder as AnyObject).toOpaque()))\n}\n\n@_cdecl(\"_ffi_swift_Adder__add\")\nfunc _ffi_swift_Adder__add(_self: UnsafeRawPointer?, y: Int32) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Adder\n    return _self.add(y)\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_adder_box(adder_ptr: *const u8) -> i32 {\n    set_adder_box(Box::new(_ffi_rs_Adder(adder_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_adder_rc(adder_ptr: *const u8) -> i32 {\n    set_adder_rc(std::rc::Rc::new(_ffi_rs_Adder(adder_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Adder(*const u8);\n\nimpl Drop for _ffi_rs_Adder {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Adder for _ffi_rs_Adder {\n    fn add(&self, y: i32) -> i32 {\n        unsafe extern \"C\" { fn _ffi_swift_Adder__add(_: *const u8, y: i32) -> i32; }\n        unsafe { _ffi_swift_Adder__add(self.0, y) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_export_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_Rc_Exported__add(const void*, int32_t x, int32_t y);\n\nuint32_t _ffi_fn_get_counter();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_set_imported(const void* imported_ptr);\n\nvoid _ffi_rs_drop_Rc_Exported(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_export_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Imported: AnyObject {\n    func run(_ exported: Exported) -> Int32\n}\n\nprotocol Exported: AnyObject {\n    func add(_ x: Int32, _ y: Int32) -> Int32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_counter() -> UInt32 {\n    return _ffi_fn_get_counter()\n}\n\nfunc set_imported(_ imported: Imported) -> Int32 {\n    return _ffi_fn_set_imported(UnsafeRawPointer(Unmanaged.passRetained(imported as AnyObject).toOpaque()))\n}\n\nprivate class _ffi_Rc_Exported : Exported {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Rc_Exported(_ffi)\n    }\n\n    func add(_ x: Int32, _ y: Int32) -> Int32 {\n        return _ffi_Rc_Exported__add(_ffi, x, y)\n    }\n}\n\n@_cdecl(\"_ffi_swift_Imported__run\")\nfunc _ffi_swift_Imported__run(_self: UnsafeRawPointer?, exported_ptr: UnsafeRawPointer?) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Imported\n    return _self.run(_ffi_Rc_Exported(exported_ptr))\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_export_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Exported__add(_self: *const u8, x: i32, y: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Exported>) };\n    _self.add(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_imported(imported_ptr: *const u8) -> i32 {\n    set_imported(std::rc::Rc::new(_ffi_rs_Imported(imported_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Imported(*const u8);\n\nimpl Drop for _ffi_rs_Imported {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Imported for _ffi_rs_Imported {\n    fn run(&self, exported: std::rc::Rc<dyn Exported>) -> i32 {\n        extern \"C\" { fn _ffi_swift_Imported__run(_: *const u8, exported_ptr: *const u8) -> i32; }\n        unsafe { _ffi_swift_Imported__run(self.0, Box::into_raw(Box::new(exported)) as *const u8) }\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Rc_Exported(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Exported>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_export_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint32_t _ffi_Rc_Exported__add(const void*, int32_t x, int32_t y);\n\nuint32_t _ffi_fn_get_counter();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_set_imported(const void* imported_ptr);\n\nvoid _ffi_rs_drop_Rc_Exported(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_export_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Imported: AnyObject {\n    func run(_ exported: Exported) -> Int32\n}\n\nprotocol Exported: AnyObject {\n    func add(_ x: Int32, _ y: Int32) -> Int32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_counter() -> UInt32 {\n    return _ffi_fn_get_counter()\n}\n\nfunc set_imported(_ imported: Imported) -> Int32 {\n    return _ffi_fn_set_imported(UnsafeRawPointer(Unmanaged.passRetained(imported as AnyObject).toOpaque()))\n}\n\nprivate class _ffi_Rc_Exported : Exported {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Rc_Exported(_ffi)\n    }\n\n    func add(_ x: Int32, _ y: Int32) -> Int32 {\n        return _ffi_Rc_Exported__add(_ffi, x, y)\n    }\n}\n\n@_cdecl(\"_ffi_swift_Imported__run\")\nfunc _ffi_swift_Imported__run(_self: UnsafeRawPointer?, exported_ptr: UnsafeRawPointer?) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Imported\n    return _self.run(_ffi_Rc_Exported(exported_ptr))\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_export_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Exported__add(_self: *const u8, x: i32, y: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Exported>) };\n    _self.add(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_imported(imported_ptr: *const u8) -> i32 {\n    set_imported(std::rc::Rc::new(_ffi_rs_Imported(imported_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Imported(*const u8);\n\nimpl Drop for _ffi_rs_Imported {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Imported for _ffi_rs_Imported {\n    fn run(&self, exported: std::rc::Rc<dyn Exported>) -> i32 {\n        unsafe extern \"C\" { fn _ffi_swift_Imported__run(_: *const u8, exported_ptr: *const u8) -> i32; }\n        unsafe { _ffi_swift_Imported__run(self.0, Box::into_raw(Box::new(exported)) as *const u8) }\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Rc_Exported(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Exported>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_nested_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_set_getter(const void* getter_ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_nested_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Getter: AnyObject {\n    func get_adder() -> Adder\n}\n\nprotocol Adder: AnyObject {\n    func add(_ x: Int32, _ y: Int32) -> Int32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc set_getter(_ getter: Getter) -> Int32 {\n    return _ffi_fn_set_getter(UnsafeRawPointer(Unmanaged.passRetained(getter as AnyObject).toOpaque()))\n}\n\n@_cdecl(\"_ffi_swift_Adder__add\")\nfunc _ffi_swift_Adder__add(_self: UnsafeRawPointer?, x: Int32, y: Int32) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Adder\n    return _self.add(x, y)\n}\n\n@_cdecl(\"_ffi_swift_Getter__get_adder\")\nfunc _ffi_swift_Getter__get_adder(_self: UnsafeRawPointer?) -> UnsafeRawPointer? {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Getter\n    return UnsafeRawPointer(Unmanaged.passRetained(_self.get_adder() as AnyObject).toOpaque())\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_nested_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_getter(getter_ptr: *const u8) -> i32 {\n    set_getter(std::rc::Rc::new(_ffi_rs_Getter(getter_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Adder(*const u8);\n\nimpl Drop for _ffi_rs_Adder {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Adder for _ffi_rs_Adder {\n    fn add(&self, x: i32, y: i32) -> i32 {\n        extern \"C\" { fn _ffi_swift_Adder__add(_: *const u8, x: i32, y: i32) -> i32; }\n        unsafe { _ffi_swift_Adder__add(self.0, x, y) }\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Getter(*const u8);\n\nimpl Drop for _ffi_rs_Getter {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Getter for _ffi_rs_Getter {\n    fn get_adder(&self) -> std::rc::Rc<dyn Adder> {\n        extern \"C\" { fn _ffi_swift_Getter__get_adder(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_swift_Getter__get_adder(self.0) };\n        std::rc::Rc::new(_ffi_rs_Adder(ret_ptr))\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_nested_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_set_getter(const void* getter_ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_nested_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Getter: AnyObject {\n    func get_adder() -> Adder\n}\n\nprotocol Adder: AnyObject {\n    func add(_ x: Int32, _ y: Int32) -> Int32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc set_getter(_ getter: Getter) -> Int32 {\n    return _ffi_fn_set_getter(UnsafeRawPointer(Unmanaged.passRetained(getter as AnyObject).toOpaque()))\n}\n\n@_cdecl(\"_ffi_swift_Adder__add\")\nfunc _ffi_swift_Adder__add(_self: UnsafeRawPointer?, x: Int32, y: Int32) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Adder\n    return _self.add(x, y)\n}\n\n@_cdecl(\"_ffi_swift_Getter__get_adder\")\nfunc _ffi_swift_Getter__get_adder(_self: UnsafeRawPointer?) -> UnsafeRawPointer? {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Getter\n    return UnsafeRawPointer(Unmanaged.passRetained(_self.get_adder() as AnyObject).toOpaque())\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_nested_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_getter(getter_ptr: *const u8) -> i32 {\n    set_getter(std::rc::Rc::new(_ffi_rs_Getter(getter_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Adder(*const u8);\n\nimpl Drop for _ffi_rs_Adder {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Adder for _ffi_rs_Adder {\n    fn add(&self, x: i32, y: i32) -> i32 {\n        unsafe extern \"C\" { fn _ffi_swift_Adder__add(_: *const u8, x: i32, y: i32) -> i32; }\n        unsafe { _ffi_swift_Adder__add(self.0, x, y) }\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Getter(*const u8);\n\nimpl Drop for _ffi_rs_Getter {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Getter for _ffi_rs_Getter {\n    fn get_adder(&self) -> std::rc::Rc<dyn Adder> {\n        unsafe extern \"C\" { fn _ffi_swift_Getter__get_adder(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_swift_Getter__get_adder(self.0) };\n        std::rc::Rc::new(_ffi_rs_Adder(ret_ptr))\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_struct_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_set_empty_struct(const void* struct_in_ptr);\n\nfloat _ffi_fn_set_multiply_pairs(const void* struct_in_ptr);\n\nint32_t _ffi_fn_set_single_element_struct(const void* struct_in_ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_struct_in_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol StructIn: AnyObject {\n    func empty_struct(_ x: Int32, _ foo: EmptyStruct, _ y: Int32) -> Int32\n    func single_element_struct(_ x: SingleElementStruct, _ y: SingleElementStruct) -> Int32\n    func multiply_pairs(_ ab: PairStruct, _ cd: PairStruct) -> Float32\n}\n\nstruct EmptyStruct {\n}\n\nstruct SingleElementStruct {\n    var _0: Int32\n}\n\nstruct PairStruct {\n    var x: Float32\n    var y: Float32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc set_empty_struct(_ struct_in: StructIn) -> Int32 {\n    return _ffi_fn_set_empty_struct(UnsafeRawPointer(Unmanaged.passRetained(struct_in as AnyObject).toOpaque()))\n}\n\nfunc set_single_element_struct(_ struct_in: StructIn) -> Int32 {\n    return _ffi_fn_set_single_element_struct(UnsafeRawPointer(Unmanaged.passRetained(struct_in as AnyObject).toOpaque()))\n}\n\nfunc set_multiply_pairs(_ struct_in: StructIn) -> Float32 {\n    return _ffi_fn_set_multiply_pairs(UnsafeRawPointer(Unmanaged.passRetained(struct_in as AnyObject).toOpaque()))\n}\n\n@_cdecl(\"_ffi_swift_StructIn__empty_struct\")\nfunc _ffi_swift_StructIn__empty_struct(_self: UnsafeRawPointer?, x: Int32, y: Int32) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! StructIn\n    return _self.empty_struct(x, EmptyStruct(), y)\n}\n\n@_cdecl(\"_ffi_swift_StructIn__multiply_pairs\")\nfunc _ffi_swift_StructIn__multiply_pairs(_self: UnsafeRawPointer?, ab_x: Float32, ab_y: Float32, cd_x: Float32, cd_y: Float32) -> Float32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! StructIn\n    return _self.multiply_pairs(PairStruct(x: ab_x, y: ab_y), PairStruct(x: cd_x, y: cd_y))\n}\n\n@_cdecl(\"_ffi_swift_StructIn__single_element_struct\")\nfunc _ffi_swift_StructIn__single_element_struct(_self: UnsafeRawPointer?, x_0: Int32, y_0: Int32) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! StructIn\n    return _self.single_element_struct(SingleElementStruct(_0: x_0), SingleElementStruct(_0: y_0))\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_struct_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_empty_struct(struct_in_ptr: *const u8) -> i32 {\n    set_empty_struct(std::rc::Rc::new(_ffi_rs_StructIn(struct_in_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_multiply_pairs(struct_in_ptr: *const u8) -> f32 {\n    set_multiply_pairs(std::rc::Rc::new(_ffi_rs_StructIn(struct_in_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_single_element_struct(struct_in_ptr: *const u8) -> i32 {\n    set_single_element_struct(std::rc::Rc::new(_ffi_rs_StructIn(struct_in_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_StructIn(*const u8);\n\nimpl Drop for _ffi_rs_StructIn {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl StructIn for _ffi_rs_StructIn {\n    fn empty_struct(&self, x: i32, foo: EmptyStruct, y: i32) -> i32 {\n        extern \"C\" { fn _ffi_swift_StructIn__empty_struct(_: *const u8, x: i32, y: i32) -> i32; }\n        _ = foo;\n        unsafe { _ffi_swift_StructIn__empty_struct(self.0, x, y) }\n    }\n\n    fn single_element_struct(&self, x: SingleElementStruct, y: SingleElementStruct) -> i32 {\n        extern \"C\" { fn _ffi_swift_StructIn__single_element_struct(_: *const u8, x_0: i32, y_0: i32) -> i32; }\n        unsafe { _ffi_swift_StructIn__single_element_struct(self.0, x.0, y.0) }\n    }\n\n    fn multiply_pairs(&self, ab: PairStruct, cd: PairStruct) -> f32 {\n        extern \"C\" { fn _ffi_swift_StructIn__multiply_pairs(_: *const u8, ab_x: f32, ab_y: f32, cd_x: f32, cd_y: f32) -> f32; }\n        unsafe { _ffi_swift_StructIn__multiply_pairs(self.0, ab.x, ab.y, cd.x, cd.y) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_struct_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_set_empty_struct(const void* struct_in_ptr);\n\nfloat _ffi_fn_set_multiply_pairs(const void* struct_in_ptr);\n\nint32_t _ffi_fn_set_single_element_struct(const void* struct_in_ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_struct_in_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol StructIn: AnyObject {\n    func empty_struct(_ x: Int32, _ foo: EmptyStruct, _ y: Int32) -> Int32\n    func single_element_struct(_ x: SingleElementStruct, _ y: SingleElementStruct) -> Int32\n    func multiply_pairs(_ ab: PairStruct, _ cd: PairStruct) -> Float32\n}\n\nstruct EmptyStruct {\n}\n\nstruct SingleElementStruct {\n    var _0: Int32\n}\n\nstruct PairStruct {\n    var x: Float32\n    var y: Float32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc set_empty_struct(_ struct_in: StructIn) -> Int32 {\n    return _ffi_fn_set_empty_struct(UnsafeRawPointer(Unmanaged.passRetained(struct_in as AnyObject).toOpaque()))\n}\n\nfunc set_single_element_struct(_ struct_in: StructIn) -> Int32 {\n    return _ffi_fn_set_single_element_struct(UnsafeRawPointer(Unmanaged.passRetained(struct_in as AnyObject).toOpaque()))\n}\n\nfunc set_multiply_pairs(_ struct_in: StructIn) -> Float32 {\n    return _ffi_fn_set_multiply_pairs(UnsafeRawPointer(Unmanaged.passRetained(struct_in as AnyObject).toOpaque()))\n}\n\n@_cdecl(\"_ffi_swift_StructIn__empty_struct\")\nfunc _ffi_swift_StructIn__empty_struct(_self: UnsafeRawPointer?, x: Int32, y: Int32) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! StructIn\n    return _self.empty_struct(x, EmptyStruct(), y)\n}\n\n@_cdecl(\"_ffi_swift_StructIn__multiply_pairs\")\nfunc _ffi_swift_StructIn__multiply_pairs(_self: UnsafeRawPointer?, ab_x: Float32, ab_y: Float32, cd_x: Float32, cd_y: Float32) -> Float32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! StructIn\n    return _self.multiply_pairs(PairStruct(x: ab_x, y: ab_y), PairStruct(x: cd_x, y: cd_y))\n}\n\n@_cdecl(\"_ffi_swift_StructIn__single_element_struct\")\nfunc _ffi_swift_StructIn__single_element_struct(_self: UnsafeRawPointer?, x_0: Int32, y_0: Int32) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! StructIn\n    return _self.single_element_struct(SingleElementStruct(_0: x_0), SingleElementStruct(_0: y_0))\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_struct_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_empty_struct(struct_in_ptr: *const u8) -> i32 {\n    set_empty_struct(std::rc::Rc::new(_ffi_rs_StructIn(struct_in_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_multiply_pairs(struct_in_ptr: *const u8) -> f32 {\n    set_multiply_pairs(std::rc::Rc::new(_ffi_rs_StructIn(struct_in_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_single_element_struct(struct_in_ptr: *const u8) -> i32 {\n    set_single_element_struct(std::rc::Rc::new(_ffi_rs_StructIn(struct_in_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_StructIn(*const u8);\n\nimpl Drop for _ffi_rs_StructIn {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl StructIn for _ffi_rs_StructIn {\n    fn empty_struct(&self, x: i32, foo: EmptyStruct, y: i32) -> i32 {\n        unsafe extern \"C\" { fn _ffi_swift_StructIn__empty_struct(_: *const u8, x: i32, y: i32) -> i32; }\n        _ = foo;\n        unsafe { _ffi_swift_StructIn__empty_struct(self.0, x, y) }\n    }\n\n    fn single_element_struct(&self, x: SingleElementStruct, y: SingleElementStruct) -> i32 {\n        unsafe extern \"C\" { fn _ffi_swift_StructIn__single_element_struct(_: *const u8, x_0: i32, y_0: i32) -> i32; }\n        unsafe { _ffi_swift_StructIn__single_element_struct(self.0, x.0, y.0) }\n    }\n\n    fn multiply_pairs(&self, ab: PairStruct, cd: PairStruct) -> f32 {\n        unsafe extern \"C\" { fn _ffi_swift_StructIn__multiply_pairs(_: *const u8, ab_x: f32, ab_y: f32, cd_x: f32, cd_y: f32) -> f32; }\n        unsafe { _ffi_swift_StructIn__multiply_pairs(self.0, ab.x, ab.y, cd.x, cd.y) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_tuple_in_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_set_empty_tuple(const void* tuple_in_ptr);\n\nfloat _ffi_fn_set_multiply_pairs(const void* tuple_in_ptr);\n\nint32_t _ffi_fn_set_single_element_tuple(const void* tuple_in_ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_tuple_in_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol TupleIn: AnyObject {\n    func empty_tuple(_ x: Int32, _ foo: (), _ y: Int32) -> Int32\n    func single_element_tuple(_ x: Int32, _ y: Int32) -> Int32\n    func multiply_pairs(_ ab: (Float32, Float32), _ cd: (Float32, Float32)) -> Float32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc set_empty_tuple(_ tuple_in: TupleIn) -> Int32 {\n    return _ffi_fn_set_empty_tuple(UnsafeRawPointer(Unmanaged.passRetained(tuple_in as AnyObject).toOpaque()))\n}\n\nfunc set_single_element_tuple(_ tuple_in: TupleIn) -> Int32 {\n    return _ffi_fn_set_single_element_tuple(UnsafeRawPointer(Unmanaged.passRetained(tuple_in as AnyObject).toOpaque()))\n}\n\nfunc set_multiply_pairs(_ tuple_in: TupleIn) -> Float32 {\n    return _ffi_fn_set_multiply_pairs(UnsafeRawPointer(Unmanaged.passRetained(tuple_in as AnyObject).toOpaque()))\n}\n\n@_cdecl(\"_ffi_swift_TupleIn__empty_tuple\")\nfunc _ffi_swift_TupleIn__empty_tuple(_self: UnsafeRawPointer?, x: Int32, y: Int32) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! TupleIn\n    return _self.empty_tuple(x, (), y)\n}\n\n@_cdecl(\"_ffi_swift_TupleIn__multiply_pairs\")\nfunc _ffi_swift_TupleIn__multiply_pairs(_self: UnsafeRawPointer?, ab_0: Float32, ab_1: Float32, cd_0: Float32, cd_1: Float32) -> Float32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! TupleIn\n    return _self.multiply_pairs((ab_0, ab_1), (cd_0, cd_1))\n}\n\n@_cdecl(\"_ffi_swift_TupleIn__single_element_tuple\")\nfunc _ffi_swift_TupleIn__single_element_tuple(_self: UnsafeRawPointer?, x_0: Int32, y_0: Int32) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! TupleIn\n    return _self.single_element_tuple(x_0, y_0)\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_tuple_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_empty_tuple(tuple_in_ptr: *const u8) -> i32 {\n    set_empty_tuple(std::rc::Rc::new(_ffi_rs_TupleIn(tuple_in_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_multiply_pairs(tuple_in_ptr: *const u8) -> f32 {\n    set_multiply_pairs(std::rc::Rc::new(_ffi_rs_TupleIn(tuple_in_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_single_element_tuple(tuple_in_ptr: *const u8) -> i32 {\n    set_single_element_tuple(std::rc::Rc::new(_ffi_rs_TupleIn(tuple_in_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_TupleIn(*const u8);\n\nimpl Drop for _ffi_rs_TupleIn {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl TupleIn for _ffi_rs_TupleIn {\n    fn empty_tuple(&self, x: i32, foo: (), y: i32) -> i32 {\n        extern \"C\" { fn _ffi_swift_TupleIn__empty_tuple(_: *const u8, x: i32, y: i32) -> i32; }\n        _ = foo;\n        unsafe { _ffi_swift_TupleIn__empty_tuple(self.0, x, y) }\n    }\n\n    fn single_element_tuple(&self, x: (i32,), y: (i32,)) -> i32 {\n        extern \"C\" { fn _ffi_swift_TupleIn__single_element_tuple(_: *const u8, x_0: i32, y_0: i32) -> i32; }\n        unsafe { _ffi_swift_TupleIn__single_element_tuple(self.0, x.0, y.0) }\n    }\n\n    fn multiply_pairs(&self, ab: (f32, f32), cd: (f32, f32)) -> f32 {\n        extern \"C\" { fn _ffi_swift_TupleIn__multiply_pairs(_: *const u8, ab_0: f32, ab_1: f32, cd_0: f32, cd_1: f32) -> f32; }\n        unsafe { _ffi_swift_TupleIn__multiply_pairs(self.0, ab.0, ab.1, cd.0, cd.1) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_tuple_in_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\nint32_t _ffi_fn_set_empty_tuple(const void* tuple_in_ptr);\n\nfloat _ffi_fn_set_multiply_pairs(const void* tuple_in_ptr);\n\nint32_t _ffi_fn_set_single_element_tuple(const void* tuple_in_ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_tuple_in_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol TupleIn: AnyObject {\n    func empty_tuple(_ x: Int32, _ foo: (), _ y: Int32) -> Int32\n    func single_element_tuple(_ x: Int32, _ y: Int32) -> Int32\n    func multiply_pairs(_ ab: (Float32, Float32), _ cd: (Float32, Float32)) -> Float32\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc set_empty_tuple(_ tuple_in: TupleIn) -> Int32 {\n    return _ffi_fn_set_empty_tuple(UnsafeRawPointer(Unmanaged.passRetained(tuple_in as AnyObject).toOpaque()))\n}\n\nfunc set_single_element_tuple(_ tuple_in: TupleIn) -> Int32 {\n    return _ffi_fn_set_single_element_tuple(UnsafeRawPointer(Unmanaged.passRetained(tuple_in as AnyObject).toOpaque()))\n}\n\nfunc set_multiply_pairs(_ tuple_in: TupleIn) -> Float32 {\n    return _ffi_fn_set_multiply_pairs(UnsafeRawPointer(Unmanaged.passRetained(tuple_in as AnyObject).toOpaque()))\n}\n\n@_cdecl(\"_ffi_swift_TupleIn__empty_tuple\")\nfunc _ffi_swift_TupleIn__empty_tuple(_self: UnsafeRawPointer?, x: Int32, y: Int32) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! TupleIn\n    return _self.empty_tuple(x, (), y)\n}\n\n@_cdecl(\"_ffi_swift_TupleIn__multiply_pairs\")\nfunc _ffi_swift_TupleIn__multiply_pairs(_self: UnsafeRawPointer?, ab_0: Float32, ab_1: Float32, cd_0: Float32, cd_1: Float32) -> Float32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! TupleIn\n    return _self.multiply_pairs((ab_0, ab_1), (cd_0, cd_1))\n}\n\n@_cdecl(\"_ffi_swift_TupleIn__single_element_tuple\")\nfunc _ffi_swift_TupleIn__single_element_tuple(_self: UnsafeRawPointer?, x_0: Int32, y_0: Int32) -> Int32 {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! TupleIn\n    return _self.single_element_tuple(x_0, y_0)\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_import_tuple_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_empty_tuple(tuple_in_ptr: *const u8) -> i32 {\n    set_empty_tuple(std::rc::Rc::new(_ffi_rs_TupleIn(tuple_in_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_multiply_pairs(tuple_in_ptr: *const u8) -> f32 {\n    set_multiply_pairs(std::rc::Rc::new(_ffi_rs_TupleIn(tuple_in_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_single_element_tuple(tuple_in_ptr: *const u8) -> i32 {\n    set_single_element_tuple(std::rc::Rc::new(_ffi_rs_TupleIn(tuple_in_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_TupleIn(*const u8);\n\nimpl Drop for _ffi_rs_TupleIn {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl TupleIn for _ffi_rs_TupleIn {\n    fn empty_tuple(&self, x: i32, foo: (), y: i32) -> i32 {\n        unsafe extern \"C\" { fn _ffi_swift_TupleIn__empty_tuple(_: *const u8, x: i32, y: i32) -> i32; }\n        _ = foo;\n        unsafe { _ffi_swift_TupleIn__empty_tuple(self.0, x, y) }\n    }\n\n    fn single_element_tuple(&self, x: (i32,), y: (i32,)) -> i32 {\n        unsafe extern \"C\" { fn _ffi_swift_TupleIn__single_element_tuple(_: *const u8, x_0: i32, y_0: i32) -> i32; }\n        unsafe { _ffi_swift_TupleIn__single_element_tuple(self.0, x.0, y.0) }\n    }\n\n    fn multiply_pairs(&self, ab: (f32, f32), cd: (f32, f32)) -> f32 {\n        unsafe extern \"C\" { fn _ffi_swift_TupleIn__multiply_pairs(_: *const u8, ab_0: f32, ab_1: f32, cd_0: f32, cd_1: f32) -> f32; }\n        unsafe { _ffi_swift_TupleIn__multiply_pairs(self.0, ab.0, ab.1, cd.0, cd.1) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_string_2021/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_Rc_Test__get_string(const void*);\n\nvoid _ffi_Rc_Test__set_str(const void*, const void* x_ptr, uintptr_t x_len);\n\nvoid _ffi_Rc_Test__set_string(const void*, const void* x_ptr, uintptr_t x_len);\n\nvoid* _ffi_alloc(intptr_t len);\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\nconst void* _ffi_fn_get_test();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n_ffi_ret_ptr_2_usize _ffi_fn_set_test(const void* test_ptr);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n} _ffi_ret_ptr_usize;\n\nvoid _ffi_rs_drop_Rc_Test(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_string_2021/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Test: AnyObject {\n    func get_string() -> String\n    func set_string(_ x: String)\n    func set_str(_ x: String)\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_test() -> Test {\n    let ret_ptr = _ffi_fn_get_test()\n    return _ffi_Rc_Test(ret_ptr)\n}\n\nfunc set_test(_ test: Test) -> String {\n    let multi_ret = _ffi_fn_set_test(UnsafeRawPointer(Unmanaged.passRetained(test as AnyObject).toOpaque()))\n    let ret_ptr = multi_ret._0\n    let ret_len = multi_ret._1\n    let ret_cap = multi_ret._2\n    return _ffi_string_from_rust(ret_ptr, Int(ret_len), ret_cap)\n}\n\nprivate class _ffi_Rc_Test : Test {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Rc_Test(_ffi)\n    }\n\n    func get_string() -> String {\n        let multi_ret = _ffi_Rc_Test__get_string(_ffi)\n        let ret_ptr = multi_ret._0\n        let ret_len = multi_ret._1\n        let ret_cap = multi_ret._2\n        return _ffi_string_from_rust(ret_ptr, Int(ret_len), ret_cap)\n    }\n\n    func set_string(_ x: String) {\n        let (x_ptr, x_len) = _ffi_string_to_rust(x);\n        _ffi_Rc_Test__set_string(_ffi, x_ptr, x_len)\n    }\n\n    func set_str(_ x: String) {\n        let (x_ptr, x_len) = _ffi_string_to_rust(x);\n        _ffi_Rc_Test__set_str(_ffi, x_ptr, x_len)\n    }\n}\n\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\nprivate func _ffi_string_to_rust(_ str: String) -> (UnsafeRawPointer?, UInt) {\n    var str = str\n    return str.withUTF8 { str in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(str.count), count: str.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: str.baseAddress, count: str.count))\n        return (UnsafeRawPointer(buf.baseAddress), UInt(buf.count))\n    }\n}\n\n@_cdecl(\"_ffi_swift_Test__get_string\")\nfunc _ffi_swift_Test__get_string(_self: UnsafeRawPointer?) -> _ffi_ret_ptr_usize {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Test\n    let (ret_ptr, ret_len) = _ffi_string_to_rust(_self.get_string());\n    return _ffi_ret_ptr_usize(_0: ret_ptr, _1: ret_len)\n}\n\n@_cdecl(\"_ffi_swift_Test__set_str\")\nfunc _ffi_swift_Test__set_str(_self: UnsafeRawPointer?, x_ptr: UnsafeRawPointer?, x_len: UInt, x_cap: UInt) {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Test\n    _self.set_str(_ffi_string_from_rust(x_ptr, Int(x_len), x_cap))\n}\n\n@_cdecl(\"_ffi_swift_Test__set_string\")\nfunc _ffi_swift_Test__set_string(_self: UnsafeRawPointer?, x_ptr: UnsafeRawPointer?, x_len: UInt, x_cap: UInt) {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Test\n    _self.set_string(_ffi_string_from_rust(x_ptr, Int(x_len), x_cap))\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_string_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Test__get_string(_self: *const u8) -> _ffi_ret_ptr_2_usize {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(_self.get_string());\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Test__set_str(_self: *const u8, x_ptr: *const u8, x_len: usize) {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    _self.set_str(&_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Test__set_string(_self: *const u8, x_ptr: *const u8, x_len: usize) {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    _self.set_string(_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_test() -> *const u8 {\n    Box::into_raw(Box::new(get_test())) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_test(test_ptr: *const u8) -> _ffi_ret_ptr_2_usize {\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(set_test(std::rc::Rc::new(_ffi_rs_Test(test_ptr))));\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Test(*const u8);\n\nimpl Drop for _ffi_rs_Test {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Test for _ffi_rs_Test {\n    fn get_string(&self) -> String {\n        extern \"C\" { fn _ffi_swift_Test__get_string(_: *const u8) -> _ffi_ret_ptr_usize; }\n        let multi_ret = unsafe { _ffi_swift_Test__get_string(self.0) };\n        let ret_ptr = multi_ret.0;\n        let ret_len = multi_ret.1;\n        _ffi_string_from_host(ret_ptr, ret_len)\n    }\n\n    fn set_string(&self, x: String) {\n        extern \"C\" { fn _ffi_swift_Test__set_string(_: *const u8, x_ptr: *const u8, x_len: usize, x_cap: usize); }\n        let (x_ptr, x_len, x_cap) = _ffi_string_to_host(x);\n        unsafe { _ffi_swift_Test__set_string(self.0, x_ptr, x_len, x_cap) };\n    }\n\n    fn set_str(&self, x: &str) {\n        extern \"C\" { fn _ffi_swift_Test__set_str(_: *const u8, x_ptr: *const u8, x_len: usize, x_cap: usize); }\n        let (x_ptr, x_len, x_cap) = _ffi_string_to_host(x.into());\n        unsafe { _ffi_swift_Test__set_str(self.0, x_ptr, x_len, x_cap) };\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Rc_Test(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Test>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_string_2024/ffi.h",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n    uintptr_t _2;\n} _ffi_ret_ptr_2_usize;\n\n_ffi_ret_ptr_2_usize _ffi_Rc_Test__get_string(const void*);\n\nvoid _ffi_Rc_Test__set_str(const void*, const void* x_ptr, uintptr_t x_len);\n\nvoid _ffi_Rc_Test__set_string(const void*, const void* x_ptr, uintptr_t x_len);\n\nvoid* _ffi_alloc(intptr_t len);\n\nvoid _ffi_dealloc(const void* ptr, uintptr_t capacity);\n\nconst void* _ffi_fn_get_test();\n\nuintptr_t _ffi_fn_rust_mem_leaked();\n\n_ffi_ret_ptr_2_usize _ffi_fn_set_test(const void* test_ptr);\n\ntypedef struct {\n    const void* _0;\n    uintptr_t _1;\n} _ffi_ret_ptr_usize;\n\nvoid _ffi_rs_drop_Rc_Test(const void* ptr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_string_2024/ffi.swift",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nprotocol Test: AnyObject {\n    func get_string() -> String\n    func set_string(_ x: String)\n    func set_str(_ x: String)\n}\n\nfunc rust_mem_leaked() -> UInt {\n    return _ffi_fn_rust_mem_leaked()\n}\n\nfunc get_test() -> Test {\n    let ret_ptr = _ffi_fn_get_test()\n    return _ffi_Rc_Test(ret_ptr)\n}\n\nfunc set_test(_ test: Test) -> String {\n    let multi_ret = _ffi_fn_set_test(UnsafeRawPointer(Unmanaged.passRetained(test as AnyObject).toOpaque()))\n    let ret_ptr = multi_ret._0\n    let ret_len = multi_ret._1\n    let ret_cap = multi_ret._2\n    return _ffi_string_from_rust(ret_ptr, Int(ret_len), ret_cap)\n}\n\nprivate class _ffi_Rc_Test : Test {\n    private var _ffi: UnsafeRawPointer?\n\n    init(_ ptr: UnsafeRawPointer?) {\n        _ffi = ptr\n    }\n\n    deinit {\n        _ffi_rs_drop_Rc_Test(_ffi)\n    }\n\n    func get_string() -> String {\n        let multi_ret = _ffi_Rc_Test__get_string(_ffi)\n        let ret_ptr = multi_ret._0\n        let ret_len = multi_ret._1\n        let ret_cap = multi_ret._2\n        return _ffi_string_from_rust(ret_ptr, Int(ret_len), ret_cap)\n    }\n\n    func set_string(_ x: String) {\n        let (x_ptr, x_len) = _ffi_string_to_rust(x);\n        _ffi_Rc_Test__set_string(_ffi, x_ptr, x_len)\n    }\n\n    func set_str(_ x: String) {\n        let (x_ptr, x_len) = _ffi_string_to_rust(x);\n        _ffi_Rc_Test__set_str(_ffi, x_ptr, x_len)\n    }\n}\n\nprivate func _ffi_string_from_rust(_ ptr: UnsafeRawPointer?, _ len: Int, _ cap: UInt) -> String {\n    let buf = UnsafeBufferPointer(start: ptr!.assumingMemoryBound(to: UInt8.self), count: len)\n    let str = String(decoding: buf, as: UTF8.self)\n    _ffi_dealloc(ptr, cap)\n    return str\n}\n\nprivate func _ffi_string_to_rust(_ str: String) -> (UnsafeRawPointer?, UInt) {\n    var str = str\n    return str.withUTF8 { str in\n        let buf = UnsafeMutableRawBufferPointer(start: _ffi_alloc(str.count), count: str.count)\n        buf.copyMemory(from: UnsafeRawBufferPointer(start: str.baseAddress, count: str.count))\n        return (UnsafeRawPointer(buf.baseAddress), UInt(buf.count))\n    }\n}\n\n@_cdecl(\"_ffi_swift_Test__get_string\")\nfunc _ffi_swift_Test__get_string(_self: UnsafeRawPointer?) -> _ffi_ret_ptr_usize {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Test\n    let (ret_ptr, ret_len) = _ffi_string_to_rust(_self.get_string());\n    return _ffi_ret_ptr_usize(_0: ret_ptr, _1: ret_len)\n}\n\n@_cdecl(\"_ffi_swift_Test__set_str\")\nfunc _ffi_swift_Test__set_str(_self: UnsafeRawPointer?, x_ptr: UnsafeRawPointer?, x_len: UInt, x_cap: UInt) {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Test\n    _self.set_str(_ffi_string_from_rust(x_ptr, Int(x_len), x_cap))\n}\n\n@_cdecl(\"_ffi_swift_Test__set_string\")\nfunc _ffi_swift_Test__set_string(_self: UnsafeRawPointer?, x_ptr: UnsafeRawPointer?, x_len: UInt, x_cap: UInt) {\n    let _self = Unmanaged<AnyObject>.fromOpaque(_self!).takeUnretainedValue() as! Test\n    _self.set_string(_ffi_string_from_rust(x_ptr, Int(x_len), x_cap))\n}\n\n@_cdecl(\"_ffi_swift_drop\")\nfunc _ffi_swift_drop(ptr: UnsafeRawPointer?) {\n    _ = Unmanaged<AnyObject>.fromOpaque(ptr!).takeRetainedValue()\n}\n"
  },
  {
    "path": "src/tests/snapshots/swift_trait_string_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Test__get_string(_self: *const u8) -> _ffi_ret_ptr_2_usize {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(_self.get_string());\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Test__set_str(_self: *const u8, x_ptr: *const u8, x_len: usize) {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    _self.set_str(&_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Test__set_string(_self: *const u8, x_ptr: *const u8, x_len: usize) {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    _self.set_string(_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_test() -> *const u8 {\n    Box::into_raw(Box::new(get_test())) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_test(test_ptr: *const u8) -> _ffi_ret_ptr_2_usize {\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(set_test(std::rc::Rc::new(_ffi_rs_Test(test_ptr))));\n    _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap)\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Test(*const u8);\n\nimpl Drop for _ffi_rs_Test {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_swift_drop(_: *const u8); }\n        unsafe { _ffi_swift_drop(self.0) };\n    }\n}\n\nimpl Test for _ffi_rs_Test {\n    fn get_string(&self) -> String {\n        unsafe extern \"C\" { fn _ffi_swift_Test__get_string(_: *const u8) -> _ffi_ret_ptr_usize; }\n        let multi_ret = unsafe { _ffi_swift_Test__get_string(self.0) };\n        let ret_ptr = multi_ret.0;\n        let ret_len = multi_ret.1;\n        _ffi_string_from_host(ret_ptr, ret_len)\n    }\n\n    fn set_string(&self, x: String) {\n        unsafe extern \"C\" { fn _ffi_swift_Test__set_string(_: *const u8, x_ptr: *const u8, x_len: usize, x_cap: usize); }\n        let (x_ptr, x_len, x_cap) = _ffi_string_to_host(x);\n        unsafe { _ffi_swift_Test__set_string(self.0, x_ptr, x_len, x_cap) };\n    }\n\n    fn set_str(&self, x: &str) {\n        unsafe extern \"C\" { fn _ffi_swift_Test__set_str(_: *const u8, x_ptr: *const u8, x_len: usize, x_cap: usize); }\n        let (x_ptr, x_len, x_cap) = _ffi_string_to_host(x.into());\n        unsafe { _ffi_swift_Test__set_str(self.0, x_ptr, x_len, x_cap) };\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Rc_Test(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Test>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_app_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Platform {\n    create_window(): Window;\n}\n\nexport interface Window {\n    get_title(): string;\n    set_title(title: string): void;\n    get_size(): [number, number];\n    set_size(width: number, height: number): void;\n    set_handler(handler: Handler): void;\n    child_window(): Window;\n}\n\nexport interface Handler {\n    on_draw(canvas: Canvas): void;\n}\n\nexport interface Canvas {\n    draw_text_runs(runs: TextRun[]): void;\n}\n\nexport interface TextRun {\n    text: string,\n    rect: TextRect,\n}\n\nexport interface TextRect {\n    x: number,\n    y: number,\n    w: number,\n    h: number,\n}\n\nexport function rust_mem_leaked(): number;\nexport function create_app(platform: Platform): void;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_app_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function create_app(platform) {\n    _ffi_exports._ffi_fn_create_app(_ffi_handle_alloc(platform));\n}\n\nlet _ffi_len = 0;\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\nlet _ffi_reg_Box_Handler = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Box_Handler(ptr));\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\nlet _ffi_u8;\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nconst _ffi_Box_Handler = class Handler {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Box_Handler.register(this, _);\n    }\n\n    on_draw(canvas) {\n        _ffi_exports._ffi_Box_Handler__on_draw(this._, _ffi_handle_alloc(canvas));\n    }\n};\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf) {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_string_from_rust(ptr, len, cap) {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_string_to_rust(str) {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_vec_TextRun_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push({\n            text: _ffi_string_from_rust(_ffi_read_i32(buf), _ffi_read_u32(buf), _ffi_read_u32(buf)),\n            rect: { x: _ffi_read_i32(buf), y: _ffi_read_i32(buf), w: _ffi_read_i32(buf), h: _ffi_read_i32(buf) }\n        });\n    }\n    return items;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_Canvas__draw_text_runs(self, buf_ptr, buf_cap, runs_len) {\n        let buf = _ffi_new_ReadBuf(buf_ptr);\n        _ffi_handles.get(self).draw_text_runs(_ffi_vec_TextRun_from_rust(runs_len, buf));\n        _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    },\n\n    _ffi_js_Platform__create_window(self) {\n        return _ffi_handle_alloc(_ffi_handles.get(self).create_window());\n    },\n\n    _ffi_js_Window__child_window(self) {\n        return _ffi_handle_alloc(_ffi_handles.get(self).child_window());\n    },\n\n    _ffi_js_Window__get_size(self, _ffi_ret_2_i32) {\n        let ret = _ffi_handles.get(self).get_size();\n        _ffi_update_dv().setInt32(_ffi_ret_2_i32, ret[0], true);\n        _ffi_dv.setInt32(_ffi_ret_2_i32 + 4, ret[1], true);\n    },\n\n    _ffi_js_Window__get_title(self, _ffi_ret_ptr_usize) {\n        let ret_ptr = _ffi_string_to_rust(_ffi_handles.get(self).get_title()), ret_len = _ffi_len;\n        _ffi_update_dv().setInt32(_ffi_ret_ptr_usize, ret_ptr, true);\n        _ffi_dv.setInt32(_ffi_ret_ptr_usize + 4, ret_len, true);\n    },\n\n    _ffi_js_Window__set_handler(self, handler_ptr) {\n        _ffi_handles.get(self).set_handler(new _ffi_Box_Handler(handler_ptr));\n    },\n\n    _ffi_js_Window__set_size(self, width, height) {\n        _ffi_handles.get(self).set_size(width, height);\n    },\n\n    _ffi_js_Window__set_title(self, title_ptr, title_len, title_cap) {\n        _ffi_handles.get(self).set_title(_ffi_string_from_rust(title_ptr, title_len, title_cap));\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_app_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Platform {\n    create_window(): Window;\n}\n\nexport interface Window {\n    get_title(): string;\n    set_title(title: string): void;\n    get_size(): [number, number];\n    set_size(width: number, height: number): void;\n    set_handler(handler: Handler): void;\n    child_window(): Window;\n}\n\nexport interface Handler {\n    on_draw(canvas: Canvas): void;\n}\n\nexport interface Canvas {\n    draw_text_runs(runs: TextRun[]): void;\n}\n\nexport interface TextRun {\n    text: string,\n    rect: TextRect,\n}\n\nexport interface TextRect {\n    x: number,\n    y: number,\n    w: number,\n    h: number,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function create_app(platform: Platform): void {\n    _ffi_exports._ffi_fn_create_app(_ffi_handle_alloc(platform));\n}\n\nlet _ffi_len = 0;\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\nlet _ffi_reg_Box_Handler = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Box_Handler(ptr));\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\nlet _ffi_u8: Uint8Array;\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nconst _ffi_Box_Handler = class Handler implements Handler {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Box_Handler.register(this, _);\n    }\n\n    on_draw(canvas: Canvas): void {\n        _ffi_exports._ffi_Box_Handler__on_draw(this._, _ffi_handle_alloc(canvas));\n    }\n};\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_string_from_rust(ptr: number, len: number, cap: number): string {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_string_to_rust(str: string): number {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_vec_TextRun_from_rust(len: number, buf: _ffi_ReadBuf): TextRun[] {\n    let items: TextRun[] = [];\n    while (items.length < len) {\n        items.push({\n            text: _ffi_string_from_rust(_ffi_read_i32(buf), _ffi_read_u32(buf), _ffi_read_u32(buf)),\n            rect: { x: _ffi_read_i32(buf), y: _ffi_read_i32(buf), w: _ffi_read_i32(buf), h: _ffi_read_i32(buf) }\n        });\n    }\n    return items;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Box_Handler__on_draw: (_self: number, canvas_ptr: number) => void,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_create_app: (platform_ptr: number) => void,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_rs_drop_Box_Handler: (ptr: number) => void,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {\n    _ffi_js_Canvas__draw_text_runs(self: number, buf_ptr: number, buf_cap: number, runs_len: number): void {\n        let buf = _ffi_new_ReadBuf(buf_ptr);\n        _ffi_handles.get(self).draw_text_runs(_ffi_vec_TextRun_from_rust(runs_len, buf));\n        _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    },\n\n    _ffi_js_Platform__create_window(self: number): number {\n        return _ffi_handle_alloc(_ffi_handles.get(self).create_window());\n    },\n\n    _ffi_js_Window__child_window(self: number): number {\n        return _ffi_handle_alloc(_ffi_handles.get(self).child_window());\n    },\n\n    _ffi_js_Window__get_size(self: number, _ffi_ret_2_i32: number): void {\n        let ret = _ffi_handles.get(self).get_size();\n        _ffi_update_dv().setInt32(_ffi_ret_2_i32, ret[0], true);\n        _ffi_dv.setInt32(_ffi_ret_2_i32 + 4, ret[1], true);\n    },\n\n    _ffi_js_Window__get_title(self: number, _ffi_ret_ptr_usize: number): void {\n        let ret_ptr = _ffi_string_to_rust(_ffi_handles.get(self).get_title()), ret_len = _ffi_len;\n        _ffi_update_dv().setInt32(_ffi_ret_ptr_usize, ret_ptr, true);\n        _ffi_dv.setInt32(_ffi_ret_ptr_usize + 4, ret_len, true);\n    },\n\n    _ffi_js_Window__set_handler(self: number, handler_ptr: number): void {\n        _ffi_handles.get(self).set_handler(new _ffi_Box_Handler(handler_ptr));\n    },\n\n    _ffi_js_Window__set_size(self: number, width: number, height: number): void {\n        _ffi_handles.get(self).set_size(width, height);\n    },\n\n    _ffi_js_Window__set_title(self: number, title_ptr: number, title_len: number, title_cap: number): void {\n        _ffi_handles.get(self).set_title(_ffi_string_from_rust(title_ptr, title_len, title_cap));\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_app_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Box_Handler__on_draw(_self: *const u8, canvas_ptr: *const u8) {\n    let _self = unsafe { &*(_self as *const Box<dyn Handler>) };\n    _self.on_draw(Box::new(_ffi_rs_Canvas(canvas_ptr)));\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_create_app(platform_ptr: *const u8) {\n    create_app(Box::new(_ffi_rs_Platform(platform_ptr)));\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_2_i32(i32, i32);\nstatic mut _FFI_RET_2_I32: _ffi_ret_2_i32 = _ffi_ret_2_i32(0, 0);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\nstatic mut _FFI_RET_PTR_USIZE: _ffi_ret_ptr_usize = _ffi_ret_ptr_usize(std::ptr::null(), 0);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Canvas(*const u8);\n\nimpl Drop for _ffi_rs_Canvas {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Canvas for _ffi_rs_Canvas {\n    fn draw_text_runs(&self, runs: Vec<TextRun>) {\n        extern \"C\" { fn _ffi_js_Canvas__draw_text_runs(_: *const u8, buf_ptr: *const u8, buf_cap: usize, runs_len: usize); }\n        let mut buf = Vec::<u8>::new();\n        let runs_len = runs.len();\n        _ffi_vec_TextRun_to_js(runs, &mut buf);\n        let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n        unsafe { _ffi_js_Canvas__draw_text_runs(self.0, buf_ptr, buf_cap, runs_len) };\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Platform(*const u8);\n\nimpl Drop for _ffi_rs_Platform {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Platform for _ffi_rs_Platform {\n    fn create_window(&self) -> std::rc::Rc<dyn Window> {\n        extern \"C\" { fn _ffi_js_Platform__create_window(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_js_Platform__create_window(self.0) };\n        std::rc::Rc::new(_ffi_rs_Window(ret_ptr))\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Window(*const u8);\n\nimpl Drop for _ffi_rs_Window {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Window for _ffi_rs_Window {\n    fn get_title(&self) -> String {\n        extern \"C\" { fn _ffi_js_Window__get_title(_: *const u8, _: *const _ffi_ret_ptr_usize); }\n        unsafe { _ffi_js_Window__get_title(self.0, std::ptr::addr_of!(_FFI_RET_PTR_USIZE)) }\n        let ret_ptr = unsafe { _FFI_RET_PTR_USIZE.0 };\n        let ret_len = unsafe { _FFI_RET_PTR_USIZE.1 };\n        _ffi_string_from_host(ret_ptr, ret_len)\n    }\n\n    fn set_title(&self, title: &str) {\n        extern \"C\" { fn _ffi_js_Window__set_title(_: *const u8, title_ptr: *const u8, title_len: usize, title_cap: usize); }\n        let (title_ptr, title_len, title_cap) = _ffi_string_to_host(title.into());\n        unsafe { _ffi_js_Window__set_title(self.0, title_ptr, title_len, title_cap) };\n    }\n\n    fn get_size(&self) -> (i32, i32) {\n        extern \"C\" { fn _ffi_js_Window__get_size(_: *const u8, _: *const _ffi_ret_2_i32); }\n        unsafe { _ffi_js_Window__get_size(self.0, std::ptr::addr_of!(_FFI_RET_2_I32)) }\n        let ret_0 = unsafe { _FFI_RET_2_I32.0 };\n        let ret_1 = unsafe { _FFI_RET_2_I32.1 };\n        (ret_0, ret_1)\n    }\n\n    fn set_size(&self, width: i32, height: i32) {\n        extern \"C\" { fn _ffi_js_Window__set_size(_: *const u8, width: i32, height: i32); }\n        unsafe { _ffi_js_Window__set_size(self.0, width, height) };\n    }\n\n    fn set_handler(&self, handler: Box<dyn Handler>) {\n        extern \"C\" { fn _ffi_js_Window__set_handler(_: *const u8, handler_ptr: *const u8); }\n        unsafe { _ffi_js_Window__set_handler(self.0, Box::into_raw(Box::new(handler)) as *const u8) };\n    }\n\n    fn child_window(&self) -> std::rc::Rc<dyn Window> {\n        extern \"C\" { fn _ffi_js_Window__child_window(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_js_Window__child_window(self.0) };\n        std::rc::Rc::new(_ffi_rs_Window(ret_ptr))\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Box_Handler(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Handler>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_TextRun_to_js(items: Vec<TextRun>, buf: &mut Vec<u8>) {\n    for item in items {\n        let (item_text_ptr, item_text_len, item_text_cap) = _ffi_string_to_host(item.text);\n        _ffi_write(item_text_ptr, buf);\n        _ffi_write(item_text_len, buf);\n        _ffi_write(item_text_cap, buf);\n        _ffi_write(item.rect.x, buf);\n        _ffi_write(item.rect.y, buf);\n        _ffi_write(item.rect.w, buf);\n        _ffi_write(item.rect.h, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_app_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Platform {\n    create_window(): Window;\n}\n\nexport interface Window {\n    get_title(): string;\n    set_title(title: string): void;\n    get_size(): [number, number];\n    set_size(width: number, height: number): void;\n    set_handler(handler: Handler): void;\n    child_window(): Window;\n}\n\nexport interface Handler {\n    on_draw(canvas: Canvas): void;\n}\n\nexport interface Canvas {\n    draw_text_runs(runs: TextRun[]): void;\n}\n\nexport interface TextRun {\n    text: string,\n    rect: TextRect,\n}\n\nexport interface TextRect {\n    x: number,\n    y: number,\n    w: number,\n    h: number,\n}\n\nexport function rust_mem_leaked(): number;\nexport function create_app(platform: Platform): void;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_app_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function create_app(platform) {\n    _ffi_exports._ffi_fn_create_app(_ffi_handle_alloc(platform));\n}\n\nlet _ffi_len = 0;\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\nlet _ffi_reg_Box_Handler = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Box_Handler(ptr));\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\nlet _ffi_u8;\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nconst _ffi_Box_Handler = class Handler {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Box_Handler.register(this, _);\n    }\n\n    on_draw(canvas) {\n        _ffi_exports._ffi_Box_Handler__on_draw(this._, _ffi_handle_alloc(canvas));\n    }\n};\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf) {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_string_from_rust(ptr, len, cap) {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_string_to_rust(str) {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_vec_TextRun_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push({\n            text: _ffi_string_from_rust(_ffi_read_i32(buf), _ffi_read_u32(buf), _ffi_read_u32(buf)),\n            rect: { x: _ffi_read_i32(buf), y: _ffi_read_i32(buf), w: _ffi_read_i32(buf), h: _ffi_read_i32(buf) }\n        });\n    }\n    return items;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_Canvas__draw_text_runs(self, buf_ptr, buf_cap, runs_len) {\n        let buf = _ffi_new_ReadBuf(buf_ptr);\n        _ffi_handles.get(self).draw_text_runs(_ffi_vec_TextRun_from_rust(runs_len, buf));\n        _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    },\n\n    _ffi_js_Platform__create_window(self) {\n        return _ffi_handle_alloc(_ffi_handles.get(self).create_window());\n    },\n\n    _ffi_js_Window__child_window(self) {\n        return _ffi_handle_alloc(_ffi_handles.get(self).child_window());\n    },\n\n    _ffi_js_Window__get_size(self, _ffi_ret_2_i32) {\n        let ret = _ffi_handles.get(self).get_size();\n        _ffi_update_dv().setInt32(_ffi_ret_2_i32, ret[0], true);\n        _ffi_dv.setInt32(_ffi_ret_2_i32 + 4, ret[1], true);\n    },\n\n    _ffi_js_Window__get_title(self, _ffi_ret_ptr_usize) {\n        let ret_ptr = _ffi_string_to_rust(_ffi_handles.get(self).get_title()), ret_len = _ffi_len;\n        _ffi_update_dv().setInt32(_ffi_ret_ptr_usize, ret_ptr, true);\n        _ffi_dv.setInt32(_ffi_ret_ptr_usize + 4, ret_len, true);\n    },\n\n    _ffi_js_Window__set_handler(self, handler_ptr) {\n        _ffi_handles.get(self).set_handler(new _ffi_Box_Handler(handler_ptr));\n    },\n\n    _ffi_js_Window__set_size(self, width, height) {\n        _ffi_handles.get(self).set_size(width, height);\n    },\n\n    _ffi_js_Window__set_title(self, title_ptr, title_len, title_cap) {\n        _ffi_handles.get(self).set_title(_ffi_string_from_rust(title_ptr, title_len, title_cap));\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_app_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Platform {\n    create_window(): Window;\n}\n\nexport interface Window {\n    get_title(): string;\n    set_title(title: string): void;\n    get_size(): [number, number];\n    set_size(width: number, height: number): void;\n    set_handler(handler: Handler): void;\n    child_window(): Window;\n}\n\nexport interface Handler {\n    on_draw(canvas: Canvas): void;\n}\n\nexport interface Canvas {\n    draw_text_runs(runs: TextRun[]): void;\n}\n\nexport interface TextRun {\n    text: string,\n    rect: TextRect,\n}\n\nexport interface TextRect {\n    x: number,\n    y: number,\n    w: number,\n    h: number,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function create_app(platform: Platform): void {\n    _ffi_exports._ffi_fn_create_app(_ffi_handle_alloc(platform));\n}\n\nlet _ffi_len = 0;\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\nlet _ffi_reg_Box_Handler = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Box_Handler(ptr));\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\nlet _ffi_u8: Uint8Array;\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nconst _ffi_Box_Handler = class Handler implements Handler {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Box_Handler.register(this, _);\n    }\n\n    on_draw(canvas: Canvas): void {\n        _ffi_exports._ffi_Box_Handler__on_draw(this._, _ffi_handle_alloc(canvas));\n    }\n};\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_string_from_rust(ptr: number, len: number, cap: number): string {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_string_to_rust(str: string): number {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_vec_TextRun_from_rust(len: number, buf: _ffi_ReadBuf): TextRun[] {\n    let items: TextRun[] = [];\n    while (items.length < len) {\n        items.push({\n            text: _ffi_string_from_rust(_ffi_read_i32(buf), _ffi_read_u32(buf), _ffi_read_u32(buf)),\n            rect: { x: _ffi_read_i32(buf), y: _ffi_read_i32(buf), w: _ffi_read_i32(buf), h: _ffi_read_i32(buf) }\n        });\n    }\n    return items;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Box_Handler__on_draw: (_self: number, canvas_ptr: number) => void,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_create_app: (platform_ptr: number) => void,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_rs_drop_Box_Handler: (ptr: number) => void,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {\n    _ffi_js_Canvas__draw_text_runs(self: number, buf_ptr: number, buf_cap: number, runs_len: number): void {\n        let buf = _ffi_new_ReadBuf(buf_ptr);\n        _ffi_handles.get(self).draw_text_runs(_ffi_vec_TextRun_from_rust(runs_len, buf));\n        _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    },\n\n    _ffi_js_Platform__create_window(self: number): number {\n        return _ffi_handle_alloc(_ffi_handles.get(self).create_window());\n    },\n\n    _ffi_js_Window__child_window(self: number): number {\n        return _ffi_handle_alloc(_ffi_handles.get(self).child_window());\n    },\n\n    _ffi_js_Window__get_size(self: number, _ffi_ret_2_i32: number): void {\n        let ret = _ffi_handles.get(self).get_size();\n        _ffi_update_dv().setInt32(_ffi_ret_2_i32, ret[0], true);\n        _ffi_dv.setInt32(_ffi_ret_2_i32 + 4, ret[1], true);\n    },\n\n    _ffi_js_Window__get_title(self: number, _ffi_ret_ptr_usize: number): void {\n        let ret_ptr = _ffi_string_to_rust(_ffi_handles.get(self).get_title()), ret_len = _ffi_len;\n        _ffi_update_dv().setInt32(_ffi_ret_ptr_usize, ret_ptr, true);\n        _ffi_dv.setInt32(_ffi_ret_ptr_usize + 4, ret_len, true);\n    },\n\n    _ffi_js_Window__set_handler(self: number, handler_ptr: number): void {\n        _ffi_handles.get(self).set_handler(new _ffi_Box_Handler(handler_ptr));\n    },\n\n    _ffi_js_Window__set_size(self: number, width: number, height: number): void {\n        _ffi_handles.get(self).set_size(width, height);\n    },\n\n    _ffi_js_Window__set_title(self: number, title_ptr: number, title_len: number, title_cap: number): void {\n        _ffi_handles.get(self).set_title(_ffi_string_from_rust(title_ptr, title_len, title_cap));\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_app_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Box_Handler__on_draw(_self: *const u8, canvas_ptr: *const u8) {\n    let _self = unsafe { &*(_self as *const Box<dyn Handler>) };\n    _self.on_draw(Box::new(_ffi_rs_Canvas(canvas_ptr)));\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_create_app(platform_ptr: *const u8) {\n    create_app(Box::new(_ffi_rs_Platform(platform_ptr)));\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_2_i32(i32, i32);\nstatic mut _FFI_RET_2_I32: _ffi_ret_2_i32 = _ffi_ret_2_i32(0, 0);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\nstatic mut _FFI_RET_PTR_USIZE: _ffi_ret_ptr_usize = _ffi_ret_ptr_usize(std::ptr::null(), 0);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Canvas(*const u8);\n\nimpl Drop for _ffi_rs_Canvas {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Canvas for _ffi_rs_Canvas {\n    fn draw_text_runs(&self, runs: Vec<TextRun>) {\n        unsafe extern \"C\" { fn _ffi_js_Canvas__draw_text_runs(_: *const u8, buf_ptr: *const u8, buf_cap: usize, runs_len: usize); }\n        let mut buf = Vec::<u8>::new();\n        let runs_len = runs.len();\n        _ffi_vec_TextRun_to_js(runs, &mut buf);\n        let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n        unsafe { _ffi_js_Canvas__draw_text_runs(self.0, buf_ptr, buf_cap, runs_len) };\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Platform(*const u8);\n\nimpl Drop for _ffi_rs_Platform {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Platform for _ffi_rs_Platform {\n    fn create_window(&self) -> std::rc::Rc<dyn Window> {\n        unsafe extern \"C\" { fn _ffi_js_Platform__create_window(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_js_Platform__create_window(self.0) };\n        std::rc::Rc::new(_ffi_rs_Window(ret_ptr))\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Window(*const u8);\n\nimpl Drop for _ffi_rs_Window {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Window for _ffi_rs_Window {\n    fn get_title(&self) -> String {\n        unsafe extern \"C\" { fn _ffi_js_Window__get_title(_: *const u8, _: *const _ffi_ret_ptr_usize); }\n        unsafe { _ffi_js_Window__get_title(self.0, std::ptr::addr_of!(_FFI_RET_PTR_USIZE)) }\n        let ret_ptr = unsafe { _FFI_RET_PTR_USIZE.0 };\n        let ret_len = unsafe { _FFI_RET_PTR_USIZE.1 };\n        _ffi_string_from_host(ret_ptr, ret_len)\n    }\n\n    fn set_title(&self, title: &str) {\n        unsafe extern \"C\" { fn _ffi_js_Window__set_title(_: *const u8, title_ptr: *const u8, title_len: usize, title_cap: usize); }\n        let (title_ptr, title_len, title_cap) = _ffi_string_to_host(title.into());\n        unsafe { _ffi_js_Window__set_title(self.0, title_ptr, title_len, title_cap) };\n    }\n\n    fn get_size(&self) -> (i32, i32) {\n        unsafe extern \"C\" { fn _ffi_js_Window__get_size(_: *const u8, _: *const _ffi_ret_2_i32); }\n        unsafe { _ffi_js_Window__get_size(self.0, std::ptr::addr_of!(_FFI_RET_2_I32)) }\n        let ret_0 = unsafe { _FFI_RET_2_I32.0 };\n        let ret_1 = unsafe { _FFI_RET_2_I32.1 };\n        (ret_0, ret_1)\n    }\n\n    fn set_size(&self, width: i32, height: i32) {\n        unsafe extern \"C\" { fn _ffi_js_Window__set_size(_: *const u8, width: i32, height: i32); }\n        unsafe { _ffi_js_Window__set_size(self.0, width, height) };\n    }\n\n    fn set_handler(&self, handler: Box<dyn Handler>) {\n        unsafe extern \"C\" { fn _ffi_js_Window__set_handler(_: *const u8, handler_ptr: *const u8); }\n        unsafe { _ffi_js_Window__set_handler(self.0, Box::into_raw(Box::new(handler)) as *const u8) };\n    }\n\n    fn child_window(&self) -> std::rc::Rc<dyn Window> {\n        unsafe extern \"C\" { fn _ffi_js_Window__child_window(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_js_Window__child_window(self.0) };\n        std::rc::Rc::new(_ffi_rs_Window(ret_ptr))\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Box_Handler(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Handler>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_TextRun_to_js(items: Vec<TextRun>, buf: &mut Vec<u8>) {\n    for item in items {\n        let (item_text_ptr, item_text_len, item_text_cap) = _ffi_string_to_host(item.text);\n        _ffi_write(item_text_ptr, buf);\n        _ffi_write(item_text_len, buf);\n        _ffi_write(item_text_cap, buf);\n        _ffi_write(item.rect.x, buf);\n        _ffi_write(item.rect.y, buf);\n        _ffi_write(item.rect.w, buf);\n        _ffi_write(item.rect.h, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_const_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport const CONST_FALSE: boolean;\nexport const CONST_TRUE: boolean;\nexport const CONST_U8_MIN: number;\nexport const CONST_U8_MAX: number;\nexport const CONST_U16_MIN: number;\nexport const CONST_U16_MAX: number;\nexport const CONST_U32_MIN: number;\nexport const CONST_U32_MAX: number;\nexport const CONST_U64_MIN: bigint;\nexport const CONST_U64_MAX: bigint;\nexport const CONST_I8_MIN: number;\nexport const CONST_I8_MAX: number;\nexport const CONST_I16_MIN: number;\nexport const CONST_I16_MAX: number;\nexport const CONST_I32_MIN: number;\nexport const CONST_I32_MAX: number;\nexport const CONST_I64_MIN: bigint;\nexport const CONST_I64_MAX: bigint;\nexport const CONST_F32_NEG_0: number;\nexport const CONST_F64_NEG_0: number;\nexport const CONST_F32_PI: number;\nexport const CONST_F64_PI: number;\nexport const CONST_STRING: string;\n\nexport function rust_mem_leaked(): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_const_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport const CONST_FALSE = false;\nexport const CONST_TRUE = true;\nexport const CONST_U8_MIN = 0;\nexport const CONST_U8_MAX = 255;\nexport const CONST_U16_MIN = 0;\nexport const CONST_U16_MAX = 65535;\nexport const CONST_U32_MIN = 0;\nexport const CONST_U32_MAX = 4294967295;\nexport const CONST_U64_MIN = 0n;\nexport const CONST_U64_MAX = 18446744073709551615n;\nexport const CONST_I8_MIN = -128;\nexport const CONST_I8_MAX = 127;\nexport const CONST_I16_MIN = -32768;\nexport const CONST_I16_MAX = 32767;\nexport const CONST_I32_MIN = -2147483648;\nexport const CONST_I32_MAX = 2147483647;\nexport const CONST_I64_MIN = -9223372036854775808n;\nexport const CONST_I64_MAX = 9223372036854775807n;\nexport const CONST_F32_NEG_0 = -0;\nexport const CONST_F64_NEG_0 = -0;\nexport const CONST_F32_PI = 3.1415927410125732;\nexport const CONST_F64_PI = -3.141592653589793;\nexport const CONST_STRING = \"\\x00\\r\\n🦀\";\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_const_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport const CONST_FALSE: boolean = false;\nexport const CONST_TRUE: boolean = true;\nexport const CONST_U8_MIN: number = 0;\nexport const CONST_U8_MAX: number = 255;\nexport const CONST_U16_MIN: number = 0;\nexport const CONST_U16_MAX: number = 65535;\nexport const CONST_U32_MIN: number = 0;\nexport const CONST_U32_MAX: number = 4294967295;\nexport const CONST_U64_MIN: bigint = 0n;\nexport const CONST_U64_MAX: bigint = 18446744073709551615n;\nexport const CONST_I8_MIN: number = -128;\nexport const CONST_I8_MAX: number = 127;\nexport const CONST_I16_MIN: number = -32768;\nexport const CONST_I16_MAX: number = 32767;\nexport const CONST_I32_MIN: number = -2147483648;\nexport const CONST_I32_MAX: number = 2147483647;\nexport const CONST_I64_MIN: bigint = -9223372036854775808n;\nexport const CONST_I64_MAX: bigint = 9223372036854775807n;\nexport const CONST_F32_NEG_0: number = -0;\nexport const CONST_F64_NEG_0: number = -0;\nexport const CONST_F32_PI: number = 3.1415927410125732;\nexport const CONST_F64_PI: number = -3.141592653589793;\nexport const CONST_STRING: string = \"\\x00\\r\\n🦀\";\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_const_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_const_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport const CONST_FALSE: boolean;\nexport const CONST_TRUE: boolean;\nexport const CONST_U8_MIN: number;\nexport const CONST_U8_MAX: number;\nexport const CONST_U16_MIN: number;\nexport const CONST_U16_MAX: number;\nexport const CONST_U32_MIN: number;\nexport const CONST_U32_MAX: number;\nexport const CONST_U64_MIN: bigint;\nexport const CONST_U64_MAX: bigint;\nexport const CONST_I8_MIN: number;\nexport const CONST_I8_MAX: number;\nexport const CONST_I16_MIN: number;\nexport const CONST_I16_MAX: number;\nexport const CONST_I32_MIN: number;\nexport const CONST_I32_MAX: number;\nexport const CONST_I64_MIN: bigint;\nexport const CONST_I64_MAX: bigint;\nexport const CONST_F32_NEG_0: number;\nexport const CONST_F64_NEG_0: number;\nexport const CONST_F32_PI: number;\nexport const CONST_F64_PI: number;\nexport const CONST_STRING: string;\n\nexport function rust_mem_leaked(): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_const_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport const CONST_FALSE = false;\nexport const CONST_TRUE = true;\nexport const CONST_U8_MIN = 0;\nexport const CONST_U8_MAX = 255;\nexport const CONST_U16_MIN = 0;\nexport const CONST_U16_MAX = 65535;\nexport const CONST_U32_MIN = 0;\nexport const CONST_U32_MAX = 4294967295;\nexport const CONST_U64_MIN = 0n;\nexport const CONST_U64_MAX = 18446744073709551615n;\nexport const CONST_I8_MIN = -128;\nexport const CONST_I8_MAX = 127;\nexport const CONST_I16_MIN = -32768;\nexport const CONST_I16_MAX = 32767;\nexport const CONST_I32_MIN = -2147483648;\nexport const CONST_I32_MAX = 2147483647;\nexport const CONST_I64_MIN = -9223372036854775808n;\nexport const CONST_I64_MAX = 9223372036854775807n;\nexport const CONST_F32_NEG_0 = -0;\nexport const CONST_F64_NEG_0 = -0;\nexport const CONST_F32_PI = 3.1415927410125732;\nexport const CONST_F64_PI = -3.141592653589793;\nexport const CONST_STRING = \"\\x00\\r\\n🦀\";\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_const_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport const CONST_FALSE: boolean = false;\nexport const CONST_TRUE: boolean = true;\nexport const CONST_U8_MIN: number = 0;\nexport const CONST_U8_MAX: number = 255;\nexport const CONST_U16_MIN: number = 0;\nexport const CONST_U16_MAX: number = 65535;\nexport const CONST_U32_MIN: number = 0;\nexport const CONST_U32_MAX: number = 4294967295;\nexport const CONST_U64_MIN: bigint = 0n;\nexport const CONST_U64_MAX: bigint = 18446744073709551615n;\nexport const CONST_I8_MIN: number = -128;\nexport const CONST_I8_MAX: number = 127;\nexport const CONST_I16_MIN: number = -32768;\nexport const CONST_I16_MAX: number = 32767;\nexport const CONST_I32_MIN: number = -2147483648;\nexport const CONST_I32_MAX: number = 2147483647;\nexport const CONST_I64_MIN: bigint = -9223372036854775808n;\nexport const CONST_I64_MAX: bigint = 9223372036854775807n;\nexport const CONST_F32_NEG_0: number = -0;\nexport const CONST_F64_NEG_0: number = -0;\nexport const CONST_F32_PI: number = 3.1415927410125732;\nexport const CONST_F64_PI: number = -3.141592653589793;\nexport const CONST_STRING: string = \"\\x00\\r\\n🦀\";\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_const_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_derive_eq_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport type EnumBoxTup =\n    | { readonly $: \"Foo\", 0: [number, number] }\n    | { readonly $: \"Bar\" }\n    | { readonly $: \"Baz\", x: number, y: number }\n\nexport type EnumVecTup =\n    | { readonly $: \"Foo\", 0: [number, number][] }\n    | { readonly $: \"Bar\" }\n    | { readonly $: \"Baz\", x: number, y: number }\n\nexport type EnumOptTup =\n    | { readonly $: \"Foo\", 0: [number, number] | null }\n    | { readonly $: \"Bar\" }\n    | { readonly $: \"Baz\", x: number, y: number }\n\nexport interface EmptyStruct {\n}\n\nexport interface BoxTup0 {\n    0: undefined,\n}\n\nexport interface BoxTup1 {\n    0: [number],\n}\n\nexport interface BoxTup2 {\n    0: [number, number],\n}\n\nexport interface VecTup0 {\n    0: undefined[],\n}\n\nexport interface VecTup1 {\n    0: [number][],\n}\n\nexport interface VecTup2 {\n    0: [number, number][],\n}\n\nexport interface OptTup0 {\n    0: undefined | null,\n}\n\nexport interface OptTup1 {\n    0: [number] | null,\n}\n\nexport interface OptTup2 {\n    0: [number, number] | null,\n}\n\nexport interface TupBox {\n    0: [number, boolean],\n}\n\nexport interface VecBox {\n    0: number[],\n}\n\nexport interface BoxVec {\n    0: number[],\n}\n\nexport interface OptBox {\n    0: number | null,\n}\n\nexport interface BoxOpt {\n    0: number | null,\n}\n\nexport interface VecBoxVec {\n    0: number[][],\n}\n\nexport interface BoxVecBox {\n    0: number[],\n}\n\nexport interface OptBoxOpt {\n    0: number | null,\n}\n\nexport interface BoxOptBox {\n    0: number | null,\n}\n\nexport function rust_mem_leaked(): number;\nexport function empty_tuple(x: undefined): undefined;\nexport function empty_struct(x: EmptyStruct): EmptyStruct;\nexport function box_tup_0(x: BoxTup0): BoxTup0;\nexport function box_tup_1(x: BoxTup1): BoxTup1;\nexport function box_tup_2(x: BoxTup2): BoxTup2;\nexport function vec_tup_0(x: VecTup0): VecTup0;\nexport function vec_tup_1(x: VecTup1): VecTup1;\nexport function vec_tup_2(x: VecTup2): VecTup2;\nexport function opt_tup_0(x: OptTup0): OptTup0;\nexport function opt_tup_1(x: OptTup1): OptTup1;\nexport function opt_tup_2(x: OptTup2): OptTup2;\nexport function enum_box_tup(x: EnumBoxTup): EnumBoxTup;\nexport function enum_vec_tup(x: EnumVecTup): EnumVecTup;\nexport function enum_opt_tup(x: EnumOptTup): EnumOptTup;\nexport function tup_box(x: TupBox): TupBox;\nexport function vec_box(x: VecBox): VecBox;\nexport function box_vec(x: BoxVec): BoxVec;\nexport function opt_box(x: OptBox): OptBox;\nexport function box_opt(x: BoxOpt): BoxOpt;\nexport function vec_box_vec(x: VecBoxVec): VecBoxVec;\nexport function box_vec_box(x: BoxVecBox): BoxVecBox;\nexport function opt_box_opt(x: OptBoxOpt): OptBoxOpt;\nexport function box_opt_box(x: BoxOptBox): BoxOptBox;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_derive_eq_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function empty_tuple(x) {\n    _ffi_exports._ffi_fn_empty_tuple();\n    return undefined;\n}\n\nexport function empty_struct(x) {\n    _ffi_exports._ffi_fn_empty_struct();\n    return {};\n}\n\nexport function box_tup_0(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box__to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_tup_0(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_box__from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_tup_1(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_tup_1(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_box_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_tup_2(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_i32_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_tup_2(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_box_i32_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_tup_0(x) {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec__to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_tup_0(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_vec__from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_tup_1(x) {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_tup_1(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_vec_i32_from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_tup_2(x) {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec_i32_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_tup_2(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_vec_i32_i32_from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_tup_0(x) {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_tup_0(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: has_ret_0 ? undefined : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_tup_1(x) {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n        _ffi_write_i32(buf, x_0_val[0]);\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_tup_1(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: has_ret_0 ? [_ffi_read_i32(buf2)] : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_tup_2(x) {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n        _ffi_write_i32(buf, x_0_val[0]);\n        _ffi_write_i32(buf, x_0_val[1]);\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_tup_2(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: has_ret_0 ? [_ffi_read_i32(buf2), _ffi_read_i32(buf2)] : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function enum_box_tup(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_enum_EnumBoxTup_to_rust(x, buf);\n    let multi_ret = _ffi_exports._ffi_fn_enum_box_tup(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = _ffi_enum_EnumBoxTup_from_rust(buf2);\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function enum_vec_tup(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_enum_EnumVecTup_to_rust(x, buf);\n    let multi_ret = _ffi_exports._ffi_fn_enum_vec_tup(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = _ffi_enum_EnumVecTup_from_rust(buf2);\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function enum_opt_tup(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_enum_EnumOptTup_to_rust(x, buf);\n    let multi_ret = _ffi_exports._ffi_fn_enum_opt_tup(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = _ffi_enum_EnumOptTup_from_rust(buf2);\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function tup_box(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_i32_to_rust2(x[0][0], buf);\n    _ffi_box_bool_to_rust(x[0][1], buf);\n    let multi_ret = _ffi_exports._ffi_fn_tup_box(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: [_ffi_box_i32_from_rust2(buf2), _ffi_box_bool_from_rust(buf2)] };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_box(x) {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec_box_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_box(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_vec_box_i32_from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_vec(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_vec_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_vec(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_box_vec_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_box(x) {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n        _ffi_box_i32_to_rust2(x_0_val, buf);\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_box(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: has_ret_0 ? _ffi_box_i32_from_rust2(buf2) : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_opt(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_option_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_opt(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_box_option_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_box_vec(x) {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec_box_vec_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_box_vec(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_vec_box_vec_i32_from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_vec_box(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_vec_box_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_vec_box(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_box_vec_box_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_box_opt(x) {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n        _ffi_box_option_i32_to_rust(x_0_val, buf);\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_box_opt(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: has_ret_0 ? _ffi_box_option_i32_from_rust(buf2) : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_opt_box(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_option_box_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_opt_box(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_box_option_box_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8;\nlet _ffi_enum_EnumBoxTup__Bar = { $: \"Bar\" };\nlet _ffi_enum_EnumOptTup__Bar = { $: \"Bar\" };\nlet _ffi_enum_EnumVecTup__Bar = { $: \"Bar\" };\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_box__from_rust(buf) {\n    return undefined;\n}\n\nfunction _ffi_box__to_rust(val, buf) {\n}\n\nfunction _ffi_box_bool_from_rust(buf) {\n    return !!_ffi_read_u8(buf);\n}\n\nfunction _ffi_box_bool_to_rust(val, buf) {\n    _ffi_write_i8(buf, +val);\n}\n\nfunction _ffi_box_i32_from_rust(buf) {\n    return [_ffi_read_i32(buf)];\n}\n\nfunction _ffi_box_i32_from_rust2(buf) {\n    return _ffi_read_i32(buf);\n}\n\nfunction _ffi_box_i32_i32_from_rust(buf) {\n    return [_ffi_read_i32(buf), _ffi_read_i32(buf)];\n}\n\nfunction _ffi_box_i32_i32_to_rust(val, buf) {\n    _ffi_write_i32(buf, val[0]);\n    _ffi_write_i32(buf, val[1]);\n}\n\nfunction _ffi_box_i32_to_rust(val, buf) {\n    _ffi_write_i32(buf, val[0]);\n}\n\nfunction _ffi_box_i32_to_rust2(val, buf) {\n    _ffi_write_i32(buf, val);\n}\n\nfunction _ffi_box_option_box_i32_from_rust(buf) {\n    return _ffi_read_u8(buf) ? _ffi_box_i32_from_rust2(buf) : null;\n}\n\nfunction _ffi_box_option_box_i32_to_rust(val, buf) {\n    _ffi_write_i8(buf, +(val !== null));\n    if (val !== null) {\n        let val_val = val;\n        _ffi_box_i32_to_rust2(val_val, buf);\n    }\n}\n\nfunction _ffi_box_option_i32_from_rust(buf) {\n    return _ffi_read_u8(buf) ? _ffi_read_i32(buf) : null;\n}\n\nfunction _ffi_box_option_i32_to_rust(val, buf) {\n    _ffi_write_i8(buf, +(val !== null));\n    if (val !== null) {\n        _ffi_write_i32(buf, val);\n    }\n}\n\nfunction _ffi_box_vec_box_i32_from_rust(buf) {\n    return _ffi_vec_box_i32_from_rust(_ffi_read_u32(buf), buf);\n}\n\nfunction _ffi_box_vec_box_i32_to_rust(val, buf) {\n    _ffi_write_i32(buf, val.length);\n    _ffi_vec_box_i32_to_rust(val, buf);\n}\n\nfunction _ffi_box_vec_i32_from_rust(buf) {\n    return _ffi_vec_i32_from_rust2(_ffi_read_u32(buf), buf);\n}\n\nfunction _ffi_box_vec_i32_to_rust(val, buf) {\n    _ffi_write_i32(buf, val.length);\n    _ffi_vec_i32_to_rust2(val, buf);\n}\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_enum_EnumBoxTup_from_rust(buf) {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return { $: \"Foo\", 0: _ffi_box_i32_i32_from_rust(buf) };\n        case 1: return _ffi_enum_EnumBoxTup__Bar;\n        case 2: return { $: \"Baz\", x: _ffi_read_i32(buf), y: _ffi_read_i32(buf) };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_enum_EnumBoxTup_to_rust(val, buf) {\n    switch (val.$) {\n        case \"Foo\":\n            _ffi_write_i32(buf, 0);\n            _ffi_box_i32_i32_to_rust(val[0], buf);\n            break;\n        case \"Bar\":\n            _ffi_write_i32(buf, 1);\n            break;\n        case \"Baz\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.x);\n            _ffi_write_i32(buf, val.y);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"EnumBoxTup\\\"\");\n    }\n}\n\nfunction _ffi_enum_EnumOptTup_from_rust(buf) {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return { $: \"Foo\", 0: _ffi_read_u8(buf) ? [_ffi_read_i32(buf), _ffi_read_i32(buf)] : null };\n        case 1: return _ffi_enum_EnumOptTup__Bar;\n        case 2: return { $: \"Baz\", x: _ffi_read_i32(buf), y: _ffi_read_i32(buf) };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_enum_EnumOptTup_to_rust(val, buf) {\n    switch (val.$) {\n        case \"Foo\":\n            _ffi_write_i32(buf, 0);\n            _ffi_write_i8(buf, +(val[0] !== null));\n            if (val[0] !== null) {\n                let x_val = val[0];\n                _ffi_write_i32(buf, x_val[0]);\n                _ffi_write_i32(buf, x_val[1]);\n            }\n            break;\n        case \"Bar\":\n            _ffi_write_i32(buf, 1);\n            break;\n        case \"Baz\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.x);\n            _ffi_write_i32(buf, val.y);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"EnumOptTup\\\"\");\n    }\n}\n\nfunction _ffi_enum_EnumVecTup_from_rust(buf) {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return { $: \"Foo\", 0: _ffi_vec_i32_i32_from_rust(_ffi_read_u32(buf), buf) };\n        case 1: return _ffi_enum_EnumVecTup__Bar;\n        case 2: return { $: \"Baz\", x: _ffi_read_i32(buf), y: _ffi_read_i32(buf) };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_enum_EnumVecTup_to_rust(val, buf) {\n    switch (val.$) {\n        case \"Foo\":\n            _ffi_write_i32(buf, 0);\n            _ffi_write_i32(buf, val[0].length);\n            _ffi_vec_i32_i32_to_rust(val[0], buf);\n            break;\n        case \"Bar\":\n            _ffi_write_i32(buf, 1);\n            break;\n        case \"Baz\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.x);\n            _ffi_write_i32(buf, val.y);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"EnumVecTup\\\"\");\n    }\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf) {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u8(buf) {\n    return buf.dv.getUint8(buf.off++);\n}\n\nfunction _ffi_vec__from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(undefined);\n    }\n    return items;\n}\n\nfunction _ffi_vec__to_rust(items, buf) {\n}\n\nfunction _ffi_vec_box_i32_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(_ffi_box_i32_from_rust2(buf));\n    }\n    return items;\n}\n\nfunction _ffi_vec_box_i32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_box_i32_to_rust2(item, buf);\n    }\n}\n\nfunction _ffi_vec_box_vec_i32_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(_ffi_box_vec_i32_from_rust(buf));\n    }\n    return items;\n}\n\nfunction _ffi_vec_box_vec_i32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_box_vec_i32_to_rust(item, buf);\n    }\n}\n\nfunction _ffi_vec_i32_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push([_ffi_read_i32(buf)]);\n    }\n    return items;\n}\n\nfunction _ffi_vec_i32_from_rust2(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(_ffi_read_i32(buf));\n    }\n    return items;\n}\n\nfunction _ffi_vec_i32_i32_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push([_ffi_read_i32(buf), _ffi_read_i32(buf)]);\n    }\n    return items;\n}\n\nfunction _ffi_vec_i32_i32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item[0]);\n        _ffi_write_i32(buf, item[1]);\n    }\n}\n\nfunction _ffi_vec_i32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item[0]);\n    }\n}\n\nfunction _ffi_vec_i32_to_rust2(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf, val) {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv.setInt8(ptr, val);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_derive_eq_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport type EnumBoxTup =\n    | { readonly $: \"Foo\", 0: [number, number] }\n    | { readonly $: \"Bar\" }\n    | { readonly $: \"Baz\", x: number, y: number }\n\nexport type EnumVecTup =\n    | { readonly $: \"Foo\", 0: [number, number][] }\n    | { readonly $: \"Bar\" }\n    | { readonly $: \"Baz\", x: number, y: number }\n\nexport type EnumOptTup =\n    | { readonly $: \"Foo\", 0: [number, number] | null }\n    | { readonly $: \"Bar\" }\n    | { readonly $: \"Baz\", x: number, y: number }\n\nexport interface EmptyStruct {\n}\n\nexport interface BoxTup0 {\n    0: undefined,\n}\n\nexport interface BoxTup1 {\n    0: [number],\n}\n\nexport interface BoxTup2 {\n    0: [number, number],\n}\n\nexport interface VecTup0 {\n    0: undefined[],\n}\n\nexport interface VecTup1 {\n    0: [number][],\n}\n\nexport interface VecTup2 {\n    0: [number, number][],\n}\n\nexport interface OptTup0 {\n    0: undefined | null,\n}\n\nexport interface OptTup1 {\n    0: [number] | null,\n}\n\nexport interface OptTup2 {\n    0: [number, number] | null,\n}\n\nexport interface TupBox {\n    0: [number, boolean],\n}\n\nexport interface VecBox {\n    0: number[],\n}\n\nexport interface BoxVec {\n    0: number[],\n}\n\nexport interface OptBox {\n    0: number | null,\n}\n\nexport interface BoxOpt {\n    0: number | null,\n}\n\nexport interface VecBoxVec {\n    0: number[][],\n}\n\nexport interface BoxVecBox {\n    0: number[],\n}\n\nexport interface OptBoxOpt {\n    0: number | null,\n}\n\nexport interface BoxOptBox {\n    0: number | null,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function empty_tuple(x: undefined): undefined {\n    _ffi_exports._ffi_fn_empty_tuple();\n    return undefined;\n}\n\nexport function empty_struct(x: EmptyStruct): EmptyStruct {\n    _ffi_exports._ffi_fn_empty_struct();\n    return {};\n}\n\nexport function box_tup_0(x: BoxTup0): BoxTup0 {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box__to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_tup_0(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: BoxTup0 = { 0: _ffi_box__from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_tup_1(x: BoxTup1): BoxTup1 {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_tup_1(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: BoxTup1 = { 0: _ffi_box_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_tup_2(x: BoxTup2): BoxTup2 {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_i32_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_tup_2(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: BoxTup2 = { 0: _ffi_box_i32_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_tup_0(x: VecTup0): VecTup0 {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec__to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_tup_0(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: VecTup0 = { 0: _ffi_vec__from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_tup_1(x: VecTup1): VecTup1 {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_tup_1(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: VecTup1 = { 0: _ffi_vec_i32_from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_tup_2(x: VecTup2): VecTup2 {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec_i32_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_tup_2(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: VecTup2 = { 0: _ffi_vec_i32_i32_from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_tup_0(x: OptTup0): OptTup0 {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_tup_0(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: OptTup0 = { 0: has_ret_0 ? undefined : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_tup_1(x: OptTup1): OptTup1 {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n        _ffi_write_i32(buf, x_0_val[0]);\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_tup_1(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: OptTup1 = { 0: has_ret_0 ? [_ffi_read_i32(buf2)] : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_tup_2(x: OptTup2): OptTup2 {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n        _ffi_write_i32(buf, x_0_val[0]);\n        _ffi_write_i32(buf, x_0_val[1]);\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_tup_2(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: OptTup2 = { 0: has_ret_0 ? [_ffi_read_i32(buf2), _ffi_read_i32(buf2)] : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function enum_box_tup(x: EnumBoxTup): EnumBoxTup {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_enum_EnumBoxTup_to_rust(x, buf);\n    let multi_ret = _ffi_exports._ffi_fn_enum_box_tup(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: EnumBoxTup = _ffi_enum_EnumBoxTup_from_rust(buf2);\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function enum_vec_tup(x: EnumVecTup): EnumVecTup {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_enum_EnumVecTup_to_rust(x, buf);\n    let multi_ret = _ffi_exports._ffi_fn_enum_vec_tup(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: EnumVecTup = _ffi_enum_EnumVecTup_from_rust(buf2);\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function enum_opt_tup(x: EnumOptTup): EnumOptTup {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_enum_EnumOptTup_to_rust(x, buf);\n    let multi_ret = _ffi_exports._ffi_fn_enum_opt_tup(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: EnumOptTup = _ffi_enum_EnumOptTup_from_rust(buf2);\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function tup_box(x: TupBox): TupBox {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_i32_to_rust2(x[0][0], buf);\n    _ffi_box_bool_to_rust(x[0][1], buf);\n    let multi_ret = _ffi_exports._ffi_fn_tup_box(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: TupBox = { 0: [_ffi_box_i32_from_rust2(buf2), _ffi_box_bool_from_rust(buf2)] };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_box(x: VecBox): VecBox {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec_box_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_box(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: VecBox = { 0: _ffi_vec_box_i32_from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_vec(x: BoxVec): BoxVec {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_vec_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_vec(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: BoxVec = { 0: _ffi_box_vec_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_box(x: OptBox): OptBox {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n        _ffi_box_i32_to_rust2(x_0_val, buf);\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_box(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: OptBox = { 0: has_ret_0 ? _ffi_box_i32_from_rust2(buf2) : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_opt(x: BoxOpt): BoxOpt {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_option_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_opt(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: BoxOpt = { 0: _ffi_box_option_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_box_vec(x: VecBoxVec): VecBoxVec {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec_box_vec_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_box_vec(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: VecBoxVec = { 0: _ffi_vec_box_vec_i32_from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_vec_box(x: BoxVecBox): BoxVecBox {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_vec_box_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_vec_box(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: BoxVecBox = { 0: _ffi_box_vec_box_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_box_opt(x: OptBoxOpt): OptBoxOpt {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n        _ffi_box_option_i32_to_rust(x_0_val, buf);\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_box_opt(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: OptBoxOpt = { 0: has_ret_0 ? _ffi_box_option_i32_from_rust(buf2) : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_opt_box(x: BoxOptBox): BoxOptBox {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_option_box_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_opt_box(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: BoxOptBox = { 0: _ffi_box_option_box_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8: Uint8Array;\nlet _ffi_enum_EnumBoxTup__Bar: EnumBoxTup = { $: \"Bar\" };\nlet _ffi_enum_EnumOptTup__Bar: EnumOptTup = { $: \"Bar\" };\nlet _ffi_enum_EnumVecTup__Bar: EnumVecTup = { $: \"Bar\" };\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nfunction _ffi_box__from_rust(buf: _ffi_ReadBuf): undefined {\n    return undefined;\n}\n\nfunction _ffi_box__to_rust(val: undefined, buf: _ffi_WriteBuf): void {\n}\n\nfunction _ffi_box_bool_from_rust(buf: _ffi_ReadBuf): boolean {\n    return !!_ffi_read_u8(buf);\n}\n\nfunction _ffi_box_bool_to_rust(val: boolean, buf: _ffi_WriteBuf): void {\n    _ffi_write_i8(buf, +val);\n}\n\nfunction _ffi_box_i32_from_rust(buf: _ffi_ReadBuf): [number] {\n    return [_ffi_read_i32(buf)];\n}\n\nfunction _ffi_box_i32_from_rust2(buf: _ffi_ReadBuf): number {\n    return _ffi_read_i32(buf);\n}\n\nfunction _ffi_box_i32_i32_from_rust(buf: _ffi_ReadBuf): [number, number] {\n    return [_ffi_read_i32(buf), _ffi_read_i32(buf)];\n}\n\nfunction _ffi_box_i32_i32_to_rust(val: [number, number], buf: _ffi_WriteBuf): void {\n    _ffi_write_i32(buf, val[0]);\n    _ffi_write_i32(buf, val[1]);\n}\n\nfunction _ffi_box_i32_to_rust(val: [number], buf: _ffi_WriteBuf): void {\n    _ffi_write_i32(buf, val[0]);\n}\n\nfunction _ffi_box_i32_to_rust2(val: number, buf: _ffi_WriteBuf): void {\n    _ffi_write_i32(buf, val);\n}\n\nfunction _ffi_box_option_box_i32_from_rust(buf: _ffi_ReadBuf): number | null {\n    return _ffi_read_u8(buf) ? _ffi_box_i32_from_rust2(buf) : null;\n}\n\nfunction _ffi_box_option_box_i32_to_rust(val: number | null, buf: _ffi_WriteBuf): void {\n    _ffi_write_i8(buf, +(val !== null));\n    if (val !== null) {\n        let val_val = val;\n        _ffi_box_i32_to_rust2(val_val, buf);\n    }\n}\n\nfunction _ffi_box_option_i32_from_rust(buf: _ffi_ReadBuf): number | null {\n    return _ffi_read_u8(buf) ? _ffi_read_i32(buf) : null;\n}\n\nfunction _ffi_box_option_i32_to_rust(val: number | null, buf: _ffi_WriteBuf): void {\n    _ffi_write_i8(buf, +(val !== null));\n    if (val !== null) {\n        _ffi_write_i32(buf, val);\n    }\n}\n\nfunction _ffi_box_vec_box_i32_from_rust(buf: _ffi_ReadBuf): number[] {\n    return _ffi_vec_box_i32_from_rust(_ffi_read_u32(buf), buf);\n}\n\nfunction _ffi_box_vec_box_i32_to_rust(val: number[], buf: _ffi_WriteBuf): void {\n    _ffi_write_i32(buf, val.length);\n    _ffi_vec_box_i32_to_rust(val, buf);\n}\n\nfunction _ffi_box_vec_i32_from_rust(buf: _ffi_ReadBuf): number[] {\n    return _ffi_vec_i32_from_rust2(_ffi_read_u32(buf), buf);\n}\n\nfunction _ffi_box_vec_i32_to_rust(val: number[], buf: _ffi_WriteBuf): void {\n    _ffi_write_i32(buf, val.length);\n    _ffi_vec_i32_to_rust2(val, buf);\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_enum_EnumBoxTup_from_rust(buf: _ffi_ReadBuf): EnumBoxTup {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return { $: \"Foo\", 0: _ffi_box_i32_i32_from_rust(buf) };\n        case 1: return _ffi_enum_EnumBoxTup__Bar;\n        case 2: return { $: \"Baz\", x: _ffi_read_i32(buf), y: _ffi_read_i32(buf) };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_enum_EnumBoxTup_to_rust(val: EnumBoxTup, buf: _ffi_WriteBuf): void {\n    switch (val.$) {\n        case \"Foo\":\n            _ffi_write_i32(buf, 0);\n            _ffi_box_i32_i32_to_rust(val[0], buf);\n            break;\n        case \"Bar\":\n            _ffi_write_i32(buf, 1);\n            break;\n        case \"Baz\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.x);\n            _ffi_write_i32(buf, val.y);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"EnumBoxTup\\\"\");\n    }\n}\n\nfunction _ffi_enum_EnumOptTup_from_rust(buf: _ffi_ReadBuf): EnumOptTup {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return { $: \"Foo\", 0: _ffi_read_u8(buf) ? [_ffi_read_i32(buf), _ffi_read_i32(buf)] : null };\n        case 1: return _ffi_enum_EnumOptTup__Bar;\n        case 2: return { $: \"Baz\", x: _ffi_read_i32(buf), y: _ffi_read_i32(buf) };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_enum_EnumOptTup_to_rust(val: EnumOptTup, buf: _ffi_WriteBuf): void {\n    switch (val.$) {\n        case \"Foo\":\n            _ffi_write_i32(buf, 0);\n            _ffi_write_i8(buf, +(val[0] !== null));\n            if (val[0] !== null) {\n                let x_val = val[0];\n                _ffi_write_i32(buf, x_val[0]);\n                _ffi_write_i32(buf, x_val[1]);\n            }\n            break;\n        case \"Bar\":\n            _ffi_write_i32(buf, 1);\n            break;\n        case \"Baz\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.x);\n            _ffi_write_i32(buf, val.y);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"EnumOptTup\\\"\");\n    }\n}\n\nfunction _ffi_enum_EnumVecTup_from_rust(buf: _ffi_ReadBuf): EnumVecTup {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return { $: \"Foo\", 0: _ffi_vec_i32_i32_from_rust(_ffi_read_u32(buf), buf) };\n        case 1: return _ffi_enum_EnumVecTup__Bar;\n        case 2: return { $: \"Baz\", x: _ffi_read_i32(buf), y: _ffi_read_i32(buf) };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_enum_EnumVecTup_to_rust(val: EnumVecTup, buf: _ffi_WriteBuf): void {\n    switch (val.$) {\n        case \"Foo\":\n            _ffi_write_i32(buf, 0);\n            _ffi_write_i32(buf, val[0].length);\n            _ffi_vec_i32_i32_to_rust(val[0], buf);\n            break;\n        case \"Bar\":\n            _ffi_write_i32(buf, 1);\n            break;\n        case \"Baz\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.x);\n            _ffi_write_i32(buf, val.y);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"EnumVecTup\\\"\");\n    }\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u8(buf: _ffi_ReadBuf): number {\n    return buf.dv.getUint8(buf.off++);\n}\n\nfunction _ffi_vec__from_rust(len: number, buf: _ffi_ReadBuf): undefined[] {\n    let items: undefined[] = [];\n    while (items.length < len) {\n        items.push(undefined);\n    }\n    return items;\n}\n\nfunction _ffi_vec__to_rust(items: undefined[], buf: _ffi_WriteBuf): void {\n}\n\nfunction _ffi_vec_box_i32_from_rust(len: number, buf: _ffi_ReadBuf): number[] {\n    let items: number[] = [];\n    while (items.length < len) {\n        items.push(_ffi_box_i32_from_rust2(buf));\n    }\n    return items;\n}\n\nfunction _ffi_vec_box_i32_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_box_i32_to_rust2(item, buf);\n    }\n}\n\nfunction _ffi_vec_box_vec_i32_from_rust(len: number, buf: _ffi_ReadBuf): number[][] {\n    let items: number[][] = [];\n    while (items.length < len) {\n        items.push(_ffi_box_vec_i32_from_rust(buf));\n    }\n    return items;\n}\n\nfunction _ffi_vec_box_vec_i32_to_rust(items: number[][], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_box_vec_i32_to_rust(item, buf);\n    }\n}\n\nfunction _ffi_vec_i32_from_rust(len: number, buf: _ffi_ReadBuf): [number][] {\n    let items: [number][] = [];\n    while (items.length < len) {\n        items.push([_ffi_read_i32(buf)]);\n    }\n    return items;\n}\n\nfunction _ffi_vec_i32_from_rust2(len: number, buf: _ffi_ReadBuf): number[] {\n    let items: number[] = [];\n    while (items.length < len) {\n        items.push(_ffi_read_i32(buf));\n    }\n    return items;\n}\n\nfunction _ffi_vec_i32_i32_from_rust(len: number, buf: _ffi_ReadBuf): [number, number][] {\n    let items: [number, number][] = [];\n    while (items.length < len) {\n        items.push([_ffi_read_i32(buf), _ffi_read_i32(buf)]);\n    }\n    return items;\n}\n\nfunction _ffi_vec_i32_i32_to_rust(items: [number, number][], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item[0]);\n        _ffi_write_i32(buf, item[1]);\n    }\n}\n\nfunction _ffi_vec_i32_to_rust(items: [number][], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item[0]);\n    }\n}\n\nfunction _ffi_vec_i32_to_rust2(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv!.setInt8(ptr, val);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_box_opt: (buf_ptr: number) => number,\n    _ffi_fn_box_opt_box: (buf_ptr: number) => number,\n    _ffi_fn_box_tup_0: (buf_ptr: number) => number,\n    _ffi_fn_box_tup_1: (buf_ptr: number) => number,\n    _ffi_fn_box_tup_2: (buf_ptr: number) => number,\n    _ffi_fn_box_vec: (buf_ptr: number) => number,\n    _ffi_fn_box_vec_box: (buf_ptr: number) => number,\n    _ffi_fn_empty_struct: () => void,\n    _ffi_fn_empty_tuple: () => void,\n    _ffi_fn_enum_box_tup: (buf_ptr: number) => number,\n    _ffi_fn_enum_opt_tup: (buf_ptr: number) => number,\n    _ffi_fn_enum_vec_tup: (buf_ptr: number) => number,\n    _ffi_fn_opt_box: (buf_ptr: number, has_x_0: boolean) => number,\n    _ffi_fn_opt_box_opt: (buf_ptr: number, has_x_0: boolean) => number,\n    _ffi_fn_opt_tup_0: (buf_ptr: number, has_x_0: boolean) => number,\n    _ffi_fn_opt_tup_1: (buf_ptr: number, has_x_0: boolean) => number,\n    _ffi_fn_opt_tup_2: (buf_ptr: number, has_x_0: boolean) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_tup_box: (buf_ptr: number) => number,\n    _ffi_fn_vec_box: (buf_ptr: number, x_0_len: number) => number,\n    _ffi_fn_vec_box_vec: (buf_ptr: number, x_0_len: number) => number,\n    _ffi_fn_vec_tup_0: (buf_ptr: number, x_0_len: number) => number,\n    _ffi_fn_vec_tup_1: (buf_ptr: number, x_0_len: number) => number,\n    _ffi_fn_vec_tup_2: (buf_ptr: number, x_0_len: number) => number,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_derive_eq_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box__from_js(_: &mut *const u8) -> Box<()> {\n    Box::new(())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_box__to_js(val: (), _: &mut Vec<u8>) {\n    _ = val;\n}\n\nfn _ffi_box_bool_from_js(end: &mut *const u8) -> Box<bool> {\n    Box::new(_ffi_read::<bool>(end))\n}\n\nfn _ffi_box_bool_to_js(val: bool, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\nfn _ffi_box_i32_from_js(end: &mut *const u8) -> Box<(i32,)> {\n    Box::new((_ffi_read::<i32>(end),))\n}\n\nfn _ffi_box_i32_from_js2(end: &mut *const u8) -> Box<i32> {\n    Box::new(_ffi_read::<i32>(end))\n}\n\nfn _ffi_box_i32_i32_from_js(end: &mut *const u8) -> Box<(i32, i32)> {\n    Box::new((_ffi_read::<i32>(end), _ffi_read::<i32>(end)))\n}\n\nfn _ffi_box_i32_i32_to_js(val: (i32, i32), buf: &mut Vec<u8>) {\n    _ffi_write(val.0, buf);\n    _ffi_write(val.1, buf);\n}\n\nfn _ffi_box_i32_to_js(val: (i32,), buf: &mut Vec<u8>) {\n    _ffi_write(val.0, buf);\n}\n\nfn _ffi_box_i32_to_js2(val: i32, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\nfn _ffi_box_option_box_i32_from_js(end: &mut *const u8) -> Box<Option<Box<i32>>> {\n    Box::new(_ffi_read::<bool>(end).then(|| _ffi_box_i32_from_js2(end)))\n}\n\nfn _ffi_box_option_box_i32_to_js(val: Option<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_write(val.is_some(), buf);\n    if let Some(val_val) = val {\n        _ffi_box_i32_to_js2(*val_val, buf);\n    }\n}\n\nfn _ffi_box_option_i32_from_js(end: &mut *const u8) -> Box<Option<i32>> {\n    Box::new(_ffi_read::<bool>(end).then(|| _ffi_read::<i32>(end)))\n}\n\nfn _ffi_box_option_i32_to_js(val: Option<i32>, buf: &mut Vec<u8>) {\n    _ffi_write(val.is_some(), buf);\n    if let Some(val_val) = val {\n        _ffi_write(val_val, buf);\n    }\n}\n\nfn _ffi_box_vec_box_i32_from_js(end: &mut *const u8) -> Box<Vec<Box<i32>>> {\n    Box::new(_ffi_vec_box_i32_from_js(_ffi_read::<usize>(end), end))\n}\n\nfn _ffi_box_vec_box_i32_to_js(val: Vec<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_write(val.len(), buf);\n    _ffi_vec_box_i32_to_js(val, buf);\n}\n\nfn _ffi_box_vec_i32_from_js(end: &mut *const u8) -> Box<Vec<i32>> {\n    Box::new(_ffi_vec_i32_from_js2(_ffi_read::<usize>(end), end))\n}\n\nfn _ffi_box_vec_i32_to_js(val: Vec<i32>, buf: &mut Vec<u8>) {\n    _ffi_write(val.len(), buf);\n    _ffi_vec_i32_to_js2(val, buf);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumBoxTup_from_js(end: &mut *const u8) -> EnumBoxTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumBoxTup::Foo(_ffi_box_i32_i32_from_js(end)),\n        1 => EnumBoxTup::Bar,\n        2 => EnumBoxTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumBoxTup_to_js(val: EnumBoxTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumBoxTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_box_i32_i32_to_js(*x, buf);\n        }\n        EnumBoxTup::Bar => _ffi_write(1 as i32, buf),\n        EnumBoxTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumOptTup_from_js(end: &mut *const u8) -> EnumOptTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumOptTup::Foo(_ffi_read::<bool>(end).then(|| (_ffi_read::<i32>(end), _ffi_read::<i32>(end)))),\n        1 => EnumOptTup::Bar,\n        2 => EnumOptTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumOptTup_to_js(val: EnumOptTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumOptTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_write(x.is_some(), buf);\n            if let Some(x_val) = x {\n                _ffi_write(x_val.0, buf);\n                _ffi_write(x_val.1, buf);\n            }\n        }\n        EnumOptTup::Bar => _ffi_write(1 as i32, buf),\n        EnumOptTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumVecTup_from_js(end: &mut *const u8) -> EnumVecTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumVecTup::Foo(_ffi_vec_i32_i32_from_js(_ffi_read::<usize>(end), end)),\n        1 => EnumVecTup::Bar,\n        2 => EnumVecTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumVecTup_to_js(val: EnumVecTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumVecTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_write(x.len(), buf);\n            _ffi_vec_i32_i32_to_js(x, buf);\n        }\n        EnumVecTup::Bar => _ffi_write(1 as i32, buf),\n        EnumVecTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_opt(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_opt(BoxOpt(_ffi_box_option_i32_from_js(&mut buf_end)));\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_option_i32_to_js(*ret.0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_opt_box(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_opt_box(BoxOptBox(_ffi_box_option_box_i32_from_js(&mut buf_end)));\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_option_box_i32_to_js(*ret.0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_tup_0(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_0(BoxTup0(_ffi_box__from_js(&mut buf_end)));\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box__to_js(*ret.0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_tup_1(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_1(BoxTup1(_ffi_box_i32_from_js(&mut buf_end)));\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_to_js(*ret.0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_tup_2(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_2(BoxTup2(_ffi_box_i32_i32_from_js(&mut buf_end)));\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_i32_to_js(*ret.0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_vec(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_vec(BoxVec(_ffi_box_vec_i32_from_js(&mut buf_end)));\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_vec_i32_to_js(*ret.0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_box_vec_box(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_vec_box(BoxVecBox(_ffi_box_vec_box_i32_from_js(&mut buf_end)));\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_vec_box_i32_to_js(*ret.0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_empty_struct() {\n    _ = empty_struct(EmptyStruct);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_empty_tuple() {\n    _ = empty_tuple(());\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_enum_box_tup(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumBoxTup_to_js(enum_box_tup(_ffi_enum_EnumBoxTup_from_js(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_enum_opt_tup(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumOptTup_to_js(enum_opt_tup(_ffi_enum_EnumOptTup_from_js(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_enum_vec_tup(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumVecTup_to_js(enum_vec_tup(_ffi_enum_EnumVecTup_from_js(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_box(buf_ptr: *const u8, has_x_0: bool) -> *const _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_box(OptBox(has_x_0.then(|| _ffi_box_i32_from_js2(&mut buf_end))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_box_i32_to_js2(*ret_0_val, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE_BOOL = _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE_BOOL)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_box_opt(buf_ptr: *const u8, has_x_0: bool) -> *const _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_box_opt(OptBoxOpt(has_x_0.then(|| _ffi_box_option_i32_from_js(&mut buf_end))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_box_option_i32_to_js(*ret_0_val, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE_BOOL = _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE_BOOL)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_tup_0(buf_ptr: *const u8, has_x_0: bool) -> *const _ffi_ret_ptr_usize_bool {\n    let buf_end = buf_ptr;\n    let ret = opt_tup_0(OptTup0(has_x_0.then(|| ())));\n    let ret_0 = ret.0;\n    let buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ = ret_0_val;\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE_BOOL = _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE_BOOL)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_tup_1(buf_ptr: *const u8, has_x_0: bool) -> *const _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_tup_1(OptTup1(has_x_0.then(|| (_ffi_read::<i32>(&mut buf_end),))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_write(ret_0_val.0, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE_BOOL = _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE_BOOL)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_tup_2(buf_ptr: *const u8, has_x_0: bool) -> *const _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_tup_2(OptTup2(has_x_0.then(|| (_ffi_read::<i32>(&mut buf_end), _ffi_read::<i32>(&mut buf_end)))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_write(ret_0_val.0, &mut buf2);\n        _ffi_write(ret_0_val.1, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE_BOOL = _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE_BOOL)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_tup_box(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = tup_box(TupBox((_ffi_box_i32_from_js2(&mut buf_end), _ffi_box_bool_from_js(&mut buf_end))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_to_js2(*ret_0.0, &mut buf2);\n    _ffi_box_bool_to_js(*ret_0.1, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_box(buf_ptr: *const u8, x_0_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_box(VecBox(_ffi_vec_box_i32_from_js(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_box_i32_to_js(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_box_vec(buf_ptr: *const u8, x_0_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_box_vec(VecBoxVec(_ffi_vec_box_vec_i32_from_js(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_box_vec_i32_to_js(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_tup_0(buf_ptr: *const u8, x_0_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_0(VecTup0(_ffi_vec__from_js(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec__to_js(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_tup_1(buf_ptr: *const u8, x_0_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_1(VecTup1(_ffi_vec_i32_from_js(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_i32_to_js(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_tup_2(buf_ptr: *const u8, x_0_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_2(VecTup2(_ffi_vec_i32_i32_from_js(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_i32_i32_to_js(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\nstatic mut _FFI_RET_PTR_USIZE: _ffi_ret_ptr_usize = _ffi_ret_ptr_usize(std::ptr::null(), 0);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize_bool(*const u8, usize, bool);\nstatic mut _FFI_RET_PTR_USIZE_BOOL: _ffi_ret_ptr_usize_bool = _ffi_ret_ptr_usize_bool(std::ptr::null(), 0, false);\n\n#[allow(non_snake_case)]\nfn _ffi_vec__from_js(len: usize, _: &mut *const u8) -> Vec<()> {\n    let mut items = Vec::<()>::with_capacity(len);\n    for _ in 0..len {\n        items.push(());\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__to_js(items: Vec<()>, _: &mut Vec<u8>) {\n    for item in items {\n        _ = item;\n    }\n}\n\nfn _ffi_vec_box_i32_from_js(len: usize, end: &mut *const u8) -> Vec<Box<i32>> {\n    let mut items = Vec::<Box<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_box_i32_from_js2(end));\n    }\n    items\n}\n\nfn _ffi_vec_box_i32_to_js(items: Vec<Box<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_box_i32_to_js2(*item, buf);\n    }\n}\n\nfn _ffi_vec_box_vec_i32_from_js(len: usize, end: &mut *const u8) -> Vec<Box<Vec<i32>>> {\n    let mut items = Vec::<Box<Vec<i32>>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_box_vec_i32_from_js(end));\n    }\n    items\n}\n\nfn _ffi_vec_box_vec_i32_to_js(items: Vec<Box<Vec<i32>>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_box_vec_i32_to_js(*item, buf);\n    }\n}\n\nfn _ffi_vec_i32_from_js(len: usize, end: &mut *const u8) -> Vec<(i32,)> {\n    let mut items = Vec::<(i32,)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((_ffi_read::<i32>(end),));\n    }\n    items\n}\n\nfn _ffi_vec_i32_from_js2(len: usize, end: &mut *const u8) -> Vec<i32> {\n    let mut items = Vec::<i32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i32_i32_from_js(len: usize, end: &mut *const u8) -> Vec<(i32, i32)> {\n    let mut items = Vec::<(i32, i32)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((_ffi_read::<i32>(end), _ffi_read::<i32>(end)));\n    }\n    items\n}\n\nfn _ffi_vec_i32_i32_to_js(items: Vec<(i32, i32)>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.0, buf);\n        _ffi_write(item.1, buf);\n    }\n}\n\nfn _ffi_vec_i32_to_js(items: Vec<(i32,)>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.0, buf);\n    }\n}\n\nfn _ffi_vec_i32_to_js2(items: Vec<i32>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item, buf);\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_derive_eq_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport type EnumBoxTup =\n    | { readonly $: \"Foo\", 0: [number, number] }\n    | { readonly $: \"Bar\" }\n    | { readonly $: \"Baz\", x: number, y: number }\n\nexport type EnumVecTup =\n    | { readonly $: \"Foo\", 0: [number, number][] }\n    | { readonly $: \"Bar\" }\n    | { readonly $: \"Baz\", x: number, y: number }\n\nexport type EnumOptTup =\n    | { readonly $: \"Foo\", 0: [number, number] | null }\n    | { readonly $: \"Bar\" }\n    | { readonly $: \"Baz\", x: number, y: number }\n\nexport interface EmptyStruct {\n}\n\nexport interface BoxTup0 {\n    0: undefined,\n}\n\nexport interface BoxTup1 {\n    0: [number],\n}\n\nexport interface BoxTup2 {\n    0: [number, number],\n}\n\nexport interface VecTup0 {\n    0: undefined[],\n}\n\nexport interface VecTup1 {\n    0: [number][],\n}\n\nexport interface VecTup2 {\n    0: [number, number][],\n}\n\nexport interface OptTup0 {\n    0: undefined | null,\n}\n\nexport interface OptTup1 {\n    0: [number] | null,\n}\n\nexport interface OptTup2 {\n    0: [number, number] | null,\n}\n\nexport interface TupBox {\n    0: [number, boolean],\n}\n\nexport interface VecBox {\n    0: number[],\n}\n\nexport interface BoxVec {\n    0: number[],\n}\n\nexport interface OptBox {\n    0: number | null,\n}\n\nexport interface BoxOpt {\n    0: number | null,\n}\n\nexport interface VecBoxVec {\n    0: number[][],\n}\n\nexport interface BoxVecBox {\n    0: number[],\n}\n\nexport interface OptBoxOpt {\n    0: number | null,\n}\n\nexport interface BoxOptBox {\n    0: number | null,\n}\n\nexport function rust_mem_leaked(): number;\nexport function empty_tuple(x: undefined): undefined;\nexport function empty_struct(x: EmptyStruct): EmptyStruct;\nexport function box_tup_0(x: BoxTup0): BoxTup0;\nexport function box_tup_1(x: BoxTup1): BoxTup1;\nexport function box_tup_2(x: BoxTup2): BoxTup2;\nexport function vec_tup_0(x: VecTup0): VecTup0;\nexport function vec_tup_1(x: VecTup1): VecTup1;\nexport function vec_tup_2(x: VecTup2): VecTup2;\nexport function opt_tup_0(x: OptTup0): OptTup0;\nexport function opt_tup_1(x: OptTup1): OptTup1;\nexport function opt_tup_2(x: OptTup2): OptTup2;\nexport function enum_box_tup(x: EnumBoxTup): EnumBoxTup;\nexport function enum_vec_tup(x: EnumVecTup): EnumVecTup;\nexport function enum_opt_tup(x: EnumOptTup): EnumOptTup;\nexport function tup_box(x: TupBox): TupBox;\nexport function vec_box(x: VecBox): VecBox;\nexport function box_vec(x: BoxVec): BoxVec;\nexport function opt_box(x: OptBox): OptBox;\nexport function box_opt(x: BoxOpt): BoxOpt;\nexport function vec_box_vec(x: VecBoxVec): VecBoxVec;\nexport function box_vec_box(x: BoxVecBox): BoxVecBox;\nexport function opt_box_opt(x: OptBoxOpt): OptBoxOpt;\nexport function box_opt_box(x: BoxOptBox): BoxOptBox;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_derive_eq_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function empty_tuple(x) {\n    _ffi_exports._ffi_fn_empty_tuple();\n    return undefined;\n}\n\nexport function empty_struct(x) {\n    _ffi_exports._ffi_fn_empty_struct();\n    return {};\n}\n\nexport function box_tup_0(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box__to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_tup_0(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_box__from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_tup_1(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_tup_1(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_box_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_tup_2(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_i32_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_tup_2(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_box_i32_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_tup_0(x) {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec__to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_tup_0(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_vec__from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_tup_1(x) {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_tup_1(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_vec_i32_from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_tup_2(x) {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec_i32_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_tup_2(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_vec_i32_i32_from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_tup_0(x) {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_tup_0(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: has_ret_0 ? undefined : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_tup_1(x) {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n        _ffi_write_i32(buf, x_0_val[0]);\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_tup_1(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: has_ret_0 ? [_ffi_read_i32(buf2)] : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_tup_2(x) {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n        _ffi_write_i32(buf, x_0_val[0]);\n        _ffi_write_i32(buf, x_0_val[1]);\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_tup_2(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: has_ret_0 ? [_ffi_read_i32(buf2), _ffi_read_i32(buf2)] : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function enum_box_tup(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_enum_EnumBoxTup_to_rust(x, buf);\n    let multi_ret = _ffi_exports._ffi_fn_enum_box_tup(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = _ffi_enum_EnumBoxTup_from_rust(buf2);\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function enum_vec_tup(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_enum_EnumVecTup_to_rust(x, buf);\n    let multi_ret = _ffi_exports._ffi_fn_enum_vec_tup(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = _ffi_enum_EnumVecTup_from_rust(buf2);\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function enum_opt_tup(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_enum_EnumOptTup_to_rust(x, buf);\n    let multi_ret = _ffi_exports._ffi_fn_enum_opt_tup(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = _ffi_enum_EnumOptTup_from_rust(buf2);\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function tup_box(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_i32_to_rust2(x[0][0], buf);\n    _ffi_box_bool_to_rust(x[0][1], buf);\n    let multi_ret = _ffi_exports._ffi_fn_tup_box(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: [_ffi_box_i32_from_rust2(buf2), _ffi_box_bool_from_rust(buf2)] };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_box(x) {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec_box_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_box(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_vec_box_i32_from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_vec(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_vec_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_vec(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_box_vec_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_box(x) {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n        _ffi_box_i32_to_rust2(x_0_val, buf);\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_box(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: has_ret_0 ? _ffi_box_i32_from_rust2(buf2) : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_opt(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_option_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_opt(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_box_option_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_box_vec(x) {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec_box_vec_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_box_vec(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_vec_box_vec_i32_from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_vec_box(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_vec_box_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_vec_box(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_box_vec_box_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_box_opt(x) {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n        _ffi_box_option_i32_to_rust(x_0_val, buf);\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_box_opt(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: has_ret_0 ? _ffi_box_option_i32_from_rust(buf2) : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_opt_box(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_option_box_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_opt_box(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = { 0: _ffi_box_option_box_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8;\nlet _ffi_enum_EnumBoxTup__Bar = { $: \"Bar\" };\nlet _ffi_enum_EnumOptTup__Bar = { $: \"Bar\" };\nlet _ffi_enum_EnumVecTup__Bar = { $: \"Bar\" };\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_box__from_rust(buf) {\n    return undefined;\n}\n\nfunction _ffi_box__to_rust(val, buf) {\n}\n\nfunction _ffi_box_bool_from_rust(buf) {\n    return !!_ffi_read_u8(buf);\n}\n\nfunction _ffi_box_bool_to_rust(val, buf) {\n    _ffi_write_i8(buf, +val);\n}\n\nfunction _ffi_box_i32_from_rust(buf) {\n    return [_ffi_read_i32(buf)];\n}\n\nfunction _ffi_box_i32_from_rust2(buf) {\n    return _ffi_read_i32(buf);\n}\n\nfunction _ffi_box_i32_i32_from_rust(buf) {\n    return [_ffi_read_i32(buf), _ffi_read_i32(buf)];\n}\n\nfunction _ffi_box_i32_i32_to_rust(val, buf) {\n    _ffi_write_i32(buf, val[0]);\n    _ffi_write_i32(buf, val[1]);\n}\n\nfunction _ffi_box_i32_to_rust(val, buf) {\n    _ffi_write_i32(buf, val[0]);\n}\n\nfunction _ffi_box_i32_to_rust2(val, buf) {\n    _ffi_write_i32(buf, val);\n}\n\nfunction _ffi_box_option_box_i32_from_rust(buf) {\n    return _ffi_read_u8(buf) ? _ffi_box_i32_from_rust2(buf) : null;\n}\n\nfunction _ffi_box_option_box_i32_to_rust(val, buf) {\n    _ffi_write_i8(buf, +(val !== null));\n    if (val !== null) {\n        let val_val = val;\n        _ffi_box_i32_to_rust2(val_val, buf);\n    }\n}\n\nfunction _ffi_box_option_i32_from_rust(buf) {\n    return _ffi_read_u8(buf) ? _ffi_read_i32(buf) : null;\n}\n\nfunction _ffi_box_option_i32_to_rust(val, buf) {\n    _ffi_write_i8(buf, +(val !== null));\n    if (val !== null) {\n        _ffi_write_i32(buf, val);\n    }\n}\n\nfunction _ffi_box_vec_box_i32_from_rust(buf) {\n    return _ffi_vec_box_i32_from_rust(_ffi_read_u32(buf), buf);\n}\n\nfunction _ffi_box_vec_box_i32_to_rust(val, buf) {\n    _ffi_write_i32(buf, val.length);\n    _ffi_vec_box_i32_to_rust(val, buf);\n}\n\nfunction _ffi_box_vec_i32_from_rust(buf) {\n    return _ffi_vec_i32_from_rust2(_ffi_read_u32(buf), buf);\n}\n\nfunction _ffi_box_vec_i32_to_rust(val, buf) {\n    _ffi_write_i32(buf, val.length);\n    _ffi_vec_i32_to_rust2(val, buf);\n}\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_enum_EnumBoxTup_from_rust(buf) {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return { $: \"Foo\", 0: _ffi_box_i32_i32_from_rust(buf) };\n        case 1: return _ffi_enum_EnumBoxTup__Bar;\n        case 2: return { $: \"Baz\", x: _ffi_read_i32(buf), y: _ffi_read_i32(buf) };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_enum_EnumBoxTup_to_rust(val, buf) {\n    switch (val.$) {\n        case \"Foo\":\n            _ffi_write_i32(buf, 0);\n            _ffi_box_i32_i32_to_rust(val[0], buf);\n            break;\n        case \"Bar\":\n            _ffi_write_i32(buf, 1);\n            break;\n        case \"Baz\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.x);\n            _ffi_write_i32(buf, val.y);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"EnumBoxTup\\\"\");\n    }\n}\n\nfunction _ffi_enum_EnumOptTup_from_rust(buf) {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return { $: \"Foo\", 0: _ffi_read_u8(buf) ? [_ffi_read_i32(buf), _ffi_read_i32(buf)] : null };\n        case 1: return _ffi_enum_EnumOptTup__Bar;\n        case 2: return { $: \"Baz\", x: _ffi_read_i32(buf), y: _ffi_read_i32(buf) };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_enum_EnumOptTup_to_rust(val, buf) {\n    switch (val.$) {\n        case \"Foo\":\n            _ffi_write_i32(buf, 0);\n            _ffi_write_i8(buf, +(val[0] !== null));\n            if (val[0] !== null) {\n                let x_val = val[0];\n                _ffi_write_i32(buf, x_val[0]);\n                _ffi_write_i32(buf, x_val[1]);\n            }\n            break;\n        case \"Bar\":\n            _ffi_write_i32(buf, 1);\n            break;\n        case \"Baz\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.x);\n            _ffi_write_i32(buf, val.y);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"EnumOptTup\\\"\");\n    }\n}\n\nfunction _ffi_enum_EnumVecTup_from_rust(buf) {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return { $: \"Foo\", 0: _ffi_vec_i32_i32_from_rust(_ffi_read_u32(buf), buf) };\n        case 1: return _ffi_enum_EnumVecTup__Bar;\n        case 2: return { $: \"Baz\", x: _ffi_read_i32(buf), y: _ffi_read_i32(buf) };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_enum_EnumVecTup_to_rust(val, buf) {\n    switch (val.$) {\n        case \"Foo\":\n            _ffi_write_i32(buf, 0);\n            _ffi_write_i32(buf, val[0].length);\n            _ffi_vec_i32_i32_to_rust(val[0], buf);\n            break;\n        case \"Bar\":\n            _ffi_write_i32(buf, 1);\n            break;\n        case \"Baz\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.x);\n            _ffi_write_i32(buf, val.y);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"EnumVecTup\\\"\");\n    }\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf) {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u8(buf) {\n    return buf.dv.getUint8(buf.off++);\n}\n\nfunction _ffi_vec__from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(undefined);\n    }\n    return items;\n}\n\nfunction _ffi_vec__to_rust(items, buf) {\n}\n\nfunction _ffi_vec_box_i32_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(_ffi_box_i32_from_rust2(buf));\n    }\n    return items;\n}\n\nfunction _ffi_vec_box_i32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_box_i32_to_rust2(item, buf);\n    }\n}\n\nfunction _ffi_vec_box_vec_i32_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(_ffi_box_vec_i32_from_rust(buf));\n    }\n    return items;\n}\n\nfunction _ffi_vec_box_vec_i32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_box_vec_i32_to_rust(item, buf);\n    }\n}\n\nfunction _ffi_vec_i32_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push([_ffi_read_i32(buf)]);\n    }\n    return items;\n}\n\nfunction _ffi_vec_i32_from_rust2(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(_ffi_read_i32(buf));\n    }\n    return items;\n}\n\nfunction _ffi_vec_i32_i32_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push([_ffi_read_i32(buf), _ffi_read_i32(buf)]);\n    }\n    return items;\n}\n\nfunction _ffi_vec_i32_i32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item[0]);\n        _ffi_write_i32(buf, item[1]);\n    }\n}\n\nfunction _ffi_vec_i32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item[0]);\n    }\n}\n\nfunction _ffi_vec_i32_to_rust2(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf, val) {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv.setInt8(ptr, val);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_derive_eq_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport type EnumBoxTup =\n    | { readonly $: \"Foo\", 0: [number, number] }\n    | { readonly $: \"Bar\" }\n    | { readonly $: \"Baz\", x: number, y: number }\n\nexport type EnumVecTup =\n    | { readonly $: \"Foo\", 0: [number, number][] }\n    | { readonly $: \"Bar\" }\n    | { readonly $: \"Baz\", x: number, y: number }\n\nexport type EnumOptTup =\n    | { readonly $: \"Foo\", 0: [number, number] | null }\n    | { readonly $: \"Bar\" }\n    | { readonly $: \"Baz\", x: number, y: number }\n\nexport interface EmptyStruct {\n}\n\nexport interface BoxTup0 {\n    0: undefined,\n}\n\nexport interface BoxTup1 {\n    0: [number],\n}\n\nexport interface BoxTup2 {\n    0: [number, number],\n}\n\nexport interface VecTup0 {\n    0: undefined[],\n}\n\nexport interface VecTup1 {\n    0: [number][],\n}\n\nexport interface VecTup2 {\n    0: [number, number][],\n}\n\nexport interface OptTup0 {\n    0: undefined | null,\n}\n\nexport interface OptTup1 {\n    0: [number] | null,\n}\n\nexport interface OptTup2 {\n    0: [number, number] | null,\n}\n\nexport interface TupBox {\n    0: [number, boolean],\n}\n\nexport interface VecBox {\n    0: number[],\n}\n\nexport interface BoxVec {\n    0: number[],\n}\n\nexport interface OptBox {\n    0: number | null,\n}\n\nexport interface BoxOpt {\n    0: number | null,\n}\n\nexport interface VecBoxVec {\n    0: number[][],\n}\n\nexport interface BoxVecBox {\n    0: number[],\n}\n\nexport interface OptBoxOpt {\n    0: number | null,\n}\n\nexport interface BoxOptBox {\n    0: number | null,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function empty_tuple(x: undefined): undefined {\n    _ffi_exports._ffi_fn_empty_tuple();\n    return undefined;\n}\n\nexport function empty_struct(x: EmptyStruct): EmptyStruct {\n    _ffi_exports._ffi_fn_empty_struct();\n    return {};\n}\n\nexport function box_tup_0(x: BoxTup0): BoxTup0 {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box__to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_tup_0(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: BoxTup0 = { 0: _ffi_box__from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_tup_1(x: BoxTup1): BoxTup1 {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_tup_1(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: BoxTup1 = { 0: _ffi_box_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_tup_2(x: BoxTup2): BoxTup2 {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_i32_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_tup_2(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: BoxTup2 = { 0: _ffi_box_i32_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_tup_0(x: VecTup0): VecTup0 {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec__to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_tup_0(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: VecTup0 = { 0: _ffi_vec__from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_tup_1(x: VecTup1): VecTup1 {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_tup_1(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: VecTup1 = { 0: _ffi_vec_i32_from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_tup_2(x: VecTup2): VecTup2 {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec_i32_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_tup_2(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: VecTup2 = { 0: _ffi_vec_i32_i32_from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_tup_0(x: OptTup0): OptTup0 {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_tup_0(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: OptTup0 = { 0: has_ret_0 ? undefined : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_tup_1(x: OptTup1): OptTup1 {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n        _ffi_write_i32(buf, x_0_val[0]);\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_tup_1(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: OptTup1 = { 0: has_ret_0 ? [_ffi_read_i32(buf2)] : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_tup_2(x: OptTup2): OptTup2 {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n        _ffi_write_i32(buf, x_0_val[0]);\n        _ffi_write_i32(buf, x_0_val[1]);\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_tup_2(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: OptTup2 = { 0: has_ret_0 ? [_ffi_read_i32(buf2), _ffi_read_i32(buf2)] : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function enum_box_tup(x: EnumBoxTup): EnumBoxTup {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_enum_EnumBoxTup_to_rust(x, buf);\n    let multi_ret = _ffi_exports._ffi_fn_enum_box_tup(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: EnumBoxTup = _ffi_enum_EnumBoxTup_from_rust(buf2);\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function enum_vec_tup(x: EnumVecTup): EnumVecTup {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_enum_EnumVecTup_to_rust(x, buf);\n    let multi_ret = _ffi_exports._ffi_fn_enum_vec_tup(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: EnumVecTup = _ffi_enum_EnumVecTup_from_rust(buf2);\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function enum_opt_tup(x: EnumOptTup): EnumOptTup {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_enum_EnumOptTup_to_rust(x, buf);\n    let multi_ret = _ffi_exports._ffi_fn_enum_opt_tup(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: EnumOptTup = _ffi_enum_EnumOptTup_from_rust(buf2);\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function tup_box(x: TupBox): TupBox {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_i32_to_rust2(x[0][0], buf);\n    _ffi_box_bool_to_rust(x[0][1], buf);\n    let multi_ret = _ffi_exports._ffi_fn_tup_box(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: TupBox = { 0: [_ffi_box_i32_from_rust2(buf2), _ffi_box_bool_from_rust(buf2)] };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_box(x: VecBox): VecBox {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec_box_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_box(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: VecBox = { 0: _ffi_vec_box_i32_from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_vec(x: BoxVec): BoxVec {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_vec_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_vec(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: BoxVec = { 0: _ffi_box_vec_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_box(x: OptBox): OptBox {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n        _ffi_box_i32_to_rust2(x_0_val, buf);\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_box(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: OptBox = { 0: has_ret_0 ? _ffi_box_i32_from_rust2(buf2) : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_opt(x: BoxOpt): BoxOpt {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_option_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_opt(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: BoxOpt = { 0: _ffi_box_option_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function vec_box_vec(x: VecBoxVec): VecBoxVec {\n    let buf = _ffi_new_WriteBuf();\n    let x_0_len = x[0].length;\n    _ffi_vec_box_vec_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_vec_box_vec(_ffi_buf_to_rust(buf), x_0_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_0_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: VecBoxVec = { 0: _ffi_vec_box_vec_i32_from_rust(ret_0_len, buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_vec_box(x: BoxVecBox): BoxVecBox {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_vec_box_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_vec_box(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: BoxVecBox = { 0: _ffi_box_vec_box_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function opt_box_opt(x: OptBoxOpt): OptBoxOpt {\n    let buf = _ffi_new_WriteBuf();\n    let has_x_0 = x[0] !== null;\n    if (x[0] !== null) {\n        let x_0_val = x[0];\n        _ffi_box_option_i32_to_rust(x_0_val, buf);\n    }\n    let multi_ret = _ffi_exports._ffi_fn_opt_box_opt(_ffi_buf_to_rust(buf), has_x_0);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret_0 = _ffi_dv.getUint8(multi_ret + 8);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: OptBoxOpt = { 0: has_ret_0 ? _ffi_box_option_i32_from_rust(buf2) : null };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nexport function box_opt_box(x: BoxOptBox): BoxOptBox {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_option_box_i32_to_rust(x[0], buf);\n    let multi_ret = _ffi_exports._ffi_fn_box_opt_box(_ffi_buf_to_rust(buf));\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret: BoxOptBox = { 0: _ffi_box_option_box_i32_from_rust(buf2) };\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8: Uint8Array;\nlet _ffi_enum_EnumBoxTup__Bar: EnumBoxTup = { $: \"Bar\" };\nlet _ffi_enum_EnumOptTup__Bar: EnumOptTup = { $: \"Bar\" };\nlet _ffi_enum_EnumVecTup__Bar: EnumVecTup = { $: \"Bar\" };\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nfunction _ffi_box__from_rust(buf: _ffi_ReadBuf): undefined {\n    return undefined;\n}\n\nfunction _ffi_box__to_rust(val: undefined, buf: _ffi_WriteBuf): void {\n}\n\nfunction _ffi_box_bool_from_rust(buf: _ffi_ReadBuf): boolean {\n    return !!_ffi_read_u8(buf);\n}\n\nfunction _ffi_box_bool_to_rust(val: boolean, buf: _ffi_WriteBuf): void {\n    _ffi_write_i8(buf, +val);\n}\n\nfunction _ffi_box_i32_from_rust(buf: _ffi_ReadBuf): [number] {\n    return [_ffi_read_i32(buf)];\n}\n\nfunction _ffi_box_i32_from_rust2(buf: _ffi_ReadBuf): number {\n    return _ffi_read_i32(buf);\n}\n\nfunction _ffi_box_i32_i32_from_rust(buf: _ffi_ReadBuf): [number, number] {\n    return [_ffi_read_i32(buf), _ffi_read_i32(buf)];\n}\n\nfunction _ffi_box_i32_i32_to_rust(val: [number, number], buf: _ffi_WriteBuf): void {\n    _ffi_write_i32(buf, val[0]);\n    _ffi_write_i32(buf, val[1]);\n}\n\nfunction _ffi_box_i32_to_rust(val: [number], buf: _ffi_WriteBuf): void {\n    _ffi_write_i32(buf, val[0]);\n}\n\nfunction _ffi_box_i32_to_rust2(val: number, buf: _ffi_WriteBuf): void {\n    _ffi_write_i32(buf, val);\n}\n\nfunction _ffi_box_option_box_i32_from_rust(buf: _ffi_ReadBuf): number | null {\n    return _ffi_read_u8(buf) ? _ffi_box_i32_from_rust2(buf) : null;\n}\n\nfunction _ffi_box_option_box_i32_to_rust(val: number | null, buf: _ffi_WriteBuf): void {\n    _ffi_write_i8(buf, +(val !== null));\n    if (val !== null) {\n        let val_val = val;\n        _ffi_box_i32_to_rust2(val_val, buf);\n    }\n}\n\nfunction _ffi_box_option_i32_from_rust(buf: _ffi_ReadBuf): number | null {\n    return _ffi_read_u8(buf) ? _ffi_read_i32(buf) : null;\n}\n\nfunction _ffi_box_option_i32_to_rust(val: number | null, buf: _ffi_WriteBuf): void {\n    _ffi_write_i8(buf, +(val !== null));\n    if (val !== null) {\n        _ffi_write_i32(buf, val);\n    }\n}\n\nfunction _ffi_box_vec_box_i32_from_rust(buf: _ffi_ReadBuf): number[] {\n    return _ffi_vec_box_i32_from_rust(_ffi_read_u32(buf), buf);\n}\n\nfunction _ffi_box_vec_box_i32_to_rust(val: number[], buf: _ffi_WriteBuf): void {\n    _ffi_write_i32(buf, val.length);\n    _ffi_vec_box_i32_to_rust(val, buf);\n}\n\nfunction _ffi_box_vec_i32_from_rust(buf: _ffi_ReadBuf): number[] {\n    return _ffi_vec_i32_from_rust2(_ffi_read_u32(buf), buf);\n}\n\nfunction _ffi_box_vec_i32_to_rust(val: number[], buf: _ffi_WriteBuf): void {\n    _ffi_write_i32(buf, val.length);\n    _ffi_vec_i32_to_rust2(val, buf);\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_enum_EnumBoxTup_from_rust(buf: _ffi_ReadBuf): EnumBoxTup {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return { $: \"Foo\", 0: _ffi_box_i32_i32_from_rust(buf) };\n        case 1: return _ffi_enum_EnumBoxTup__Bar;\n        case 2: return { $: \"Baz\", x: _ffi_read_i32(buf), y: _ffi_read_i32(buf) };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_enum_EnumBoxTup_to_rust(val: EnumBoxTup, buf: _ffi_WriteBuf): void {\n    switch (val.$) {\n        case \"Foo\":\n            _ffi_write_i32(buf, 0);\n            _ffi_box_i32_i32_to_rust(val[0], buf);\n            break;\n        case \"Bar\":\n            _ffi_write_i32(buf, 1);\n            break;\n        case \"Baz\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.x);\n            _ffi_write_i32(buf, val.y);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"EnumBoxTup\\\"\");\n    }\n}\n\nfunction _ffi_enum_EnumOptTup_from_rust(buf: _ffi_ReadBuf): EnumOptTup {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return { $: \"Foo\", 0: _ffi_read_u8(buf) ? [_ffi_read_i32(buf), _ffi_read_i32(buf)] : null };\n        case 1: return _ffi_enum_EnumOptTup__Bar;\n        case 2: return { $: \"Baz\", x: _ffi_read_i32(buf), y: _ffi_read_i32(buf) };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_enum_EnumOptTup_to_rust(val: EnumOptTup, buf: _ffi_WriteBuf): void {\n    switch (val.$) {\n        case \"Foo\":\n            _ffi_write_i32(buf, 0);\n            _ffi_write_i8(buf, +(val[0] !== null));\n            if (val[0] !== null) {\n                let x_val = val[0];\n                _ffi_write_i32(buf, x_val[0]);\n                _ffi_write_i32(buf, x_val[1]);\n            }\n            break;\n        case \"Bar\":\n            _ffi_write_i32(buf, 1);\n            break;\n        case \"Baz\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.x);\n            _ffi_write_i32(buf, val.y);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"EnumOptTup\\\"\");\n    }\n}\n\nfunction _ffi_enum_EnumVecTup_from_rust(buf: _ffi_ReadBuf): EnumVecTup {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return { $: \"Foo\", 0: _ffi_vec_i32_i32_from_rust(_ffi_read_u32(buf), buf) };\n        case 1: return _ffi_enum_EnumVecTup__Bar;\n        case 2: return { $: \"Baz\", x: _ffi_read_i32(buf), y: _ffi_read_i32(buf) };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_enum_EnumVecTup_to_rust(val: EnumVecTup, buf: _ffi_WriteBuf): void {\n    switch (val.$) {\n        case \"Foo\":\n            _ffi_write_i32(buf, 0);\n            _ffi_write_i32(buf, val[0].length);\n            _ffi_vec_i32_i32_to_rust(val[0], buf);\n            break;\n        case \"Bar\":\n            _ffi_write_i32(buf, 1);\n            break;\n        case \"Baz\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.x);\n            _ffi_write_i32(buf, val.y);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"EnumVecTup\\\"\");\n    }\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u8(buf: _ffi_ReadBuf): number {\n    return buf.dv.getUint8(buf.off++);\n}\n\nfunction _ffi_vec__from_rust(len: number, buf: _ffi_ReadBuf): undefined[] {\n    let items: undefined[] = [];\n    while (items.length < len) {\n        items.push(undefined);\n    }\n    return items;\n}\n\nfunction _ffi_vec__to_rust(items: undefined[], buf: _ffi_WriteBuf): void {\n}\n\nfunction _ffi_vec_box_i32_from_rust(len: number, buf: _ffi_ReadBuf): number[] {\n    let items: number[] = [];\n    while (items.length < len) {\n        items.push(_ffi_box_i32_from_rust2(buf));\n    }\n    return items;\n}\n\nfunction _ffi_vec_box_i32_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_box_i32_to_rust2(item, buf);\n    }\n}\n\nfunction _ffi_vec_box_vec_i32_from_rust(len: number, buf: _ffi_ReadBuf): number[][] {\n    let items: number[][] = [];\n    while (items.length < len) {\n        items.push(_ffi_box_vec_i32_from_rust(buf));\n    }\n    return items;\n}\n\nfunction _ffi_vec_box_vec_i32_to_rust(items: number[][], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_box_vec_i32_to_rust(item, buf);\n    }\n}\n\nfunction _ffi_vec_i32_from_rust(len: number, buf: _ffi_ReadBuf): [number][] {\n    let items: [number][] = [];\n    while (items.length < len) {\n        items.push([_ffi_read_i32(buf)]);\n    }\n    return items;\n}\n\nfunction _ffi_vec_i32_from_rust2(len: number, buf: _ffi_ReadBuf): number[] {\n    let items: number[] = [];\n    while (items.length < len) {\n        items.push(_ffi_read_i32(buf));\n    }\n    return items;\n}\n\nfunction _ffi_vec_i32_i32_from_rust(len: number, buf: _ffi_ReadBuf): [number, number][] {\n    let items: [number, number][] = [];\n    while (items.length < len) {\n        items.push([_ffi_read_i32(buf), _ffi_read_i32(buf)]);\n    }\n    return items;\n}\n\nfunction _ffi_vec_i32_i32_to_rust(items: [number, number][], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item[0]);\n        _ffi_write_i32(buf, item[1]);\n    }\n}\n\nfunction _ffi_vec_i32_to_rust(items: [number][], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item[0]);\n    }\n}\n\nfunction _ffi_vec_i32_to_rust2(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv!.setInt8(ptr, val);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_box_opt: (buf_ptr: number) => number,\n    _ffi_fn_box_opt_box: (buf_ptr: number) => number,\n    _ffi_fn_box_tup_0: (buf_ptr: number) => number,\n    _ffi_fn_box_tup_1: (buf_ptr: number) => number,\n    _ffi_fn_box_tup_2: (buf_ptr: number) => number,\n    _ffi_fn_box_vec: (buf_ptr: number) => number,\n    _ffi_fn_box_vec_box: (buf_ptr: number) => number,\n    _ffi_fn_empty_struct: () => void,\n    _ffi_fn_empty_tuple: () => void,\n    _ffi_fn_enum_box_tup: (buf_ptr: number) => number,\n    _ffi_fn_enum_opt_tup: (buf_ptr: number) => number,\n    _ffi_fn_enum_vec_tup: (buf_ptr: number) => number,\n    _ffi_fn_opt_box: (buf_ptr: number, has_x_0: boolean) => number,\n    _ffi_fn_opt_box_opt: (buf_ptr: number, has_x_0: boolean) => number,\n    _ffi_fn_opt_tup_0: (buf_ptr: number, has_x_0: boolean) => number,\n    _ffi_fn_opt_tup_1: (buf_ptr: number, has_x_0: boolean) => number,\n    _ffi_fn_opt_tup_2: (buf_ptr: number, has_x_0: boolean) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_tup_box: (buf_ptr: number) => number,\n    _ffi_fn_vec_box: (buf_ptr: number, x_0_len: number) => number,\n    _ffi_fn_vec_box_vec: (buf_ptr: number, x_0_len: number) => number,\n    _ffi_fn_vec_tup_0: (buf_ptr: number, x_0_len: number) => number,\n    _ffi_fn_vec_tup_1: (buf_ptr: number, x_0_len: number) => number,\n    _ffi_fn_vec_tup_2: (buf_ptr: number, x_0_len: number) => number,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_derive_eq_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box__from_js(_: &mut *const u8) -> Box<()> {\n    Box::new(())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_box__to_js(val: (), _: &mut Vec<u8>) {\n    _ = val;\n}\n\nfn _ffi_box_bool_from_js(end: &mut *const u8) -> Box<bool> {\n    Box::new(_ffi_read::<bool>(end))\n}\n\nfn _ffi_box_bool_to_js(val: bool, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\nfn _ffi_box_i32_from_js(end: &mut *const u8) -> Box<(i32,)> {\n    Box::new((_ffi_read::<i32>(end),))\n}\n\nfn _ffi_box_i32_from_js2(end: &mut *const u8) -> Box<i32> {\n    Box::new(_ffi_read::<i32>(end))\n}\n\nfn _ffi_box_i32_i32_from_js(end: &mut *const u8) -> Box<(i32, i32)> {\n    Box::new((_ffi_read::<i32>(end), _ffi_read::<i32>(end)))\n}\n\nfn _ffi_box_i32_i32_to_js(val: (i32, i32), buf: &mut Vec<u8>) {\n    _ffi_write(val.0, buf);\n    _ffi_write(val.1, buf);\n}\n\nfn _ffi_box_i32_to_js(val: (i32,), buf: &mut Vec<u8>) {\n    _ffi_write(val.0, buf);\n}\n\nfn _ffi_box_i32_to_js2(val: i32, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\nfn _ffi_box_option_box_i32_from_js(end: &mut *const u8) -> Box<Option<Box<i32>>> {\n    Box::new(_ffi_read::<bool>(end).then(|| _ffi_box_i32_from_js2(end)))\n}\n\nfn _ffi_box_option_box_i32_to_js(val: Option<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_write(val.is_some(), buf);\n    if let Some(val_val) = val {\n        _ffi_box_i32_to_js2(*val_val, buf);\n    }\n}\n\nfn _ffi_box_option_i32_from_js(end: &mut *const u8) -> Box<Option<i32>> {\n    Box::new(_ffi_read::<bool>(end).then(|| _ffi_read::<i32>(end)))\n}\n\nfn _ffi_box_option_i32_to_js(val: Option<i32>, buf: &mut Vec<u8>) {\n    _ffi_write(val.is_some(), buf);\n    if let Some(val_val) = val {\n        _ffi_write(val_val, buf);\n    }\n}\n\nfn _ffi_box_vec_box_i32_from_js(end: &mut *const u8) -> Box<Vec<Box<i32>>> {\n    Box::new(_ffi_vec_box_i32_from_js(_ffi_read::<usize>(end), end))\n}\n\nfn _ffi_box_vec_box_i32_to_js(val: Vec<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_write(val.len(), buf);\n    _ffi_vec_box_i32_to_js(val, buf);\n}\n\nfn _ffi_box_vec_i32_from_js(end: &mut *const u8) -> Box<Vec<i32>> {\n    Box::new(_ffi_vec_i32_from_js2(_ffi_read::<usize>(end), end))\n}\n\nfn _ffi_box_vec_i32_to_js(val: Vec<i32>, buf: &mut Vec<u8>) {\n    _ffi_write(val.len(), buf);\n    _ffi_vec_i32_to_js2(val, buf);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumBoxTup_from_js(end: &mut *const u8) -> EnumBoxTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumBoxTup::Foo(_ffi_box_i32_i32_from_js(end)),\n        1 => EnumBoxTup::Bar,\n        2 => EnumBoxTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumBoxTup_to_js(val: EnumBoxTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumBoxTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_box_i32_i32_to_js(*x, buf);\n        }\n        EnumBoxTup::Bar => _ffi_write(1 as i32, buf),\n        EnumBoxTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumOptTup_from_js(end: &mut *const u8) -> EnumOptTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumOptTup::Foo(_ffi_read::<bool>(end).then(|| (_ffi_read::<i32>(end), _ffi_read::<i32>(end)))),\n        1 => EnumOptTup::Bar,\n        2 => EnumOptTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumOptTup_to_js(val: EnumOptTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumOptTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_write(x.is_some(), buf);\n            if let Some(x_val) = x {\n                _ffi_write(x_val.0, buf);\n                _ffi_write(x_val.1, buf);\n            }\n        }\n        EnumOptTup::Bar => _ffi_write(1 as i32, buf),\n        EnumOptTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumVecTup_from_js(end: &mut *const u8) -> EnumVecTup {\n    match _ffi_read::<i32>(end) {\n        0 => EnumVecTup::Foo(_ffi_vec_i32_i32_from_js(_ffi_read::<usize>(end), end)),\n        1 => EnumVecTup::Bar,\n        2 => EnumVecTup::Baz { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_EnumVecTup_to_js(val: EnumVecTup, buf: &mut Vec<u8>) {\n    match val {\n        EnumVecTup::Foo(x) => {\n            _ffi_write(0 as i32, buf);\n            _ffi_write(x.len(), buf);\n            _ffi_vec_i32_i32_to_js(x, buf);\n        }\n        EnumVecTup::Bar => _ffi_write(1 as i32, buf),\n        EnumVecTup::Baz { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_opt(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_opt(BoxOpt(_ffi_box_option_i32_from_js(&mut buf_end)));\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_option_i32_to_js(*ret.0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_opt_box(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_opt_box(BoxOptBox(_ffi_box_option_box_i32_from_js(&mut buf_end)));\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_option_box_i32_to_js(*ret.0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_tup_0(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_0(BoxTup0(_ffi_box__from_js(&mut buf_end)));\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box__to_js(*ret.0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_tup_1(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_1(BoxTup1(_ffi_box_i32_from_js(&mut buf_end)));\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_to_js(*ret.0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_tup_2(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_tup_2(BoxTup2(_ffi_box_i32_i32_from_js(&mut buf_end)));\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_i32_to_js(*ret.0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_vec(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_vec(BoxVec(_ffi_box_vec_i32_from_js(&mut buf_end)));\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_vec_i32_to_js(*ret.0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_box_vec_box(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = box_vec_box(BoxVecBox(_ffi_box_vec_box_i32_from_js(&mut buf_end)));\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_vec_box_i32_to_js(*ret.0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_empty_struct() {\n    _ = empty_struct(EmptyStruct);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_empty_tuple() {\n    _ = empty_tuple(());\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_enum_box_tup(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumBoxTup_to_js(enum_box_tup(_ffi_enum_EnumBoxTup_from_js(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_enum_opt_tup(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumOptTup_to_js(enum_opt_tup(_ffi_enum_EnumOptTup_from_js(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_enum_vec_tup(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_enum_EnumVecTup_to_js(enum_vec_tup(_ffi_enum_EnumVecTup_from_js(&mut buf_end)), &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_box(buf_ptr: *const u8, has_x_0: bool) -> *const _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_box(OptBox(has_x_0.then(|| _ffi_box_i32_from_js2(&mut buf_end))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_box_i32_to_js2(*ret_0_val, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE_BOOL = _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE_BOOL)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_box_opt(buf_ptr: *const u8, has_x_0: bool) -> *const _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_box_opt(OptBoxOpt(has_x_0.then(|| _ffi_box_option_i32_from_js(&mut buf_end))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_box_option_i32_to_js(*ret_0_val, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE_BOOL = _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE_BOOL)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_tup_0(buf_ptr: *const u8, has_x_0: bool) -> *const _ffi_ret_ptr_usize_bool {\n    let buf_end = buf_ptr;\n    let ret = opt_tup_0(OptTup0(has_x_0.then(|| ())));\n    let ret_0 = ret.0;\n    let buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ = ret_0_val;\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE_BOOL = _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE_BOOL)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_tup_1(buf_ptr: *const u8, has_x_0: bool) -> *const _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_tup_1(OptTup1(has_x_0.then(|| (_ffi_read::<i32>(&mut buf_end),))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_write(ret_0_val.0, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE_BOOL = _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE_BOOL)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_tup_2(buf_ptr: *const u8, has_x_0: bool) -> *const _ffi_ret_ptr_usize_bool {\n    let mut buf_end = buf_ptr;\n    let ret = opt_tup_2(OptTup2(has_x_0.then(|| (_ffi_read::<i32>(&mut buf_end), _ffi_read::<i32>(&mut buf_end)))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let has_ret_0 = ret_0.is_some();\n    if let Some(ret_0_val) = ret_0 {\n        _ffi_write(ret_0_val.0, &mut buf2);\n        _ffi_write(ret_0_val.1, &mut buf2);\n    }\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE_BOOL = _ffi_ret_ptr_usize_bool(buf_ptr2, buf_cap, has_ret_0);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE_BOOL)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_tup_box(buf_ptr: *const u8) -> *const _ffi_ret_ptr_usize {\n    let mut buf_end = buf_ptr;\n    let ret = tup_box(TupBox((_ffi_box_i32_from_js2(&mut buf_end), _ffi_box_bool_from_js(&mut buf_end))));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    _ffi_box_i32_to_js2(*ret_0.0, &mut buf2);\n    _ffi_box_bool_to_js(*ret_0.1, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr2, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_box(buf_ptr: *const u8, x_0_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_box(VecBox(_ffi_vec_box_i32_from_js(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_box_i32_to_js(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_box_vec(buf_ptr: *const u8, x_0_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_box_vec(VecBoxVec(_ffi_vec_box_vec_i32_from_js(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_box_vec_i32_to_js(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_tup_0(buf_ptr: *const u8, x_0_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_0(VecTup0(_ffi_vec__from_js(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec__to_js(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_tup_1(buf_ptr: *const u8, x_0_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_1(VecTup1(_ffi_vec_i32_from_js(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_i32_to_js(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_tup_2(buf_ptr: *const u8, x_0_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = vec_tup_2(VecTup2(_ffi_vec_i32_i32_from_js(x_0_len, &mut buf_end)));\n    let ret_0 = ret.0;\n    let mut buf2 = Vec::<u8>::new();\n    let ret_0_len = ret_0.len();\n    _ffi_vec_i32_i32_to_js(ret_0, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_0_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\nstatic mut _FFI_RET_PTR_USIZE: _ffi_ret_ptr_usize = _ffi_ret_ptr_usize(std::ptr::null(), 0);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize_bool(*const u8, usize, bool);\nstatic mut _FFI_RET_PTR_USIZE_BOOL: _ffi_ret_ptr_usize_bool = _ffi_ret_ptr_usize_bool(std::ptr::null(), 0, false);\n\n#[allow(non_snake_case)]\nfn _ffi_vec__from_js(len: usize, _: &mut *const u8) -> Vec<()> {\n    let mut items = Vec::<()>::with_capacity(len);\n    for _ in 0..len {\n        items.push(());\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__to_js(items: Vec<()>, _: &mut Vec<u8>) {\n    for item in items {\n        _ = item;\n    }\n}\n\nfn _ffi_vec_box_i32_from_js(len: usize, end: &mut *const u8) -> Vec<Box<i32>> {\n    let mut items = Vec::<Box<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_box_i32_from_js2(end));\n    }\n    items\n}\n\nfn _ffi_vec_box_i32_to_js(items: Vec<Box<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_box_i32_to_js2(*item, buf);\n    }\n}\n\nfn _ffi_vec_box_vec_i32_from_js(len: usize, end: &mut *const u8) -> Vec<Box<Vec<i32>>> {\n    let mut items = Vec::<Box<Vec<i32>>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_box_vec_i32_from_js(end));\n    }\n    items\n}\n\nfn _ffi_vec_box_vec_i32_to_js(items: Vec<Box<Vec<i32>>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_box_vec_i32_to_js(*item, buf);\n    }\n}\n\nfn _ffi_vec_i32_from_js(len: usize, end: &mut *const u8) -> Vec<(i32,)> {\n    let mut items = Vec::<(i32,)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((_ffi_read::<i32>(end),));\n    }\n    items\n}\n\nfn _ffi_vec_i32_from_js2(len: usize, end: &mut *const u8) -> Vec<i32> {\n    let mut items = Vec::<i32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i32_i32_from_js(len: usize, end: &mut *const u8) -> Vec<(i32, i32)> {\n    let mut items = Vec::<(i32, i32)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((_ffi_read::<i32>(end), _ffi_read::<i32>(end)));\n    }\n    items\n}\n\nfn _ffi_vec_i32_i32_to_js(items: Vec<(i32, i32)>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.0, buf);\n        _ffi_write(item.1, buf);\n    }\n}\n\nfn _ffi_vec_i32_to_js(items: Vec<(i32,)>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.0, buf);\n    }\n}\n\nfn _ffi_vec_i32_to_js2(items: Vec<i32>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item, buf);\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_enum_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport type NestedBox =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: NestedBox }\n\nexport type NestedVec =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: NestedVec[] }\n\nexport type NestedOption =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: NestedOption | null }\n\nexport type NestedTuple =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: [number, NestedTuple] }\n\nexport type NestedStruct =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: [number, InnerStruct] }\n\nexport type NestedEnum =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: [number, InnerEnum] }\n\nexport type InnerEnum =\n    | { readonly $: \"Foo\", 0: NestedEnum }\n\nexport interface InnerStruct {\n    x: NestedStruct,\n}\n\nexport function rust_mem_leaked(): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_enum_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_enum_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport type NestedBox =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: NestedBox }\n\nexport type NestedVec =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: NestedVec[] }\n\nexport type NestedOption =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: NestedOption | null }\n\nexport type NestedTuple =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: [number, NestedTuple] }\n\nexport type NestedStruct =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: [number, InnerStruct] }\n\nexport type NestedEnum =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: [number, InnerEnum] }\n\nexport type InnerEnum =\n    | { readonly $: \"Foo\", 0: NestedEnum }\n\nexport interface InnerStruct {\n    x: NestedStruct,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_enum_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_enum_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport type NestedBox =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: NestedBox }\n\nexport type NestedVec =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: NestedVec[] }\n\nexport type NestedOption =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: NestedOption | null }\n\nexport type NestedTuple =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: [number, NestedTuple] }\n\nexport type NestedStruct =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: [number, InnerStruct] }\n\nexport type NestedEnum =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: [number, InnerEnum] }\n\nexport type InnerEnum =\n    | { readonly $: \"Foo\", 0: NestedEnum }\n\nexport interface InnerStruct {\n    x: NestedStruct,\n}\n\nexport function rust_mem_leaked(): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_enum_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_enum_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport type NestedBox =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: NestedBox }\n\nexport type NestedVec =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: NestedVec[] }\n\nexport type NestedOption =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: NestedOption | null }\n\nexport type NestedTuple =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: [number, NestedTuple] }\n\nexport type NestedStruct =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: [number, InnerStruct] }\n\nexport type NestedEnum =\n    | { readonly $: \"Foo\" }\n    | { readonly $: \"Bar\", 0: [number, InnerEnum] }\n\nexport type InnerEnum =\n    | { readonly $: \"Foo\", 0: NestedEnum }\n\nexport interface InnerStruct {\n    x: NestedStruct,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_enum_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_keyword_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function test_alignas(alignas: number): number;\nexport function test_alignof(alignof: number): number;\nexport function test_and(and: number): number;\nexport function test_and_eq(and_eq: number): number;\nexport function test_asm(asm: number): number;\nexport function test_associatedtype(associatedtype: number): number;\nexport function test_associativity(associativity: number): number;\nexport function test_atomic_cancel(atomic_cancel: number): number;\nexport function test_atomic_commit(atomic_commit: number): number;\nexport function test_atomic_noexcept(atomic_noexcept: number): number;\nexport function test_auto(auto: number): number;\nexport function test_bitand(bitand: number): number;\nexport function test_bitor(bitor: number): number;\nexport function test_bool(bool: number): number;\nexport function test_boolean(boolean2: number): number;\nexport function test_borrowing(borrowing: number): number;\nexport function test_byte(byte2: number): number;\nexport function test_case(case2: number): number;\nexport function test_catch(catch2: number): number;\nexport function test_char(char2: number): number;\nexport function test_char16_t(char16_t: number): number;\nexport function test_char32_t(char32_t: number): number;\nexport function test_char8_t(char8_t: number): number;\nexport function test_class(class2: number): number;\nexport function test_co_await(co_await: number): number;\nexport function test_co_return(co_return: number): number;\nexport function test_co_yield(co_yield: number): number;\nexport function test_compl(compl: number): number;\nexport function test_concept(concept: number): number;\nexport function test_const_cast(const_cast: number): number;\nexport function test_consteval(consteval: number): number;\nexport function test_constexpr(constexpr: number): number;\nexport function test_constinit(constinit: number): number;\nexport function test_consuming(consuming: number): number;\nexport function test_contract_assert(contract_assert: number): number;\nexport function test_convenience(convenience: number): number;\nexport function test_debugger(debugger2: number): number;\nexport function test_decltype(decltype: number): number;\nexport function test_default(default2: number): number;\nexport function test_defer(defer: number): number;\nexport function test_deinit(deinit: number): number;\nexport function test_delete(delete2: number): number;\nexport function test_double(double2: number): number;\nexport function test_dynamic(dynamic: number): number;\nexport function test_dynamic_cast(dynamic_cast: number): number;\nexport function test_explicit(explicit: number): number;\nexport function test_export(export2: number): number;\nexport function test_extends(extends2: number): number;\nexport function test_extension(extension: number): number;\nexport function test_fallthrough(fallthrough: number): number;\nexport function test_fileprivate(fileprivate: number): number;\nexport function test_finally(finally2: number): number;\nexport function test_float(float2: number): number;\nexport function test_friend(friend: number): number;\nexport function test_func(func: number): number;\nexport function test_function(function2: number): number;\nexport function test_get(get: number): number;\nexport function test_goto(goto2: number): number;\nexport function test_guard(guard: number): number;\nexport function test_implements(implements2: number): number;\nexport function test_import(import2: number): number;\nexport function test_indirect(indirect: number): number;\nexport function test_infix(infix: number): number;\nexport function test_init(init: number): number;\nexport function test_inline(inline: number): number;\nexport function test_inout(inout: number): number;\nexport function test_instanceof(instanceof2: number): number;\nexport function test_int(int2: number): number;\nexport function test_interface(interface2: number): number;\nexport function test_internal(internal: number): number;\nexport function test_is(is: number): number;\nexport function test_lazy(lazy: number): number;\nexport function test_left(left: number): number;\nexport function test_long(long2: number): number;\nexport function test_mutable(mutable: number): number;\nexport function test_mutating(mutating: number): number;\nexport function test_namespace(namespace: number): number;\nexport function test_native(native2: number): number;\nexport function test_new(new2: number): number;\nexport function test_nil(nil: number): number;\nexport function test_noexcept(noexcept: number): number;\nexport function test_none(none: number): number;\nexport function test_nonisolated(nonisolated: number): number;\nexport function test_nonmutating(nonmutating: number): number;\nexport function test_not(not: number): number;\nexport function test_not_eq(not_eq: number): number;\nexport function test_null(null2: number): number;\nexport function test_nullptr(nullptr: number): number;\nexport function test_open(open: number): number;\nexport function test_operator(operator: number): number;\nexport function test_optional(optional: number): number;\nexport function test_or(or: number): number;\nexport function test_or_eq(or_eq: number): number;\nexport function test_package(package2: number): number;\nexport function test_postfix(postfix: number): number;\nexport function test_precedence(precedence: number): number;\nexport function test_precedencegroup(precedencegroup: number): number;\nexport function test_prefix(prefix: number): number;\nexport function test_private(private2: number): number;\nexport function test_protected(protected2: number): number;\nexport function test_protocol(protocol: number): number;\nexport function test_public(public2: number): number;\nexport function test_reflexpr(reflexpr: number): number;\nexport function test_register(register: number): number;\nexport function test_reinterpret_cast(reinterpret_cast: number): number;\nexport function test_repeat(repeat: number): number;\nexport function test_required(required: number): number;\nexport function test_requires(requires: number): number;\nexport function test_rethrows(rethrows: number): number;\nexport function test_right(right: number): number;\nexport function test_set(set: number): number;\nexport function test_short(short2: number): number;\nexport function test_signed(signed: number): number;\nexport function test_sizeof(sizeof: number): number;\nexport function test_some(some: number): number;\nexport function test_static_assert(static_assert: number): number;\nexport function test_static_cast(static_cast: number): number;\nexport function test_subscript(subscript: number): number;\nexport function test_switch(switch2: number): number;\nexport function test_synchronized(synchronized2: number): number;\nexport function test_template(template: number): number;\nexport function test_this(this2: number): number;\nexport function test_thread_local(thread_local: number): number;\nexport function test_throw(throw2: number): number;\nexport function test_throws(throws2: number): number;\nexport function test_transient(transient2: number): number;\nexport function test_typealias(typealias: number): number;\nexport function test_typedef(typedef: number): number;\nexport function test_typeid(typeid: number): number;\nexport function test_typename(typename: number): number;\nexport function test_undefined(undefined2: number): number;\nexport function test_union(union: number): number;\nexport function test_unowned(unowned: number): number;\nexport function test_unsigned(unsigned: number): number;\nexport function test_using(using: number): number;\nexport function test_var(var2: number): number;\nexport function test_void(void2: number): number;\nexport function test_volatile(volatile2: number): number;\nexport function test_wchar_t(wchar_t: number): number;\nexport function test_weak(weak: number): number;\nexport function test_with(with2: number): number;\nexport function test_xor(xor: number): number;\nexport function test_xor_eq(xor_eq: number): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_keyword_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function test_alignas(alignas) {\n    return _ffi_exports._ffi_fn_test_alignas(alignas);\n}\n\nexport function test_alignof(alignof) {\n    return _ffi_exports._ffi_fn_test_alignof(alignof);\n}\n\nexport function test_and(and) {\n    return _ffi_exports._ffi_fn_test_and(and);\n}\n\nexport function test_and_eq(and_eq) {\n    return _ffi_exports._ffi_fn_test_and_eq(and_eq);\n}\n\nexport function test_asm(asm) {\n    return _ffi_exports._ffi_fn_test_asm(asm);\n}\n\nexport function test_associatedtype(associatedtype) {\n    return _ffi_exports._ffi_fn_test_associatedtype(associatedtype);\n}\n\nexport function test_associativity(associativity) {\n    return _ffi_exports._ffi_fn_test_associativity(associativity);\n}\n\nexport function test_atomic_cancel(atomic_cancel) {\n    return _ffi_exports._ffi_fn_test_atomic_cancel(atomic_cancel);\n}\n\nexport function test_atomic_commit(atomic_commit) {\n    return _ffi_exports._ffi_fn_test_atomic_commit(atomic_commit);\n}\n\nexport function test_atomic_noexcept(atomic_noexcept) {\n    return _ffi_exports._ffi_fn_test_atomic_noexcept(atomic_noexcept);\n}\n\nexport function test_auto(auto) {\n    return _ffi_exports._ffi_fn_test_auto(auto);\n}\n\nexport function test_bitand(bitand) {\n    return _ffi_exports._ffi_fn_test_bitand(bitand);\n}\n\nexport function test_bitor(bitor) {\n    return _ffi_exports._ffi_fn_test_bitor(bitor);\n}\n\nexport function test_bool(bool) {\n    return _ffi_exports._ffi_fn_test_bool(bool);\n}\n\nexport function test_boolean(boolean2) {\n    return _ffi_exports._ffi_fn_test_boolean(boolean2);\n}\n\nexport function test_borrowing(borrowing) {\n    return _ffi_exports._ffi_fn_test_borrowing(borrowing);\n}\n\nexport function test_byte(byte2) {\n    return _ffi_exports._ffi_fn_test_byte(byte2);\n}\n\nexport function test_case(case2) {\n    return _ffi_exports._ffi_fn_test_case(case2);\n}\n\nexport function test_catch(catch2) {\n    return _ffi_exports._ffi_fn_test_catch(catch2);\n}\n\nexport function test_char(char2) {\n    return _ffi_exports._ffi_fn_test_char(char2);\n}\n\nexport function test_char16_t(char16_t) {\n    return _ffi_exports._ffi_fn_test_char16_t(char16_t);\n}\n\nexport function test_char32_t(char32_t) {\n    return _ffi_exports._ffi_fn_test_char32_t(char32_t);\n}\n\nexport function test_char8_t(char8_t) {\n    return _ffi_exports._ffi_fn_test_char8_t(char8_t);\n}\n\nexport function test_class(class2) {\n    return _ffi_exports._ffi_fn_test_class(class2);\n}\n\nexport function test_co_await(co_await) {\n    return _ffi_exports._ffi_fn_test_co_await(co_await);\n}\n\nexport function test_co_return(co_return) {\n    return _ffi_exports._ffi_fn_test_co_return(co_return);\n}\n\nexport function test_co_yield(co_yield) {\n    return _ffi_exports._ffi_fn_test_co_yield(co_yield);\n}\n\nexport function test_compl(compl) {\n    return _ffi_exports._ffi_fn_test_compl(compl);\n}\n\nexport function test_concept(concept) {\n    return _ffi_exports._ffi_fn_test_concept(concept);\n}\n\nexport function test_const_cast(const_cast) {\n    return _ffi_exports._ffi_fn_test_const_cast(const_cast);\n}\n\nexport function test_consteval(consteval) {\n    return _ffi_exports._ffi_fn_test_consteval(consteval);\n}\n\nexport function test_constexpr(constexpr) {\n    return _ffi_exports._ffi_fn_test_constexpr(constexpr);\n}\n\nexport function test_constinit(constinit) {\n    return _ffi_exports._ffi_fn_test_constinit(constinit);\n}\n\nexport function test_consuming(consuming) {\n    return _ffi_exports._ffi_fn_test_consuming(consuming);\n}\n\nexport function test_contract_assert(contract_assert) {\n    return _ffi_exports._ffi_fn_test_contract_assert(contract_assert);\n}\n\nexport function test_convenience(convenience) {\n    return _ffi_exports._ffi_fn_test_convenience(convenience);\n}\n\nexport function test_debugger(debugger2) {\n    return _ffi_exports._ffi_fn_test_debugger(debugger2);\n}\n\nexport function test_decltype(decltype) {\n    return _ffi_exports._ffi_fn_test_decltype(decltype);\n}\n\nexport function test_default(default2) {\n    return _ffi_exports._ffi_fn_test_default(default2);\n}\n\nexport function test_defer(defer) {\n    return _ffi_exports._ffi_fn_test_defer(defer);\n}\n\nexport function test_deinit(deinit) {\n    return _ffi_exports._ffi_fn_test_deinit(deinit);\n}\n\nexport function test_delete(delete2) {\n    return _ffi_exports._ffi_fn_test_delete(delete2);\n}\n\nexport function test_double(double2) {\n    return _ffi_exports._ffi_fn_test_double(double2);\n}\n\nexport function test_dynamic(dynamic) {\n    return _ffi_exports._ffi_fn_test_dynamic(dynamic);\n}\n\nexport function test_dynamic_cast(dynamic_cast) {\n    return _ffi_exports._ffi_fn_test_dynamic_cast(dynamic_cast);\n}\n\nexport function test_explicit(explicit) {\n    return _ffi_exports._ffi_fn_test_explicit(explicit);\n}\n\nexport function test_export(export2) {\n    return _ffi_exports._ffi_fn_test_export(export2);\n}\n\nexport function test_extends(extends2) {\n    return _ffi_exports._ffi_fn_test_extends(extends2);\n}\n\nexport function test_extension(extension) {\n    return _ffi_exports._ffi_fn_test_extension(extension);\n}\n\nexport function test_fallthrough(fallthrough) {\n    return _ffi_exports._ffi_fn_test_fallthrough(fallthrough);\n}\n\nexport function test_fileprivate(fileprivate) {\n    return _ffi_exports._ffi_fn_test_fileprivate(fileprivate);\n}\n\nexport function test_finally(finally2) {\n    return _ffi_exports._ffi_fn_test_finally(finally2);\n}\n\nexport function test_float(float2) {\n    return _ffi_exports._ffi_fn_test_float(float2);\n}\n\nexport function test_friend(friend) {\n    return _ffi_exports._ffi_fn_test_friend(friend);\n}\n\nexport function test_func(func) {\n    return _ffi_exports._ffi_fn_test_func(func);\n}\n\nexport function test_function(function2) {\n    return _ffi_exports._ffi_fn_test_function(function2);\n}\n\nexport function test_get(get) {\n    return _ffi_exports._ffi_fn_test_get(get);\n}\n\nexport function test_goto(goto2) {\n    return _ffi_exports._ffi_fn_test_goto(goto2);\n}\n\nexport function test_guard(guard) {\n    return _ffi_exports._ffi_fn_test_guard(guard);\n}\n\nexport function test_implements(implements2) {\n    return _ffi_exports._ffi_fn_test_implements(implements2);\n}\n\nexport function test_import(import2) {\n    return _ffi_exports._ffi_fn_test_import(import2);\n}\n\nexport function test_indirect(indirect) {\n    return _ffi_exports._ffi_fn_test_indirect(indirect);\n}\n\nexport function test_infix(infix) {\n    return _ffi_exports._ffi_fn_test_infix(infix);\n}\n\nexport function test_init(init) {\n    return _ffi_exports._ffi_fn_test_init(init);\n}\n\nexport function test_inline(inline) {\n    return _ffi_exports._ffi_fn_test_inline(inline);\n}\n\nexport function test_inout(inout) {\n    return _ffi_exports._ffi_fn_test_inout(inout);\n}\n\nexport function test_instanceof(instanceof2) {\n    return _ffi_exports._ffi_fn_test_instanceof(instanceof2);\n}\n\nexport function test_int(int2) {\n    return _ffi_exports._ffi_fn_test_int(int2);\n}\n\nexport function test_interface(interface2) {\n    return _ffi_exports._ffi_fn_test_interface(interface2);\n}\n\nexport function test_internal(internal) {\n    return _ffi_exports._ffi_fn_test_internal(internal);\n}\n\nexport function test_is(is) {\n    return _ffi_exports._ffi_fn_test_is(is);\n}\n\nexport function test_lazy(lazy) {\n    return _ffi_exports._ffi_fn_test_lazy(lazy);\n}\n\nexport function test_left(left) {\n    return _ffi_exports._ffi_fn_test_left(left);\n}\n\nexport function test_long(long2) {\n    return _ffi_exports._ffi_fn_test_long(long2);\n}\n\nexport function test_mutable(mutable) {\n    return _ffi_exports._ffi_fn_test_mutable(mutable);\n}\n\nexport function test_mutating(mutating) {\n    return _ffi_exports._ffi_fn_test_mutating(mutating);\n}\n\nexport function test_namespace(namespace) {\n    return _ffi_exports._ffi_fn_test_namespace(namespace);\n}\n\nexport function test_native(native2) {\n    return _ffi_exports._ffi_fn_test_native(native2);\n}\n\nexport function test_new(new2) {\n    return _ffi_exports._ffi_fn_test_new(new2);\n}\n\nexport function test_nil(nil) {\n    return _ffi_exports._ffi_fn_test_nil(nil);\n}\n\nexport function test_noexcept(noexcept) {\n    return _ffi_exports._ffi_fn_test_noexcept(noexcept);\n}\n\nexport function test_none(none) {\n    return _ffi_exports._ffi_fn_test_none(none);\n}\n\nexport function test_nonisolated(nonisolated) {\n    return _ffi_exports._ffi_fn_test_nonisolated(nonisolated);\n}\n\nexport function test_nonmutating(nonmutating) {\n    return _ffi_exports._ffi_fn_test_nonmutating(nonmutating);\n}\n\nexport function test_not(not) {\n    return _ffi_exports._ffi_fn_test_not(not);\n}\n\nexport function test_not_eq(not_eq) {\n    return _ffi_exports._ffi_fn_test_not_eq(not_eq);\n}\n\nexport function test_null(null2) {\n    return _ffi_exports._ffi_fn_test_null(null2);\n}\n\nexport function test_nullptr(nullptr) {\n    return _ffi_exports._ffi_fn_test_nullptr(nullptr);\n}\n\nexport function test_open(open) {\n    return _ffi_exports._ffi_fn_test_open(open);\n}\n\nexport function test_operator(operator) {\n    return _ffi_exports._ffi_fn_test_operator(operator);\n}\n\nexport function test_optional(optional) {\n    return _ffi_exports._ffi_fn_test_optional(optional);\n}\n\nexport function test_or(or) {\n    return _ffi_exports._ffi_fn_test_or(or);\n}\n\nexport function test_or_eq(or_eq) {\n    return _ffi_exports._ffi_fn_test_or_eq(or_eq);\n}\n\nexport function test_package(package2) {\n    return _ffi_exports._ffi_fn_test_package(package2);\n}\n\nexport function test_postfix(postfix) {\n    return _ffi_exports._ffi_fn_test_postfix(postfix);\n}\n\nexport function test_precedence(precedence) {\n    return _ffi_exports._ffi_fn_test_precedence(precedence);\n}\n\nexport function test_precedencegroup(precedencegroup) {\n    return _ffi_exports._ffi_fn_test_precedencegroup(precedencegroup);\n}\n\nexport function test_prefix(prefix) {\n    return _ffi_exports._ffi_fn_test_prefix(prefix);\n}\n\nexport function test_private(private2) {\n    return _ffi_exports._ffi_fn_test_private(private2);\n}\n\nexport function test_protected(protected2) {\n    return _ffi_exports._ffi_fn_test_protected(protected2);\n}\n\nexport function test_protocol(protocol) {\n    return _ffi_exports._ffi_fn_test_protocol(protocol);\n}\n\nexport function test_public(public2) {\n    return _ffi_exports._ffi_fn_test_public(public2);\n}\n\nexport function test_reflexpr(reflexpr) {\n    return _ffi_exports._ffi_fn_test_reflexpr(reflexpr);\n}\n\nexport function test_register(register) {\n    return _ffi_exports._ffi_fn_test_register(register);\n}\n\nexport function test_reinterpret_cast(reinterpret_cast) {\n    return _ffi_exports._ffi_fn_test_reinterpret_cast(reinterpret_cast);\n}\n\nexport function test_repeat(repeat) {\n    return _ffi_exports._ffi_fn_test_repeat(repeat);\n}\n\nexport function test_required(required) {\n    return _ffi_exports._ffi_fn_test_required(required);\n}\n\nexport function test_requires(requires) {\n    return _ffi_exports._ffi_fn_test_requires(requires);\n}\n\nexport function test_rethrows(rethrows) {\n    return _ffi_exports._ffi_fn_test_rethrows(rethrows);\n}\n\nexport function test_right(right) {\n    return _ffi_exports._ffi_fn_test_right(right);\n}\n\nexport function test_set(set) {\n    return _ffi_exports._ffi_fn_test_set(set);\n}\n\nexport function test_short(short2) {\n    return _ffi_exports._ffi_fn_test_short(short2);\n}\n\nexport function test_signed(signed) {\n    return _ffi_exports._ffi_fn_test_signed(signed);\n}\n\nexport function test_sizeof(sizeof) {\n    return _ffi_exports._ffi_fn_test_sizeof(sizeof);\n}\n\nexport function test_some(some) {\n    return _ffi_exports._ffi_fn_test_some(some);\n}\n\nexport function test_static_assert(static_assert) {\n    return _ffi_exports._ffi_fn_test_static_assert(static_assert);\n}\n\nexport function test_static_cast(static_cast) {\n    return _ffi_exports._ffi_fn_test_static_cast(static_cast);\n}\n\nexport function test_subscript(subscript) {\n    return _ffi_exports._ffi_fn_test_subscript(subscript);\n}\n\nexport function test_switch(switch2) {\n    return _ffi_exports._ffi_fn_test_switch(switch2);\n}\n\nexport function test_synchronized(synchronized2) {\n    return _ffi_exports._ffi_fn_test_synchronized(synchronized2);\n}\n\nexport function test_template(template) {\n    return _ffi_exports._ffi_fn_test_template(template);\n}\n\nexport function test_this(this2) {\n    return _ffi_exports._ffi_fn_test_this(this2);\n}\n\nexport function test_thread_local(thread_local) {\n    return _ffi_exports._ffi_fn_test_thread_local(thread_local);\n}\n\nexport function test_throw(throw2) {\n    return _ffi_exports._ffi_fn_test_throw(throw2);\n}\n\nexport function test_throws(throws2) {\n    return _ffi_exports._ffi_fn_test_throws(throws2);\n}\n\nexport function test_transient(transient2) {\n    return _ffi_exports._ffi_fn_test_transient(transient2);\n}\n\nexport function test_typealias(typealias) {\n    return _ffi_exports._ffi_fn_test_typealias(typealias);\n}\n\nexport function test_typedef(typedef) {\n    return _ffi_exports._ffi_fn_test_typedef(typedef);\n}\n\nexport function test_typeid(typeid) {\n    return _ffi_exports._ffi_fn_test_typeid(typeid);\n}\n\nexport function test_typename(typename) {\n    return _ffi_exports._ffi_fn_test_typename(typename);\n}\n\nexport function test_undefined(undefined2) {\n    return _ffi_exports._ffi_fn_test_undefined(undefined2);\n}\n\nexport function test_union(union) {\n    return _ffi_exports._ffi_fn_test_union(union);\n}\n\nexport function test_unowned(unowned) {\n    return _ffi_exports._ffi_fn_test_unowned(unowned);\n}\n\nexport function test_unsigned(unsigned) {\n    return _ffi_exports._ffi_fn_test_unsigned(unsigned);\n}\n\nexport function test_using(using) {\n    return _ffi_exports._ffi_fn_test_using(using);\n}\n\nexport function test_var(var2) {\n    return _ffi_exports._ffi_fn_test_var(var2);\n}\n\nexport function test_void(void2) {\n    return _ffi_exports._ffi_fn_test_void(void2);\n}\n\nexport function test_volatile(volatile2) {\n    return _ffi_exports._ffi_fn_test_volatile(volatile2);\n}\n\nexport function test_wchar_t(wchar_t) {\n    return _ffi_exports._ffi_fn_test_wchar_t(wchar_t);\n}\n\nexport function test_weak(weak) {\n    return _ffi_exports._ffi_fn_test_weak(weak);\n}\n\nexport function test_with(with2) {\n    return _ffi_exports._ffi_fn_test_with(with2);\n}\n\nexport function test_xor(xor) {\n    return _ffi_exports._ffi_fn_test_xor(xor);\n}\n\nexport function test_xor_eq(xor_eq) {\n    return _ffi_exports._ffi_fn_test_xor_eq(xor_eq);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_keyword_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function test_alignas(alignas: number): number {\n    return _ffi_exports._ffi_fn_test_alignas(alignas);\n}\n\nexport function test_alignof(alignof: number): number {\n    return _ffi_exports._ffi_fn_test_alignof(alignof);\n}\n\nexport function test_and(and: number): number {\n    return _ffi_exports._ffi_fn_test_and(and);\n}\n\nexport function test_and_eq(and_eq: number): number {\n    return _ffi_exports._ffi_fn_test_and_eq(and_eq);\n}\n\nexport function test_asm(asm: number): number {\n    return _ffi_exports._ffi_fn_test_asm(asm);\n}\n\nexport function test_associatedtype(associatedtype: number): number {\n    return _ffi_exports._ffi_fn_test_associatedtype(associatedtype);\n}\n\nexport function test_associativity(associativity: number): number {\n    return _ffi_exports._ffi_fn_test_associativity(associativity);\n}\n\nexport function test_atomic_cancel(atomic_cancel: number): number {\n    return _ffi_exports._ffi_fn_test_atomic_cancel(atomic_cancel);\n}\n\nexport function test_atomic_commit(atomic_commit: number): number {\n    return _ffi_exports._ffi_fn_test_atomic_commit(atomic_commit);\n}\n\nexport function test_atomic_noexcept(atomic_noexcept: number): number {\n    return _ffi_exports._ffi_fn_test_atomic_noexcept(atomic_noexcept);\n}\n\nexport function test_auto(auto: number): number {\n    return _ffi_exports._ffi_fn_test_auto(auto);\n}\n\nexport function test_bitand(bitand: number): number {\n    return _ffi_exports._ffi_fn_test_bitand(bitand);\n}\n\nexport function test_bitor(bitor: number): number {\n    return _ffi_exports._ffi_fn_test_bitor(bitor);\n}\n\nexport function test_bool(bool: number): number {\n    return _ffi_exports._ffi_fn_test_bool(bool);\n}\n\nexport function test_boolean(boolean2: number): number {\n    return _ffi_exports._ffi_fn_test_boolean(boolean2);\n}\n\nexport function test_borrowing(borrowing: number): number {\n    return _ffi_exports._ffi_fn_test_borrowing(borrowing);\n}\n\nexport function test_byte(byte2: number): number {\n    return _ffi_exports._ffi_fn_test_byte(byte2);\n}\n\nexport function test_case(case2: number): number {\n    return _ffi_exports._ffi_fn_test_case(case2);\n}\n\nexport function test_catch(catch2: number): number {\n    return _ffi_exports._ffi_fn_test_catch(catch2);\n}\n\nexport function test_char(char2: number): number {\n    return _ffi_exports._ffi_fn_test_char(char2);\n}\n\nexport function test_char16_t(char16_t: number): number {\n    return _ffi_exports._ffi_fn_test_char16_t(char16_t);\n}\n\nexport function test_char32_t(char32_t: number): number {\n    return _ffi_exports._ffi_fn_test_char32_t(char32_t);\n}\n\nexport function test_char8_t(char8_t: number): number {\n    return _ffi_exports._ffi_fn_test_char8_t(char8_t);\n}\n\nexport function test_class(class2: number): number {\n    return _ffi_exports._ffi_fn_test_class(class2);\n}\n\nexport function test_co_await(co_await: number): number {\n    return _ffi_exports._ffi_fn_test_co_await(co_await);\n}\n\nexport function test_co_return(co_return: number): number {\n    return _ffi_exports._ffi_fn_test_co_return(co_return);\n}\n\nexport function test_co_yield(co_yield: number): number {\n    return _ffi_exports._ffi_fn_test_co_yield(co_yield);\n}\n\nexport function test_compl(compl: number): number {\n    return _ffi_exports._ffi_fn_test_compl(compl);\n}\n\nexport function test_concept(concept: number): number {\n    return _ffi_exports._ffi_fn_test_concept(concept);\n}\n\nexport function test_const_cast(const_cast: number): number {\n    return _ffi_exports._ffi_fn_test_const_cast(const_cast);\n}\n\nexport function test_consteval(consteval: number): number {\n    return _ffi_exports._ffi_fn_test_consteval(consteval);\n}\n\nexport function test_constexpr(constexpr: number): number {\n    return _ffi_exports._ffi_fn_test_constexpr(constexpr);\n}\n\nexport function test_constinit(constinit: number): number {\n    return _ffi_exports._ffi_fn_test_constinit(constinit);\n}\n\nexport function test_consuming(consuming: number): number {\n    return _ffi_exports._ffi_fn_test_consuming(consuming);\n}\n\nexport function test_contract_assert(contract_assert: number): number {\n    return _ffi_exports._ffi_fn_test_contract_assert(contract_assert);\n}\n\nexport function test_convenience(convenience: number): number {\n    return _ffi_exports._ffi_fn_test_convenience(convenience);\n}\n\nexport function test_debugger(debugger2: number): number {\n    return _ffi_exports._ffi_fn_test_debugger(debugger2);\n}\n\nexport function test_decltype(decltype: number): number {\n    return _ffi_exports._ffi_fn_test_decltype(decltype);\n}\n\nexport function test_default(default2: number): number {\n    return _ffi_exports._ffi_fn_test_default(default2);\n}\n\nexport function test_defer(defer: number): number {\n    return _ffi_exports._ffi_fn_test_defer(defer);\n}\n\nexport function test_deinit(deinit: number): number {\n    return _ffi_exports._ffi_fn_test_deinit(deinit);\n}\n\nexport function test_delete(delete2: number): number {\n    return _ffi_exports._ffi_fn_test_delete(delete2);\n}\n\nexport function test_double(double2: number): number {\n    return _ffi_exports._ffi_fn_test_double(double2);\n}\n\nexport function test_dynamic(dynamic: number): number {\n    return _ffi_exports._ffi_fn_test_dynamic(dynamic);\n}\n\nexport function test_dynamic_cast(dynamic_cast: number): number {\n    return _ffi_exports._ffi_fn_test_dynamic_cast(dynamic_cast);\n}\n\nexport function test_explicit(explicit: number): number {\n    return _ffi_exports._ffi_fn_test_explicit(explicit);\n}\n\nexport function test_export(export2: number): number {\n    return _ffi_exports._ffi_fn_test_export(export2);\n}\n\nexport function test_extends(extends2: number): number {\n    return _ffi_exports._ffi_fn_test_extends(extends2);\n}\n\nexport function test_extension(extension: number): number {\n    return _ffi_exports._ffi_fn_test_extension(extension);\n}\n\nexport function test_fallthrough(fallthrough: number): number {\n    return _ffi_exports._ffi_fn_test_fallthrough(fallthrough);\n}\n\nexport function test_fileprivate(fileprivate: number): number {\n    return _ffi_exports._ffi_fn_test_fileprivate(fileprivate);\n}\n\nexport function test_finally(finally2: number): number {\n    return _ffi_exports._ffi_fn_test_finally(finally2);\n}\n\nexport function test_float(float2: number): number {\n    return _ffi_exports._ffi_fn_test_float(float2);\n}\n\nexport function test_friend(friend: number): number {\n    return _ffi_exports._ffi_fn_test_friend(friend);\n}\n\nexport function test_func(func: number): number {\n    return _ffi_exports._ffi_fn_test_func(func);\n}\n\nexport function test_function(function2: number): number {\n    return _ffi_exports._ffi_fn_test_function(function2);\n}\n\nexport function test_get(get: number): number {\n    return _ffi_exports._ffi_fn_test_get(get);\n}\n\nexport function test_goto(goto2: number): number {\n    return _ffi_exports._ffi_fn_test_goto(goto2);\n}\n\nexport function test_guard(guard: number): number {\n    return _ffi_exports._ffi_fn_test_guard(guard);\n}\n\nexport function test_implements(implements2: number): number {\n    return _ffi_exports._ffi_fn_test_implements(implements2);\n}\n\nexport function test_import(import2: number): number {\n    return _ffi_exports._ffi_fn_test_import(import2);\n}\n\nexport function test_indirect(indirect: number): number {\n    return _ffi_exports._ffi_fn_test_indirect(indirect);\n}\n\nexport function test_infix(infix: number): number {\n    return _ffi_exports._ffi_fn_test_infix(infix);\n}\n\nexport function test_init(init: number): number {\n    return _ffi_exports._ffi_fn_test_init(init);\n}\n\nexport function test_inline(inline: number): number {\n    return _ffi_exports._ffi_fn_test_inline(inline);\n}\n\nexport function test_inout(inout: number): number {\n    return _ffi_exports._ffi_fn_test_inout(inout);\n}\n\nexport function test_instanceof(instanceof2: number): number {\n    return _ffi_exports._ffi_fn_test_instanceof(instanceof2);\n}\n\nexport function test_int(int2: number): number {\n    return _ffi_exports._ffi_fn_test_int(int2);\n}\n\nexport function test_interface(interface2: number): number {\n    return _ffi_exports._ffi_fn_test_interface(interface2);\n}\n\nexport function test_internal(internal: number): number {\n    return _ffi_exports._ffi_fn_test_internal(internal);\n}\n\nexport function test_is(is: number): number {\n    return _ffi_exports._ffi_fn_test_is(is);\n}\n\nexport function test_lazy(lazy: number): number {\n    return _ffi_exports._ffi_fn_test_lazy(lazy);\n}\n\nexport function test_left(left: number): number {\n    return _ffi_exports._ffi_fn_test_left(left);\n}\n\nexport function test_long(long2: number): number {\n    return _ffi_exports._ffi_fn_test_long(long2);\n}\n\nexport function test_mutable(mutable: number): number {\n    return _ffi_exports._ffi_fn_test_mutable(mutable);\n}\n\nexport function test_mutating(mutating: number): number {\n    return _ffi_exports._ffi_fn_test_mutating(mutating);\n}\n\nexport function test_namespace(namespace: number): number {\n    return _ffi_exports._ffi_fn_test_namespace(namespace);\n}\n\nexport function test_native(native2: number): number {\n    return _ffi_exports._ffi_fn_test_native(native2);\n}\n\nexport function test_new(new2: number): number {\n    return _ffi_exports._ffi_fn_test_new(new2);\n}\n\nexport function test_nil(nil: number): number {\n    return _ffi_exports._ffi_fn_test_nil(nil);\n}\n\nexport function test_noexcept(noexcept: number): number {\n    return _ffi_exports._ffi_fn_test_noexcept(noexcept);\n}\n\nexport function test_none(none: number): number {\n    return _ffi_exports._ffi_fn_test_none(none);\n}\n\nexport function test_nonisolated(nonisolated: number): number {\n    return _ffi_exports._ffi_fn_test_nonisolated(nonisolated);\n}\n\nexport function test_nonmutating(nonmutating: number): number {\n    return _ffi_exports._ffi_fn_test_nonmutating(nonmutating);\n}\n\nexport function test_not(not: number): number {\n    return _ffi_exports._ffi_fn_test_not(not);\n}\n\nexport function test_not_eq(not_eq: number): number {\n    return _ffi_exports._ffi_fn_test_not_eq(not_eq);\n}\n\nexport function test_null(null2: number): number {\n    return _ffi_exports._ffi_fn_test_null(null2);\n}\n\nexport function test_nullptr(nullptr: number): number {\n    return _ffi_exports._ffi_fn_test_nullptr(nullptr);\n}\n\nexport function test_open(open: number): number {\n    return _ffi_exports._ffi_fn_test_open(open);\n}\n\nexport function test_operator(operator: number): number {\n    return _ffi_exports._ffi_fn_test_operator(operator);\n}\n\nexport function test_optional(optional: number): number {\n    return _ffi_exports._ffi_fn_test_optional(optional);\n}\n\nexport function test_or(or: number): number {\n    return _ffi_exports._ffi_fn_test_or(or);\n}\n\nexport function test_or_eq(or_eq: number): number {\n    return _ffi_exports._ffi_fn_test_or_eq(or_eq);\n}\n\nexport function test_package(package2: number): number {\n    return _ffi_exports._ffi_fn_test_package(package2);\n}\n\nexport function test_postfix(postfix: number): number {\n    return _ffi_exports._ffi_fn_test_postfix(postfix);\n}\n\nexport function test_precedence(precedence: number): number {\n    return _ffi_exports._ffi_fn_test_precedence(precedence);\n}\n\nexport function test_precedencegroup(precedencegroup: number): number {\n    return _ffi_exports._ffi_fn_test_precedencegroup(precedencegroup);\n}\n\nexport function test_prefix(prefix: number): number {\n    return _ffi_exports._ffi_fn_test_prefix(prefix);\n}\n\nexport function test_private(private2: number): number {\n    return _ffi_exports._ffi_fn_test_private(private2);\n}\n\nexport function test_protected(protected2: number): number {\n    return _ffi_exports._ffi_fn_test_protected(protected2);\n}\n\nexport function test_protocol(protocol: number): number {\n    return _ffi_exports._ffi_fn_test_protocol(protocol);\n}\n\nexport function test_public(public2: number): number {\n    return _ffi_exports._ffi_fn_test_public(public2);\n}\n\nexport function test_reflexpr(reflexpr: number): number {\n    return _ffi_exports._ffi_fn_test_reflexpr(reflexpr);\n}\n\nexport function test_register(register: number): number {\n    return _ffi_exports._ffi_fn_test_register(register);\n}\n\nexport function test_reinterpret_cast(reinterpret_cast: number): number {\n    return _ffi_exports._ffi_fn_test_reinterpret_cast(reinterpret_cast);\n}\n\nexport function test_repeat(repeat: number): number {\n    return _ffi_exports._ffi_fn_test_repeat(repeat);\n}\n\nexport function test_required(required: number): number {\n    return _ffi_exports._ffi_fn_test_required(required);\n}\n\nexport function test_requires(requires: number): number {\n    return _ffi_exports._ffi_fn_test_requires(requires);\n}\n\nexport function test_rethrows(rethrows: number): number {\n    return _ffi_exports._ffi_fn_test_rethrows(rethrows);\n}\n\nexport function test_right(right: number): number {\n    return _ffi_exports._ffi_fn_test_right(right);\n}\n\nexport function test_set(set: number): number {\n    return _ffi_exports._ffi_fn_test_set(set);\n}\n\nexport function test_short(short2: number): number {\n    return _ffi_exports._ffi_fn_test_short(short2);\n}\n\nexport function test_signed(signed: number): number {\n    return _ffi_exports._ffi_fn_test_signed(signed);\n}\n\nexport function test_sizeof(sizeof: number): number {\n    return _ffi_exports._ffi_fn_test_sizeof(sizeof);\n}\n\nexport function test_some(some: number): number {\n    return _ffi_exports._ffi_fn_test_some(some);\n}\n\nexport function test_static_assert(static_assert: number): number {\n    return _ffi_exports._ffi_fn_test_static_assert(static_assert);\n}\n\nexport function test_static_cast(static_cast: number): number {\n    return _ffi_exports._ffi_fn_test_static_cast(static_cast);\n}\n\nexport function test_subscript(subscript: number): number {\n    return _ffi_exports._ffi_fn_test_subscript(subscript);\n}\n\nexport function test_switch(switch2: number): number {\n    return _ffi_exports._ffi_fn_test_switch(switch2);\n}\n\nexport function test_synchronized(synchronized2: number): number {\n    return _ffi_exports._ffi_fn_test_synchronized(synchronized2);\n}\n\nexport function test_template(template: number): number {\n    return _ffi_exports._ffi_fn_test_template(template);\n}\n\nexport function test_this(this2: number): number {\n    return _ffi_exports._ffi_fn_test_this(this2);\n}\n\nexport function test_thread_local(thread_local: number): number {\n    return _ffi_exports._ffi_fn_test_thread_local(thread_local);\n}\n\nexport function test_throw(throw2: number): number {\n    return _ffi_exports._ffi_fn_test_throw(throw2);\n}\n\nexport function test_throws(throws2: number): number {\n    return _ffi_exports._ffi_fn_test_throws(throws2);\n}\n\nexport function test_transient(transient2: number): number {\n    return _ffi_exports._ffi_fn_test_transient(transient2);\n}\n\nexport function test_typealias(typealias: number): number {\n    return _ffi_exports._ffi_fn_test_typealias(typealias);\n}\n\nexport function test_typedef(typedef: number): number {\n    return _ffi_exports._ffi_fn_test_typedef(typedef);\n}\n\nexport function test_typeid(typeid: number): number {\n    return _ffi_exports._ffi_fn_test_typeid(typeid);\n}\n\nexport function test_typename(typename: number): number {\n    return _ffi_exports._ffi_fn_test_typename(typename);\n}\n\nexport function test_undefined(undefined2: number): number {\n    return _ffi_exports._ffi_fn_test_undefined(undefined2);\n}\n\nexport function test_union(union: number): number {\n    return _ffi_exports._ffi_fn_test_union(union);\n}\n\nexport function test_unowned(unowned: number): number {\n    return _ffi_exports._ffi_fn_test_unowned(unowned);\n}\n\nexport function test_unsigned(unsigned: number): number {\n    return _ffi_exports._ffi_fn_test_unsigned(unsigned);\n}\n\nexport function test_using(using: number): number {\n    return _ffi_exports._ffi_fn_test_using(using);\n}\n\nexport function test_var(var2: number): number {\n    return _ffi_exports._ffi_fn_test_var(var2);\n}\n\nexport function test_void(void2: number): number {\n    return _ffi_exports._ffi_fn_test_void(void2);\n}\n\nexport function test_volatile(volatile2: number): number {\n    return _ffi_exports._ffi_fn_test_volatile(volatile2);\n}\n\nexport function test_wchar_t(wchar_t: number): number {\n    return _ffi_exports._ffi_fn_test_wchar_t(wchar_t);\n}\n\nexport function test_weak(weak: number): number {\n    return _ffi_exports._ffi_fn_test_weak(weak);\n}\n\nexport function test_with(with2: number): number {\n    return _ffi_exports._ffi_fn_test_with(with2);\n}\n\nexport function test_xor(xor: number): number {\n    return _ffi_exports._ffi_fn_test_xor(xor);\n}\n\nexport function test_xor_eq(xor_eq: number): number {\n    return _ffi_exports._ffi_fn_test_xor_eq(xor_eq);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_test_alignas: (alignas: number) => number,\n    _ffi_fn_test_alignof: (alignof: number) => number,\n    _ffi_fn_test_and: (and: number) => number,\n    _ffi_fn_test_and_eq: (and_eq: number) => number,\n    _ffi_fn_test_asm: (asm: number) => number,\n    _ffi_fn_test_associatedtype: (associatedtype: number) => number,\n    _ffi_fn_test_associativity: (associativity: number) => number,\n    _ffi_fn_test_atomic_cancel: (atomic_cancel: number) => number,\n    _ffi_fn_test_atomic_commit: (atomic_commit: number) => number,\n    _ffi_fn_test_atomic_noexcept: (atomic_noexcept: number) => number,\n    _ffi_fn_test_auto: (auto: number) => number,\n    _ffi_fn_test_bitand: (bitand: number) => number,\n    _ffi_fn_test_bitor: (bitor: number) => number,\n    _ffi_fn_test_bool: (bool: number) => number,\n    _ffi_fn_test_boolean: (boolean2: number) => number,\n    _ffi_fn_test_borrowing: (borrowing: number) => number,\n    _ffi_fn_test_byte: (byte2: number) => number,\n    _ffi_fn_test_case: (case2: number) => number,\n    _ffi_fn_test_catch: (catch2: number) => number,\n    _ffi_fn_test_char: (char2: number) => number,\n    _ffi_fn_test_char16_t: (char16_t: number) => number,\n    _ffi_fn_test_char32_t: (char32_t: number) => number,\n    _ffi_fn_test_char8_t: (char8_t: number) => number,\n    _ffi_fn_test_class: (class2: number) => number,\n    _ffi_fn_test_co_await: (co_await: number) => number,\n    _ffi_fn_test_co_return: (co_return: number) => number,\n    _ffi_fn_test_co_yield: (co_yield: number) => number,\n    _ffi_fn_test_compl: (compl: number) => number,\n    _ffi_fn_test_concept: (concept: number) => number,\n    _ffi_fn_test_const_cast: (const_cast: number) => number,\n    _ffi_fn_test_consteval: (consteval: number) => number,\n    _ffi_fn_test_constexpr: (constexpr: number) => number,\n    _ffi_fn_test_constinit: (constinit: number) => number,\n    _ffi_fn_test_consuming: (consuming: number) => number,\n    _ffi_fn_test_contract_assert: (contract_assert: number) => number,\n    _ffi_fn_test_convenience: (convenience: number) => number,\n    _ffi_fn_test_debugger: (debugger2: number) => number,\n    _ffi_fn_test_decltype: (decltype: number) => number,\n    _ffi_fn_test_default: (default2: number) => number,\n    _ffi_fn_test_defer: (defer: number) => number,\n    _ffi_fn_test_deinit: (deinit: number) => number,\n    _ffi_fn_test_delete: (delete2: number) => number,\n    _ffi_fn_test_double: (double2: number) => number,\n    _ffi_fn_test_dynamic: (dynamic: number) => number,\n    _ffi_fn_test_dynamic_cast: (dynamic_cast: number) => number,\n    _ffi_fn_test_explicit: (explicit: number) => number,\n    _ffi_fn_test_export: (export2: number) => number,\n    _ffi_fn_test_extends: (extends2: number) => number,\n    _ffi_fn_test_extension: (extension: number) => number,\n    _ffi_fn_test_fallthrough: (fallthrough: number) => number,\n    _ffi_fn_test_fileprivate: (fileprivate: number) => number,\n    _ffi_fn_test_finally: (finally2: number) => number,\n    _ffi_fn_test_float: (float2: number) => number,\n    _ffi_fn_test_friend: (friend: number) => number,\n    _ffi_fn_test_func: (func: number) => number,\n    _ffi_fn_test_function: (function2: number) => number,\n    _ffi_fn_test_get: (get: number) => number,\n    _ffi_fn_test_goto: (goto2: number) => number,\n    _ffi_fn_test_guard: (guard: number) => number,\n    _ffi_fn_test_implements: (implements2: number) => number,\n    _ffi_fn_test_import: (import2: number) => number,\n    _ffi_fn_test_indirect: (indirect: number) => number,\n    _ffi_fn_test_infix: (infix: number) => number,\n    _ffi_fn_test_init: (init: number) => number,\n    _ffi_fn_test_inline: (inline: number) => number,\n    _ffi_fn_test_inout: (inout: number) => number,\n    _ffi_fn_test_instanceof: (instanceof2: number) => number,\n    _ffi_fn_test_int: (int2: number) => number,\n    _ffi_fn_test_interface: (interface2: number) => number,\n    _ffi_fn_test_internal: (internal: number) => number,\n    _ffi_fn_test_is: (is: number) => number,\n    _ffi_fn_test_lazy: (lazy: number) => number,\n    _ffi_fn_test_left: (left: number) => number,\n    _ffi_fn_test_long: (long2: number) => number,\n    _ffi_fn_test_mutable: (mutable: number) => number,\n    _ffi_fn_test_mutating: (mutating: number) => number,\n    _ffi_fn_test_namespace: (namespace: number) => number,\n    _ffi_fn_test_native: (native2: number) => number,\n    _ffi_fn_test_new: (new2: number) => number,\n    _ffi_fn_test_nil: (nil: number) => number,\n    _ffi_fn_test_noexcept: (noexcept: number) => number,\n    _ffi_fn_test_none: (none: number) => number,\n    _ffi_fn_test_nonisolated: (nonisolated: number) => number,\n    _ffi_fn_test_nonmutating: (nonmutating: number) => number,\n    _ffi_fn_test_not: (not: number) => number,\n    _ffi_fn_test_not_eq: (not_eq: number) => number,\n    _ffi_fn_test_null: (null2: number) => number,\n    _ffi_fn_test_nullptr: (nullptr: number) => number,\n    _ffi_fn_test_open: (open: number) => number,\n    _ffi_fn_test_operator: (operator: number) => number,\n    _ffi_fn_test_optional: (optional: number) => number,\n    _ffi_fn_test_or: (or: number) => number,\n    _ffi_fn_test_or_eq: (or_eq: number) => number,\n    _ffi_fn_test_package: (package2: number) => number,\n    _ffi_fn_test_postfix: (postfix: number) => number,\n    _ffi_fn_test_precedence: (precedence: number) => number,\n    _ffi_fn_test_precedencegroup: (precedencegroup: number) => number,\n    _ffi_fn_test_prefix: (prefix: number) => number,\n    _ffi_fn_test_private: (private2: number) => number,\n    _ffi_fn_test_protected: (protected2: number) => number,\n    _ffi_fn_test_protocol: (protocol: number) => number,\n    _ffi_fn_test_public: (public2: number) => number,\n    _ffi_fn_test_reflexpr: (reflexpr: number) => number,\n    _ffi_fn_test_register: (register: number) => number,\n    _ffi_fn_test_reinterpret_cast: (reinterpret_cast: number) => number,\n    _ffi_fn_test_repeat: (repeat: number) => number,\n    _ffi_fn_test_required: (required: number) => number,\n    _ffi_fn_test_requires: (requires: number) => number,\n    _ffi_fn_test_rethrows: (rethrows: number) => number,\n    _ffi_fn_test_right: (right: number) => number,\n    _ffi_fn_test_set: (set: number) => number,\n    _ffi_fn_test_short: (short2: number) => number,\n    _ffi_fn_test_signed: (signed: number) => number,\n    _ffi_fn_test_sizeof: (sizeof: number) => number,\n    _ffi_fn_test_some: (some: number) => number,\n    _ffi_fn_test_static_assert: (static_assert: number) => number,\n    _ffi_fn_test_static_cast: (static_cast: number) => number,\n    _ffi_fn_test_subscript: (subscript: number) => number,\n    _ffi_fn_test_switch: (switch2: number) => number,\n    _ffi_fn_test_synchronized: (synchronized2: number) => number,\n    _ffi_fn_test_template: (template: number) => number,\n    _ffi_fn_test_this: (this2: number) => number,\n    _ffi_fn_test_thread_local: (thread_local: number) => number,\n    _ffi_fn_test_throw: (throw2: number) => number,\n    _ffi_fn_test_throws: (throws2: number) => number,\n    _ffi_fn_test_transient: (transient2: number) => number,\n    _ffi_fn_test_typealias: (typealias: number) => number,\n    _ffi_fn_test_typedef: (typedef: number) => number,\n    _ffi_fn_test_typeid: (typeid: number) => number,\n    _ffi_fn_test_typename: (typename: number) => number,\n    _ffi_fn_test_undefined: (undefined2: number) => number,\n    _ffi_fn_test_union: (union: number) => number,\n    _ffi_fn_test_unowned: (unowned: number) => number,\n    _ffi_fn_test_unsigned: (unsigned: number) => number,\n    _ffi_fn_test_using: (using: number) => number,\n    _ffi_fn_test_var: (var2: number) => number,\n    _ffi_fn_test_void: (void2: number) => number,\n    _ffi_fn_test_volatile: (volatile2: number) => number,\n    _ffi_fn_test_wchar_t: (wchar_t: number) => number,\n    _ffi_fn_test_weak: (weak: number) => number,\n    _ffi_fn_test_with: (with2: number) => number,\n    _ffi_fn_test_xor: (xor: number) => number,\n    _ffi_fn_test_xor_eq: (xor_eq: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_keyword_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_alignas(alignas: i32) -> i32 {\n    test_alignas(alignas)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_alignof(alignof: i32) -> i32 {\n    test_alignof(alignof)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_and(and: i32) -> i32 {\n    test_and(and)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_and_eq(and_eq: i32) -> i32 {\n    test_and_eq(and_eq)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_asm(asm: i32) -> i32 {\n    test_asm(asm)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_associatedtype(associatedtype: i32) -> i32 {\n    test_associatedtype(associatedtype)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_associativity(associativity: i32) -> i32 {\n    test_associativity(associativity)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_atomic_cancel(atomic_cancel: i32) -> i32 {\n    test_atomic_cancel(atomic_cancel)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_atomic_commit(atomic_commit: i32) -> i32 {\n    test_atomic_commit(atomic_commit)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_atomic_noexcept(atomic_noexcept: i32) -> i32 {\n    test_atomic_noexcept(atomic_noexcept)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_auto(auto: i32) -> i32 {\n    test_auto(auto)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_bitand(bitand: i32) -> i32 {\n    test_bitand(bitand)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_bitor(bitor: i32) -> i32 {\n    test_bitor(bitor)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_bool(bool: i32) -> i32 {\n    test_bool(bool)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_boolean(boolean2: i32) -> i32 {\n    test_boolean(boolean2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_borrowing(borrowing: i32) -> i32 {\n    test_borrowing(borrowing)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_byte(byte2: i32) -> i32 {\n    test_byte(byte2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_case(case2: i32) -> i32 {\n    test_case(case2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_catch(catch2: i32) -> i32 {\n    test_catch(catch2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_char(char2: i32) -> i32 {\n    test_char(char2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_char16_t(char16_t: i32) -> i32 {\n    test_char16_t(char16_t)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_char32_t(char32_t: i32) -> i32 {\n    test_char32_t(char32_t)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_char8_t(char8_t: i32) -> i32 {\n    test_char8_t(char8_t)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_class(class2: i32) -> i32 {\n    test_class(class2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_co_await(co_await: i32) -> i32 {\n    test_co_await(co_await)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_co_return(co_return: i32) -> i32 {\n    test_co_return(co_return)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_co_yield(co_yield: i32) -> i32 {\n    test_co_yield(co_yield)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_compl(compl: i32) -> i32 {\n    test_compl(compl)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_concept(concept: i32) -> i32 {\n    test_concept(concept)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_const_cast(const_cast: i32) -> i32 {\n    test_const_cast(const_cast)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_consteval(consteval: i32) -> i32 {\n    test_consteval(consteval)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_constexpr(constexpr: i32) -> i32 {\n    test_constexpr(constexpr)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_constinit(constinit: i32) -> i32 {\n    test_constinit(constinit)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_consuming(consuming: i32) -> i32 {\n    test_consuming(consuming)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_contract_assert(contract_assert: i32) -> i32 {\n    test_contract_assert(contract_assert)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_convenience(convenience: i32) -> i32 {\n    test_convenience(convenience)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_debugger(debugger2: i32) -> i32 {\n    test_debugger(debugger2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_decltype(decltype: i32) -> i32 {\n    test_decltype(decltype)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_default(default2: i32) -> i32 {\n    test_default(default2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_defer(defer: i32) -> i32 {\n    test_defer(defer)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_deinit(deinit: i32) -> i32 {\n    test_deinit(deinit)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_delete(delete2: i32) -> i32 {\n    test_delete(delete2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_double(double2: i32) -> i32 {\n    test_double(double2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_dynamic(dynamic: i32) -> i32 {\n    test_dynamic(dynamic)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_dynamic_cast(dynamic_cast: i32) -> i32 {\n    test_dynamic_cast(dynamic_cast)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_explicit(explicit: i32) -> i32 {\n    test_explicit(explicit)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_export(export2: i32) -> i32 {\n    test_export(export2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_extends(extends2: i32) -> i32 {\n    test_extends(extends2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_extension(extension: i32) -> i32 {\n    test_extension(extension)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_fallthrough(fallthrough: i32) -> i32 {\n    test_fallthrough(fallthrough)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_fileprivate(fileprivate: i32) -> i32 {\n    test_fileprivate(fileprivate)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_finally(finally2: i32) -> i32 {\n    test_finally(finally2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_float(float2: i32) -> i32 {\n    test_float(float2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_friend(friend: i32) -> i32 {\n    test_friend(friend)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_func(func: i32) -> i32 {\n    test_func(func)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_function(function2: i32) -> i32 {\n    test_function(function2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_get(get: i32) -> i32 {\n    test_get(get)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_goto(goto2: i32) -> i32 {\n    test_goto(goto2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_guard(guard: i32) -> i32 {\n    test_guard(guard)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_implements(implements2: i32) -> i32 {\n    test_implements(implements2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_import(import2: i32) -> i32 {\n    test_import(import2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_indirect(indirect: i32) -> i32 {\n    test_indirect(indirect)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_infix(infix: i32) -> i32 {\n    test_infix(infix)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_init(init: i32) -> i32 {\n    test_init(init)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_inline(inline: i32) -> i32 {\n    test_inline(inline)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_inout(inout: i32) -> i32 {\n    test_inout(inout)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_instanceof(instanceof2: i32) -> i32 {\n    test_instanceof(instanceof2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_int(int2: i32) -> i32 {\n    test_int(int2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_interface(interface2: i32) -> i32 {\n    test_interface(interface2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_internal(internal: i32) -> i32 {\n    test_internal(internal)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_is(is: i32) -> i32 {\n    test_is(is)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_lazy(lazy: i32) -> i32 {\n    test_lazy(lazy)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_left(left: i32) -> i32 {\n    test_left(left)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_long(long2: i32) -> i32 {\n    test_long(long2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_mutable(mutable: i32) -> i32 {\n    test_mutable(mutable)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_mutating(mutating: i32) -> i32 {\n    test_mutating(mutating)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_namespace(namespace: i32) -> i32 {\n    test_namespace(namespace)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_native(native2: i32) -> i32 {\n    test_native(native2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_new(new2: i32) -> i32 {\n    test_new(new2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_nil(nil: i32) -> i32 {\n    test_nil(nil)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_noexcept(noexcept: i32) -> i32 {\n    test_noexcept(noexcept)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_none(none: i32) -> i32 {\n    test_none(none)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_nonisolated(nonisolated: i32) -> i32 {\n    test_nonisolated(nonisolated)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_nonmutating(nonmutating: i32) -> i32 {\n    test_nonmutating(nonmutating)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_not(not: i32) -> i32 {\n    test_not(not)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_not_eq(not_eq: i32) -> i32 {\n    test_not_eq(not_eq)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_null(null2: i32) -> i32 {\n    test_null(null2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_nullptr(nullptr: i32) -> i32 {\n    test_nullptr(nullptr)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_open(open: i32) -> i32 {\n    test_open(open)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_operator(operator: i32) -> i32 {\n    test_operator(operator)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_optional(optional: i32) -> i32 {\n    test_optional(optional)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_or(or: i32) -> i32 {\n    test_or(or)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_or_eq(or_eq: i32) -> i32 {\n    test_or_eq(or_eq)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_package(package2: i32) -> i32 {\n    test_package(package2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_postfix(postfix: i32) -> i32 {\n    test_postfix(postfix)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_precedence(precedence: i32) -> i32 {\n    test_precedence(precedence)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_precedencegroup(precedencegroup: i32) -> i32 {\n    test_precedencegroup(precedencegroup)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_prefix(prefix: i32) -> i32 {\n    test_prefix(prefix)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_private(private2: i32) -> i32 {\n    test_private(private2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_protected(protected2: i32) -> i32 {\n    test_protected(protected2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_protocol(protocol: i32) -> i32 {\n    test_protocol(protocol)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_public(public2: i32) -> i32 {\n    test_public(public2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_reflexpr(reflexpr: i32) -> i32 {\n    test_reflexpr(reflexpr)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_register(register: i32) -> i32 {\n    test_register(register)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_reinterpret_cast(reinterpret_cast: i32) -> i32 {\n    test_reinterpret_cast(reinterpret_cast)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_repeat(repeat: i32) -> i32 {\n    test_repeat(repeat)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_required(required: i32) -> i32 {\n    test_required(required)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_requires(requires: i32) -> i32 {\n    test_requires(requires)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_rethrows(rethrows: i32) -> i32 {\n    test_rethrows(rethrows)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_right(right: i32) -> i32 {\n    test_right(right)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_set(set: i32) -> i32 {\n    test_set(set)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_short(short2: i32) -> i32 {\n    test_short(short2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_signed(signed: i32) -> i32 {\n    test_signed(signed)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_sizeof(sizeof: i32) -> i32 {\n    test_sizeof(sizeof)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_some(some: i32) -> i32 {\n    test_some(some)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_static_assert(static_assert: i32) -> i32 {\n    test_static_assert(static_assert)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_static_cast(static_cast: i32) -> i32 {\n    test_static_cast(static_cast)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_subscript(subscript: i32) -> i32 {\n    test_subscript(subscript)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_switch(switch2: i32) -> i32 {\n    test_switch(switch2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_synchronized(synchronized2: i32) -> i32 {\n    test_synchronized(synchronized2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_template(template: i32) -> i32 {\n    test_template(template)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_this(this2: i32) -> i32 {\n    test_this(this2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_thread_local(thread_local: i32) -> i32 {\n    test_thread_local(thread_local)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_throw(throw2: i32) -> i32 {\n    test_throw(throw2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_throws(throws2: i32) -> i32 {\n    test_throws(throws2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_transient(transient2: i32) -> i32 {\n    test_transient(transient2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_typealias(typealias: i32) -> i32 {\n    test_typealias(typealias)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_typedef(typedef: i32) -> i32 {\n    test_typedef(typedef)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_typeid(typeid: i32) -> i32 {\n    test_typeid(typeid)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_typename(typename: i32) -> i32 {\n    test_typename(typename)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_undefined(undefined2: i32) -> i32 {\n    test_undefined(undefined2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_union(union: i32) -> i32 {\n    test_union(union)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_unowned(unowned: i32) -> i32 {\n    test_unowned(unowned)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_unsigned(unsigned: i32) -> i32 {\n    test_unsigned(unsigned)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_using(using: i32) -> i32 {\n    test_using(using)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_var(var2: i32) -> i32 {\n    test_var(var2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_void(void2: i32) -> i32 {\n    test_void(void2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_volatile(volatile2: i32) -> i32 {\n    test_volatile(volatile2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_wchar_t(wchar_t: i32) -> i32 {\n    test_wchar_t(wchar_t)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_weak(weak: i32) -> i32 {\n    test_weak(weak)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_with(with2: i32) -> i32 {\n    test_with(with2)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_xor(xor: i32) -> i32 {\n    test_xor(xor)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test_xor_eq(xor_eq: i32) -> i32 {\n    test_xor_eq(xor_eq)\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_keyword_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function test_alignas(alignas: number): number;\nexport function test_alignof(alignof: number): number;\nexport function test_and(and: number): number;\nexport function test_and_eq(and_eq: number): number;\nexport function test_asm(asm: number): number;\nexport function test_associatedtype(associatedtype: number): number;\nexport function test_associativity(associativity: number): number;\nexport function test_atomic_cancel(atomic_cancel: number): number;\nexport function test_atomic_commit(atomic_commit: number): number;\nexport function test_atomic_noexcept(atomic_noexcept: number): number;\nexport function test_auto(auto: number): number;\nexport function test_bitand(bitand: number): number;\nexport function test_bitor(bitor: number): number;\nexport function test_bool(bool: number): number;\nexport function test_boolean(boolean2: number): number;\nexport function test_borrowing(borrowing: number): number;\nexport function test_byte(byte2: number): number;\nexport function test_case(case2: number): number;\nexport function test_catch(catch2: number): number;\nexport function test_char(char2: number): number;\nexport function test_char16_t(char16_t: number): number;\nexport function test_char32_t(char32_t: number): number;\nexport function test_char8_t(char8_t: number): number;\nexport function test_class(class2: number): number;\nexport function test_co_await(co_await: number): number;\nexport function test_co_return(co_return: number): number;\nexport function test_co_yield(co_yield: number): number;\nexport function test_compl(compl: number): number;\nexport function test_concept(concept: number): number;\nexport function test_const_cast(const_cast: number): number;\nexport function test_consteval(consteval: number): number;\nexport function test_constexpr(constexpr: number): number;\nexport function test_constinit(constinit: number): number;\nexport function test_consuming(consuming: number): number;\nexport function test_contract_assert(contract_assert: number): number;\nexport function test_convenience(convenience: number): number;\nexport function test_debugger(debugger2: number): number;\nexport function test_decltype(decltype: number): number;\nexport function test_default(default2: number): number;\nexport function test_defer(defer: number): number;\nexport function test_deinit(deinit: number): number;\nexport function test_delete(delete2: number): number;\nexport function test_double(double2: number): number;\nexport function test_dynamic(dynamic: number): number;\nexport function test_dynamic_cast(dynamic_cast: number): number;\nexport function test_explicit(explicit: number): number;\nexport function test_export(export2: number): number;\nexport function test_extends(extends2: number): number;\nexport function test_extension(extension: number): number;\nexport function test_fallthrough(fallthrough: number): number;\nexport function test_fileprivate(fileprivate: number): number;\nexport function test_finally(finally2: number): number;\nexport function test_float(float2: number): number;\nexport function test_friend(friend: number): number;\nexport function test_func(func: number): number;\nexport function test_function(function2: number): number;\nexport function test_get(get: number): number;\nexport function test_goto(goto2: number): number;\nexport function test_guard(guard: number): number;\nexport function test_implements(implements2: number): number;\nexport function test_import(import2: number): number;\nexport function test_indirect(indirect: number): number;\nexport function test_infix(infix: number): number;\nexport function test_init(init: number): number;\nexport function test_inline(inline: number): number;\nexport function test_inout(inout: number): number;\nexport function test_instanceof(instanceof2: number): number;\nexport function test_int(int2: number): number;\nexport function test_interface(interface2: number): number;\nexport function test_internal(internal: number): number;\nexport function test_is(is: number): number;\nexport function test_lazy(lazy: number): number;\nexport function test_left(left: number): number;\nexport function test_long(long2: number): number;\nexport function test_mutable(mutable: number): number;\nexport function test_mutating(mutating: number): number;\nexport function test_namespace(namespace: number): number;\nexport function test_native(native2: number): number;\nexport function test_new(new2: number): number;\nexport function test_nil(nil: number): number;\nexport function test_noexcept(noexcept: number): number;\nexport function test_none(none: number): number;\nexport function test_nonisolated(nonisolated: number): number;\nexport function test_nonmutating(nonmutating: number): number;\nexport function test_not(not: number): number;\nexport function test_not_eq(not_eq: number): number;\nexport function test_null(null2: number): number;\nexport function test_nullptr(nullptr: number): number;\nexport function test_open(open: number): number;\nexport function test_operator(operator: number): number;\nexport function test_optional(optional: number): number;\nexport function test_or(or: number): number;\nexport function test_or_eq(or_eq: number): number;\nexport function test_package(package2: number): number;\nexport function test_postfix(postfix: number): number;\nexport function test_precedence(precedence: number): number;\nexport function test_precedencegroup(precedencegroup: number): number;\nexport function test_prefix(prefix: number): number;\nexport function test_private(private2: number): number;\nexport function test_protected(protected2: number): number;\nexport function test_protocol(protocol: number): number;\nexport function test_public(public2: number): number;\nexport function test_reflexpr(reflexpr: number): number;\nexport function test_register(register: number): number;\nexport function test_reinterpret_cast(reinterpret_cast: number): number;\nexport function test_repeat(repeat: number): number;\nexport function test_required(required: number): number;\nexport function test_requires(requires: number): number;\nexport function test_rethrows(rethrows: number): number;\nexport function test_right(right: number): number;\nexport function test_set(set: number): number;\nexport function test_short(short2: number): number;\nexport function test_signed(signed: number): number;\nexport function test_sizeof(sizeof: number): number;\nexport function test_some(some: number): number;\nexport function test_static_assert(static_assert: number): number;\nexport function test_static_cast(static_cast: number): number;\nexport function test_subscript(subscript: number): number;\nexport function test_switch(switch2: number): number;\nexport function test_synchronized(synchronized2: number): number;\nexport function test_template(template: number): number;\nexport function test_this(this2: number): number;\nexport function test_thread_local(thread_local: number): number;\nexport function test_throw(throw2: number): number;\nexport function test_throws(throws2: number): number;\nexport function test_transient(transient2: number): number;\nexport function test_typealias(typealias: number): number;\nexport function test_typedef(typedef: number): number;\nexport function test_typeid(typeid: number): number;\nexport function test_typename(typename: number): number;\nexport function test_undefined(undefined2: number): number;\nexport function test_union(union: number): number;\nexport function test_unowned(unowned: number): number;\nexport function test_unsigned(unsigned: number): number;\nexport function test_using(using: number): number;\nexport function test_var(var2: number): number;\nexport function test_void(void2: number): number;\nexport function test_volatile(volatile2: number): number;\nexport function test_wchar_t(wchar_t: number): number;\nexport function test_weak(weak: number): number;\nexport function test_with(with2: number): number;\nexport function test_xor(xor: number): number;\nexport function test_xor_eq(xor_eq: number): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_keyword_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function test_alignas(alignas) {\n    return _ffi_exports._ffi_fn_test_alignas(alignas);\n}\n\nexport function test_alignof(alignof) {\n    return _ffi_exports._ffi_fn_test_alignof(alignof);\n}\n\nexport function test_and(and) {\n    return _ffi_exports._ffi_fn_test_and(and);\n}\n\nexport function test_and_eq(and_eq) {\n    return _ffi_exports._ffi_fn_test_and_eq(and_eq);\n}\n\nexport function test_asm(asm) {\n    return _ffi_exports._ffi_fn_test_asm(asm);\n}\n\nexport function test_associatedtype(associatedtype) {\n    return _ffi_exports._ffi_fn_test_associatedtype(associatedtype);\n}\n\nexport function test_associativity(associativity) {\n    return _ffi_exports._ffi_fn_test_associativity(associativity);\n}\n\nexport function test_atomic_cancel(atomic_cancel) {\n    return _ffi_exports._ffi_fn_test_atomic_cancel(atomic_cancel);\n}\n\nexport function test_atomic_commit(atomic_commit) {\n    return _ffi_exports._ffi_fn_test_atomic_commit(atomic_commit);\n}\n\nexport function test_atomic_noexcept(atomic_noexcept) {\n    return _ffi_exports._ffi_fn_test_atomic_noexcept(atomic_noexcept);\n}\n\nexport function test_auto(auto) {\n    return _ffi_exports._ffi_fn_test_auto(auto);\n}\n\nexport function test_bitand(bitand) {\n    return _ffi_exports._ffi_fn_test_bitand(bitand);\n}\n\nexport function test_bitor(bitor) {\n    return _ffi_exports._ffi_fn_test_bitor(bitor);\n}\n\nexport function test_bool(bool) {\n    return _ffi_exports._ffi_fn_test_bool(bool);\n}\n\nexport function test_boolean(boolean2) {\n    return _ffi_exports._ffi_fn_test_boolean(boolean2);\n}\n\nexport function test_borrowing(borrowing) {\n    return _ffi_exports._ffi_fn_test_borrowing(borrowing);\n}\n\nexport function test_byte(byte2) {\n    return _ffi_exports._ffi_fn_test_byte(byte2);\n}\n\nexport function test_case(case2) {\n    return _ffi_exports._ffi_fn_test_case(case2);\n}\n\nexport function test_catch(catch2) {\n    return _ffi_exports._ffi_fn_test_catch(catch2);\n}\n\nexport function test_char(char2) {\n    return _ffi_exports._ffi_fn_test_char(char2);\n}\n\nexport function test_char16_t(char16_t) {\n    return _ffi_exports._ffi_fn_test_char16_t(char16_t);\n}\n\nexport function test_char32_t(char32_t) {\n    return _ffi_exports._ffi_fn_test_char32_t(char32_t);\n}\n\nexport function test_char8_t(char8_t) {\n    return _ffi_exports._ffi_fn_test_char8_t(char8_t);\n}\n\nexport function test_class(class2) {\n    return _ffi_exports._ffi_fn_test_class(class2);\n}\n\nexport function test_co_await(co_await) {\n    return _ffi_exports._ffi_fn_test_co_await(co_await);\n}\n\nexport function test_co_return(co_return) {\n    return _ffi_exports._ffi_fn_test_co_return(co_return);\n}\n\nexport function test_co_yield(co_yield) {\n    return _ffi_exports._ffi_fn_test_co_yield(co_yield);\n}\n\nexport function test_compl(compl) {\n    return _ffi_exports._ffi_fn_test_compl(compl);\n}\n\nexport function test_concept(concept) {\n    return _ffi_exports._ffi_fn_test_concept(concept);\n}\n\nexport function test_const_cast(const_cast) {\n    return _ffi_exports._ffi_fn_test_const_cast(const_cast);\n}\n\nexport function test_consteval(consteval) {\n    return _ffi_exports._ffi_fn_test_consteval(consteval);\n}\n\nexport function test_constexpr(constexpr) {\n    return _ffi_exports._ffi_fn_test_constexpr(constexpr);\n}\n\nexport function test_constinit(constinit) {\n    return _ffi_exports._ffi_fn_test_constinit(constinit);\n}\n\nexport function test_consuming(consuming) {\n    return _ffi_exports._ffi_fn_test_consuming(consuming);\n}\n\nexport function test_contract_assert(contract_assert) {\n    return _ffi_exports._ffi_fn_test_contract_assert(contract_assert);\n}\n\nexport function test_convenience(convenience) {\n    return _ffi_exports._ffi_fn_test_convenience(convenience);\n}\n\nexport function test_debugger(debugger2) {\n    return _ffi_exports._ffi_fn_test_debugger(debugger2);\n}\n\nexport function test_decltype(decltype) {\n    return _ffi_exports._ffi_fn_test_decltype(decltype);\n}\n\nexport function test_default(default2) {\n    return _ffi_exports._ffi_fn_test_default(default2);\n}\n\nexport function test_defer(defer) {\n    return _ffi_exports._ffi_fn_test_defer(defer);\n}\n\nexport function test_deinit(deinit) {\n    return _ffi_exports._ffi_fn_test_deinit(deinit);\n}\n\nexport function test_delete(delete2) {\n    return _ffi_exports._ffi_fn_test_delete(delete2);\n}\n\nexport function test_double(double2) {\n    return _ffi_exports._ffi_fn_test_double(double2);\n}\n\nexport function test_dynamic(dynamic) {\n    return _ffi_exports._ffi_fn_test_dynamic(dynamic);\n}\n\nexport function test_dynamic_cast(dynamic_cast) {\n    return _ffi_exports._ffi_fn_test_dynamic_cast(dynamic_cast);\n}\n\nexport function test_explicit(explicit) {\n    return _ffi_exports._ffi_fn_test_explicit(explicit);\n}\n\nexport function test_export(export2) {\n    return _ffi_exports._ffi_fn_test_export(export2);\n}\n\nexport function test_extends(extends2) {\n    return _ffi_exports._ffi_fn_test_extends(extends2);\n}\n\nexport function test_extension(extension) {\n    return _ffi_exports._ffi_fn_test_extension(extension);\n}\n\nexport function test_fallthrough(fallthrough) {\n    return _ffi_exports._ffi_fn_test_fallthrough(fallthrough);\n}\n\nexport function test_fileprivate(fileprivate) {\n    return _ffi_exports._ffi_fn_test_fileprivate(fileprivate);\n}\n\nexport function test_finally(finally2) {\n    return _ffi_exports._ffi_fn_test_finally(finally2);\n}\n\nexport function test_float(float2) {\n    return _ffi_exports._ffi_fn_test_float(float2);\n}\n\nexport function test_friend(friend) {\n    return _ffi_exports._ffi_fn_test_friend(friend);\n}\n\nexport function test_func(func) {\n    return _ffi_exports._ffi_fn_test_func(func);\n}\n\nexport function test_function(function2) {\n    return _ffi_exports._ffi_fn_test_function(function2);\n}\n\nexport function test_get(get) {\n    return _ffi_exports._ffi_fn_test_get(get);\n}\n\nexport function test_goto(goto2) {\n    return _ffi_exports._ffi_fn_test_goto(goto2);\n}\n\nexport function test_guard(guard) {\n    return _ffi_exports._ffi_fn_test_guard(guard);\n}\n\nexport function test_implements(implements2) {\n    return _ffi_exports._ffi_fn_test_implements(implements2);\n}\n\nexport function test_import(import2) {\n    return _ffi_exports._ffi_fn_test_import(import2);\n}\n\nexport function test_indirect(indirect) {\n    return _ffi_exports._ffi_fn_test_indirect(indirect);\n}\n\nexport function test_infix(infix) {\n    return _ffi_exports._ffi_fn_test_infix(infix);\n}\n\nexport function test_init(init) {\n    return _ffi_exports._ffi_fn_test_init(init);\n}\n\nexport function test_inline(inline) {\n    return _ffi_exports._ffi_fn_test_inline(inline);\n}\n\nexport function test_inout(inout) {\n    return _ffi_exports._ffi_fn_test_inout(inout);\n}\n\nexport function test_instanceof(instanceof2) {\n    return _ffi_exports._ffi_fn_test_instanceof(instanceof2);\n}\n\nexport function test_int(int2) {\n    return _ffi_exports._ffi_fn_test_int(int2);\n}\n\nexport function test_interface(interface2) {\n    return _ffi_exports._ffi_fn_test_interface(interface2);\n}\n\nexport function test_internal(internal) {\n    return _ffi_exports._ffi_fn_test_internal(internal);\n}\n\nexport function test_is(is) {\n    return _ffi_exports._ffi_fn_test_is(is);\n}\n\nexport function test_lazy(lazy) {\n    return _ffi_exports._ffi_fn_test_lazy(lazy);\n}\n\nexport function test_left(left) {\n    return _ffi_exports._ffi_fn_test_left(left);\n}\n\nexport function test_long(long2) {\n    return _ffi_exports._ffi_fn_test_long(long2);\n}\n\nexport function test_mutable(mutable) {\n    return _ffi_exports._ffi_fn_test_mutable(mutable);\n}\n\nexport function test_mutating(mutating) {\n    return _ffi_exports._ffi_fn_test_mutating(mutating);\n}\n\nexport function test_namespace(namespace) {\n    return _ffi_exports._ffi_fn_test_namespace(namespace);\n}\n\nexport function test_native(native2) {\n    return _ffi_exports._ffi_fn_test_native(native2);\n}\n\nexport function test_new(new2) {\n    return _ffi_exports._ffi_fn_test_new(new2);\n}\n\nexport function test_nil(nil) {\n    return _ffi_exports._ffi_fn_test_nil(nil);\n}\n\nexport function test_noexcept(noexcept) {\n    return _ffi_exports._ffi_fn_test_noexcept(noexcept);\n}\n\nexport function test_none(none) {\n    return _ffi_exports._ffi_fn_test_none(none);\n}\n\nexport function test_nonisolated(nonisolated) {\n    return _ffi_exports._ffi_fn_test_nonisolated(nonisolated);\n}\n\nexport function test_nonmutating(nonmutating) {\n    return _ffi_exports._ffi_fn_test_nonmutating(nonmutating);\n}\n\nexport function test_not(not) {\n    return _ffi_exports._ffi_fn_test_not(not);\n}\n\nexport function test_not_eq(not_eq) {\n    return _ffi_exports._ffi_fn_test_not_eq(not_eq);\n}\n\nexport function test_null(null2) {\n    return _ffi_exports._ffi_fn_test_null(null2);\n}\n\nexport function test_nullptr(nullptr) {\n    return _ffi_exports._ffi_fn_test_nullptr(nullptr);\n}\n\nexport function test_open(open) {\n    return _ffi_exports._ffi_fn_test_open(open);\n}\n\nexport function test_operator(operator) {\n    return _ffi_exports._ffi_fn_test_operator(operator);\n}\n\nexport function test_optional(optional) {\n    return _ffi_exports._ffi_fn_test_optional(optional);\n}\n\nexport function test_or(or) {\n    return _ffi_exports._ffi_fn_test_or(or);\n}\n\nexport function test_or_eq(or_eq) {\n    return _ffi_exports._ffi_fn_test_or_eq(or_eq);\n}\n\nexport function test_package(package2) {\n    return _ffi_exports._ffi_fn_test_package(package2);\n}\n\nexport function test_postfix(postfix) {\n    return _ffi_exports._ffi_fn_test_postfix(postfix);\n}\n\nexport function test_precedence(precedence) {\n    return _ffi_exports._ffi_fn_test_precedence(precedence);\n}\n\nexport function test_precedencegroup(precedencegroup) {\n    return _ffi_exports._ffi_fn_test_precedencegroup(precedencegroup);\n}\n\nexport function test_prefix(prefix) {\n    return _ffi_exports._ffi_fn_test_prefix(prefix);\n}\n\nexport function test_private(private2) {\n    return _ffi_exports._ffi_fn_test_private(private2);\n}\n\nexport function test_protected(protected2) {\n    return _ffi_exports._ffi_fn_test_protected(protected2);\n}\n\nexport function test_protocol(protocol) {\n    return _ffi_exports._ffi_fn_test_protocol(protocol);\n}\n\nexport function test_public(public2) {\n    return _ffi_exports._ffi_fn_test_public(public2);\n}\n\nexport function test_reflexpr(reflexpr) {\n    return _ffi_exports._ffi_fn_test_reflexpr(reflexpr);\n}\n\nexport function test_register(register) {\n    return _ffi_exports._ffi_fn_test_register(register);\n}\n\nexport function test_reinterpret_cast(reinterpret_cast) {\n    return _ffi_exports._ffi_fn_test_reinterpret_cast(reinterpret_cast);\n}\n\nexport function test_repeat(repeat) {\n    return _ffi_exports._ffi_fn_test_repeat(repeat);\n}\n\nexport function test_required(required) {\n    return _ffi_exports._ffi_fn_test_required(required);\n}\n\nexport function test_requires(requires) {\n    return _ffi_exports._ffi_fn_test_requires(requires);\n}\n\nexport function test_rethrows(rethrows) {\n    return _ffi_exports._ffi_fn_test_rethrows(rethrows);\n}\n\nexport function test_right(right) {\n    return _ffi_exports._ffi_fn_test_right(right);\n}\n\nexport function test_set(set) {\n    return _ffi_exports._ffi_fn_test_set(set);\n}\n\nexport function test_short(short2) {\n    return _ffi_exports._ffi_fn_test_short(short2);\n}\n\nexport function test_signed(signed) {\n    return _ffi_exports._ffi_fn_test_signed(signed);\n}\n\nexport function test_sizeof(sizeof) {\n    return _ffi_exports._ffi_fn_test_sizeof(sizeof);\n}\n\nexport function test_some(some) {\n    return _ffi_exports._ffi_fn_test_some(some);\n}\n\nexport function test_static_assert(static_assert) {\n    return _ffi_exports._ffi_fn_test_static_assert(static_assert);\n}\n\nexport function test_static_cast(static_cast) {\n    return _ffi_exports._ffi_fn_test_static_cast(static_cast);\n}\n\nexport function test_subscript(subscript) {\n    return _ffi_exports._ffi_fn_test_subscript(subscript);\n}\n\nexport function test_switch(switch2) {\n    return _ffi_exports._ffi_fn_test_switch(switch2);\n}\n\nexport function test_synchronized(synchronized2) {\n    return _ffi_exports._ffi_fn_test_synchronized(synchronized2);\n}\n\nexport function test_template(template) {\n    return _ffi_exports._ffi_fn_test_template(template);\n}\n\nexport function test_this(this2) {\n    return _ffi_exports._ffi_fn_test_this(this2);\n}\n\nexport function test_thread_local(thread_local) {\n    return _ffi_exports._ffi_fn_test_thread_local(thread_local);\n}\n\nexport function test_throw(throw2) {\n    return _ffi_exports._ffi_fn_test_throw(throw2);\n}\n\nexport function test_throws(throws2) {\n    return _ffi_exports._ffi_fn_test_throws(throws2);\n}\n\nexport function test_transient(transient2) {\n    return _ffi_exports._ffi_fn_test_transient(transient2);\n}\n\nexport function test_typealias(typealias) {\n    return _ffi_exports._ffi_fn_test_typealias(typealias);\n}\n\nexport function test_typedef(typedef) {\n    return _ffi_exports._ffi_fn_test_typedef(typedef);\n}\n\nexport function test_typeid(typeid) {\n    return _ffi_exports._ffi_fn_test_typeid(typeid);\n}\n\nexport function test_typename(typename) {\n    return _ffi_exports._ffi_fn_test_typename(typename);\n}\n\nexport function test_undefined(undefined2) {\n    return _ffi_exports._ffi_fn_test_undefined(undefined2);\n}\n\nexport function test_union(union) {\n    return _ffi_exports._ffi_fn_test_union(union);\n}\n\nexport function test_unowned(unowned) {\n    return _ffi_exports._ffi_fn_test_unowned(unowned);\n}\n\nexport function test_unsigned(unsigned) {\n    return _ffi_exports._ffi_fn_test_unsigned(unsigned);\n}\n\nexport function test_using(using) {\n    return _ffi_exports._ffi_fn_test_using(using);\n}\n\nexport function test_var(var2) {\n    return _ffi_exports._ffi_fn_test_var(var2);\n}\n\nexport function test_void(void2) {\n    return _ffi_exports._ffi_fn_test_void(void2);\n}\n\nexport function test_volatile(volatile2) {\n    return _ffi_exports._ffi_fn_test_volatile(volatile2);\n}\n\nexport function test_wchar_t(wchar_t) {\n    return _ffi_exports._ffi_fn_test_wchar_t(wchar_t);\n}\n\nexport function test_weak(weak) {\n    return _ffi_exports._ffi_fn_test_weak(weak);\n}\n\nexport function test_with(with2) {\n    return _ffi_exports._ffi_fn_test_with(with2);\n}\n\nexport function test_xor(xor) {\n    return _ffi_exports._ffi_fn_test_xor(xor);\n}\n\nexport function test_xor_eq(xor_eq) {\n    return _ffi_exports._ffi_fn_test_xor_eq(xor_eq);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_keyword_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function test_alignas(alignas: number): number {\n    return _ffi_exports._ffi_fn_test_alignas(alignas);\n}\n\nexport function test_alignof(alignof: number): number {\n    return _ffi_exports._ffi_fn_test_alignof(alignof);\n}\n\nexport function test_and(and: number): number {\n    return _ffi_exports._ffi_fn_test_and(and);\n}\n\nexport function test_and_eq(and_eq: number): number {\n    return _ffi_exports._ffi_fn_test_and_eq(and_eq);\n}\n\nexport function test_asm(asm: number): number {\n    return _ffi_exports._ffi_fn_test_asm(asm);\n}\n\nexport function test_associatedtype(associatedtype: number): number {\n    return _ffi_exports._ffi_fn_test_associatedtype(associatedtype);\n}\n\nexport function test_associativity(associativity: number): number {\n    return _ffi_exports._ffi_fn_test_associativity(associativity);\n}\n\nexport function test_atomic_cancel(atomic_cancel: number): number {\n    return _ffi_exports._ffi_fn_test_atomic_cancel(atomic_cancel);\n}\n\nexport function test_atomic_commit(atomic_commit: number): number {\n    return _ffi_exports._ffi_fn_test_atomic_commit(atomic_commit);\n}\n\nexport function test_atomic_noexcept(atomic_noexcept: number): number {\n    return _ffi_exports._ffi_fn_test_atomic_noexcept(atomic_noexcept);\n}\n\nexport function test_auto(auto: number): number {\n    return _ffi_exports._ffi_fn_test_auto(auto);\n}\n\nexport function test_bitand(bitand: number): number {\n    return _ffi_exports._ffi_fn_test_bitand(bitand);\n}\n\nexport function test_bitor(bitor: number): number {\n    return _ffi_exports._ffi_fn_test_bitor(bitor);\n}\n\nexport function test_bool(bool: number): number {\n    return _ffi_exports._ffi_fn_test_bool(bool);\n}\n\nexport function test_boolean(boolean2: number): number {\n    return _ffi_exports._ffi_fn_test_boolean(boolean2);\n}\n\nexport function test_borrowing(borrowing: number): number {\n    return _ffi_exports._ffi_fn_test_borrowing(borrowing);\n}\n\nexport function test_byte(byte2: number): number {\n    return _ffi_exports._ffi_fn_test_byte(byte2);\n}\n\nexport function test_case(case2: number): number {\n    return _ffi_exports._ffi_fn_test_case(case2);\n}\n\nexport function test_catch(catch2: number): number {\n    return _ffi_exports._ffi_fn_test_catch(catch2);\n}\n\nexport function test_char(char2: number): number {\n    return _ffi_exports._ffi_fn_test_char(char2);\n}\n\nexport function test_char16_t(char16_t: number): number {\n    return _ffi_exports._ffi_fn_test_char16_t(char16_t);\n}\n\nexport function test_char32_t(char32_t: number): number {\n    return _ffi_exports._ffi_fn_test_char32_t(char32_t);\n}\n\nexport function test_char8_t(char8_t: number): number {\n    return _ffi_exports._ffi_fn_test_char8_t(char8_t);\n}\n\nexport function test_class(class2: number): number {\n    return _ffi_exports._ffi_fn_test_class(class2);\n}\n\nexport function test_co_await(co_await: number): number {\n    return _ffi_exports._ffi_fn_test_co_await(co_await);\n}\n\nexport function test_co_return(co_return: number): number {\n    return _ffi_exports._ffi_fn_test_co_return(co_return);\n}\n\nexport function test_co_yield(co_yield: number): number {\n    return _ffi_exports._ffi_fn_test_co_yield(co_yield);\n}\n\nexport function test_compl(compl: number): number {\n    return _ffi_exports._ffi_fn_test_compl(compl);\n}\n\nexport function test_concept(concept: number): number {\n    return _ffi_exports._ffi_fn_test_concept(concept);\n}\n\nexport function test_const_cast(const_cast: number): number {\n    return _ffi_exports._ffi_fn_test_const_cast(const_cast);\n}\n\nexport function test_consteval(consteval: number): number {\n    return _ffi_exports._ffi_fn_test_consteval(consteval);\n}\n\nexport function test_constexpr(constexpr: number): number {\n    return _ffi_exports._ffi_fn_test_constexpr(constexpr);\n}\n\nexport function test_constinit(constinit: number): number {\n    return _ffi_exports._ffi_fn_test_constinit(constinit);\n}\n\nexport function test_consuming(consuming: number): number {\n    return _ffi_exports._ffi_fn_test_consuming(consuming);\n}\n\nexport function test_contract_assert(contract_assert: number): number {\n    return _ffi_exports._ffi_fn_test_contract_assert(contract_assert);\n}\n\nexport function test_convenience(convenience: number): number {\n    return _ffi_exports._ffi_fn_test_convenience(convenience);\n}\n\nexport function test_debugger(debugger2: number): number {\n    return _ffi_exports._ffi_fn_test_debugger(debugger2);\n}\n\nexport function test_decltype(decltype: number): number {\n    return _ffi_exports._ffi_fn_test_decltype(decltype);\n}\n\nexport function test_default(default2: number): number {\n    return _ffi_exports._ffi_fn_test_default(default2);\n}\n\nexport function test_defer(defer: number): number {\n    return _ffi_exports._ffi_fn_test_defer(defer);\n}\n\nexport function test_deinit(deinit: number): number {\n    return _ffi_exports._ffi_fn_test_deinit(deinit);\n}\n\nexport function test_delete(delete2: number): number {\n    return _ffi_exports._ffi_fn_test_delete(delete2);\n}\n\nexport function test_double(double2: number): number {\n    return _ffi_exports._ffi_fn_test_double(double2);\n}\n\nexport function test_dynamic(dynamic: number): number {\n    return _ffi_exports._ffi_fn_test_dynamic(dynamic);\n}\n\nexport function test_dynamic_cast(dynamic_cast: number): number {\n    return _ffi_exports._ffi_fn_test_dynamic_cast(dynamic_cast);\n}\n\nexport function test_explicit(explicit: number): number {\n    return _ffi_exports._ffi_fn_test_explicit(explicit);\n}\n\nexport function test_export(export2: number): number {\n    return _ffi_exports._ffi_fn_test_export(export2);\n}\n\nexport function test_extends(extends2: number): number {\n    return _ffi_exports._ffi_fn_test_extends(extends2);\n}\n\nexport function test_extension(extension: number): number {\n    return _ffi_exports._ffi_fn_test_extension(extension);\n}\n\nexport function test_fallthrough(fallthrough: number): number {\n    return _ffi_exports._ffi_fn_test_fallthrough(fallthrough);\n}\n\nexport function test_fileprivate(fileprivate: number): number {\n    return _ffi_exports._ffi_fn_test_fileprivate(fileprivate);\n}\n\nexport function test_finally(finally2: number): number {\n    return _ffi_exports._ffi_fn_test_finally(finally2);\n}\n\nexport function test_float(float2: number): number {\n    return _ffi_exports._ffi_fn_test_float(float2);\n}\n\nexport function test_friend(friend: number): number {\n    return _ffi_exports._ffi_fn_test_friend(friend);\n}\n\nexport function test_func(func: number): number {\n    return _ffi_exports._ffi_fn_test_func(func);\n}\n\nexport function test_function(function2: number): number {\n    return _ffi_exports._ffi_fn_test_function(function2);\n}\n\nexport function test_get(get: number): number {\n    return _ffi_exports._ffi_fn_test_get(get);\n}\n\nexport function test_goto(goto2: number): number {\n    return _ffi_exports._ffi_fn_test_goto(goto2);\n}\n\nexport function test_guard(guard: number): number {\n    return _ffi_exports._ffi_fn_test_guard(guard);\n}\n\nexport function test_implements(implements2: number): number {\n    return _ffi_exports._ffi_fn_test_implements(implements2);\n}\n\nexport function test_import(import2: number): number {\n    return _ffi_exports._ffi_fn_test_import(import2);\n}\n\nexport function test_indirect(indirect: number): number {\n    return _ffi_exports._ffi_fn_test_indirect(indirect);\n}\n\nexport function test_infix(infix: number): number {\n    return _ffi_exports._ffi_fn_test_infix(infix);\n}\n\nexport function test_init(init: number): number {\n    return _ffi_exports._ffi_fn_test_init(init);\n}\n\nexport function test_inline(inline: number): number {\n    return _ffi_exports._ffi_fn_test_inline(inline);\n}\n\nexport function test_inout(inout: number): number {\n    return _ffi_exports._ffi_fn_test_inout(inout);\n}\n\nexport function test_instanceof(instanceof2: number): number {\n    return _ffi_exports._ffi_fn_test_instanceof(instanceof2);\n}\n\nexport function test_int(int2: number): number {\n    return _ffi_exports._ffi_fn_test_int(int2);\n}\n\nexport function test_interface(interface2: number): number {\n    return _ffi_exports._ffi_fn_test_interface(interface2);\n}\n\nexport function test_internal(internal: number): number {\n    return _ffi_exports._ffi_fn_test_internal(internal);\n}\n\nexport function test_is(is: number): number {\n    return _ffi_exports._ffi_fn_test_is(is);\n}\n\nexport function test_lazy(lazy: number): number {\n    return _ffi_exports._ffi_fn_test_lazy(lazy);\n}\n\nexport function test_left(left: number): number {\n    return _ffi_exports._ffi_fn_test_left(left);\n}\n\nexport function test_long(long2: number): number {\n    return _ffi_exports._ffi_fn_test_long(long2);\n}\n\nexport function test_mutable(mutable: number): number {\n    return _ffi_exports._ffi_fn_test_mutable(mutable);\n}\n\nexport function test_mutating(mutating: number): number {\n    return _ffi_exports._ffi_fn_test_mutating(mutating);\n}\n\nexport function test_namespace(namespace: number): number {\n    return _ffi_exports._ffi_fn_test_namespace(namespace);\n}\n\nexport function test_native(native2: number): number {\n    return _ffi_exports._ffi_fn_test_native(native2);\n}\n\nexport function test_new(new2: number): number {\n    return _ffi_exports._ffi_fn_test_new(new2);\n}\n\nexport function test_nil(nil: number): number {\n    return _ffi_exports._ffi_fn_test_nil(nil);\n}\n\nexport function test_noexcept(noexcept: number): number {\n    return _ffi_exports._ffi_fn_test_noexcept(noexcept);\n}\n\nexport function test_none(none: number): number {\n    return _ffi_exports._ffi_fn_test_none(none);\n}\n\nexport function test_nonisolated(nonisolated: number): number {\n    return _ffi_exports._ffi_fn_test_nonisolated(nonisolated);\n}\n\nexport function test_nonmutating(nonmutating: number): number {\n    return _ffi_exports._ffi_fn_test_nonmutating(nonmutating);\n}\n\nexport function test_not(not: number): number {\n    return _ffi_exports._ffi_fn_test_not(not);\n}\n\nexport function test_not_eq(not_eq: number): number {\n    return _ffi_exports._ffi_fn_test_not_eq(not_eq);\n}\n\nexport function test_null(null2: number): number {\n    return _ffi_exports._ffi_fn_test_null(null2);\n}\n\nexport function test_nullptr(nullptr: number): number {\n    return _ffi_exports._ffi_fn_test_nullptr(nullptr);\n}\n\nexport function test_open(open: number): number {\n    return _ffi_exports._ffi_fn_test_open(open);\n}\n\nexport function test_operator(operator: number): number {\n    return _ffi_exports._ffi_fn_test_operator(operator);\n}\n\nexport function test_optional(optional: number): number {\n    return _ffi_exports._ffi_fn_test_optional(optional);\n}\n\nexport function test_or(or: number): number {\n    return _ffi_exports._ffi_fn_test_or(or);\n}\n\nexport function test_or_eq(or_eq: number): number {\n    return _ffi_exports._ffi_fn_test_or_eq(or_eq);\n}\n\nexport function test_package(package2: number): number {\n    return _ffi_exports._ffi_fn_test_package(package2);\n}\n\nexport function test_postfix(postfix: number): number {\n    return _ffi_exports._ffi_fn_test_postfix(postfix);\n}\n\nexport function test_precedence(precedence: number): number {\n    return _ffi_exports._ffi_fn_test_precedence(precedence);\n}\n\nexport function test_precedencegroup(precedencegroup: number): number {\n    return _ffi_exports._ffi_fn_test_precedencegroup(precedencegroup);\n}\n\nexport function test_prefix(prefix: number): number {\n    return _ffi_exports._ffi_fn_test_prefix(prefix);\n}\n\nexport function test_private(private2: number): number {\n    return _ffi_exports._ffi_fn_test_private(private2);\n}\n\nexport function test_protected(protected2: number): number {\n    return _ffi_exports._ffi_fn_test_protected(protected2);\n}\n\nexport function test_protocol(protocol: number): number {\n    return _ffi_exports._ffi_fn_test_protocol(protocol);\n}\n\nexport function test_public(public2: number): number {\n    return _ffi_exports._ffi_fn_test_public(public2);\n}\n\nexport function test_reflexpr(reflexpr: number): number {\n    return _ffi_exports._ffi_fn_test_reflexpr(reflexpr);\n}\n\nexport function test_register(register: number): number {\n    return _ffi_exports._ffi_fn_test_register(register);\n}\n\nexport function test_reinterpret_cast(reinterpret_cast: number): number {\n    return _ffi_exports._ffi_fn_test_reinterpret_cast(reinterpret_cast);\n}\n\nexport function test_repeat(repeat: number): number {\n    return _ffi_exports._ffi_fn_test_repeat(repeat);\n}\n\nexport function test_required(required: number): number {\n    return _ffi_exports._ffi_fn_test_required(required);\n}\n\nexport function test_requires(requires: number): number {\n    return _ffi_exports._ffi_fn_test_requires(requires);\n}\n\nexport function test_rethrows(rethrows: number): number {\n    return _ffi_exports._ffi_fn_test_rethrows(rethrows);\n}\n\nexport function test_right(right: number): number {\n    return _ffi_exports._ffi_fn_test_right(right);\n}\n\nexport function test_set(set: number): number {\n    return _ffi_exports._ffi_fn_test_set(set);\n}\n\nexport function test_short(short2: number): number {\n    return _ffi_exports._ffi_fn_test_short(short2);\n}\n\nexport function test_signed(signed: number): number {\n    return _ffi_exports._ffi_fn_test_signed(signed);\n}\n\nexport function test_sizeof(sizeof: number): number {\n    return _ffi_exports._ffi_fn_test_sizeof(sizeof);\n}\n\nexport function test_some(some: number): number {\n    return _ffi_exports._ffi_fn_test_some(some);\n}\n\nexport function test_static_assert(static_assert: number): number {\n    return _ffi_exports._ffi_fn_test_static_assert(static_assert);\n}\n\nexport function test_static_cast(static_cast: number): number {\n    return _ffi_exports._ffi_fn_test_static_cast(static_cast);\n}\n\nexport function test_subscript(subscript: number): number {\n    return _ffi_exports._ffi_fn_test_subscript(subscript);\n}\n\nexport function test_switch(switch2: number): number {\n    return _ffi_exports._ffi_fn_test_switch(switch2);\n}\n\nexport function test_synchronized(synchronized2: number): number {\n    return _ffi_exports._ffi_fn_test_synchronized(synchronized2);\n}\n\nexport function test_template(template: number): number {\n    return _ffi_exports._ffi_fn_test_template(template);\n}\n\nexport function test_this(this2: number): number {\n    return _ffi_exports._ffi_fn_test_this(this2);\n}\n\nexport function test_thread_local(thread_local: number): number {\n    return _ffi_exports._ffi_fn_test_thread_local(thread_local);\n}\n\nexport function test_throw(throw2: number): number {\n    return _ffi_exports._ffi_fn_test_throw(throw2);\n}\n\nexport function test_throws(throws2: number): number {\n    return _ffi_exports._ffi_fn_test_throws(throws2);\n}\n\nexport function test_transient(transient2: number): number {\n    return _ffi_exports._ffi_fn_test_transient(transient2);\n}\n\nexport function test_typealias(typealias: number): number {\n    return _ffi_exports._ffi_fn_test_typealias(typealias);\n}\n\nexport function test_typedef(typedef: number): number {\n    return _ffi_exports._ffi_fn_test_typedef(typedef);\n}\n\nexport function test_typeid(typeid: number): number {\n    return _ffi_exports._ffi_fn_test_typeid(typeid);\n}\n\nexport function test_typename(typename: number): number {\n    return _ffi_exports._ffi_fn_test_typename(typename);\n}\n\nexport function test_undefined(undefined2: number): number {\n    return _ffi_exports._ffi_fn_test_undefined(undefined2);\n}\n\nexport function test_union(union: number): number {\n    return _ffi_exports._ffi_fn_test_union(union);\n}\n\nexport function test_unowned(unowned: number): number {\n    return _ffi_exports._ffi_fn_test_unowned(unowned);\n}\n\nexport function test_unsigned(unsigned: number): number {\n    return _ffi_exports._ffi_fn_test_unsigned(unsigned);\n}\n\nexport function test_using(using: number): number {\n    return _ffi_exports._ffi_fn_test_using(using);\n}\n\nexport function test_var(var2: number): number {\n    return _ffi_exports._ffi_fn_test_var(var2);\n}\n\nexport function test_void(void2: number): number {\n    return _ffi_exports._ffi_fn_test_void(void2);\n}\n\nexport function test_volatile(volatile2: number): number {\n    return _ffi_exports._ffi_fn_test_volatile(volatile2);\n}\n\nexport function test_wchar_t(wchar_t: number): number {\n    return _ffi_exports._ffi_fn_test_wchar_t(wchar_t);\n}\n\nexport function test_weak(weak: number): number {\n    return _ffi_exports._ffi_fn_test_weak(weak);\n}\n\nexport function test_with(with2: number): number {\n    return _ffi_exports._ffi_fn_test_with(with2);\n}\n\nexport function test_xor(xor: number): number {\n    return _ffi_exports._ffi_fn_test_xor(xor);\n}\n\nexport function test_xor_eq(xor_eq: number): number {\n    return _ffi_exports._ffi_fn_test_xor_eq(xor_eq);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_test_alignas: (alignas: number) => number,\n    _ffi_fn_test_alignof: (alignof: number) => number,\n    _ffi_fn_test_and: (and: number) => number,\n    _ffi_fn_test_and_eq: (and_eq: number) => number,\n    _ffi_fn_test_asm: (asm: number) => number,\n    _ffi_fn_test_associatedtype: (associatedtype: number) => number,\n    _ffi_fn_test_associativity: (associativity: number) => number,\n    _ffi_fn_test_atomic_cancel: (atomic_cancel: number) => number,\n    _ffi_fn_test_atomic_commit: (atomic_commit: number) => number,\n    _ffi_fn_test_atomic_noexcept: (atomic_noexcept: number) => number,\n    _ffi_fn_test_auto: (auto: number) => number,\n    _ffi_fn_test_bitand: (bitand: number) => number,\n    _ffi_fn_test_bitor: (bitor: number) => number,\n    _ffi_fn_test_bool: (bool: number) => number,\n    _ffi_fn_test_boolean: (boolean2: number) => number,\n    _ffi_fn_test_borrowing: (borrowing: number) => number,\n    _ffi_fn_test_byte: (byte2: number) => number,\n    _ffi_fn_test_case: (case2: number) => number,\n    _ffi_fn_test_catch: (catch2: number) => number,\n    _ffi_fn_test_char: (char2: number) => number,\n    _ffi_fn_test_char16_t: (char16_t: number) => number,\n    _ffi_fn_test_char32_t: (char32_t: number) => number,\n    _ffi_fn_test_char8_t: (char8_t: number) => number,\n    _ffi_fn_test_class: (class2: number) => number,\n    _ffi_fn_test_co_await: (co_await: number) => number,\n    _ffi_fn_test_co_return: (co_return: number) => number,\n    _ffi_fn_test_co_yield: (co_yield: number) => number,\n    _ffi_fn_test_compl: (compl: number) => number,\n    _ffi_fn_test_concept: (concept: number) => number,\n    _ffi_fn_test_const_cast: (const_cast: number) => number,\n    _ffi_fn_test_consteval: (consteval: number) => number,\n    _ffi_fn_test_constexpr: (constexpr: number) => number,\n    _ffi_fn_test_constinit: (constinit: number) => number,\n    _ffi_fn_test_consuming: (consuming: number) => number,\n    _ffi_fn_test_contract_assert: (contract_assert: number) => number,\n    _ffi_fn_test_convenience: (convenience: number) => number,\n    _ffi_fn_test_debugger: (debugger2: number) => number,\n    _ffi_fn_test_decltype: (decltype: number) => number,\n    _ffi_fn_test_default: (default2: number) => number,\n    _ffi_fn_test_defer: (defer: number) => number,\n    _ffi_fn_test_deinit: (deinit: number) => number,\n    _ffi_fn_test_delete: (delete2: number) => number,\n    _ffi_fn_test_double: (double2: number) => number,\n    _ffi_fn_test_dynamic: (dynamic: number) => number,\n    _ffi_fn_test_dynamic_cast: (dynamic_cast: number) => number,\n    _ffi_fn_test_explicit: (explicit: number) => number,\n    _ffi_fn_test_export: (export2: number) => number,\n    _ffi_fn_test_extends: (extends2: number) => number,\n    _ffi_fn_test_extension: (extension: number) => number,\n    _ffi_fn_test_fallthrough: (fallthrough: number) => number,\n    _ffi_fn_test_fileprivate: (fileprivate: number) => number,\n    _ffi_fn_test_finally: (finally2: number) => number,\n    _ffi_fn_test_float: (float2: number) => number,\n    _ffi_fn_test_friend: (friend: number) => number,\n    _ffi_fn_test_func: (func: number) => number,\n    _ffi_fn_test_function: (function2: number) => number,\n    _ffi_fn_test_get: (get: number) => number,\n    _ffi_fn_test_goto: (goto2: number) => number,\n    _ffi_fn_test_guard: (guard: number) => number,\n    _ffi_fn_test_implements: (implements2: number) => number,\n    _ffi_fn_test_import: (import2: number) => number,\n    _ffi_fn_test_indirect: (indirect: number) => number,\n    _ffi_fn_test_infix: (infix: number) => number,\n    _ffi_fn_test_init: (init: number) => number,\n    _ffi_fn_test_inline: (inline: number) => number,\n    _ffi_fn_test_inout: (inout: number) => number,\n    _ffi_fn_test_instanceof: (instanceof2: number) => number,\n    _ffi_fn_test_int: (int2: number) => number,\n    _ffi_fn_test_interface: (interface2: number) => number,\n    _ffi_fn_test_internal: (internal: number) => number,\n    _ffi_fn_test_is: (is: number) => number,\n    _ffi_fn_test_lazy: (lazy: number) => number,\n    _ffi_fn_test_left: (left: number) => number,\n    _ffi_fn_test_long: (long2: number) => number,\n    _ffi_fn_test_mutable: (mutable: number) => number,\n    _ffi_fn_test_mutating: (mutating: number) => number,\n    _ffi_fn_test_namespace: (namespace: number) => number,\n    _ffi_fn_test_native: (native2: number) => number,\n    _ffi_fn_test_new: (new2: number) => number,\n    _ffi_fn_test_nil: (nil: number) => number,\n    _ffi_fn_test_noexcept: (noexcept: number) => number,\n    _ffi_fn_test_none: (none: number) => number,\n    _ffi_fn_test_nonisolated: (nonisolated: number) => number,\n    _ffi_fn_test_nonmutating: (nonmutating: number) => number,\n    _ffi_fn_test_not: (not: number) => number,\n    _ffi_fn_test_not_eq: (not_eq: number) => number,\n    _ffi_fn_test_null: (null2: number) => number,\n    _ffi_fn_test_nullptr: (nullptr: number) => number,\n    _ffi_fn_test_open: (open: number) => number,\n    _ffi_fn_test_operator: (operator: number) => number,\n    _ffi_fn_test_optional: (optional: number) => number,\n    _ffi_fn_test_or: (or: number) => number,\n    _ffi_fn_test_or_eq: (or_eq: number) => number,\n    _ffi_fn_test_package: (package2: number) => number,\n    _ffi_fn_test_postfix: (postfix: number) => number,\n    _ffi_fn_test_precedence: (precedence: number) => number,\n    _ffi_fn_test_precedencegroup: (precedencegroup: number) => number,\n    _ffi_fn_test_prefix: (prefix: number) => number,\n    _ffi_fn_test_private: (private2: number) => number,\n    _ffi_fn_test_protected: (protected2: number) => number,\n    _ffi_fn_test_protocol: (protocol: number) => number,\n    _ffi_fn_test_public: (public2: number) => number,\n    _ffi_fn_test_reflexpr: (reflexpr: number) => number,\n    _ffi_fn_test_register: (register: number) => number,\n    _ffi_fn_test_reinterpret_cast: (reinterpret_cast: number) => number,\n    _ffi_fn_test_repeat: (repeat: number) => number,\n    _ffi_fn_test_required: (required: number) => number,\n    _ffi_fn_test_requires: (requires: number) => number,\n    _ffi_fn_test_rethrows: (rethrows: number) => number,\n    _ffi_fn_test_right: (right: number) => number,\n    _ffi_fn_test_set: (set: number) => number,\n    _ffi_fn_test_short: (short2: number) => number,\n    _ffi_fn_test_signed: (signed: number) => number,\n    _ffi_fn_test_sizeof: (sizeof: number) => number,\n    _ffi_fn_test_some: (some: number) => number,\n    _ffi_fn_test_static_assert: (static_assert: number) => number,\n    _ffi_fn_test_static_cast: (static_cast: number) => number,\n    _ffi_fn_test_subscript: (subscript: number) => number,\n    _ffi_fn_test_switch: (switch2: number) => number,\n    _ffi_fn_test_synchronized: (synchronized2: number) => number,\n    _ffi_fn_test_template: (template: number) => number,\n    _ffi_fn_test_this: (this2: number) => number,\n    _ffi_fn_test_thread_local: (thread_local: number) => number,\n    _ffi_fn_test_throw: (throw2: number) => number,\n    _ffi_fn_test_throws: (throws2: number) => number,\n    _ffi_fn_test_transient: (transient2: number) => number,\n    _ffi_fn_test_typealias: (typealias: number) => number,\n    _ffi_fn_test_typedef: (typedef: number) => number,\n    _ffi_fn_test_typeid: (typeid: number) => number,\n    _ffi_fn_test_typename: (typename: number) => number,\n    _ffi_fn_test_undefined: (undefined2: number) => number,\n    _ffi_fn_test_union: (union: number) => number,\n    _ffi_fn_test_unowned: (unowned: number) => number,\n    _ffi_fn_test_unsigned: (unsigned: number) => number,\n    _ffi_fn_test_using: (using: number) => number,\n    _ffi_fn_test_var: (var2: number) => number,\n    _ffi_fn_test_void: (void2: number) => number,\n    _ffi_fn_test_volatile: (volatile2: number) => number,\n    _ffi_fn_test_wchar_t: (wchar_t: number) => number,\n    _ffi_fn_test_weak: (weak: number) => number,\n    _ffi_fn_test_with: (with2: number) => number,\n    _ffi_fn_test_xor: (xor: number) => number,\n    _ffi_fn_test_xor_eq: (xor_eq: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_keyword_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_alignas(alignas: i32) -> i32 {\n    test_alignas(alignas)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_alignof(alignof: i32) -> i32 {\n    test_alignof(alignof)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_and(and: i32) -> i32 {\n    test_and(and)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_and_eq(and_eq: i32) -> i32 {\n    test_and_eq(and_eq)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_asm(asm: i32) -> i32 {\n    test_asm(asm)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_associatedtype(associatedtype: i32) -> i32 {\n    test_associatedtype(associatedtype)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_associativity(associativity: i32) -> i32 {\n    test_associativity(associativity)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_atomic_cancel(atomic_cancel: i32) -> i32 {\n    test_atomic_cancel(atomic_cancel)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_atomic_commit(atomic_commit: i32) -> i32 {\n    test_atomic_commit(atomic_commit)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_atomic_noexcept(atomic_noexcept: i32) -> i32 {\n    test_atomic_noexcept(atomic_noexcept)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_auto(auto: i32) -> i32 {\n    test_auto(auto)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_bitand(bitand: i32) -> i32 {\n    test_bitand(bitand)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_bitor(bitor: i32) -> i32 {\n    test_bitor(bitor)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_bool(bool: i32) -> i32 {\n    test_bool(bool)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_boolean(boolean2: i32) -> i32 {\n    test_boolean(boolean2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_borrowing(borrowing: i32) -> i32 {\n    test_borrowing(borrowing)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_byte(byte2: i32) -> i32 {\n    test_byte(byte2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_case(case2: i32) -> i32 {\n    test_case(case2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_catch(catch2: i32) -> i32 {\n    test_catch(catch2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_char(char2: i32) -> i32 {\n    test_char(char2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_char16_t(char16_t: i32) -> i32 {\n    test_char16_t(char16_t)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_char32_t(char32_t: i32) -> i32 {\n    test_char32_t(char32_t)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_char8_t(char8_t: i32) -> i32 {\n    test_char8_t(char8_t)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_class(class2: i32) -> i32 {\n    test_class(class2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_co_await(co_await: i32) -> i32 {\n    test_co_await(co_await)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_co_return(co_return: i32) -> i32 {\n    test_co_return(co_return)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_co_yield(co_yield: i32) -> i32 {\n    test_co_yield(co_yield)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_compl(compl: i32) -> i32 {\n    test_compl(compl)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_concept(concept: i32) -> i32 {\n    test_concept(concept)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_const_cast(const_cast: i32) -> i32 {\n    test_const_cast(const_cast)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_consteval(consteval: i32) -> i32 {\n    test_consteval(consteval)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_constexpr(constexpr: i32) -> i32 {\n    test_constexpr(constexpr)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_constinit(constinit: i32) -> i32 {\n    test_constinit(constinit)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_consuming(consuming: i32) -> i32 {\n    test_consuming(consuming)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_contract_assert(contract_assert: i32) -> i32 {\n    test_contract_assert(contract_assert)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_convenience(convenience: i32) -> i32 {\n    test_convenience(convenience)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_debugger(debugger2: i32) -> i32 {\n    test_debugger(debugger2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_decltype(decltype: i32) -> i32 {\n    test_decltype(decltype)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_default(default2: i32) -> i32 {\n    test_default(default2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_defer(defer: i32) -> i32 {\n    test_defer(defer)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_deinit(deinit: i32) -> i32 {\n    test_deinit(deinit)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_delete(delete2: i32) -> i32 {\n    test_delete(delete2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_double(double2: i32) -> i32 {\n    test_double(double2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_dynamic(dynamic: i32) -> i32 {\n    test_dynamic(dynamic)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_dynamic_cast(dynamic_cast: i32) -> i32 {\n    test_dynamic_cast(dynamic_cast)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_explicit(explicit: i32) -> i32 {\n    test_explicit(explicit)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_export(export2: i32) -> i32 {\n    test_export(export2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_extends(extends2: i32) -> i32 {\n    test_extends(extends2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_extension(extension: i32) -> i32 {\n    test_extension(extension)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_fallthrough(fallthrough: i32) -> i32 {\n    test_fallthrough(fallthrough)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_fileprivate(fileprivate: i32) -> i32 {\n    test_fileprivate(fileprivate)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_finally(finally2: i32) -> i32 {\n    test_finally(finally2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_float(float2: i32) -> i32 {\n    test_float(float2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_friend(friend: i32) -> i32 {\n    test_friend(friend)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_func(func: i32) -> i32 {\n    test_func(func)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_function(function2: i32) -> i32 {\n    test_function(function2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_get(get: i32) -> i32 {\n    test_get(get)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_goto(goto2: i32) -> i32 {\n    test_goto(goto2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_guard(guard: i32) -> i32 {\n    test_guard(guard)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_implements(implements2: i32) -> i32 {\n    test_implements(implements2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_import(import2: i32) -> i32 {\n    test_import(import2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_indirect(indirect: i32) -> i32 {\n    test_indirect(indirect)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_infix(infix: i32) -> i32 {\n    test_infix(infix)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_init(init: i32) -> i32 {\n    test_init(init)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_inline(inline: i32) -> i32 {\n    test_inline(inline)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_inout(inout: i32) -> i32 {\n    test_inout(inout)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_instanceof(instanceof2: i32) -> i32 {\n    test_instanceof(instanceof2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_int(int2: i32) -> i32 {\n    test_int(int2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_interface(interface2: i32) -> i32 {\n    test_interface(interface2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_internal(internal: i32) -> i32 {\n    test_internal(internal)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_is(is: i32) -> i32 {\n    test_is(is)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_lazy(lazy: i32) -> i32 {\n    test_lazy(lazy)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_left(left: i32) -> i32 {\n    test_left(left)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_long(long2: i32) -> i32 {\n    test_long(long2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_mutable(mutable: i32) -> i32 {\n    test_mutable(mutable)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_mutating(mutating: i32) -> i32 {\n    test_mutating(mutating)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_namespace(namespace: i32) -> i32 {\n    test_namespace(namespace)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_native(native2: i32) -> i32 {\n    test_native(native2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_new(new2: i32) -> i32 {\n    test_new(new2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_nil(nil: i32) -> i32 {\n    test_nil(nil)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_noexcept(noexcept: i32) -> i32 {\n    test_noexcept(noexcept)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_none(none: i32) -> i32 {\n    test_none(none)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_nonisolated(nonisolated: i32) -> i32 {\n    test_nonisolated(nonisolated)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_nonmutating(nonmutating: i32) -> i32 {\n    test_nonmutating(nonmutating)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_not(not: i32) -> i32 {\n    test_not(not)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_not_eq(not_eq: i32) -> i32 {\n    test_not_eq(not_eq)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_null(null2: i32) -> i32 {\n    test_null(null2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_nullptr(nullptr: i32) -> i32 {\n    test_nullptr(nullptr)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_open(open: i32) -> i32 {\n    test_open(open)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_operator(operator: i32) -> i32 {\n    test_operator(operator)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_optional(optional: i32) -> i32 {\n    test_optional(optional)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_or(or: i32) -> i32 {\n    test_or(or)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_or_eq(or_eq: i32) -> i32 {\n    test_or_eq(or_eq)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_package(package2: i32) -> i32 {\n    test_package(package2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_postfix(postfix: i32) -> i32 {\n    test_postfix(postfix)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_precedence(precedence: i32) -> i32 {\n    test_precedence(precedence)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_precedencegroup(precedencegroup: i32) -> i32 {\n    test_precedencegroup(precedencegroup)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_prefix(prefix: i32) -> i32 {\n    test_prefix(prefix)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_private(private2: i32) -> i32 {\n    test_private(private2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_protected(protected2: i32) -> i32 {\n    test_protected(protected2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_protocol(protocol: i32) -> i32 {\n    test_protocol(protocol)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_public(public2: i32) -> i32 {\n    test_public(public2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_reflexpr(reflexpr: i32) -> i32 {\n    test_reflexpr(reflexpr)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_register(register: i32) -> i32 {\n    test_register(register)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_reinterpret_cast(reinterpret_cast: i32) -> i32 {\n    test_reinterpret_cast(reinterpret_cast)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_repeat(repeat: i32) -> i32 {\n    test_repeat(repeat)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_required(required: i32) -> i32 {\n    test_required(required)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_requires(requires: i32) -> i32 {\n    test_requires(requires)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_rethrows(rethrows: i32) -> i32 {\n    test_rethrows(rethrows)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_right(right: i32) -> i32 {\n    test_right(right)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_set(set: i32) -> i32 {\n    test_set(set)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_short(short2: i32) -> i32 {\n    test_short(short2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_signed(signed: i32) -> i32 {\n    test_signed(signed)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_sizeof(sizeof: i32) -> i32 {\n    test_sizeof(sizeof)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_some(some: i32) -> i32 {\n    test_some(some)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_static_assert(static_assert: i32) -> i32 {\n    test_static_assert(static_assert)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_static_cast(static_cast: i32) -> i32 {\n    test_static_cast(static_cast)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_subscript(subscript: i32) -> i32 {\n    test_subscript(subscript)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_switch(switch2: i32) -> i32 {\n    test_switch(switch2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_synchronized(synchronized2: i32) -> i32 {\n    test_synchronized(synchronized2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_template(template: i32) -> i32 {\n    test_template(template)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_this(this2: i32) -> i32 {\n    test_this(this2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_thread_local(thread_local: i32) -> i32 {\n    test_thread_local(thread_local)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_throw(throw2: i32) -> i32 {\n    test_throw(throw2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_throws(throws2: i32) -> i32 {\n    test_throws(throws2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_transient(transient2: i32) -> i32 {\n    test_transient(transient2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_typealias(typealias: i32) -> i32 {\n    test_typealias(typealias)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_typedef(typedef: i32) -> i32 {\n    test_typedef(typedef)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_typeid(typeid: i32) -> i32 {\n    test_typeid(typeid)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_typename(typename: i32) -> i32 {\n    test_typename(typename)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_undefined(undefined2: i32) -> i32 {\n    test_undefined(undefined2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_union(union: i32) -> i32 {\n    test_union(union)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_unowned(unowned: i32) -> i32 {\n    test_unowned(unowned)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_unsigned(unsigned: i32) -> i32 {\n    test_unsigned(unsigned)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_using(using: i32) -> i32 {\n    test_using(using)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_var(var2: i32) -> i32 {\n    test_var(var2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_void(void2: i32) -> i32 {\n    test_void(void2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_volatile(volatile2: i32) -> i32 {\n    test_volatile(volatile2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_wchar_t(wchar_t: i32) -> i32 {\n    test_wchar_t(wchar_t)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_weak(weak: i32) -> i32 {\n    test_weak(weak)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_with(with2: i32) -> i32 {\n    test_with(with2)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_xor(xor: i32) -> i32 {\n    test_xor(xor)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test_xor_eq(xor_eq: i32) -> i32 {\n    test_xor_eq(xor_eq)\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_order_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface FirstTrait {\n    second(): SecondTrait;\n}\n\nexport interface SecondTrait {\n    first(): FirstTrait;\n}\n\nexport type EarlyInsideEnum =\n    | { readonly $: \"Value\", 0: boolean }\n\nexport type LaterOutsideEnum =\n    | { readonly $: \"Value\", 0: EarlyInsideEnum }\n\nexport type EarlyOutsideEnum =\n    | { readonly $: \"Value\", 0: LaterInsideEnum }\n\nexport type LaterInsideEnum =\n    | { readonly $: \"Value\", 0: boolean }\n\nexport type FirstEnum =\n    | { readonly $: \"Second\", 0: SecondEnum[] }\n\nexport type SecondEnum =\n    | { readonly $: \"First\", 0: FirstEnum[] }\n\nexport interface EarlyInsideStruct {\n    y: boolean,\n}\n\nexport interface LaterOutsideStruct {\n    x: EarlyInsideStruct,\n}\n\nexport interface EarlyOutsideStruct {\n    x: LaterInsideStruct,\n}\n\nexport interface LaterInsideStruct {\n    y: boolean,\n}\n\nexport interface FirstStruct {\n    second: SecondStruct[],\n}\n\nexport interface SecondStruct {\n    first: FirstStruct[],\n}\n\nexport function rust_mem_leaked(): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_order_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_order_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface FirstTrait {\n    second(): SecondTrait;\n}\n\nexport interface SecondTrait {\n    first(): FirstTrait;\n}\n\nexport type EarlyInsideEnum =\n    | { readonly $: \"Value\", 0: boolean }\n\nexport type LaterOutsideEnum =\n    | { readonly $: \"Value\", 0: EarlyInsideEnum }\n\nexport type EarlyOutsideEnum =\n    | { readonly $: \"Value\", 0: LaterInsideEnum }\n\nexport type LaterInsideEnum =\n    | { readonly $: \"Value\", 0: boolean }\n\nexport type FirstEnum =\n    | { readonly $: \"Second\", 0: SecondEnum[] }\n\nexport type SecondEnum =\n    | { readonly $: \"First\", 0: FirstEnum[] }\n\nexport interface EarlyInsideStruct {\n    y: boolean,\n}\n\nexport interface LaterOutsideStruct {\n    x: EarlyInsideStruct,\n}\n\nexport interface EarlyOutsideStruct {\n    x: LaterInsideStruct,\n}\n\nexport interface LaterInsideStruct {\n    y: boolean,\n}\n\nexport interface FirstStruct {\n    second: SecondStruct[],\n}\n\nexport interface SecondStruct {\n    first: FirstStruct[],\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_order_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_order_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface FirstTrait {\n    second(): SecondTrait;\n}\n\nexport interface SecondTrait {\n    first(): FirstTrait;\n}\n\nexport type EarlyInsideEnum =\n    | { readonly $: \"Value\", 0: boolean }\n\nexport type LaterOutsideEnum =\n    | { readonly $: \"Value\", 0: EarlyInsideEnum }\n\nexport type EarlyOutsideEnum =\n    | { readonly $: \"Value\", 0: LaterInsideEnum }\n\nexport type LaterInsideEnum =\n    | { readonly $: \"Value\", 0: boolean }\n\nexport type FirstEnum =\n    | { readonly $: \"Second\", 0: SecondEnum[] }\n\nexport type SecondEnum =\n    | { readonly $: \"First\", 0: FirstEnum[] }\n\nexport interface EarlyInsideStruct {\n    y: boolean,\n}\n\nexport interface LaterOutsideStruct {\n    x: EarlyInsideStruct,\n}\n\nexport interface EarlyOutsideStruct {\n    x: LaterInsideStruct,\n}\n\nexport interface LaterInsideStruct {\n    y: boolean,\n}\n\nexport interface FirstStruct {\n    second: SecondStruct[],\n}\n\nexport interface SecondStruct {\n    first: FirstStruct[],\n}\n\nexport function rust_mem_leaked(): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_order_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_order_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface FirstTrait {\n    second(): SecondTrait;\n}\n\nexport interface SecondTrait {\n    first(): FirstTrait;\n}\n\nexport type EarlyInsideEnum =\n    | { readonly $: \"Value\", 0: boolean }\n\nexport type LaterOutsideEnum =\n    | { readonly $: \"Value\", 0: EarlyInsideEnum }\n\nexport type EarlyOutsideEnum =\n    | { readonly $: \"Value\", 0: LaterInsideEnum }\n\nexport type LaterInsideEnum =\n    | { readonly $: \"Value\", 0: boolean }\n\nexport type FirstEnum =\n    | { readonly $: \"Second\", 0: SecondEnum[] }\n\nexport type SecondEnum =\n    | { readonly $: \"First\", 0: FirstEnum[] }\n\nexport interface EarlyInsideStruct {\n    y: boolean,\n}\n\nexport interface LaterOutsideStruct {\n    x: EarlyInsideStruct,\n}\n\nexport interface EarlyOutsideStruct {\n    x: LaterInsideStruct,\n}\n\nexport interface LaterInsideStruct {\n    y: boolean,\n}\n\nexport interface FirstStruct {\n    second: SecondStruct[],\n}\n\nexport interface SecondStruct {\n    first: FirstStruct[],\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_order_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_trait_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Trait {\n    get(): number;\n}\n\nexport interface Example {\n    box_ptr: Trait,\n    rc_ptr: Trait,\n    text: string,\n    vec_box: Trait[],\n    vec_rc: Trait[],\n}\n\nexport function rust_mem_leaked(): number;\nexport function test(vec: Example[]): Example[];\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_trait_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function test(vec) {\n    let buf = _ffi_new_WriteBuf();\n    let vec_len = vec.length;\n    _ffi_vec_Example_to_rust(vec, buf);\n    let multi_ret = _ffi_exports._ffi_fn_test(_ffi_buf_to_rust(buf), vec_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = _ffi_vec_Example_from_rust(ret_len, buf2);\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nlet _ffi_len = 0;\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_reg_Box_Trait = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Box_Trait(ptr));\nlet _ffi_reg_Rc_Trait = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Rc_Trait(ptr));\nlet _ffi_u8;\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nconst _ffi_Box_Trait = class Trait {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Box_Trait.register(this, _);\n    }\n\n    get() {\n        return _ffi_exports._ffi_Box_Trait__get(this._);\n    }\n};\n\nconst _ffi_Rc_Trait = class Trait {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Trait.register(this, _);\n    }\n\n    get() {\n        return _ffi_exports._ffi_Rc_Trait__get(this._);\n    }\n};\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf) {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_string_from_rust(ptr, len, cap) {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_string_to_rust(str) {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_vec_Example_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push({\n            box_ptr: new _ffi_Box_Trait(_ffi_read_i32(buf)),\n            rc_ptr: new _ffi_Rc_Trait(_ffi_read_i32(buf)),\n            text: _ffi_string_from_rust(_ffi_read_i32(buf), _ffi_read_u32(buf), _ffi_read_u32(buf)),\n            vec_box: _ffi_vec_box_dyn_Trait_from_rust(_ffi_read_u32(buf), buf),\n            vec_rc: _ffi_vec_rc_dyn_Trait_from_rust(_ffi_read_u32(buf), buf)\n        });\n    }\n    return items;\n}\n\nfunction _ffi_vec_Example_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, _ffi_handle_alloc(item.box_ptr));\n        _ffi_write_i32(buf, _ffi_handle_alloc(item.rc_ptr));\n        let item_text_ptr = _ffi_string_to_rust(item.text), item_text_len = _ffi_len;\n        _ffi_write_i32(buf, item_text_ptr);\n        _ffi_write_i32(buf, item_text_len);\n        _ffi_write_i32(buf, item.vec_box.length);\n        _ffi_vec_box_dyn_Trait_to_rust(item.vec_box, buf);\n        _ffi_write_i32(buf, item.vec_rc.length);\n        _ffi_vec_rc_dyn_Trait_to_rust(item.vec_rc, buf);\n    }\n}\n\nfunction _ffi_vec_box_dyn_Trait_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(new _ffi_Box_Trait(_ffi_read_i32(buf)));\n    }\n    return items;\n}\n\nfunction _ffi_vec_box_dyn_Trait_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, _ffi_handle_alloc(item));\n    }\n}\n\nfunction _ffi_vec_rc_dyn_Trait_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(new _ffi_Rc_Trait(_ffi_read_i32(buf)));\n    }\n    return items;\n}\n\nfunction _ffi_vec_rc_dyn_Trait_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, _ffi_handle_alloc(item));\n    }\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_Trait__get(self) {\n        return _ffi_handles.get(self).get();\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_trait_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Trait {\n    get(): number;\n}\n\nexport interface Example {\n    box_ptr: Trait,\n    rc_ptr: Trait,\n    text: string,\n    vec_box: Trait[],\n    vec_rc: Trait[],\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function test(vec: Example[]): Example[] {\n    let buf = _ffi_new_WriteBuf();\n    let vec_len = vec.length;\n    _ffi_vec_Example_to_rust(vec, buf);\n    let multi_ret = _ffi_exports._ffi_fn_test(_ffi_buf_to_rust(buf), vec_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = _ffi_vec_Example_from_rust(ret_len, buf2);\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nlet _ffi_len = 0;\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_reg_Box_Trait = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Box_Trait(ptr));\nlet _ffi_reg_Rc_Trait = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Rc_Trait(ptr));\nlet _ffi_u8: Uint8Array;\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nconst _ffi_Box_Trait = class Trait implements Trait {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Box_Trait.register(this, _);\n    }\n\n    get(): number {\n        return _ffi_exports._ffi_Box_Trait__get(this._);\n    }\n};\n\nconst _ffi_Rc_Trait = class Trait implements Trait {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Trait.register(this, _);\n    }\n\n    get(): number {\n        return _ffi_exports._ffi_Rc_Trait__get(this._);\n    }\n};\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_string_from_rust(ptr: number, len: number, cap: number): string {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_string_to_rust(str: string): number {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_vec_Example_from_rust(len: number, buf: _ffi_ReadBuf): Example[] {\n    let items: Example[] = [];\n    while (items.length < len) {\n        items.push({\n            box_ptr: new _ffi_Box_Trait(_ffi_read_i32(buf)),\n            rc_ptr: new _ffi_Rc_Trait(_ffi_read_i32(buf)),\n            text: _ffi_string_from_rust(_ffi_read_i32(buf), _ffi_read_u32(buf), _ffi_read_u32(buf)),\n            vec_box: _ffi_vec_box_dyn_Trait_from_rust(_ffi_read_u32(buf), buf),\n            vec_rc: _ffi_vec_rc_dyn_Trait_from_rust(_ffi_read_u32(buf), buf)\n        });\n    }\n    return items;\n}\n\nfunction _ffi_vec_Example_to_rust(items: Example[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, _ffi_handle_alloc(item.box_ptr));\n        _ffi_write_i32(buf, _ffi_handle_alloc(item.rc_ptr));\n        let item_text_ptr = _ffi_string_to_rust(item.text), item_text_len = _ffi_len;\n        _ffi_write_i32(buf, item_text_ptr);\n        _ffi_write_i32(buf, item_text_len);\n        _ffi_write_i32(buf, item.vec_box.length);\n        _ffi_vec_box_dyn_Trait_to_rust(item.vec_box, buf);\n        _ffi_write_i32(buf, item.vec_rc.length);\n        _ffi_vec_rc_dyn_Trait_to_rust(item.vec_rc, buf);\n    }\n}\n\nfunction _ffi_vec_box_dyn_Trait_from_rust(len: number, buf: _ffi_ReadBuf): Trait[] {\n    let items: Trait[] = [];\n    while (items.length < len) {\n        items.push(new _ffi_Box_Trait(_ffi_read_i32(buf)));\n    }\n    return items;\n}\n\nfunction _ffi_vec_box_dyn_Trait_to_rust(items: Trait[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, _ffi_handle_alloc(item));\n    }\n}\n\nfunction _ffi_vec_rc_dyn_Trait_from_rust(len: number, buf: _ffi_ReadBuf): Trait[] {\n    let items: Trait[] = [];\n    while (items.length < len) {\n        items.push(new _ffi_Rc_Trait(_ffi_read_i32(buf)));\n    }\n    return items;\n}\n\nfunction _ffi_vec_rc_dyn_Trait_to_rust(items: Trait[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, _ffi_handle_alloc(item));\n    }\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Box_Trait__get: (_self: number) => number,\n    _ffi_Rc_Trait__get: (_self: number) => number,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_test: (buf_ptr: number, vec_len: number) => number,\n    _ffi_rs_drop_Box_Trait: (ptr: number) => void,\n    _ffi_rs_drop_Rc_Trait: (ptr: number) => void,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {\n    _ffi_js_Trait__get(self: number): number {\n        return _ffi_handles.get(self).get();\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_trait_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Box_Trait__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Trait>) };\n    _self.get()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Trait__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Trait>) };\n    _self.get()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test(buf_ptr: *const u8, vec_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = test(_ffi_vec_Example_from_js(vec_len, &mut buf_end));\n    let mut buf2 = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_Example_to_js(ret, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Trait(*const u8);\n\nimpl Drop for _ffi_rs_Trait {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Trait for _ffi_rs_Trait {\n    fn get(&self) -> i32 {\n        extern \"C\" { fn _ffi_js_Trait__get(_: *const u8) -> i32; }\n        unsafe { _ffi_js_Trait__get(self.0) }\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Box_Trait(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Trait>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Rc_Trait(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Trait>) });\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Example_from_js(len: usize, end: &mut *const u8) -> Vec<Example> {\n    let mut items = Vec::<Example>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Example {\n            box_ptr: Box::new(_ffi_rs_Trait(_ffi_read::<*const u8>(end))),\n            rc_ptr: std::rc::Rc::new(_ffi_rs_Trait(_ffi_read::<*const u8>(end))),\n            text: _ffi_string_from_host(_ffi_read::<*const u8>(end), _ffi_read::<usize>(end)),\n            vec_box: _ffi_vec_box_dyn_Trait_from_js(_ffi_read::<usize>(end), end),\n            vec_rc: _ffi_vec_rc_dyn_Trait_from_js(_ffi_read::<usize>(end), end)\n        });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Example_to_js(items: Vec<Example>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item.box_ptr)) as *const u8, buf);\n        _ffi_write(Box::into_raw(Box::new(item.rc_ptr)) as *const u8, buf);\n        let (item_text_ptr, item_text_len, item_text_cap) = _ffi_string_to_host(item.text);\n        _ffi_write(item_text_ptr, buf);\n        _ffi_write(item_text_len, buf);\n        _ffi_write(item_text_cap, buf);\n        _ffi_write(item.vec_box.len(), buf);\n        _ffi_vec_box_dyn_Trait_to_js(item.vec_box, buf);\n        _ffi_write(item.vec_rc.len(), buf);\n        _ffi_vec_rc_dyn_Trait_to_js(item.vec_rc, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_box_dyn_Trait_from_js(len: usize, end: &mut *const u8) -> Vec<Box<dyn Trait>> {\n    let mut items = Vec::<Box<dyn Trait>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Box::new(_ffi_rs_Trait(_ffi_read::<*const u8>(end))));\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_box_dyn_Trait_to_js(items: Vec<Box<dyn Trait>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item)) as *const u8, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_rc_dyn_Trait_from_js(len: usize, end: &mut *const u8) -> Vec<std::rc::Rc<dyn Trait>> {\n    let mut items = Vec::<std::rc::Rc<dyn Trait>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(std::rc::Rc::new(_ffi_rs_Trait(_ffi_read::<*const u8>(end))));\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_rc_dyn_Trait_to_js(items: Vec<std::rc::Rc<dyn Trait>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item)) as *const u8, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_trait_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Trait {\n    get(): number;\n}\n\nexport interface Example {\n    box_ptr: Trait,\n    rc_ptr: Trait,\n    text: string,\n    vec_box: Trait[],\n    vec_rc: Trait[],\n}\n\nexport function rust_mem_leaked(): number;\nexport function test(vec: Example[]): Example[];\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_trait_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function test(vec) {\n    let buf = _ffi_new_WriteBuf();\n    let vec_len = vec.length;\n    _ffi_vec_Example_to_rust(vec, buf);\n    let multi_ret = _ffi_exports._ffi_fn_test(_ffi_buf_to_rust(buf), vec_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = _ffi_vec_Example_from_rust(ret_len, buf2);\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nlet _ffi_len = 0;\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_reg_Box_Trait = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Box_Trait(ptr));\nlet _ffi_reg_Rc_Trait = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Rc_Trait(ptr));\nlet _ffi_u8;\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nconst _ffi_Box_Trait = class Trait {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Box_Trait.register(this, _);\n    }\n\n    get() {\n        return _ffi_exports._ffi_Box_Trait__get(this._);\n    }\n};\n\nconst _ffi_Rc_Trait = class Trait {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Trait.register(this, _);\n    }\n\n    get() {\n        return _ffi_exports._ffi_Rc_Trait__get(this._);\n    }\n};\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf) {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_string_from_rust(ptr, len, cap) {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_string_to_rust(str) {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_vec_Example_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push({\n            box_ptr: new _ffi_Box_Trait(_ffi_read_i32(buf)),\n            rc_ptr: new _ffi_Rc_Trait(_ffi_read_i32(buf)),\n            text: _ffi_string_from_rust(_ffi_read_i32(buf), _ffi_read_u32(buf), _ffi_read_u32(buf)),\n            vec_box: _ffi_vec_box_dyn_Trait_from_rust(_ffi_read_u32(buf), buf),\n            vec_rc: _ffi_vec_rc_dyn_Trait_from_rust(_ffi_read_u32(buf), buf)\n        });\n    }\n    return items;\n}\n\nfunction _ffi_vec_Example_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, _ffi_handle_alloc(item.box_ptr));\n        _ffi_write_i32(buf, _ffi_handle_alloc(item.rc_ptr));\n        let item_text_ptr = _ffi_string_to_rust(item.text), item_text_len = _ffi_len;\n        _ffi_write_i32(buf, item_text_ptr);\n        _ffi_write_i32(buf, item_text_len);\n        _ffi_write_i32(buf, item.vec_box.length);\n        _ffi_vec_box_dyn_Trait_to_rust(item.vec_box, buf);\n        _ffi_write_i32(buf, item.vec_rc.length);\n        _ffi_vec_rc_dyn_Trait_to_rust(item.vec_rc, buf);\n    }\n}\n\nfunction _ffi_vec_box_dyn_Trait_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(new _ffi_Box_Trait(_ffi_read_i32(buf)));\n    }\n    return items;\n}\n\nfunction _ffi_vec_box_dyn_Trait_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, _ffi_handle_alloc(item));\n    }\n}\n\nfunction _ffi_vec_rc_dyn_Trait_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(new _ffi_Rc_Trait(_ffi_read_i32(buf)));\n    }\n    return items;\n}\n\nfunction _ffi_vec_rc_dyn_Trait_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, _ffi_handle_alloc(item));\n    }\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_Trait__get(self) {\n        return _ffi_handles.get(self).get();\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_trait_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Trait {\n    get(): number;\n}\n\nexport interface Example {\n    box_ptr: Trait,\n    rc_ptr: Trait,\n    text: string,\n    vec_box: Trait[],\n    vec_rc: Trait[],\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function test(vec: Example[]): Example[] {\n    let buf = _ffi_new_WriteBuf();\n    let vec_len = vec.length;\n    _ffi_vec_Example_to_rust(vec, buf);\n    let multi_ret = _ffi_exports._ffi_fn_test(_ffi_buf_to_rust(buf), vec_len);\n    let buf_ptr2 = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf2 = _ffi_new_ReadBuf(buf_ptr2);\n    let ret = _ffi_vec_Example_from_rust(ret_len, buf2);\n    _ffi_exports._ffi_dealloc(buf_ptr2, buf_cap);\n    return ret;\n}\n\nlet _ffi_len = 0;\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_reg_Box_Trait = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Box_Trait(ptr));\nlet _ffi_reg_Rc_Trait = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Rc_Trait(ptr));\nlet _ffi_u8: Uint8Array;\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nconst _ffi_Box_Trait = class Trait implements Trait {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Box_Trait.register(this, _);\n    }\n\n    get(): number {\n        return _ffi_exports._ffi_Box_Trait__get(this._);\n    }\n};\n\nconst _ffi_Rc_Trait = class Trait implements Trait {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Trait.register(this, _);\n    }\n\n    get(): number {\n        return _ffi_exports._ffi_Rc_Trait__get(this._);\n    }\n};\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_string_from_rust(ptr: number, len: number, cap: number): string {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_string_to_rust(str: string): number {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_vec_Example_from_rust(len: number, buf: _ffi_ReadBuf): Example[] {\n    let items: Example[] = [];\n    while (items.length < len) {\n        items.push({\n            box_ptr: new _ffi_Box_Trait(_ffi_read_i32(buf)),\n            rc_ptr: new _ffi_Rc_Trait(_ffi_read_i32(buf)),\n            text: _ffi_string_from_rust(_ffi_read_i32(buf), _ffi_read_u32(buf), _ffi_read_u32(buf)),\n            vec_box: _ffi_vec_box_dyn_Trait_from_rust(_ffi_read_u32(buf), buf),\n            vec_rc: _ffi_vec_rc_dyn_Trait_from_rust(_ffi_read_u32(buf), buf)\n        });\n    }\n    return items;\n}\n\nfunction _ffi_vec_Example_to_rust(items: Example[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, _ffi_handle_alloc(item.box_ptr));\n        _ffi_write_i32(buf, _ffi_handle_alloc(item.rc_ptr));\n        let item_text_ptr = _ffi_string_to_rust(item.text), item_text_len = _ffi_len;\n        _ffi_write_i32(buf, item_text_ptr);\n        _ffi_write_i32(buf, item_text_len);\n        _ffi_write_i32(buf, item.vec_box.length);\n        _ffi_vec_box_dyn_Trait_to_rust(item.vec_box, buf);\n        _ffi_write_i32(buf, item.vec_rc.length);\n        _ffi_vec_rc_dyn_Trait_to_rust(item.vec_rc, buf);\n    }\n}\n\nfunction _ffi_vec_box_dyn_Trait_from_rust(len: number, buf: _ffi_ReadBuf): Trait[] {\n    let items: Trait[] = [];\n    while (items.length < len) {\n        items.push(new _ffi_Box_Trait(_ffi_read_i32(buf)));\n    }\n    return items;\n}\n\nfunction _ffi_vec_box_dyn_Trait_to_rust(items: Trait[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, _ffi_handle_alloc(item));\n    }\n}\n\nfunction _ffi_vec_rc_dyn_Trait_from_rust(len: number, buf: _ffi_ReadBuf): Trait[] {\n    let items: Trait[] = [];\n    while (items.length < len) {\n        items.push(new _ffi_Rc_Trait(_ffi_read_i32(buf)));\n    }\n    return items;\n}\n\nfunction _ffi_vec_rc_dyn_Trait_to_rust(items: Trait[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, _ffi_handle_alloc(item));\n    }\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Box_Trait__get: (_self: number) => number,\n    _ffi_Rc_Trait__get: (_self: number) => number,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_test: (buf_ptr: number, vec_len: number) => number,\n    _ffi_rs_drop_Box_Trait: (ptr: number) => void,\n    _ffi_rs_drop_Rc_Trait: (ptr: number) => void,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {\n    _ffi_js_Trait__get(self: number): number {\n        return _ffi_handles.get(self).get();\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_demo_trait_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Box_Trait__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Trait>) };\n    _self.get()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Trait__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Trait>) };\n    _self.get()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test(buf_ptr: *const u8, vec_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let ret = test(_ffi_vec_Example_from_js(vec_len, &mut buf_end));\n    let mut buf2 = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_Example_to_js(ret, &mut buf2);\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    let (buf_ptr2, buf_cap) = _ffi_buf_to_host(buf2);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr2, buf_cap, ret_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Trait(*const u8);\n\nimpl Drop for _ffi_rs_Trait {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Trait for _ffi_rs_Trait {\n    fn get(&self) -> i32 {\n        unsafe extern \"C\" { fn _ffi_js_Trait__get(_: *const u8) -> i32; }\n        unsafe { _ffi_js_Trait__get(self.0) }\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Box_Trait(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Trait>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Rc_Trait(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Trait>) });\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Example_from_js(len: usize, end: &mut *const u8) -> Vec<Example> {\n    let mut items = Vec::<Example>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Example {\n            box_ptr: Box::new(_ffi_rs_Trait(_ffi_read::<*const u8>(end))),\n            rc_ptr: std::rc::Rc::new(_ffi_rs_Trait(_ffi_read::<*const u8>(end))),\n            text: _ffi_string_from_host(_ffi_read::<*const u8>(end), _ffi_read::<usize>(end)),\n            vec_box: _ffi_vec_box_dyn_Trait_from_js(_ffi_read::<usize>(end), end),\n            vec_rc: _ffi_vec_rc_dyn_Trait_from_js(_ffi_read::<usize>(end), end)\n        });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Example_to_js(items: Vec<Example>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item.box_ptr)) as *const u8, buf);\n        _ffi_write(Box::into_raw(Box::new(item.rc_ptr)) as *const u8, buf);\n        let (item_text_ptr, item_text_len, item_text_cap) = _ffi_string_to_host(item.text);\n        _ffi_write(item_text_ptr, buf);\n        _ffi_write(item_text_len, buf);\n        _ffi_write(item_text_cap, buf);\n        _ffi_write(item.vec_box.len(), buf);\n        _ffi_vec_box_dyn_Trait_to_js(item.vec_box, buf);\n        _ffi_write(item.vec_rc.len(), buf);\n        _ffi_vec_rc_dyn_Trait_to_js(item.vec_rc, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_box_dyn_Trait_from_js(len: usize, end: &mut *const u8) -> Vec<Box<dyn Trait>> {\n    let mut items = Vec::<Box<dyn Trait>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Box::new(_ffi_rs_Trait(_ffi_read::<*const u8>(end))));\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_box_dyn_Trait_to_js(items: Vec<Box<dyn Trait>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item)) as *const u8, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_rc_dyn_Trait_from_js(len: usize, end: &mut *const u8) -> Vec<std::rc::Rc<dyn Trait>> {\n    let mut items = Vec::<std::rc::Rc<dyn Trait>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(std::rc::Rc::new(_ffi_rs_Trait(_ffi_read::<*const u8>(end))));\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_rc_dyn_Trait_to_js(items: Vec<std::rc::Rc<dyn Trait>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(Box::into_raw(Box::new(item)) as *const u8, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_basic_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function add_bool(x: boolean, y: boolean): boolean;\nexport function add_u8(x: number, y: number): number;\nexport function add_u16(x: number, y: number): number;\nexport function add_u32(x: number, y: number): number;\nexport function add_usize(x: number, y: number): number;\nexport function add_u64(x: bigint, y: bigint): bigint;\nexport function add_i8(x: number, y: number): number;\nexport function add_i16(x: number, y: number): number;\nexport function add_i32(x: number, y: number): number;\nexport function add_isize(x: number, y: number): number;\nexport function add_i64(x: bigint, y: bigint): bigint;\nexport function add_f32(x: number, y: number): number;\nexport function add_f64(x: number, y: number): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_basic_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function add_bool(x, y) {\n    let ret = _ffi_exports._ffi_fn_add_bool(x, y);\n    return !!ret;\n}\n\nexport function add_u8(x, y) {\n    return _ffi_exports._ffi_fn_add_u8(x, y);\n}\n\nexport function add_u16(x, y) {\n    return _ffi_exports._ffi_fn_add_u16(x, y);\n}\n\nexport function add_u32(x, y) {\n    return _ffi_exports._ffi_fn_add_u32(x, y);\n}\n\nexport function add_usize(x, y) {\n    return _ffi_exports._ffi_fn_add_usize(x, y);\n}\n\nexport function add_u64(x, y) {\n    return _ffi_exports._ffi_fn_add_u64(x, y);\n}\n\nexport function add_i8(x, y) {\n    return _ffi_exports._ffi_fn_add_i8(x, y);\n}\n\nexport function add_i16(x, y) {\n    return _ffi_exports._ffi_fn_add_i16(x, y);\n}\n\nexport function add_i32(x, y) {\n    return _ffi_exports._ffi_fn_add_i32(x, y);\n}\n\nexport function add_isize(x, y) {\n    return _ffi_exports._ffi_fn_add_isize(x, y);\n}\n\nexport function add_i64(x, y) {\n    return _ffi_exports._ffi_fn_add_i64(x, y);\n}\n\nexport function add_f32(x, y) {\n    return _ffi_exports._ffi_fn_add_f32(x, y);\n}\n\nexport function add_f64(x, y) {\n    return _ffi_exports._ffi_fn_add_f64(x, y);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_basic_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function add_bool(x: boolean, y: boolean): boolean {\n    let ret = _ffi_exports._ffi_fn_add_bool(x, y);\n    return !!ret;\n}\n\nexport function add_u8(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_u8(x, y);\n}\n\nexport function add_u16(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_u16(x, y);\n}\n\nexport function add_u32(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_u32(x, y);\n}\n\nexport function add_usize(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_usize(x, y);\n}\n\nexport function add_u64(x: bigint, y: bigint): bigint {\n    return _ffi_exports._ffi_fn_add_u64(x, y);\n}\n\nexport function add_i8(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_i8(x, y);\n}\n\nexport function add_i16(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_i16(x, y);\n}\n\nexport function add_i32(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_i32(x, y);\n}\n\nexport function add_isize(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_isize(x, y);\n}\n\nexport function add_i64(x: bigint, y: bigint): bigint {\n    return _ffi_exports._ffi_fn_add_i64(x, y);\n}\n\nexport function add_f32(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_f32(x, y);\n}\n\nexport function add_f64(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_f64(x, y);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_add_bool: (x: boolean, y: boolean) => boolean,\n    _ffi_fn_add_f32: (x: number, y: number) => number,\n    _ffi_fn_add_f64: (x: number, y: number) => number,\n    _ffi_fn_add_i16: (x: number, y: number) => number,\n    _ffi_fn_add_i32: (x: number, y: number) => number,\n    _ffi_fn_add_i64: (x: bigint, y: bigint) => bigint,\n    _ffi_fn_add_i8: (x: number, y: number) => number,\n    _ffi_fn_add_isize: (x: number, y: number) => number,\n    _ffi_fn_add_u16: (x: number, y: number) => number,\n    _ffi_fn_add_u32: (x: number, y: number) => number,\n    _ffi_fn_add_u64: (x: bigint, y: bigint) => bigint,\n    _ffi_fn_add_u8: (x: number, y: number) => number,\n    _ffi_fn_add_usize: (x: number, y: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_basic_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_bool(x: bool, y: bool) -> bool {\n    add_bool(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_f32(x: f32, y: f32) -> f32 {\n    add_f32(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_f64(x: f64, y: f64) -> f64 {\n    add_f64(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_i16(x: i16, y: i16) -> i16 {\n    add_i16(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_i32(x: i32, y: i32) -> i32 {\n    add_i32(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_i64(x: i64, y: i64) -> i64 {\n    add_i64(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_i8(x: i8, y: i8) -> i8 {\n    add_i8(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_isize(x: isize, y: isize) -> isize {\n    add_isize(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_u16(x: u16, y: u16) -> u16 {\n    add_u16(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_u32(x: u32, y: u32) -> u32 {\n    add_u32(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_u64(x: u64, y: u64) -> u64 {\n    add_u64(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_u8(x: u8, y: u8) -> u8 {\n    add_u8(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_usize(x: usize, y: usize) -> usize {\n    add_usize(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_basic_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function add_bool(x: boolean, y: boolean): boolean;\nexport function add_u8(x: number, y: number): number;\nexport function add_u16(x: number, y: number): number;\nexport function add_u32(x: number, y: number): number;\nexport function add_usize(x: number, y: number): number;\nexport function add_u64(x: bigint, y: bigint): bigint;\nexport function add_i8(x: number, y: number): number;\nexport function add_i16(x: number, y: number): number;\nexport function add_i32(x: number, y: number): number;\nexport function add_isize(x: number, y: number): number;\nexport function add_i64(x: bigint, y: bigint): bigint;\nexport function add_f32(x: number, y: number): number;\nexport function add_f64(x: number, y: number): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_basic_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function add_bool(x, y) {\n    let ret = _ffi_exports._ffi_fn_add_bool(x, y);\n    return !!ret;\n}\n\nexport function add_u8(x, y) {\n    return _ffi_exports._ffi_fn_add_u8(x, y);\n}\n\nexport function add_u16(x, y) {\n    return _ffi_exports._ffi_fn_add_u16(x, y);\n}\n\nexport function add_u32(x, y) {\n    return _ffi_exports._ffi_fn_add_u32(x, y);\n}\n\nexport function add_usize(x, y) {\n    return _ffi_exports._ffi_fn_add_usize(x, y);\n}\n\nexport function add_u64(x, y) {\n    return _ffi_exports._ffi_fn_add_u64(x, y);\n}\n\nexport function add_i8(x, y) {\n    return _ffi_exports._ffi_fn_add_i8(x, y);\n}\n\nexport function add_i16(x, y) {\n    return _ffi_exports._ffi_fn_add_i16(x, y);\n}\n\nexport function add_i32(x, y) {\n    return _ffi_exports._ffi_fn_add_i32(x, y);\n}\n\nexport function add_isize(x, y) {\n    return _ffi_exports._ffi_fn_add_isize(x, y);\n}\n\nexport function add_i64(x, y) {\n    return _ffi_exports._ffi_fn_add_i64(x, y);\n}\n\nexport function add_f32(x, y) {\n    return _ffi_exports._ffi_fn_add_f32(x, y);\n}\n\nexport function add_f64(x, y) {\n    return _ffi_exports._ffi_fn_add_f64(x, y);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_basic_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function add_bool(x: boolean, y: boolean): boolean {\n    let ret = _ffi_exports._ffi_fn_add_bool(x, y);\n    return !!ret;\n}\n\nexport function add_u8(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_u8(x, y);\n}\n\nexport function add_u16(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_u16(x, y);\n}\n\nexport function add_u32(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_u32(x, y);\n}\n\nexport function add_usize(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_usize(x, y);\n}\n\nexport function add_u64(x: bigint, y: bigint): bigint {\n    return _ffi_exports._ffi_fn_add_u64(x, y);\n}\n\nexport function add_i8(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_i8(x, y);\n}\n\nexport function add_i16(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_i16(x, y);\n}\n\nexport function add_i32(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_i32(x, y);\n}\n\nexport function add_isize(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_isize(x, y);\n}\n\nexport function add_i64(x: bigint, y: bigint): bigint {\n    return _ffi_exports._ffi_fn_add_i64(x, y);\n}\n\nexport function add_f32(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_f32(x, y);\n}\n\nexport function add_f64(x: number, y: number): number {\n    return _ffi_exports._ffi_fn_add_f64(x, y);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_add_bool: (x: boolean, y: boolean) => boolean,\n    _ffi_fn_add_f32: (x: number, y: number) => number,\n    _ffi_fn_add_f64: (x: number, y: number) => number,\n    _ffi_fn_add_i16: (x: number, y: number) => number,\n    _ffi_fn_add_i32: (x: number, y: number) => number,\n    _ffi_fn_add_i64: (x: bigint, y: bigint) => bigint,\n    _ffi_fn_add_i8: (x: number, y: number) => number,\n    _ffi_fn_add_isize: (x: number, y: number) => number,\n    _ffi_fn_add_u16: (x: number, y: number) => number,\n    _ffi_fn_add_u32: (x: number, y: number) => number,\n    _ffi_fn_add_u64: (x: bigint, y: bigint) => bigint,\n    _ffi_fn_add_u8: (x: number, y: number) => number,\n    _ffi_fn_add_usize: (x: number, y: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_basic_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_bool(x: bool, y: bool) -> bool {\n    add_bool(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_f32(x: f32, y: f32) -> f32 {\n    add_f32(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_f64(x: f64, y: f64) -> f64 {\n    add_f64(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_i16(x: i16, y: i16) -> i16 {\n    add_i16(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_i32(x: i32, y: i32) -> i32 {\n    add_i32(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_i64(x: i64, y: i64) -> i64 {\n    add_i64(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_i8(x: i8, y: i8) -> i8 {\n    add_i8(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_isize(x: isize, y: isize) -> isize {\n    add_isize(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_u16(x: u16, y: u16) -> u16 {\n    add_u16(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_u32(x: u32, y: u32) -> u32 {\n    add_u32(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_u64(x: u64, y: u64) -> u64 {\n    add_u64(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_u8(x: u8, y: u8) -> u8 {\n    add_u8(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_usize(x: usize, y: usize) -> usize {\n    add_usize(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_basic_void_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function add_void(x: number, y: number): void;\nexport function add_empty_tuple(x: number, y: number): undefined;\nexport function get_result(): number;\nexport function wild_arg(_1: number, _2: undefined, _3: number): undefined;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_basic_void_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function add_void(x, y) {\n    _ffi_exports._ffi_fn_add_void(x, y);\n}\n\nexport function add_empty_tuple(x, y) {\n    _ffi_exports._ffi_fn_add_empty_tuple(x, y);\n    return undefined;\n}\n\nexport function get_result() {\n    return _ffi_exports._ffi_fn_get_result();\n}\n\nexport function wild_arg(_1, _2, _3) {\n    _ffi_exports._ffi_fn_wild_arg(_1, _3);\n    return undefined;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_basic_void_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function add_void(x: number, y: number): void {\n    _ffi_exports._ffi_fn_add_void(x, y);\n}\n\nexport function add_empty_tuple(x: number, y: number): undefined {\n    _ffi_exports._ffi_fn_add_empty_tuple(x, y);\n    return undefined;\n}\n\nexport function get_result(): number {\n    return _ffi_exports._ffi_fn_get_result();\n}\n\nexport function wild_arg(_1: number, _2: undefined, _3: number): undefined {\n    _ffi_exports._ffi_fn_wild_arg(_1, _3);\n    return undefined;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_add_empty_tuple: (x: number, y: number) => void,\n    _ffi_fn_add_void: (x: number, y: number) => void,\n    _ffi_fn_get_result: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_wild_arg: (_1: number, _3: number) => void,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_basic_void_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_empty_tuple(x: i32, y: i32) {\n    _ = add_empty_tuple(x, y);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_void(x: i32, y: i32) {\n    add_void(x, y);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_result() -> i32 {\n    get_result()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_wild_arg(_1: i32, _3: i32) {\n    _ = wild_arg(_1, (), _3);\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_basic_void_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function add_void(x: number, y: number): void;\nexport function add_empty_tuple(x: number, y: number): undefined;\nexport function get_result(): number;\nexport function wild_arg(_1: number, _2: undefined, _3: number): undefined;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_basic_void_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function add_void(x, y) {\n    _ffi_exports._ffi_fn_add_void(x, y);\n}\n\nexport function add_empty_tuple(x, y) {\n    _ffi_exports._ffi_fn_add_empty_tuple(x, y);\n    return undefined;\n}\n\nexport function get_result() {\n    return _ffi_exports._ffi_fn_get_result();\n}\n\nexport function wild_arg(_1, _2, _3) {\n    _ffi_exports._ffi_fn_wild_arg(_1, _3);\n    return undefined;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_basic_void_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function add_void(x: number, y: number): void {\n    _ffi_exports._ffi_fn_add_void(x, y);\n}\n\nexport function add_empty_tuple(x: number, y: number): undefined {\n    _ffi_exports._ffi_fn_add_empty_tuple(x, y);\n    return undefined;\n}\n\nexport function get_result(): number {\n    return _ffi_exports._ffi_fn_get_result();\n}\n\nexport function wild_arg(_1: number, _2: undefined, _3: number): undefined {\n    _ffi_exports._ffi_fn_wild_arg(_1, _3);\n    return undefined;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_add_empty_tuple: (x: number, y: number) => void,\n    _ffi_fn_add_void: (x: number, y: number) => void,\n    _ffi_fn_get_result: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_wild_arg: (_1: number, _3: number) => void,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_basic_void_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_empty_tuple(x: i32, y: i32) {\n    _ = add_empty_tuple(x, y);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_void(x: i32, y: i32) {\n    add_void(x, y);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_result() -> i32 {\n    get_result()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_wild_arg(_1: i32, _3: i32) {\n    _ = wild_arg(_1, (), _3);\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_box_in_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Tree {\n    value: number,\n    left: Tree | null,\n    right: Tree | null,\n}\n\nexport function rust_mem_leaked(): number;\nexport function sum_tree(tree: Tree): number;\nexport function check_nested(x: number): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_box_in_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function sum_tree(tree) {\n    let buf = _ffi_new_WriteBuf();\n    let has_tree_left = tree.left !== null;\n    if (tree.left !== null) {\n        let tree_left_val = tree.left;\n        _ffi_box_Tree_to_rust(tree_left_val, buf);\n    }\n    let has_tree_right = tree.right !== null;\n    if (tree.right !== null) {\n        let tree_right_val = tree.right;\n        _ffi_box_Tree_to_rust(tree_right_val, buf);\n    }\n    return _ffi_exports._ffi_fn_sum_tree(tree.value, _ffi_buf_to_rust(buf), has_tree_left, has_tree_right);\n}\n\nexport function check_nested(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_box_box_i32_to_rust(x, buf);\n    return _ffi_exports._ffi_fn_check_nested(_ffi_buf_to_rust(buf));\n}\n\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8;\n\nfunction _ffi_box_Tree_to_rust(val, buf) {\n    _ffi_write_i32(buf, val.value);\n    _ffi_write_i8(buf, +(val.left !== null));\n    if (val.left !== null) {\n        let val_left_val = val.left;\n        _ffi_box_Tree_to_rust(val_left_val, buf);\n    }\n    _ffi_write_i8(buf, +(val.right !== null));\n    if (val.right !== null) {\n        let val_right_val = val.right;\n        _ffi_box_Tree_to_rust(val_right_val, buf);\n    }\n}\n\nfunction _ffi_box_box_box_i32_to_rust(val, buf) {\n    _ffi_box_box_i32_to_rust(val, buf);\n}\n\nfunction _ffi_box_box_i32_to_rust(val, buf) {\n    _ffi_box_i32_to_rust(val, buf);\n}\n\nfunction _ffi_box_i32_to_rust(val, buf) {\n    _ffi_write_i32(buf, val);\n}\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf, val) {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv.setInt8(ptr, val);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_box_in_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Tree {\n    value: number,\n    left: Tree | null,\n    right: Tree | null,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function sum_tree(tree: Tree): number {\n    let buf = _ffi_new_WriteBuf();\n    let has_tree_left = tree.left !== null;\n    if (tree.left !== null) {\n        let tree_left_val = tree.left;\n        _ffi_box_Tree_to_rust(tree_left_val, buf);\n    }\n    let has_tree_right = tree.right !== null;\n    if (tree.right !== null) {\n        let tree_right_val = tree.right;\n        _ffi_box_Tree_to_rust(tree_right_val, buf);\n    }\n    return _ffi_exports._ffi_fn_sum_tree(tree.value, _ffi_buf_to_rust(buf), has_tree_left, has_tree_right);\n}\n\nexport function check_nested(x: number): number {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_box_box_i32_to_rust(x, buf);\n    return _ffi_exports._ffi_fn_check_nested(_ffi_buf_to_rust(buf));\n}\n\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8: Uint8Array;\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nfunction _ffi_box_Tree_to_rust(val: Tree, buf: _ffi_WriteBuf): void {\n    _ffi_write_i32(buf, val.value);\n    _ffi_write_i8(buf, +(val.left !== null));\n    if (val.left !== null) {\n        let val_left_val = val.left;\n        _ffi_box_Tree_to_rust(val_left_val, buf);\n    }\n    _ffi_write_i8(buf, +(val.right !== null));\n    if (val.right !== null) {\n        let val_right_val = val.right;\n        _ffi_box_Tree_to_rust(val_right_val, buf);\n    }\n}\n\nfunction _ffi_box_box_box_i32_to_rust(val: number, buf: _ffi_WriteBuf): void {\n    _ffi_box_box_i32_to_rust(val, buf);\n}\n\nfunction _ffi_box_box_i32_to_rust(val: number, buf: _ffi_WriteBuf): void {\n    _ffi_box_i32_to_rust(val, buf);\n}\n\nfunction _ffi_box_i32_to_rust(val: number, buf: _ffi_WriteBuf): void {\n    _ffi_write_i32(buf, val);\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv!.setInt8(ptr, val);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_check_nested: (buf_ptr: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_sum_tree: (tree_value: number, buf_ptr: number, has_tree_left: boolean, has_tree_right: boolean) => number,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_box_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Tree_from_js(end: &mut *const u8) -> Box<Tree> {\n    Box::new(Tree {\n        value: _ffi_read::<i32>(end),\n        left: _ffi_read::<bool>(end).then(|| _ffi_box_Tree_from_js(end)),\n        right: _ffi_read::<bool>(end).then(|| _ffi_box_Tree_from_js(end))\n    })\n}\n\nfn _ffi_box_box_box_i32_from_js(end: &mut *const u8) -> Box<Box<Box<i32>>> {\n    Box::new(_ffi_box_box_i32_from_js(end))\n}\n\nfn _ffi_box_box_i32_from_js(end: &mut *const u8) -> Box<Box<i32>> {\n    Box::new(_ffi_box_i32_from_js(end))\n}\n\nfn _ffi_box_i32_from_js(end: &mut *const u8) -> Box<i32> {\n    Box::new(_ffi_read::<i32>(end))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_nested(buf_ptr: *const u8) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = check_nested(_ffi_box_box_box_i32_from_js(&mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_tree(tree_value: i32, buf_ptr: *const u8, has_tree_left: bool, has_tree_right: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_tree(Tree {\n        value: tree_value,\n        left: has_tree_left.then(|| _ffi_box_Tree_from_js(&mut buf_end)),\n        right: has_tree_right.then(|| _ffi_box_Tree_from_js(&mut buf_end))\n    });\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_box_in_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Tree {\n    value: number,\n    left: Tree | null,\n    right: Tree | null,\n}\n\nexport function rust_mem_leaked(): number;\nexport function sum_tree(tree: Tree): number;\nexport function check_nested(x: number): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_box_in_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function sum_tree(tree) {\n    let buf = _ffi_new_WriteBuf();\n    let has_tree_left = tree.left !== null;\n    if (tree.left !== null) {\n        let tree_left_val = tree.left;\n        _ffi_box_Tree_to_rust(tree_left_val, buf);\n    }\n    let has_tree_right = tree.right !== null;\n    if (tree.right !== null) {\n        let tree_right_val = tree.right;\n        _ffi_box_Tree_to_rust(tree_right_val, buf);\n    }\n    return _ffi_exports._ffi_fn_sum_tree(tree.value, _ffi_buf_to_rust(buf), has_tree_left, has_tree_right);\n}\n\nexport function check_nested(x) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_box_box_i32_to_rust(x, buf);\n    return _ffi_exports._ffi_fn_check_nested(_ffi_buf_to_rust(buf));\n}\n\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8;\n\nfunction _ffi_box_Tree_to_rust(val, buf) {\n    _ffi_write_i32(buf, val.value);\n    _ffi_write_i8(buf, +(val.left !== null));\n    if (val.left !== null) {\n        let val_left_val = val.left;\n        _ffi_box_Tree_to_rust(val_left_val, buf);\n    }\n    _ffi_write_i8(buf, +(val.right !== null));\n    if (val.right !== null) {\n        let val_right_val = val.right;\n        _ffi_box_Tree_to_rust(val_right_val, buf);\n    }\n}\n\nfunction _ffi_box_box_box_i32_to_rust(val, buf) {\n    _ffi_box_box_i32_to_rust(val, buf);\n}\n\nfunction _ffi_box_box_i32_to_rust(val, buf) {\n    _ffi_box_i32_to_rust(val, buf);\n}\n\nfunction _ffi_box_i32_to_rust(val, buf) {\n    _ffi_write_i32(buf, val);\n}\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf, val) {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv.setInt8(ptr, val);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_box_in_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Tree {\n    value: number,\n    left: Tree | null,\n    right: Tree | null,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function sum_tree(tree: Tree): number {\n    let buf = _ffi_new_WriteBuf();\n    let has_tree_left = tree.left !== null;\n    if (tree.left !== null) {\n        let tree_left_val = tree.left;\n        _ffi_box_Tree_to_rust(tree_left_val, buf);\n    }\n    let has_tree_right = tree.right !== null;\n    if (tree.right !== null) {\n        let tree_right_val = tree.right;\n        _ffi_box_Tree_to_rust(tree_right_val, buf);\n    }\n    return _ffi_exports._ffi_fn_sum_tree(tree.value, _ffi_buf_to_rust(buf), has_tree_left, has_tree_right);\n}\n\nexport function check_nested(x: number): number {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_box_box_box_i32_to_rust(x, buf);\n    return _ffi_exports._ffi_fn_check_nested(_ffi_buf_to_rust(buf));\n}\n\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8: Uint8Array;\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nfunction _ffi_box_Tree_to_rust(val: Tree, buf: _ffi_WriteBuf): void {\n    _ffi_write_i32(buf, val.value);\n    _ffi_write_i8(buf, +(val.left !== null));\n    if (val.left !== null) {\n        let val_left_val = val.left;\n        _ffi_box_Tree_to_rust(val_left_val, buf);\n    }\n    _ffi_write_i8(buf, +(val.right !== null));\n    if (val.right !== null) {\n        let val_right_val = val.right;\n        _ffi_box_Tree_to_rust(val_right_val, buf);\n    }\n}\n\nfunction _ffi_box_box_box_i32_to_rust(val: number, buf: _ffi_WriteBuf): void {\n    _ffi_box_box_i32_to_rust(val, buf);\n}\n\nfunction _ffi_box_box_i32_to_rust(val: number, buf: _ffi_WriteBuf): void {\n    _ffi_box_i32_to_rust(val, buf);\n}\n\nfunction _ffi_box_i32_to_rust(val: number, buf: _ffi_WriteBuf): void {\n    _ffi_write_i32(buf, val);\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv!.setInt8(ptr, val);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_check_nested: (buf_ptr: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_sum_tree: (tree_value: number, buf_ptr: number, has_tree_left: boolean, has_tree_right: boolean) => number,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_box_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Tree_from_js(end: &mut *const u8) -> Box<Tree> {\n    Box::new(Tree {\n        value: _ffi_read::<i32>(end),\n        left: _ffi_read::<bool>(end).then(|| _ffi_box_Tree_from_js(end)),\n        right: _ffi_read::<bool>(end).then(|| _ffi_box_Tree_from_js(end))\n    })\n}\n\nfn _ffi_box_box_box_i32_from_js(end: &mut *const u8) -> Box<Box<Box<i32>>> {\n    Box::new(_ffi_box_box_i32_from_js(end))\n}\n\nfn _ffi_box_box_i32_from_js(end: &mut *const u8) -> Box<Box<i32>> {\n    Box::new(_ffi_box_i32_from_js(end))\n}\n\nfn _ffi_box_i32_from_js(end: &mut *const u8) -> Box<i32> {\n    Box::new(_ffi_read::<i32>(end))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_nested(buf_ptr: *const u8) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = check_nested(_ffi_box_box_box_i32_from_js(&mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_tree(tree_value: i32, buf_ptr: *const u8, has_tree_left: bool, has_tree_right: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_tree(Tree {\n        value: tree_value,\n        left: has_tree_left.then(|| _ffi_box_Tree_from_js(&mut buf_end)),\n        right: has_tree_right.then(|| _ffi_box_Tree_from_js(&mut buf_end))\n    });\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_box_out_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Tree {\n    value: number,\n    left: Tree | null,\n    right: Tree | null,\n}\n\nexport interface Nested {\n    0: number,\n}\n\nexport function rust_mem_leaked(): number;\nexport function get_tree(): Tree;\nexport function check_nested(x: number): Nested;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_box_out_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_tree() {\n    let multi_ret = _ffi_exports._ffi_fn_get_tree();\n    let ret_value = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_ptr = _ffi_dv.getInt32(multi_ret + 4, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    let has_ret_left = _ffi_dv.getUint8(multi_ret + 12);\n    let has_ret_right = _ffi_dv.getUint8(multi_ret + 13);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = {\n        value: ret_value,\n        left: has_ret_left ? _ffi_box_Tree_from_rust(buf) : null,\n        right: has_ret_right ? _ffi_box_Tree_from_rust(buf) : null\n    };\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function check_nested(x) {\n    let multi_ret = _ffi_exports._ffi_fn_check_nested(x);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = { 0: _ffi_box_box_box_i32_from_rust(buf) };\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_box_Tree_from_rust(buf) {\n    return {\n        value: _ffi_read_i32(buf),\n        left: _ffi_read_u8(buf) ? _ffi_box_Tree_from_rust(buf) : null,\n        right: _ffi_read_u8(buf) ? _ffi_box_Tree_from_rust(buf) : null\n    };\n}\n\nfunction _ffi_box_box_box_i32_from_rust(buf) {\n    return _ffi_box_box_i32_from_rust(buf);\n}\n\nfunction _ffi_box_box_i32_from_rust(buf) {\n    return _ffi_box_i32_from_rust(buf);\n}\n\nfunction _ffi_box_i32_from_rust(buf) {\n    return _ffi_read_i32(buf);\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u8(buf) {\n    return buf.dv.getUint8(buf.off++);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_box_out_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Tree {\n    value: number,\n    left: Tree | null,\n    right: Tree | null,\n}\n\nexport interface Nested {\n    0: number,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_tree(): Tree {\n    let multi_ret = _ffi_exports._ffi_fn_get_tree();\n    let ret_value = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_ptr = _ffi_dv.getInt32(multi_ret + 4, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    let has_ret_left = _ffi_dv.getUint8(multi_ret + 12);\n    let has_ret_right = _ffi_dv.getUint8(multi_ret + 13);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret: Tree = {\n        value: ret_value,\n        left: has_ret_left ? _ffi_box_Tree_from_rust(buf) : null,\n        right: has_ret_right ? _ffi_box_Tree_from_rust(buf) : null\n    };\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function check_nested(x: number): Nested {\n    let multi_ret = _ffi_exports._ffi_fn_check_nested(x);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret: Nested = { 0: _ffi_box_box_box_i32_from_rust(buf) };\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_box_Tree_from_rust(buf: _ffi_ReadBuf): Tree {\n    return {\n        value: _ffi_read_i32(buf),\n        left: _ffi_read_u8(buf) ? _ffi_box_Tree_from_rust(buf) : null,\n        right: _ffi_read_u8(buf) ? _ffi_box_Tree_from_rust(buf) : null\n    };\n}\n\nfunction _ffi_box_box_box_i32_from_rust(buf: _ffi_ReadBuf): number {\n    return _ffi_box_box_i32_from_rust(buf);\n}\n\nfunction _ffi_box_box_i32_from_rust(buf: _ffi_ReadBuf): number {\n    return _ffi_box_i32_from_rust(buf);\n}\n\nfunction _ffi_box_i32_from_rust(buf: _ffi_ReadBuf): number {\n    return _ffi_read_i32(buf);\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u8(buf: _ffi_ReadBuf): number {\n    return buf.dv.getUint8(buf.off++);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_check_nested: (x: number) => number,\n    _ffi_fn_get_tree: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_box_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Tree_to_js(val: Tree, buf: &mut Vec<u8>) {\n    _ffi_write(val.value, buf);\n    _ffi_write(val.left.is_some(), buf);\n    if let Some(val_left_val) = val.left {\n        _ffi_box_Tree_to_js(*val_left_val, buf);\n    }\n    _ffi_write(val.right.is_some(), buf);\n    if let Some(val_right_val) = val.right {\n        _ffi_box_Tree_to_js(*val_right_val, buf);\n    }\n}\n\nfn _ffi_box_box_box_i32_to_js(val: Box<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_box_box_i32_to_js(*val, buf);\n}\n\nfn _ffi_box_box_i32_to_js(val: Box<i32>, buf: &mut Vec<u8>) {\n    _ffi_box_i32_to_js(*val, buf);\n}\n\nfn _ffi_box_i32_to_js(val: i32, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_nested(x: i32) -> *const _ffi_ret_ptr_usize {\n    let ret = check_nested(x);\n    let mut buf = Vec::<u8>::new();\n    _ffi_box_box_box_i32_to_js(*ret.0, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_tree() -> *const _ffi_ret_i32_ptr_usize_2_bool {\n    let ret = get_tree();\n    let ret_value = ret.value;\n    let ret_left = ret.left;\n    let mut buf = Vec::<u8>::new();\n    let has_ret_left = ret_left.is_some();\n    if let Some(ret_left_val) = ret_left {\n        _ffi_box_Tree_to_js(*ret_left_val, &mut buf);\n    }\n    let ret_right = ret.right;\n    let has_ret_right = ret_right.is_some();\n    if let Some(ret_right_val) = ret_right {\n        _ffi_box_Tree_to_js(*ret_right_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_I32_PTR_USIZE_2_BOOL = _ffi_ret_i32_ptr_usize_2_bool(ret_value, buf_ptr, buf_cap, has_ret_left, has_ret_right);\n        std::ptr::addr_of!(_FFI_RET_I32_PTR_USIZE_2_BOOL)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr_usize_2_bool(i32, *const u8, usize, bool, bool);\nstatic mut _FFI_RET_I32_PTR_USIZE_2_BOOL: _ffi_ret_i32_ptr_usize_2_bool = _ffi_ret_i32_ptr_usize_2_bool(0, std::ptr::null(), 0, false, false);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\nstatic mut _FFI_RET_PTR_USIZE: _ffi_ret_ptr_usize = _ffi_ret_ptr_usize(std::ptr::null(), 0);\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_box_out_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Tree {\n    value: number,\n    left: Tree | null,\n    right: Tree | null,\n}\n\nexport interface Nested {\n    0: number,\n}\n\nexport function rust_mem_leaked(): number;\nexport function get_tree(): Tree;\nexport function check_nested(x: number): Nested;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_box_out_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_tree() {\n    let multi_ret = _ffi_exports._ffi_fn_get_tree();\n    let ret_value = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_ptr = _ffi_dv.getInt32(multi_ret + 4, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    let has_ret_left = _ffi_dv.getUint8(multi_ret + 12);\n    let has_ret_right = _ffi_dv.getUint8(multi_ret + 13);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = {\n        value: ret_value,\n        left: has_ret_left ? _ffi_box_Tree_from_rust(buf) : null,\n        right: has_ret_right ? _ffi_box_Tree_from_rust(buf) : null\n    };\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function check_nested(x) {\n    let multi_ret = _ffi_exports._ffi_fn_check_nested(x);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = { 0: _ffi_box_box_box_i32_from_rust(buf) };\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_box_Tree_from_rust(buf) {\n    return {\n        value: _ffi_read_i32(buf),\n        left: _ffi_read_u8(buf) ? _ffi_box_Tree_from_rust(buf) : null,\n        right: _ffi_read_u8(buf) ? _ffi_box_Tree_from_rust(buf) : null\n    };\n}\n\nfunction _ffi_box_box_box_i32_from_rust(buf) {\n    return _ffi_box_box_i32_from_rust(buf);\n}\n\nfunction _ffi_box_box_i32_from_rust(buf) {\n    return _ffi_box_i32_from_rust(buf);\n}\n\nfunction _ffi_box_i32_from_rust(buf) {\n    return _ffi_read_i32(buf);\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u8(buf) {\n    return buf.dv.getUint8(buf.off++);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_box_out_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Tree {\n    value: number,\n    left: Tree | null,\n    right: Tree | null,\n}\n\nexport interface Nested {\n    0: number,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_tree(): Tree {\n    let multi_ret = _ffi_exports._ffi_fn_get_tree();\n    let ret_value = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_ptr = _ffi_dv.getInt32(multi_ret + 4, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    let has_ret_left = _ffi_dv.getUint8(multi_ret + 12);\n    let has_ret_right = _ffi_dv.getUint8(multi_ret + 13);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret: Tree = {\n        value: ret_value,\n        left: has_ret_left ? _ffi_box_Tree_from_rust(buf) : null,\n        right: has_ret_right ? _ffi_box_Tree_from_rust(buf) : null\n    };\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function check_nested(x: number): Nested {\n    let multi_ret = _ffi_exports._ffi_fn_check_nested(x);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret: Nested = { 0: _ffi_box_box_box_i32_from_rust(buf) };\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_box_Tree_from_rust(buf: _ffi_ReadBuf): Tree {\n    return {\n        value: _ffi_read_i32(buf),\n        left: _ffi_read_u8(buf) ? _ffi_box_Tree_from_rust(buf) : null,\n        right: _ffi_read_u8(buf) ? _ffi_box_Tree_from_rust(buf) : null\n    };\n}\n\nfunction _ffi_box_box_box_i32_from_rust(buf: _ffi_ReadBuf): number {\n    return _ffi_box_box_i32_from_rust(buf);\n}\n\nfunction _ffi_box_box_i32_from_rust(buf: _ffi_ReadBuf): number {\n    return _ffi_box_i32_from_rust(buf);\n}\n\nfunction _ffi_box_i32_from_rust(buf: _ffi_ReadBuf): number {\n    return _ffi_read_i32(buf);\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u8(buf: _ffi_ReadBuf): number {\n    return buf.dv.getUint8(buf.off++);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_check_nested: (x: number) => number,\n    _ffi_fn_get_tree: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_box_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Tree_to_js(val: Tree, buf: &mut Vec<u8>) {\n    _ffi_write(val.value, buf);\n    _ffi_write(val.left.is_some(), buf);\n    if let Some(val_left_val) = val.left {\n        _ffi_box_Tree_to_js(*val_left_val, buf);\n    }\n    _ffi_write(val.right.is_some(), buf);\n    if let Some(val_right_val) = val.right {\n        _ffi_box_Tree_to_js(*val_right_val, buf);\n    }\n}\n\nfn _ffi_box_box_box_i32_to_js(val: Box<Box<i32>>, buf: &mut Vec<u8>) {\n    _ffi_box_box_i32_to_js(*val, buf);\n}\n\nfn _ffi_box_box_i32_to_js(val: Box<i32>, buf: &mut Vec<u8>) {\n    _ffi_box_i32_to_js(*val, buf);\n}\n\nfn _ffi_box_i32_to_js(val: i32, buf: &mut Vec<u8>) {\n    _ffi_write(val, buf);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_nested(x: i32) -> *const _ffi_ret_ptr_usize {\n    let ret = check_nested(x);\n    let mut buf = Vec::<u8>::new();\n    _ffi_box_box_box_i32_to_js(*ret.0, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_tree() -> *const _ffi_ret_i32_ptr_usize_2_bool {\n    let ret = get_tree();\n    let ret_value = ret.value;\n    let ret_left = ret.left;\n    let mut buf = Vec::<u8>::new();\n    let has_ret_left = ret_left.is_some();\n    if let Some(ret_left_val) = ret_left {\n        _ffi_box_Tree_to_js(*ret_left_val, &mut buf);\n    }\n    let ret_right = ret.right;\n    let has_ret_right = ret_right.is_some();\n    if let Some(ret_right_val) = ret_right {\n        _ffi_box_Tree_to_js(*ret_right_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_I32_PTR_USIZE_2_BOOL = _ffi_ret_i32_ptr_usize_2_bool(ret_value, buf_ptr, buf_cap, has_ret_left, has_ret_right);\n        std::ptr::addr_of!(_FFI_RET_I32_PTR_USIZE_2_BOOL)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr_usize_2_bool(i32, *const u8, usize, bool, bool);\nstatic mut _FFI_RET_I32_PTR_USIZE_2_BOOL: _ffi_ret_i32_ptr_usize_2_bool = _ffi_ret_i32_ptr_usize_2_bool(0, std::ptr::null(), 0, false, false);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\nstatic mut _FFI_RET_PTR_USIZE: _ffi_ret_ptr_usize = _ffi_ret_ptr_usize(std::ptr::null(), 0);\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_combo_in_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Foo {\n    x: [Bar, Bar[]],\n    y: [undefined, [number], [number, boolean]][],\n}\n\nexport interface Bar {\n    x: number,\n    y: Foo[],\n}\n\nexport function rust_mem_leaked(): number;\nexport function check_combo(foo: Foo): string;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_combo_in_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function check_combo(foo) {\n    let buf = _ffi_new_WriteBuf();\n    let foo_x_0_y_len = foo.x[0].y.length;\n    _ffi_vec_Foo_to_rust(foo.x[0].y, buf);\n    let foo_x_1_len = foo.x[1].length;\n    _ffi_vec_Bar_to_rust(foo.x[1], buf);\n    let foo_y_len = foo.y.length;\n    _ffi_vec__i32_f32_bool_to_rust(foo.y, buf);\n    let multi_ret = _ffi_exports._ffi_fn_check_combo(foo.x[0].x, _ffi_buf_to_rust(buf), foo_x_0_y_len, foo_x_1_len, foo_y_len);\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_dv;\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_string_from_rust(ptr, len, cap) {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_vec_Bar_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item.x);\n        _ffi_write_i32(buf, item.y.length);\n        _ffi_vec_Foo_to_rust(item.y, buf);\n    }\n}\n\nfunction _ffi_vec_Foo_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item.x[0].x);\n        _ffi_write_i32(buf, item.x[0].y.length);\n        _ffi_vec_Foo_to_rust(item.x[0].y, buf);\n        _ffi_write_i32(buf, item.x[1].length);\n        _ffi_vec_Bar_to_rust(item.x[1], buf);\n        _ffi_write_i32(buf, item.y.length);\n        _ffi_vec__i32_f32_bool_to_rust(item.y, buf);\n    }\n}\n\nfunction _ffi_vec__i32_f32_bool_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item[1][0]);\n        _ffi_write_f32(buf, item[2][0]);\n        _ffi_write_i8(buf, +(item[2][1]));\n    }\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_f32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setFloat32(ptr, val, true);\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf, val) {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv.setInt8(ptr, val);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_combo_in_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Foo {\n    x: [Bar, Bar[]],\n    y: [undefined, [number], [number, boolean]][],\n}\n\nexport interface Bar {\n    x: number,\n    y: Foo[],\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function check_combo(foo: Foo): string {\n    let buf = _ffi_new_WriteBuf();\n    let foo_x_0_y_len = foo.x[0].y.length;\n    _ffi_vec_Foo_to_rust(foo.x[0].y, buf);\n    let foo_x_1_len = foo.x[1].length;\n    _ffi_vec_Bar_to_rust(foo.x[1], buf);\n    let foo_y_len = foo.y.length;\n    _ffi_vec__i32_f32_bool_to_rust(foo.y, buf);\n    let multi_ret = _ffi_exports._ffi_fn_check_combo(foo.x[0].x, _ffi_buf_to_rust(buf), foo_x_0_y_len, foo_x_1_len, foo_y_len);\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8: Uint8Array;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_dv: DataView;\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_string_from_rust(ptr: number, len: number, cap: number): string {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_vec_Bar_to_rust(items: Bar[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item.x);\n        _ffi_write_i32(buf, item.y.length);\n        _ffi_vec_Foo_to_rust(item.y, buf);\n    }\n}\n\nfunction _ffi_vec_Foo_to_rust(items: Foo[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item.x[0].x);\n        _ffi_write_i32(buf, item.x[0].y.length);\n        _ffi_vec_Foo_to_rust(item.x[0].y, buf);\n        _ffi_write_i32(buf, item.x[1].length);\n        _ffi_vec_Bar_to_rust(item.x[1], buf);\n        _ffi_write_i32(buf, item.y.length);\n        _ffi_vec__i32_f32_bool_to_rust(item.y, buf);\n    }\n}\n\nfunction _ffi_vec__i32_f32_bool_to_rust(items: [undefined, [number], [number, boolean]][], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item[1][0]);\n        _ffi_write_f32(buf, item[2][0]);\n        _ffi_write_i8(buf, +(item[2][1]));\n    }\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_f32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setFloat32(ptr, val, true);\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv!.setInt8(ptr, val);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_check_combo: (foo_x_0_x: number, buf_ptr: number, foo_x_0_y_len: number, foo_x_1_len: number, foo_y_len: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_alloc: (len: number) => number,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_combo_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_combo(foo_x_0_x: i32, buf_ptr: *const u8, foo_x_0_y_len: usize, foo_x_1_len: usize, foo_y_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(check_combo(Foo {\n        x: (\n            Bar { x: foo_x_0_x, y: _ffi_vec_Foo_from_js(foo_x_0_y_len, &mut buf_end) },\n            _ffi_vec_Bar_from_js(foo_x_1_len, &mut buf_end)\n        ),\n        y: _ffi_vec__i32_f32_bool_from_js(foo_y_len, &mut buf_end)\n    }));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Bar_from_js(len: usize, end: &mut *const u8) -> Vec<Bar> {\n    let mut items = Vec::<Bar>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Bar { x: _ffi_read::<i32>(end), y: _ffi_vec_Foo_from_js(_ffi_read::<usize>(end), end) });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_from_js(len: usize, end: &mut *const u8) -> Vec<Foo> {\n    let mut items = Vec::<Foo>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Foo {\n            x: (\n                Bar { x: _ffi_read::<i32>(end), y: _ffi_vec_Foo_from_js(_ffi_read::<usize>(end), end) },\n                _ffi_vec_Bar_from_js(_ffi_read::<usize>(end), end)\n            ),\n            y: _ffi_vec__i32_f32_bool_from_js(_ffi_read::<usize>(end), end)\n        });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__i32_f32_bool_from_js(len: usize, end: &mut *const u8) -> Vec<((), (i32,), (f32, bool))> {\n    let mut items = Vec::<((), (i32,), (f32, bool))>::with_capacity(len);\n    for _ in 0..len {\n        items.push(((), (_ffi_read::<i32>(end),), (_ffi_read::<f32>(end), _ffi_read::<bool>(end))));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_combo_in_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Foo {\n    x: [Bar, Bar[]],\n    y: [undefined, [number], [number, boolean]][],\n}\n\nexport interface Bar {\n    x: number,\n    y: Foo[],\n}\n\nexport function rust_mem_leaked(): number;\nexport function check_combo(foo: Foo): string;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_combo_in_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function check_combo(foo) {\n    let buf = _ffi_new_WriteBuf();\n    let foo_x_0_y_len = foo.x[0].y.length;\n    _ffi_vec_Foo_to_rust(foo.x[0].y, buf);\n    let foo_x_1_len = foo.x[1].length;\n    _ffi_vec_Bar_to_rust(foo.x[1], buf);\n    let foo_y_len = foo.y.length;\n    _ffi_vec__i32_f32_bool_to_rust(foo.y, buf);\n    let multi_ret = _ffi_exports._ffi_fn_check_combo(foo.x[0].x, _ffi_buf_to_rust(buf), foo_x_0_y_len, foo_x_1_len, foo_y_len);\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_dv;\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_string_from_rust(ptr, len, cap) {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_vec_Bar_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item.x);\n        _ffi_write_i32(buf, item.y.length);\n        _ffi_vec_Foo_to_rust(item.y, buf);\n    }\n}\n\nfunction _ffi_vec_Foo_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item.x[0].x);\n        _ffi_write_i32(buf, item.x[0].y.length);\n        _ffi_vec_Foo_to_rust(item.x[0].y, buf);\n        _ffi_write_i32(buf, item.x[1].length);\n        _ffi_vec_Bar_to_rust(item.x[1], buf);\n        _ffi_write_i32(buf, item.y.length);\n        _ffi_vec__i32_f32_bool_to_rust(item.y, buf);\n    }\n}\n\nfunction _ffi_vec__i32_f32_bool_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item[1][0]);\n        _ffi_write_f32(buf, item[2][0]);\n        _ffi_write_i8(buf, +(item[2][1]));\n    }\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_f32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setFloat32(ptr, val, true);\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf, val) {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv.setInt8(ptr, val);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_combo_in_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Foo {\n    x: [Bar, Bar[]],\n    y: [undefined, [number], [number, boolean]][],\n}\n\nexport interface Bar {\n    x: number,\n    y: Foo[],\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function check_combo(foo: Foo): string {\n    let buf = _ffi_new_WriteBuf();\n    let foo_x_0_y_len = foo.x[0].y.length;\n    _ffi_vec_Foo_to_rust(foo.x[0].y, buf);\n    let foo_x_1_len = foo.x[1].length;\n    _ffi_vec_Bar_to_rust(foo.x[1], buf);\n    let foo_y_len = foo.y.length;\n    _ffi_vec__i32_f32_bool_to_rust(foo.y, buf);\n    let multi_ret = _ffi_exports._ffi_fn_check_combo(foo.x[0].x, _ffi_buf_to_rust(buf), foo_x_0_y_len, foo_x_1_len, foo_y_len);\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8: Uint8Array;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_dv: DataView;\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_string_from_rust(ptr: number, len: number, cap: number): string {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_vec_Bar_to_rust(items: Bar[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item.x);\n        _ffi_write_i32(buf, item.y.length);\n        _ffi_vec_Foo_to_rust(item.y, buf);\n    }\n}\n\nfunction _ffi_vec_Foo_to_rust(items: Foo[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item.x[0].x);\n        _ffi_write_i32(buf, item.x[0].y.length);\n        _ffi_vec_Foo_to_rust(item.x[0].y, buf);\n        _ffi_write_i32(buf, item.x[1].length);\n        _ffi_vec_Bar_to_rust(item.x[1], buf);\n        _ffi_write_i32(buf, item.y.length);\n        _ffi_vec__i32_f32_bool_to_rust(item.y, buf);\n    }\n}\n\nfunction _ffi_vec__i32_f32_bool_to_rust(items: [undefined, [number], [number, boolean]][], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item[1][0]);\n        _ffi_write_f32(buf, item[2][0]);\n        _ffi_write_i8(buf, +(item[2][1]));\n    }\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_f32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setFloat32(ptr, val, true);\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv!.setInt8(ptr, val);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_check_combo: (foo_x_0_x: number, buf_ptr: number, foo_x_0_y_len: number, foo_x_1_len: number, foo_y_len: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_alloc: (len: number) => number,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_combo_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_combo(foo_x_0_x: i32, buf_ptr: *const u8, foo_x_0_y_len: usize, foo_x_1_len: usize, foo_y_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(check_combo(Foo {\n        x: (\n            Bar { x: foo_x_0_x, y: _ffi_vec_Foo_from_js(foo_x_0_y_len, &mut buf_end) },\n            _ffi_vec_Bar_from_js(foo_x_1_len, &mut buf_end)\n        ),\n        y: _ffi_vec__i32_f32_bool_from_js(foo_y_len, &mut buf_end)\n    }));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Bar_from_js(len: usize, end: &mut *const u8) -> Vec<Bar> {\n    let mut items = Vec::<Bar>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Bar { x: _ffi_read::<i32>(end), y: _ffi_vec_Foo_from_js(_ffi_read::<usize>(end), end) });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_from_js(len: usize, end: &mut *const u8) -> Vec<Foo> {\n    let mut items = Vec::<Foo>::with_capacity(len);\n    for _ in 0..len {\n        items.push(Foo {\n            x: (\n                Bar { x: _ffi_read::<i32>(end), y: _ffi_vec_Foo_from_js(_ffi_read::<usize>(end), end) },\n                _ffi_vec_Bar_from_js(_ffi_read::<usize>(end), end)\n            ),\n            y: _ffi_vec__i32_f32_bool_from_js(_ffi_read::<usize>(end), end)\n        });\n    }\n    items\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__i32_f32_bool_from_js(len: usize, end: &mut *const u8) -> Vec<((), (i32,), (f32, bool))> {\n    let mut items = Vec::<((), (i32,), (f32, bool))>::with_capacity(len);\n    for _ in 0..len {\n        items.push(((), (_ffi_read::<i32>(end),), (_ffi_read::<f32>(end), _ffi_read::<bool>(end))));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_combo_out_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Foo {\n    x: [Bar, Bar[]],\n    y: [undefined, [number], [number, boolean]][],\n}\n\nexport interface Bar {\n    x: number,\n    y: Foo[],\n}\n\nexport function rust_mem_leaked(): number;\nexport function check_combo1(): Foo;\nexport function check_combo2(): Foo;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_combo_out_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function check_combo1() {\n    let multi_ret = _ffi_exports._ffi_fn_check_combo1();\n    let ret_x_0_x = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_ptr = _ffi_dv.getInt32(multi_ret + 4, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    let ret_x_0_y_len = _ffi_dv.getUint32(multi_ret + 12, true);\n    let ret_x_1_len = _ffi_dv.getUint32(multi_ret + 16, true);\n    let ret_y_len = _ffi_dv.getUint32(multi_ret + 20, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = {\n        x: [\n            { x: ret_x_0_x, y: _ffi_vec_Foo_from_rust(ret_x_0_y_len, buf) },\n            _ffi_vec_Bar_from_rust(ret_x_1_len, buf)\n        ],\n        y: _ffi_vec__i32_f32_bool_from_rust(ret_y_len, buf)\n    };\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function check_combo2() {\n    let multi_ret = _ffi_exports._ffi_fn_check_combo2();\n    let ret_x_0_x = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_ptr = _ffi_dv.getInt32(multi_ret + 4, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    let ret_x_0_y_len = _ffi_dv.getUint32(multi_ret + 12, true);\n    let ret_x_1_len = _ffi_dv.getUint32(multi_ret + 16, true);\n    let ret_y_len = _ffi_dv.getUint32(multi_ret + 20, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = {\n        x: [\n            { x: ret_x_0_x, y: _ffi_vec_Foo_from_rust(ret_x_0_y_len, buf) },\n            _ffi_vec_Bar_from_rust(ret_x_1_len, buf)\n        ],\n        y: _ffi_vec__i32_f32_bool_from_rust(ret_y_len, buf)\n    };\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_read_f32(buf) {\n    let val = buf.dv.getFloat32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf) {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u8(buf) {\n    return buf.dv.getUint8(buf.off++);\n}\n\nfunction _ffi_vec_Bar_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push({ x: _ffi_read_i32(buf), y: _ffi_vec_Foo_from_rust(_ffi_read_u32(buf), buf) });\n    }\n    return items;\n}\n\nfunction _ffi_vec_Foo_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push({\n            x: [\n                { x: _ffi_read_i32(buf), y: _ffi_vec_Foo_from_rust(_ffi_read_u32(buf), buf) },\n                _ffi_vec_Bar_from_rust(_ffi_read_u32(buf), buf)\n            ],\n            y: _ffi_vec__i32_f32_bool_from_rust(_ffi_read_u32(buf), buf)\n        });\n    }\n    return items;\n}\n\nfunction _ffi_vec__i32_f32_bool_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push([undefined, [_ffi_read_i32(buf)], [_ffi_read_f32(buf), !!_ffi_read_u8(buf)]]);\n    }\n    return items;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_combo_out_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Foo {\n    x: [Bar, Bar[]],\n    y: [undefined, [number], [number, boolean]][],\n}\n\nexport interface Bar {\n    x: number,\n    y: Foo[],\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function check_combo1(): Foo {\n    let multi_ret = _ffi_exports._ffi_fn_check_combo1();\n    let ret_x_0_x = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_ptr = _ffi_dv.getInt32(multi_ret + 4, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    let ret_x_0_y_len = _ffi_dv.getUint32(multi_ret + 12, true);\n    let ret_x_1_len = _ffi_dv.getUint32(multi_ret + 16, true);\n    let ret_y_len = _ffi_dv.getUint32(multi_ret + 20, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret: Foo = {\n        x: [\n            { x: ret_x_0_x, y: _ffi_vec_Foo_from_rust(ret_x_0_y_len, buf) },\n            _ffi_vec_Bar_from_rust(ret_x_1_len, buf)\n        ],\n        y: _ffi_vec__i32_f32_bool_from_rust(ret_y_len, buf)\n    };\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function check_combo2(): Foo {\n    let multi_ret = _ffi_exports._ffi_fn_check_combo2();\n    let ret_x_0_x = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_ptr = _ffi_dv.getInt32(multi_ret + 4, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    let ret_x_0_y_len = _ffi_dv.getUint32(multi_ret + 12, true);\n    let ret_x_1_len = _ffi_dv.getUint32(multi_ret + 16, true);\n    let ret_y_len = _ffi_dv.getUint32(multi_ret + 20, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret: Foo = {\n        x: [\n            { x: ret_x_0_x, y: _ffi_vec_Foo_from_rust(ret_x_0_y_len, buf) },\n            _ffi_vec_Bar_from_rust(ret_x_1_len, buf)\n        ],\n        y: _ffi_vec__i32_f32_bool_from_rust(ret_y_len, buf)\n    };\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_read_f32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getFloat32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u8(buf: _ffi_ReadBuf): number {\n    return buf.dv.getUint8(buf.off++);\n}\n\nfunction _ffi_vec_Bar_from_rust(len: number, buf: _ffi_ReadBuf): Bar[] {\n    let items: Bar[] = [];\n    while (items.length < len) {\n        items.push({ x: _ffi_read_i32(buf), y: _ffi_vec_Foo_from_rust(_ffi_read_u32(buf), buf) });\n    }\n    return items;\n}\n\nfunction _ffi_vec_Foo_from_rust(len: number, buf: _ffi_ReadBuf): Foo[] {\n    let items: Foo[] = [];\n    while (items.length < len) {\n        items.push({\n            x: [\n                { x: _ffi_read_i32(buf), y: _ffi_vec_Foo_from_rust(_ffi_read_u32(buf), buf) },\n                _ffi_vec_Bar_from_rust(_ffi_read_u32(buf), buf)\n            ],\n            y: _ffi_vec__i32_f32_bool_from_rust(_ffi_read_u32(buf), buf)\n        });\n    }\n    return items;\n}\n\nfunction _ffi_vec__i32_f32_bool_from_rust(len: number, buf: _ffi_ReadBuf): [undefined, [number], [number, boolean]][] {\n    let items: [undefined, [number], [number, boolean]][] = [];\n    while (items.length < len) {\n        items.push([undefined, [_ffi_read_i32(buf)], [_ffi_read_f32(buf), !!_ffi_read_u8(buf)]]);\n    }\n    return items;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_check_combo1: () => number,\n    _ffi_fn_check_combo2: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_combo_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_combo1() -> *const _ffi_ret_i32_ptr_4_usize {\n    let ret = check_combo1();\n    let ret_x = ret.x;\n    let ret_x_0 = ret_x.0;\n    let ret_x_0_x = ret_x_0.x;\n    let ret_x_0_y = ret_x_0.y;\n    let mut buf = Vec::<u8>::new();\n    let ret_x_0_y_len = ret_x_0_y.len();\n    _ffi_vec_Foo_to_js(ret_x_0_y, &mut buf);\n    let ret_x_1 = ret_x.1;\n    let ret_x_1_len = ret_x_1.len();\n    _ffi_vec_Bar_to_js(ret_x_1, &mut buf);\n    let ret_y = ret.y;\n    let ret_y_len = ret_y.len();\n    _ffi_vec__i32_f32_bool_to_js(ret_y, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_I32_PTR_4_USIZE = _ffi_ret_i32_ptr_4_usize(ret_x_0_x, buf_ptr, buf_cap, ret_x_0_y_len, ret_x_1_len, ret_y_len);\n        std::ptr::addr_of!(_FFI_RET_I32_PTR_4_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_combo2() -> *const _ffi_ret_i32_ptr_4_usize {\n    let ret = check_combo2();\n    let ret_x = ret.x;\n    let ret_x_0 = ret_x.0;\n    let ret_x_0_x = ret_x_0.x;\n    let ret_x_0_y = ret_x_0.y;\n    let mut buf = Vec::<u8>::new();\n    let ret_x_0_y_len = ret_x_0_y.len();\n    _ffi_vec_Foo_to_js(ret_x_0_y, &mut buf);\n    let ret_x_1 = ret_x.1;\n    let ret_x_1_len = ret_x_1.len();\n    _ffi_vec_Bar_to_js(ret_x_1, &mut buf);\n    let ret_y = ret.y;\n    let ret_y_len = ret_y.len();\n    _ffi_vec__i32_f32_bool_to_js(ret_y, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_I32_PTR_4_USIZE = _ffi_ret_i32_ptr_4_usize(ret_x_0_x, buf_ptr, buf_cap, ret_x_0_y_len, ret_x_1_len, ret_y_len);\n        std::ptr::addr_of!(_FFI_RET_I32_PTR_4_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr_4_usize(i32, *const u8, usize, usize, usize, usize);\nstatic mut _FFI_RET_I32_PTR_4_USIZE: _ffi_ret_i32_ptr_4_usize = _ffi_ret_i32_ptr_4_usize(0, std::ptr::null(), 0, 0, 0, 0);\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Bar_to_js(items: Vec<Bar>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.x, buf);\n        _ffi_write(item.y.len(), buf);\n        _ffi_vec_Foo_to_js(item.y, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_to_js(items: Vec<Foo>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.x.0.x, buf);\n        _ffi_write(item.x.0.y.len(), buf);\n        _ffi_vec_Foo_to_js(item.x.0.y, buf);\n        _ffi_write(item.x.1.len(), buf);\n        _ffi_vec_Bar_to_js(item.x.1, buf);\n        _ffi_write(item.y.len(), buf);\n        _ffi_vec__i32_f32_bool_to_js(item.y, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__i32_f32_bool_to_js(items: Vec<((), (i32,), (f32, bool))>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ = item.0;\n        _ffi_write(item.1.0, buf);\n        _ffi_write(item.2.0, buf);\n        _ffi_write(item.2.1, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_combo_out_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Foo {\n    x: [Bar, Bar[]],\n    y: [undefined, [number], [number, boolean]][],\n}\n\nexport interface Bar {\n    x: number,\n    y: Foo[],\n}\n\nexport function rust_mem_leaked(): number;\nexport function check_combo1(): Foo;\nexport function check_combo2(): Foo;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_combo_out_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function check_combo1() {\n    let multi_ret = _ffi_exports._ffi_fn_check_combo1();\n    let ret_x_0_x = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_ptr = _ffi_dv.getInt32(multi_ret + 4, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    let ret_x_0_y_len = _ffi_dv.getUint32(multi_ret + 12, true);\n    let ret_x_1_len = _ffi_dv.getUint32(multi_ret + 16, true);\n    let ret_y_len = _ffi_dv.getUint32(multi_ret + 20, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = {\n        x: [\n            { x: ret_x_0_x, y: _ffi_vec_Foo_from_rust(ret_x_0_y_len, buf) },\n            _ffi_vec_Bar_from_rust(ret_x_1_len, buf)\n        ],\n        y: _ffi_vec__i32_f32_bool_from_rust(ret_y_len, buf)\n    };\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function check_combo2() {\n    let multi_ret = _ffi_exports._ffi_fn_check_combo2();\n    let ret_x_0_x = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_ptr = _ffi_dv.getInt32(multi_ret + 4, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    let ret_x_0_y_len = _ffi_dv.getUint32(multi_ret + 12, true);\n    let ret_x_1_len = _ffi_dv.getUint32(multi_ret + 16, true);\n    let ret_y_len = _ffi_dv.getUint32(multi_ret + 20, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = {\n        x: [\n            { x: ret_x_0_x, y: _ffi_vec_Foo_from_rust(ret_x_0_y_len, buf) },\n            _ffi_vec_Bar_from_rust(ret_x_1_len, buf)\n        ],\n        y: _ffi_vec__i32_f32_bool_from_rust(ret_y_len, buf)\n    };\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_read_f32(buf) {\n    let val = buf.dv.getFloat32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf) {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u8(buf) {\n    return buf.dv.getUint8(buf.off++);\n}\n\nfunction _ffi_vec_Bar_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push({ x: _ffi_read_i32(buf), y: _ffi_vec_Foo_from_rust(_ffi_read_u32(buf), buf) });\n    }\n    return items;\n}\n\nfunction _ffi_vec_Foo_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push({\n            x: [\n                { x: _ffi_read_i32(buf), y: _ffi_vec_Foo_from_rust(_ffi_read_u32(buf), buf) },\n                _ffi_vec_Bar_from_rust(_ffi_read_u32(buf), buf)\n            ],\n            y: _ffi_vec__i32_f32_bool_from_rust(_ffi_read_u32(buf), buf)\n        });\n    }\n    return items;\n}\n\nfunction _ffi_vec__i32_f32_bool_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push([undefined, [_ffi_read_i32(buf)], [_ffi_read_f32(buf), !!_ffi_read_u8(buf)]]);\n    }\n    return items;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_combo_out_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Foo {\n    x: [Bar, Bar[]],\n    y: [undefined, [number], [number, boolean]][],\n}\n\nexport interface Bar {\n    x: number,\n    y: Foo[],\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function check_combo1(): Foo {\n    let multi_ret = _ffi_exports._ffi_fn_check_combo1();\n    let ret_x_0_x = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_ptr = _ffi_dv.getInt32(multi_ret + 4, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    let ret_x_0_y_len = _ffi_dv.getUint32(multi_ret + 12, true);\n    let ret_x_1_len = _ffi_dv.getUint32(multi_ret + 16, true);\n    let ret_y_len = _ffi_dv.getUint32(multi_ret + 20, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret: Foo = {\n        x: [\n            { x: ret_x_0_x, y: _ffi_vec_Foo_from_rust(ret_x_0_y_len, buf) },\n            _ffi_vec_Bar_from_rust(ret_x_1_len, buf)\n        ],\n        y: _ffi_vec__i32_f32_bool_from_rust(ret_y_len, buf)\n    };\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function check_combo2(): Foo {\n    let multi_ret = _ffi_exports._ffi_fn_check_combo2();\n    let ret_x_0_x = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_ptr = _ffi_dv.getInt32(multi_ret + 4, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    let ret_x_0_y_len = _ffi_dv.getUint32(multi_ret + 12, true);\n    let ret_x_1_len = _ffi_dv.getUint32(multi_ret + 16, true);\n    let ret_y_len = _ffi_dv.getUint32(multi_ret + 20, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret: Foo = {\n        x: [\n            { x: ret_x_0_x, y: _ffi_vec_Foo_from_rust(ret_x_0_y_len, buf) },\n            _ffi_vec_Bar_from_rust(ret_x_1_len, buf)\n        ],\n        y: _ffi_vec__i32_f32_bool_from_rust(ret_y_len, buf)\n    };\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_read_f32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getFloat32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u8(buf: _ffi_ReadBuf): number {\n    return buf.dv.getUint8(buf.off++);\n}\n\nfunction _ffi_vec_Bar_from_rust(len: number, buf: _ffi_ReadBuf): Bar[] {\n    let items: Bar[] = [];\n    while (items.length < len) {\n        items.push({ x: _ffi_read_i32(buf), y: _ffi_vec_Foo_from_rust(_ffi_read_u32(buf), buf) });\n    }\n    return items;\n}\n\nfunction _ffi_vec_Foo_from_rust(len: number, buf: _ffi_ReadBuf): Foo[] {\n    let items: Foo[] = [];\n    while (items.length < len) {\n        items.push({\n            x: [\n                { x: _ffi_read_i32(buf), y: _ffi_vec_Foo_from_rust(_ffi_read_u32(buf), buf) },\n                _ffi_vec_Bar_from_rust(_ffi_read_u32(buf), buf)\n            ],\n            y: _ffi_vec__i32_f32_bool_from_rust(_ffi_read_u32(buf), buf)\n        });\n    }\n    return items;\n}\n\nfunction _ffi_vec__i32_f32_bool_from_rust(len: number, buf: _ffi_ReadBuf): [undefined, [number], [number, boolean]][] {\n    let items: [undefined, [number], [number, boolean]][] = [];\n    while (items.length < len) {\n        items.push([undefined, [_ffi_read_i32(buf)], [_ffi_read_f32(buf), !!_ffi_read_u8(buf)]]);\n    }\n    return items;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_check_combo1: () => number,\n    _ffi_fn_check_combo2: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_combo_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_combo1() -> *const _ffi_ret_i32_ptr_4_usize {\n    let ret = check_combo1();\n    let ret_x = ret.x;\n    let ret_x_0 = ret_x.0;\n    let ret_x_0_x = ret_x_0.x;\n    let ret_x_0_y = ret_x_0.y;\n    let mut buf = Vec::<u8>::new();\n    let ret_x_0_y_len = ret_x_0_y.len();\n    _ffi_vec_Foo_to_js(ret_x_0_y, &mut buf);\n    let ret_x_1 = ret_x.1;\n    let ret_x_1_len = ret_x_1.len();\n    _ffi_vec_Bar_to_js(ret_x_1, &mut buf);\n    let ret_y = ret.y;\n    let ret_y_len = ret_y.len();\n    _ffi_vec__i32_f32_bool_to_js(ret_y, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_I32_PTR_4_USIZE = _ffi_ret_i32_ptr_4_usize(ret_x_0_x, buf_ptr, buf_cap, ret_x_0_y_len, ret_x_1_len, ret_y_len);\n        std::ptr::addr_of!(_FFI_RET_I32_PTR_4_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_combo2() -> *const _ffi_ret_i32_ptr_4_usize {\n    let ret = check_combo2();\n    let ret_x = ret.x;\n    let ret_x_0 = ret_x.0;\n    let ret_x_0_x = ret_x_0.x;\n    let ret_x_0_y = ret_x_0.y;\n    let mut buf = Vec::<u8>::new();\n    let ret_x_0_y_len = ret_x_0_y.len();\n    _ffi_vec_Foo_to_js(ret_x_0_y, &mut buf);\n    let ret_x_1 = ret_x.1;\n    let ret_x_1_len = ret_x_1.len();\n    _ffi_vec_Bar_to_js(ret_x_1, &mut buf);\n    let ret_y = ret.y;\n    let ret_y_len = ret_y.len();\n    _ffi_vec__i32_f32_bool_to_js(ret_y, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_I32_PTR_4_USIZE = _ffi_ret_i32_ptr_4_usize(ret_x_0_x, buf_ptr, buf_cap, ret_x_0_y_len, ret_x_1_len, ret_y_len);\n        std::ptr::addr_of!(_FFI_RET_I32_PTR_4_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr_4_usize(i32, *const u8, usize, usize, usize, usize);\nstatic mut _FFI_RET_I32_PTR_4_USIZE: _ffi_ret_i32_ptr_4_usize = _ffi_ret_i32_ptr_4_usize(0, std::ptr::null(), 0, 0, 0, 0);\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Bar_to_js(items: Vec<Bar>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.x, buf);\n        _ffi_write(item.y.len(), buf);\n        _ffi_vec_Foo_to_js(item.y, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_to_js(items: Vec<Foo>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.x.0.x, buf);\n        _ffi_write(item.x.0.y.len(), buf);\n        _ffi_vec_Foo_to_js(item.x.0.y, buf);\n        _ffi_write(item.x.1.len(), buf);\n        _ffi_vec_Bar_to_js(item.x.1, buf);\n        _ffi_write(item.y.len(), buf);\n        _ffi_vec__i32_f32_bool_to_js(item.y, buf);\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec__i32_f32_bool_to_js(items: Vec<((), (i32,), (f32, bool))>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ = item.0;\n        _ffi_write(item.1.0, buf);\n        _ffi_write(item.2.0, buf);\n        _ffi_write(item.2.1, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_enum_in_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport const enum Foo {\n    Zero,\n    One,\n    Hundred = 100,\n}\n\nexport const enum Big {\n    Min = -2147483648,\n    Max = 2147483647,\n}\n\nexport type LongEnum =\n    | { readonly $: \"Empty\" }\n    | { readonly $: \"ShortTuple\", 0: number }\n    | { readonly $: \"ShortStruct\", a: number }\n    | { readonly $: \"LongTuple\", 0: number, 1: number, 2: number, 3: number, 4: number, 5: number, 6: number, 7: number }\n    | { readonly $: \"LongStruct\", a: number, b: number, c: number, d: number, e: number, f: number }\n\nexport function rust_mem_leaked(): number;\nexport function foo_to_i32(foo: Foo): number;\nexport function big_to_i32(big: Big): number;\nexport function long_in(_1: LongEnum): void;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_enum_in_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport const Foo = {\n    Zero: 0,\n    One: 1,\n    Hundred: 100,\n};\n\nexport const Big = {\n    Min: -2147483648,\n    Max: 2147483647,\n};\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function foo_to_i32(foo) {\n    return _ffi_exports._ffi_fn_foo_to_i32(foo);\n}\n\nexport function big_to_i32(big) {\n    return _ffi_exports._ffi_fn_big_to_i32(big);\n}\n\nexport function long_in(_1) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_enum_LongEnum_to_rust(_1, buf);\n    _ffi_exports._ffi_fn_long_in(_ffi_buf_to_rust(buf));\n}\n\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8;\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_enum_LongEnum_to_rust(val, buf) {\n    switch (val.$) {\n        case \"Empty\":\n            _ffi_write_i32(buf, 0);\n            break;\n        case \"ShortTuple\":\n            _ffi_write_i32(buf, 1);\n            _ffi_write_i32(buf, val[0]);\n            break;\n        case \"ShortStruct\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.a);\n            break;\n        case \"LongTuple\":\n            _ffi_write_i32(buf, 3);\n            _ffi_write_i32(buf, val[0]);\n            _ffi_write_i32(buf, val[1]);\n            _ffi_write_i32(buf, val[2]);\n            _ffi_write_i32(buf, val[3]);\n            _ffi_write_i32(buf, val[4]);\n            _ffi_write_i32(buf, val[5]);\n            _ffi_write_i32(buf, val[6]);\n            _ffi_write_i32(buf, val[7]);\n            break;\n        case \"LongStruct\":\n            _ffi_write_i32(buf, 4);\n            _ffi_write_i32(buf, val.a);\n            _ffi_write_i32(buf, val.b);\n            _ffi_write_i32(buf, val.c);\n            _ffi_write_i32(buf, val.d);\n            _ffi_write_i32(buf, val.e);\n            _ffi_write_i32(buf, val.f);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"LongEnum\\\"\");\n    }\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_enum_in_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport const enum Foo {\n    Zero,\n    One,\n    Hundred = 100,\n}\n\nexport const enum Big {\n    Min = -2147483648,\n    Max = 2147483647,\n}\n\nexport type LongEnum =\n    | { readonly $: \"Empty\" }\n    | { readonly $: \"ShortTuple\", 0: number }\n    | { readonly $: \"ShortStruct\", a: number }\n    | { readonly $: \"LongTuple\", 0: number, 1: number, 2: number, 3: number, 4: number, 5: number, 6: number, 7: number }\n    | { readonly $: \"LongStruct\", a: number, b: number, c: number, d: number, e: number, f: number }\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function foo_to_i32(foo: Foo): number {\n    return _ffi_exports._ffi_fn_foo_to_i32(foo);\n}\n\nexport function big_to_i32(big: Big): number {\n    return _ffi_exports._ffi_fn_big_to_i32(big);\n}\n\nexport function long_in(_1: LongEnum): void {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_enum_LongEnum_to_rust(_1, buf);\n    _ffi_exports._ffi_fn_long_in(_ffi_buf_to_rust(buf));\n}\n\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8: Uint8Array;\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_enum_LongEnum_to_rust(val: LongEnum, buf: _ffi_WriteBuf): void {\n    switch (val.$) {\n        case \"Empty\":\n            _ffi_write_i32(buf, 0);\n            break;\n        case \"ShortTuple\":\n            _ffi_write_i32(buf, 1);\n            _ffi_write_i32(buf, val[0]);\n            break;\n        case \"ShortStruct\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.a);\n            break;\n        case \"LongTuple\":\n            _ffi_write_i32(buf, 3);\n            _ffi_write_i32(buf, val[0]);\n            _ffi_write_i32(buf, val[1]);\n            _ffi_write_i32(buf, val[2]);\n            _ffi_write_i32(buf, val[3]);\n            _ffi_write_i32(buf, val[4]);\n            _ffi_write_i32(buf, val[5]);\n            _ffi_write_i32(buf, val[6]);\n            _ffi_write_i32(buf, val[7]);\n            break;\n        case \"LongStruct\":\n            _ffi_write_i32(buf, 4);\n            _ffi_write_i32(buf, val.a);\n            _ffi_write_i32(buf, val.b);\n            _ffi_write_i32(buf, val.c);\n            _ffi_write_i32(buf, val.d);\n            _ffi_write_i32(buf, val.e);\n            _ffi_write_i32(buf, val.f);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"LongEnum\\\"\");\n    }\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_big_to_i32: (big_raw: number) => number,\n    _ffi_fn_foo_to_i32: (foo_raw: number) => number,\n    _ffi_fn_long_in: (buf_ptr: number) => void,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_enum_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Big_from_js(val: i32) -> Big {\n    match val {\n        -2147483648 => Big::Min,\n        2147483647 => Big::Max,\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_from_js(val: i32) -> Foo {\n    match val {\n        0 => Foo::Zero,\n        1 => Foo::One,\n        100 => Foo::Hundred,\n        _ => panic!(),\n    }\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_LongEnum_from_js(end: &mut *const u8) -> LongEnum {\n    match _ffi_read::<i32>(end) {\n        0 => LongEnum::Empty,\n        1 => LongEnum::ShortTuple(_ffi_read::<i32>(end)),\n        2 => LongEnum::ShortStruct { a: _ffi_read::<i32>(end) },\n        3 => LongEnum::LongTuple(\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end)\n        ),\n        4 => LongEnum::LongStruct {\n            a: _ffi_read::<i32>(end),\n            b: _ffi_read::<i32>(end),\n            c: _ffi_read::<i32>(end),\n            d: _ffi_read::<i32>(end),\n            e: _ffi_read::<i32>(end),\n            f: _ffi_read::<i32>(end)\n        },\n        _ => panic!(),\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_big_to_i32(big_raw: i32) -> i32 {\n    big_to_i32(_ffi_enum_Big_from_js(big_raw))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_foo_to_i32(foo_raw: i32) -> i32 {\n    foo_to_i32(_ffi_enum_Foo_from_js(foo_raw))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_long_in(buf_ptr: *const u8) {\n    let mut buf_end = buf_ptr;\n    long_in(_ffi_enum_LongEnum_from_js(&mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_enum_in_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport const enum Foo {\n    Zero,\n    One,\n    Hundred = 100,\n}\n\nexport const enum Big {\n    Min = -2147483648,\n    Max = 2147483647,\n}\n\nexport type LongEnum =\n    | { readonly $: \"Empty\" }\n    | { readonly $: \"ShortTuple\", 0: number }\n    | { readonly $: \"ShortStruct\", a: number }\n    | { readonly $: \"LongTuple\", 0: number, 1: number, 2: number, 3: number, 4: number, 5: number, 6: number, 7: number }\n    | { readonly $: \"LongStruct\", a: number, b: number, c: number, d: number, e: number, f: number }\n\nexport function rust_mem_leaked(): number;\nexport function foo_to_i32(foo: Foo): number;\nexport function big_to_i32(big: Big): number;\nexport function long_in(_1: LongEnum): void;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_enum_in_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport const Foo = {\n    Zero: 0,\n    One: 1,\n    Hundred: 100,\n};\n\nexport const Big = {\n    Min: -2147483648,\n    Max: 2147483647,\n};\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function foo_to_i32(foo) {\n    return _ffi_exports._ffi_fn_foo_to_i32(foo);\n}\n\nexport function big_to_i32(big) {\n    return _ffi_exports._ffi_fn_big_to_i32(big);\n}\n\nexport function long_in(_1) {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_enum_LongEnum_to_rust(_1, buf);\n    _ffi_exports._ffi_fn_long_in(_ffi_buf_to_rust(buf));\n}\n\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8;\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_enum_LongEnum_to_rust(val, buf) {\n    switch (val.$) {\n        case \"Empty\":\n            _ffi_write_i32(buf, 0);\n            break;\n        case \"ShortTuple\":\n            _ffi_write_i32(buf, 1);\n            _ffi_write_i32(buf, val[0]);\n            break;\n        case \"ShortStruct\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.a);\n            break;\n        case \"LongTuple\":\n            _ffi_write_i32(buf, 3);\n            _ffi_write_i32(buf, val[0]);\n            _ffi_write_i32(buf, val[1]);\n            _ffi_write_i32(buf, val[2]);\n            _ffi_write_i32(buf, val[3]);\n            _ffi_write_i32(buf, val[4]);\n            _ffi_write_i32(buf, val[5]);\n            _ffi_write_i32(buf, val[6]);\n            _ffi_write_i32(buf, val[7]);\n            break;\n        case \"LongStruct\":\n            _ffi_write_i32(buf, 4);\n            _ffi_write_i32(buf, val.a);\n            _ffi_write_i32(buf, val.b);\n            _ffi_write_i32(buf, val.c);\n            _ffi_write_i32(buf, val.d);\n            _ffi_write_i32(buf, val.e);\n            _ffi_write_i32(buf, val.f);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"LongEnum\\\"\");\n    }\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_enum_in_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport const enum Foo {\n    Zero,\n    One,\n    Hundred = 100,\n}\n\nexport const enum Big {\n    Min = -2147483648,\n    Max = 2147483647,\n}\n\nexport type LongEnum =\n    | { readonly $: \"Empty\" }\n    | { readonly $: \"ShortTuple\", 0: number }\n    | { readonly $: \"ShortStruct\", a: number }\n    | { readonly $: \"LongTuple\", 0: number, 1: number, 2: number, 3: number, 4: number, 5: number, 6: number, 7: number }\n    | { readonly $: \"LongStruct\", a: number, b: number, c: number, d: number, e: number, f: number }\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function foo_to_i32(foo: Foo): number {\n    return _ffi_exports._ffi_fn_foo_to_i32(foo);\n}\n\nexport function big_to_i32(big: Big): number {\n    return _ffi_exports._ffi_fn_big_to_i32(big);\n}\n\nexport function long_in(_1: LongEnum): void {\n    let buf = _ffi_new_WriteBuf();\n    _ffi_enum_LongEnum_to_rust(_1, buf);\n    _ffi_exports._ffi_fn_long_in(_ffi_buf_to_rust(buf));\n}\n\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8: Uint8Array;\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_enum_LongEnum_to_rust(val: LongEnum, buf: _ffi_WriteBuf): void {\n    switch (val.$) {\n        case \"Empty\":\n            _ffi_write_i32(buf, 0);\n            break;\n        case \"ShortTuple\":\n            _ffi_write_i32(buf, 1);\n            _ffi_write_i32(buf, val[0]);\n            break;\n        case \"ShortStruct\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.a);\n            break;\n        case \"LongTuple\":\n            _ffi_write_i32(buf, 3);\n            _ffi_write_i32(buf, val[0]);\n            _ffi_write_i32(buf, val[1]);\n            _ffi_write_i32(buf, val[2]);\n            _ffi_write_i32(buf, val[3]);\n            _ffi_write_i32(buf, val[4]);\n            _ffi_write_i32(buf, val[5]);\n            _ffi_write_i32(buf, val[6]);\n            _ffi_write_i32(buf, val[7]);\n            break;\n        case \"LongStruct\":\n            _ffi_write_i32(buf, 4);\n            _ffi_write_i32(buf, val.a);\n            _ffi_write_i32(buf, val.b);\n            _ffi_write_i32(buf, val.c);\n            _ffi_write_i32(buf, val.d);\n            _ffi_write_i32(buf, val.e);\n            _ffi_write_i32(buf, val.f);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"LongEnum\\\"\");\n    }\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_big_to_i32: (big_raw: number) => number,\n    _ffi_fn_foo_to_i32: (foo_raw: number) => number,\n    _ffi_fn_long_in: (buf_ptr: number) => void,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_enum_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Big_from_js(val: i32) -> Big {\n    match val {\n        -2147483648 => Big::Min,\n        2147483647 => Big::Max,\n        _ => panic!(),\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_from_js(val: i32) -> Foo {\n    match val {\n        0 => Foo::Zero,\n        1 => Foo::One,\n        100 => Foo::Hundred,\n        _ => panic!(),\n    }\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_LongEnum_from_js(end: &mut *const u8) -> LongEnum {\n    match _ffi_read::<i32>(end) {\n        0 => LongEnum::Empty,\n        1 => LongEnum::ShortTuple(_ffi_read::<i32>(end)),\n        2 => LongEnum::ShortStruct { a: _ffi_read::<i32>(end) },\n        3 => LongEnum::LongTuple(\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end),\n            _ffi_read::<i32>(end)\n        ),\n        4 => LongEnum::LongStruct {\n            a: _ffi_read::<i32>(end),\n            b: _ffi_read::<i32>(end),\n            c: _ffi_read::<i32>(end),\n            d: _ffi_read::<i32>(end),\n            e: _ffi_read::<i32>(end),\n            f: _ffi_read::<i32>(end)\n        },\n        _ => panic!(),\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_big_to_i32(big_raw: i32) -> i32 {\n    big_to_i32(_ffi_enum_Big_from_js(big_raw))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_foo_to_i32(foo_raw: i32) -> i32 {\n    foo_to_i32(_ffi_enum_Foo_from_js(foo_raw))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_long_in(buf_ptr: *const u8) {\n    let mut buf_end = buf_ptr;\n    long_in(_ffi_enum_LongEnum_from_js(&mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_enum_out_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport const enum Foo {\n    Zero,\n    One,\n    Hundred = 100,\n}\n\nexport const enum Big {\n    Min = -2147483648,\n    Max = 2147483647,\n}\n\nexport type LongEnum =\n    | { readonly $: \"Empty\" }\n    | { readonly $: \"ShortTuple\", 0: number }\n    | { readonly $: \"ShortStruct\", a: number }\n    | { readonly $: \"LongTuple\", 0: number, 1: number, 2: number, 3: number, 4: number, 5: number, 6: number, 7: number }\n    | { readonly $: \"LongStruct\", a: number, b: number, c: number, d: number, e: number, f: number }\n\nexport function rust_mem_leaked(): number;\nexport function i32_to_foo(foo: number): Foo;\nexport function i32_to_big(big: number): Big;\nexport function long_out(): LongEnum;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_enum_out_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport const Foo = {\n    Zero: 0,\n    One: 1,\n    Hundred: 100,\n};\n\nexport const Big = {\n    Min: -2147483648,\n    Max: 2147483647,\n};\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function i32_to_foo(foo) {\n    return _ffi_exports._ffi_fn_i32_to_foo(foo);\n}\n\nexport function i32_to_big(big) {\n    return _ffi_exports._ffi_fn_i32_to_big(big);\n}\n\nexport function long_out() {\n    let multi_ret = _ffi_exports._ffi_fn_long_out();\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_enum_LongEnum_from_rust(buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\nlet _ffi_enum_LongEnum__Empty = { $: \"Empty\" };\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_enum_LongEnum_from_rust(buf) {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return _ffi_enum_LongEnum__Empty;\n        case 1: return { $: \"ShortTuple\", 0: _ffi_read_i32(buf) };\n        case 2: return { $: \"ShortStruct\", a: _ffi_read_i32(buf) };\n        case 3: return {\n            $: \"LongTuple\",\n            0: _ffi_read_i32(buf),\n            1: _ffi_read_i32(buf),\n            2: _ffi_read_i32(buf),\n            3: _ffi_read_i32(buf),\n            4: _ffi_read_i32(buf),\n            5: _ffi_read_i32(buf),\n            6: _ffi_read_i32(buf),\n            7: _ffi_read_i32(buf)\n        };\n        case 4: return {\n            $: \"LongStruct\",\n            a: _ffi_read_i32(buf),\n            b: _ffi_read_i32(buf),\n            c: _ffi_read_i32(buf),\n            d: _ffi_read_i32(buf),\n            e: _ffi_read_i32(buf),\n            f: _ffi_read_i32(buf)\n        };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_enum_out_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport const enum Foo {\n    Zero,\n    One,\n    Hundred = 100,\n}\n\nexport const enum Big {\n    Min = -2147483648,\n    Max = 2147483647,\n}\n\nexport type LongEnum =\n    | { readonly $: \"Empty\" }\n    | { readonly $: \"ShortTuple\", 0: number }\n    | { readonly $: \"ShortStruct\", a: number }\n    | { readonly $: \"LongTuple\", 0: number, 1: number, 2: number, 3: number, 4: number, 5: number, 6: number, 7: number }\n    | { readonly $: \"LongStruct\", a: number, b: number, c: number, d: number, e: number, f: number }\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function i32_to_foo(foo: number): Foo {\n    return _ffi_exports._ffi_fn_i32_to_foo(foo);\n}\n\nexport function i32_to_big(big: number): Big {\n    return _ffi_exports._ffi_fn_i32_to_big(big);\n}\n\nexport function long_out(): LongEnum {\n    let multi_ret = _ffi_exports._ffi_fn_long_out();\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret: LongEnum = _ffi_enum_LongEnum_from_rust(buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\nlet _ffi_enum_LongEnum__Empty: LongEnum = { $: \"Empty\" };\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_enum_LongEnum_from_rust(buf: _ffi_ReadBuf): LongEnum {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return _ffi_enum_LongEnum__Empty;\n        case 1: return { $: \"ShortTuple\", 0: _ffi_read_i32(buf) };\n        case 2: return { $: \"ShortStruct\", a: _ffi_read_i32(buf) };\n        case 3: return {\n            $: \"LongTuple\",\n            0: _ffi_read_i32(buf),\n            1: _ffi_read_i32(buf),\n            2: _ffi_read_i32(buf),\n            3: _ffi_read_i32(buf),\n            4: _ffi_read_i32(buf),\n            5: _ffi_read_i32(buf),\n            6: _ffi_read_i32(buf),\n            7: _ffi_read_i32(buf)\n        };\n        case 4: return {\n            $: \"LongStruct\",\n            a: _ffi_read_i32(buf),\n            b: _ffi_read_i32(buf),\n            c: _ffi_read_i32(buf),\n            d: _ffi_read_i32(buf),\n            e: _ffi_read_i32(buf),\n            f: _ffi_read_i32(buf)\n        };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_i32_to_big: (big: number) => number,\n    _ffi_fn_i32_to_foo: (foo: number) => number,\n    _ffi_fn_long_out: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_enum_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_LongEnum_to_js(val: LongEnum, buf: &mut Vec<u8>) {\n    match val {\n        LongEnum::Empty => _ffi_write(0 as i32, buf),\n        LongEnum::ShortTuple(x) => {\n            _ffi_write(1 as i32, buf);\n            _ffi_write(x, buf);\n        }\n        LongEnum::ShortStruct { a } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(a, buf);\n        }\n        LongEnum::LongTuple(x0, x1, x2, x3, x4, x5, x6, x7) => {\n            _ffi_write(3 as i32, buf);\n            _ffi_write(x0, buf);\n            _ffi_write(x1, buf);\n            _ffi_write(x2, buf);\n            _ffi_write(x3, buf);\n            _ffi_write(x4, buf);\n            _ffi_write(x5, buf);\n            _ffi_write(x6, buf);\n            _ffi_write(x7, buf);\n        }\n        LongEnum::LongStruct { a, b, c, d, e, f } => {\n            _ffi_write(4 as i32, buf);\n            _ffi_write(a, buf);\n            _ffi_write(b, buf);\n            _ffi_write(c, buf);\n            _ffi_write(d, buf);\n            _ffi_write(e, buf);\n            _ffi_write(f, buf);\n        }\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_i32_to_big(big: i32) -> i32 {\n    i32_to_big(big) as i32\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_i32_to_foo(foo: i32) -> i32 {\n    i32_to_foo(foo) as i32\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_long_out() -> *const _ffi_ret_ptr_usize {\n    let mut buf = Vec::<u8>::new();\n    _ffi_enum_LongEnum_to_js(long_out(), &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\nstatic mut _FFI_RET_PTR_USIZE: _ffi_ret_ptr_usize = _ffi_ret_ptr_usize(std::ptr::null(), 0);\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_enum_out_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport const enum Foo {\n    Zero,\n    One,\n    Hundred = 100,\n}\n\nexport const enum Big {\n    Min = -2147483648,\n    Max = 2147483647,\n}\n\nexport type LongEnum =\n    | { readonly $: \"Empty\" }\n    | { readonly $: \"ShortTuple\", 0: number }\n    | { readonly $: \"ShortStruct\", a: number }\n    | { readonly $: \"LongTuple\", 0: number, 1: number, 2: number, 3: number, 4: number, 5: number, 6: number, 7: number }\n    | { readonly $: \"LongStruct\", a: number, b: number, c: number, d: number, e: number, f: number }\n\nexport function rust_mem_leaked(): number;\nexport function i32_to_foo(foo: number): Foo;\nexport function i32_to_big(big: number): Big;\nexport function long_out(): LongEnum;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_enum_out_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport const Foo = {\n    Zero: 0,\n    One: 1,\n    Hundred: 100,\n};\n\nexport const Big = {\n    Min: -2147483648,\n    Max: 2147483647,\n};\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function i32_to_foo(foo) {\n    return _ffi_exports._ffi_fn_i32_to_foo(foo);\n}\n\nexport function i32_to_big(big) {\n    return _ffi_exports._ffi_fn_i32_to_big(big);\n}\n\nexport function long_out() {\n    let multi_ret = _ffi_exports._ffi_fn_long_out();\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_enum_LongEnum_from_rust(buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\nlet _ffi_enum_LongEnum__Empty = { $: \"Empty\" };\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_enum_LongEnum_from_rust(buf) {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return _ffi_enum_LongEnum__Empty;\n        case 1: return { $: \"ShortTuple\", 0: _ffi_read_i32(buf) };\n        case 2: return { $: \"ShortStruct\", a: _ffi_read_i32(buf) };\n        case 3: return {\n            $: \"LongTuple\",\n            0: _ffi_read_i32(buf),\n            1: _ffi_read_i32(buf),\n            2: _ffi_read_i32(buf),\n            3: _ffi_read_i32(buf),\n            4: _ffi_read_i32(buf),\n            5: _ffi_read_i32(buf),\n            6: _ffi_read_i32(buf),\n            7: _ffi_read_i32(buf)\n        };\n        case 4: return {\n            $: \"LongStruct\",\n            a: _ffi_read_i32(buf),\n            b: _ffi_read_i32(buf),\n            c: _ffi_read_i32(buf),\n            d: _ffi_read_i32(buf),\n            e: _ffi_read_i32(buf),\n            f: _ffi_read_i32(buf)\n        };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_enum_out_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport const enum Foo {\n    Zero,\n    One,\n    Hundred = 100,\n}\n\nexport const enum Big {\n    Min = -2147483648,\n    Max = 2147483647,\n}\n\nexport type LongEnum =\n    | { readonly $: \"Empty\" }\n    | { readonly $: \"ShortTuple\", 0: number }\n    | { readonly $: \"ShortStruct\", a: number }\n    | { readonly $: \"LongTuple\", 0: number, 1: number, 2: number, 3: number, 4: number, 5: number, 6: number, 7: number }\n    | { readonly $: \"LongStruct\", a: number, b: number, c: number, d: number, e: number, f: number }\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function i32_to_foo(foo: number): Foo {\n    return _ffi_exports._ffi_fn_i32_to_foo(foo);\n}\n\nexport function i32_to_big(big: number): Big {\n    return _ffi_exports._ffi_fn_i32_to_big(big);\n}\n\nexport function long_out(): LongEnum {\n    let multi_ret = _ffi_exports._ffi_fn_long_out();\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret: LongEnum = _ffi_enum_LongEnum_from_rust(buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\nlet _ffi_enum_LongEnum__Empty: LongEnum = { $: \"Empty\" };\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_enum_LongEnum_from_rust(buf: _ffi_ReadBuf): LongEnum {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return _ffi_enum_LongEnum__Empty;\n        case 1: return { $: \"ShortTuple\", 0: _ffi_read_i32(buf) };\n        case 2: return { $: \"ShortStruct\", a: _ffi_read_i32(buf) };\n        case 3: return {\n            $: \"LongTuple\",\n            0: _ffi_read_i32(buf),\n            1: _ffi_read_i32(buf),\n            2: _ffi_read_i32(buf),\n            3: _ffi_read_i32(buf),\n            4: _ffi_read_i32(buf),\n            5: _ffi_read_i32(buf),\n            6: _ffi_read_i32(buf),\n            7: _ffi_read_i32(buf)\n        };\n        case 4: return {\n            $: \"LongStruct\",\n            a: _ffi_read_i32(buf),\n            b: _ffi_read_i32(buf),\n            c: _ffi_read_i32(buf),\n            d: _ffi_read_i32(buf),\n            e: _ffi_read_i32(buf),\n            f: _ffi_read_i32(buf)\n        };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_i32_to_big: (big: number) => number,\n    _ffi_fn_i32_to_foo: (foo: number) => number,\n    _ffi_fn_long_out: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_enum_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_LongEnum_to_js(val: LongEnum, buf: &mut Vec<u8>) {\n    match val {\n        LongEnum::Empty => _ffi_write(0 as i32, buf),\n        LongEnum::ShortTuple(x) => {\n            _ffi_write(1 as i32, buf);\n            _ffi_write(x, buf);\n        }\n        LongEnum::ShortStruct { a } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(a, buf);\n        }\n        LongEnum::LongTuple(x0, x1, x2, x3, x4, x5, x6, x7) => {\n            _ffi_write(3 as i32, buf);\n            _ffi_write(x0, buf);\n            _ffi_write(x1, buf);\n            _ffi_write(x2, buf);\n            _ffi_write(x3, buf);\n            _ffi_write(x4, buf);\n            _ffi_write(x5, buf);\n            _ffi_write(x6, buf);\n            _ffi_write(x7, buf);\n        }\n        LongEnum::LongStruct { a, b, c, d, e, f } => {\n            _ffi_write(4 as i32, buf);\n            _ffi_write(a, buf);\n            _ffi_write(b, buf);\n            _ffi_write(c, buf);\n            _ffi_write(d, buf);\n            _ffi_write(e, buf);\n            _ffi_write(f, buf);\n        }\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_i32_to_big(big: i32) -> i32 {\n    i32_to_big(big) as i32\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_i32_to_foo(foo: i32) -> i32 {\n    i32_to_foo(foo) as i32\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_long_out() -> *const _ffi_ret_ptr_usize {\n    let mut buf = Vec::<u8>::new();\n    _ffi_enum_LongEnum_to_js(long_out(), &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_USIZE = _ffi_ret_ptr_usize(buf_ptr, buf_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\nstatic mut _FFI_RET_PTR_USIZE: _ffi_ret_ptr_usize = _ffi_ret_ptr_usize(std::ptr::null(), 0);\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_nested_in_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Bar {\n    get(): number;\n}\n\nexport interface Foo {\n    empty: undefined,\n    ptr: Bar,\n}\n\nexport function rust_mem_leaked(): number;\nexport function test(x: [number, Foo, [number, Foo][]]): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_nested_in_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function test(x) {\n    let x_1_ptr_ptr = _ffi_handle_alloc(x[1].ptr);\n    let buf = _ffi_new_WriteBuf();\n    let x_2_len = x[2].length;\n    _ffi_vec_i32_Foo_to_rust(x[2], buf);\n    return _ffi_exports._ffi_fn_test(x[0], x_1_ptr_ptr, _ffi_buf_to_rust(buf), x_2_len);\n}\n\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8;\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nfunction _ffi_vec_i32_Foo_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item[0]);\n        _ffi_write_i32(buf, _ffi_handle_alloc(item[1].ptr));\n    }\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_Bar__get(self) {\n        return _ffi_handles.get(self).get();\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_nested_in_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Bar {\n    get(): number;\n}\n\nexport interface Foo {\n    empty: undefined,\n    ptr: Bar,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function test(x: [number, Foo, [number, Foo][]]): number {\n    let x_1_ptr_ptr = _ffi_handle_alloc(x[1].ptr);\n    let buf = _ffi_new_WriteBuf();\n    let x_2_len = x[2].length;\n    _ffi_vec_i32_Foo_to_rust(x[2], buf);\n    return _ffi_exports._ffi_fn_test(x[0], x_1_ptr_ptr, _ffi_buf_to_rust(buf), x_2_len);\n}\n\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8: Uint8Array;\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nfunction _ffi_vec_i32_Foo_to_rust(items: [number, Foo][], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item[0]);\n        _ffi_write_i32(buf, _ffi_handle_alloc(item[1].ptr));\n    }\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_test: (x_0: number, x_1_ptr_ptr: number, buf_ptr: number, x_2_len: number) => number,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {\n    _ffi_js_Bar__get(self: number): number {\n        return _ffi_handles.get(self).get();\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_nested_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test(x_0: i32, x_1_ptr_ptr: *const u8, buf_ptr: *const u8, x_2_len: usize) -> i32 {\n    let x_1 = Foo { empty: (), ptr: std::rc::Rc::new(_ffi_rs_Bar(x_1_ptr_ptr)) };\n    let mut buf_end = buf_ptr;\n    let ret = test((x_0, x_1, _ffi_vec_i32_Foo_from_js(x_2_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Bar(*const u8);\n\nimpl Drop for _ffi_rs_Bar {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Bar for _ffi_rs_Bar {\n    fn get(&self) -> i32 {\n        extern \"C\" { fn _ffi_js_Bar__get(_: *const u8) -> i32; }\n        unsafe { _ffi_js_Bar__get(self.0) }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_i32_Foo_from_js(len: usize, end: &mut *const u8) -> Vec<(i32, Foo)> {\n    let mut items = Vec::<(i32, Foo)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((\n            _ffi_read::<i32>(end),\n            Foo { empty: (), ptr: std::rc::Rc::new(_ffi_rs_Bar(_ffi_read::<*const u8>(end))) }\n        ));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_nested_in_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Bar {\n    get(): number;\n}\n\nexport interface Foo {\n    empty: undefined,\n    ptr: Bar,\n}\n\nexport function rust_mem_leaked(): number;\nexport function test(x: [number, Foo, [number, Foo][]]): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_nested_in_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function test(x) {\n    let x_1_ptr_ptr = _ffi_handle_alloc(x[1].ptr);\n    let buf = _ffi_new_WriteBuf();\n    let x_2_len = x[2].length;\n    _ffi_vec_i32_Foo_to_rust(x[2], buf);\n    return _ffi_exports._ffi_fn_test(x[0], x_1_ptr_ptr, _ffi_buf_to_rust(buf), x_2_len);\n}\n\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8;\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nfunction _ffi_vec_i32_Foo_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item[0]);\n        _ffi_write_i32(buf, _ffi_handle_alloc(item[1].ptr));\n    }\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_Bar__get(self) {\n        return _ffi_handles.get(self).get();\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_nested_in_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Bar {\n    get(): number;\n}\n\nexport interface Foo {\n    empty: undefined,\n    ptr: Bar,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function test(x: [number, Foo, [number, Foo][]]): number {\n    let x_1_ptr_ptr = _ffi_handle_alloc(x[1].ptr);\n    let buf = _ffi_new_WriteBuf();\n    let x_2_len = x[2].length;\n    _ffi_vec_i32_Foo_to_rust(x[2], buf);\n    return _ffi_exports._ffi_fn_test(x[0], x_1_ptr_ptr, _ffi_buf_to_rust(buf), x_2_len);\n}\n\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8: Uint8Array;\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nfunction _ffi_vec_i32_Foo_to_rust(items: [number, Foo][], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item[0]);\n        _ffi_write_i32(buf, _ffi_handle_alloc(item[1].ptr));\n    }\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_test: (x_0: number, x_1_ptr_ptr: number, buf_ptr: number, x_2_len: number) => number,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {\n    _ffi_js_Bar__get(self: number): number {\n        return _ffi_handles.get(self).get();\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_nested_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test(x_0: i32, x_1_ptr_ptr: *const u8, buf_ptr: *const u8, x_2_len: usize) -> i32 {\n    let x_1 = Foo { empty: (), ptr: std::rc::Rc::new(_ffi_rs_Bar(x_1_ptr_ptr)) };\n    let mut buf_end = buf_ptr;\n    let ret = test((x_0, x_1, _ffi_vec_i32_Foo_from_js(x_2_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Bar(*const u8);\n\nimpl Drop for _ffi_rs_Bar {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Bar for _ffi_rs_Bar {\n    fn get(&self) -> i32 {\n        unsafe extern \"C\" { fn _ffi_js_Bar__get(_: *const u8) -> i32; }\n        unsafe { _ffi_js_Bar__get(self.0) }\n    }\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_i32_Foo_from_js(len: usize, end: &mut *const u8) -> Vec<(i32, Foo)> {\n    let mut items = Vec::<(i32, Foo)>::with_capacity(len);\n    for _ in 0..len {\n        items.push((\n            _ffi_read::<i32>(end),\n            Foo { empty: (), ptr: std::rc::Rc::new(_ffi_rs_Bar(_ffi_read::<*const u8>(end))) }\n        ));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_nested_out_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Bar {\n    get(): number;\n}\n\nexport interface Foo {\n    ptr: Bar,\n}\n\nexport function rust_mem_leaked(): number;\nexport function test(x: number): [number, Foo];\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_nested_out_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function test(x) {\n    let multi_ret = _ffi_exports._ffi_fn_test(x);\n    let ret_0 = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_1_ptr_ptr = _ffi_dv.getInt32(multi_ret + 4, true);\n    return [ret_0, { ptr: new _ffi_Rc_Bar(ret_1_ptr_ptr) }];\n}\n\nlet _ffi_reg_Rc_Bar = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Rc_Bar(ptr));\nlet _ffi_dv;\n\nconst _ffi_Rc_Bar = class Bar {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Bar.register(this, _);\n    }\n\n    get() {\n        return _ffi_exports._ffi_Rc_Bar__get(this._);\n    }\n};\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_nested_out_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Bar {\n    get(): number;\n}\n\nexport interface Foo {\n    ptr: Bar,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function test(x: number): [number, Foo] {\n    let multi_ret = _ffi_exports._ffi_fn_test(x);\n    let ret_0 = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_1_ptr_ptr = _ffi_dv.getInt32(multi_ret + 4, true);\n    return [ret_0, { ptr: new _ffi_Rc_Bar(ret_1_ptr_ptr) }];\n}\n\nlet _ffi_reg_Rc_Bar = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Rc_Bar(ptr));\nlet _ffi_dv: DataView;\n\nconst _ffi_Rc_Bar = class Bar implements Bar {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Bar.register(this, _);\n    }\n\n    get(): number {\n        return _ffi_exports._ffi_Rc_Bar__get(this._);\n    }\n};\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Rc_Bar__get: (_self: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_test: (x: number) => number,\n    _ffi_rs_drop_Rc_Bar: (ptr: number) => void,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_nested_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Bar__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Bar>) };\n    _self.get()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_test(x: i32) -> *const _ffi_ret_i32_ptr {\n    let ret = test(x);\n    let ret_0 = ret.0;\n    let ret_1 = ret.1;\n    unsafe {\n        _FFI_RET_I32_PTR = _ffi_ret_i32_ptr(ret_0, Box::into_raw(Box::new(ret_1.ptr)) as *const u8);\n        std::ptr::addr_of!(_FFI_RET_I32_PTR)\n    }\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr(i32, *const u8);\nstatic mut _FFI_RET_I32_PTR: _ffi_ret_i32_ptr = _ffi_ret_i32_ptr(0, std::ptr::null());\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Rc_Bar(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Bar>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_nested_out_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Bar {\n    get(): number;\n}\n\nexport interface Foo {\n    ptr: Bar,\n}\n\nexport function rust_mem_leaked(): number;\nexport function test(x: number): [number, Foo];\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_nested_out_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function test(x) {\n    let multi_ret = _ffi_exports._ffi_fn_test(x);\n    let ret_0 = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_1_ptr_ptr = _ffi_dv.getInt32(multi_ret + 4, true);\n    return [ret_0, { ptr: new _ffi_Rc_Bar(ret_1_ptr_ptr) }];\n}\n\nlet _ffi_reg_Rc_Bar = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Rc_Bar(ptr));\nlet _ffi_dv;\n\nconst _ffi_Rc_Bar = class Bar {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Bar.register(this, _);\n    }\n\n    get() {\n        return _ffi_exports._ffi_Rc_Bar__get(this._);\n    }\n};\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_nested_out_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Bar {\n    get(): number;\n}\n\nexport interface Foo {\n    ptr: Bar,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function test(x: number): [number, Foo] {\n    let multi_ret = _ffi_exports._ffi_fn_test(x);\n    let ret_0 = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_1_ptr_ptr = _ffi_dv.getInt32(multi_ret + 4, true);\n    return [ret_0, { ptr: new _ffi_Rc_Bar(ret_1_ptr_ptr) }];\n}\n\nlet _ffi_reg_Rc_Bar = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Rc_Bar(ptr));\nlet _ffi_dv: DataView;\n\nconst _ffi_Rc_Bar = class Bar implements Bar {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Bar.register(this, _);\n    }\n\n    get(): number {\n        return _ffi_exports._ffi_Rc_Bar__get(this._);\n    }\n};\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Rc_Bar__get: (_self: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_test: (x: number) => number,\n    _ffi_rs_drop_Rc_Bar: (ptr: number) => void,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_nested_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Bar__get(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Bar>) };\n    _self.get()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_test(x: i32) -> *const _ffi_ret_i32_ptr {\n    let ret = test(x);\n    let ret_0 = ret.0;\n    let ret_1 = ret.1;\n    unsafe {\n        _FFI_RET_I32_PTR = _ffi_ret_i32_ptr(ret_0, Box::into_raw(Box::new(ret_1.ptr)) as *const u8);\n        std::ptr::addr_of!(_FFI_RET_I32_PTR)\n    }\n}\n\n#[repr(C)]\nstruct _ffi_ret_i32_ptr(i32, *const u8);\nstatic mut _FFI_RET_I32_PTR: _ffi_ret_i32_ptr = _ffi_ret_i32_ptr(0, std::ptr::null());\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Rc_Bar(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Bar>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_option_in_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function add_option(x: number | null, y: number | null): number;\nexport function add_nested(x: number | null, y: number | null): number;\nexport function add_all(x: (number | null)[]): number;\nexport function join_all(x: (string | null)[]): string;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_option_in_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function add_option(x, y) {\n    let buf = _ffi_new_WriteBuf();\n    let has_x = x !== null;\n    if (x !== null) {\n        _ffi_write_i32(buf, x);\n    }\n    let has_y = y !== null;\n    if (y !== null) {\n        _ffi_write_i32(buf, y);\n    }\n    return _ffi_exports._ffi_fn_add_option(_ffi_buf_to_rust(buf), has_x, has_y);\n}\n\nexport function add_nested(x, y) {\n    let buf = _ffi_new_WriteBuf();\n    let has_x = x !== null;\n    if (x !== null) {\n        let x_val = x;\n        _ffi_write_i8(buf, +(x_val !== null));\n        if (x_val !== null) {\n            _ffi_write_i32(buf, x_val);\n        }\n    }\n    let has_y = y !== null;\n    if (y !== null) {\n        let y_val = y;\n        _ffi_write_i8(buf, +(y_val !== null));\n        if (y_val !== null) {\n            _ffi_write_i32(buf, y_val);\n        }\n    }\n    return _ffi_exports._ffi_fn_add_nested(_ffi_buf_to_rust(buf), has_x, has_y);\n}\n\nexport function add_all(x) {\n    let buf = _ffi_new_WriteBuf();\n    let x_len = x.length;\n    _ffi_vec_option_i32_to_rust(x, buf);\n    return _ffi_exports._ffi_fn_add_all(_ffi_buf_to_rust(buf), x_len);\n}\n\nexport function join_all(x) {\n    let buf = _ffi_new_WriteBuf();\n    let x_len = x.length;\n    _ffi_vec_option_string_to_rust(x, buf);\n    let multi_ret = _ffi_exports._ffi_fn_join_all(_ffi_buf_to_rust(buf), x_len);\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nlet _ffi_len = 0;\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\nlet _ffi_dv;\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_string_from_rust(ptr, len, cap) {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_string_to_rust(str) {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_vec_option_i32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i8(buf, +(item !== null));\n        if (item !== null) {\n            _ffi_write_i32(buf, item);\n        }\n    }\n}\n\nfunction _ffi_vec_option_string_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i8(buf, +(item !== null));\n        if (item !== null) {\n            let item_val_ptr = _ffi_string_to_rust(item), item_val_len = _ffi_len;\n            _ffi_write_i32(buf, item_val_ptr);\n            _ffi_write_i32(buf, item_val_len);\n        }\n    }\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf, val) {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv.setInt8(ptr, val);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_option_in_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function add_option(x: number | null, y: number | null): number {\n    let buf = _ffi_new_WriteBuf();\n    let has_x = x !== null;\n    if (x !== null) {\n        _ffi_write_i32(buf, x);\n    }\n    let has_y = y !== null;\n    if (y !== null) {\n        _ffi_write_i32(buf, y);\n    }\n    return _ffi_exports._ffi_fn_add_option(_ffi_buf_to_rust(buf), has_x, has_y);\n}\n\nexport function add_nested(x: number | null, y: number | null): number {\n    let buf = _ffi_new_WriteBuf();\n    let has_x = x !== null;\n    if (x !== null) {\n        let x_val = x;\n        _ffi_write_i8(buf, +(x_val !== null));\n        if (x_val !== null) {\n            _ffi_write_i32(buf, x_val);\n        }\n    }\n    let has_y = y !== null;\n    if (y !== null) {\n        let y_val = y;\n        _ffi_write_i8(buf, +(y_val !== null));\n        if (y_val !== null) {\n            _ffi_write_i32(buf, y_val);\n        }\n    }\n    return _ffi_exports._ffi_fn_add_nested(_ffi_buf_to_rust(buf), has_x, has_y);\n}\n\nexport function add_all(x: (number | null)[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let x_len = x.length;\n    _ffi_vec_option_i32_to_rust(x, buf);\n    return _ffi_exports._ffi_fn_add_all(_ffi_buf_to_rust(buf), x_len);\n}\n\nexport function join_all(x: (string | null)[]): string {\n    let buf = _ffi_new_WriteBuf();\n    let x_len = x.length;\n    _ffi_vec_option_string_to_rust(x, buf);\n    let multi_ret = _ffi_exports._ffi_fn_join_all(_ffi_buf_to_rust(buf), x_len);\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nlet _ffi_len = 0;\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8: Uint8Array;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\nlet _ffi_dv: DataView;\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_string_from_rust(ptr: number, len: number, cap: number): string {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_string_to_rust(str: string): number {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_vec_option_i32_to_rust(items: (number | null)[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i8(buf, +(item !== null));\n        if (item !== null) {\n            _ffi_write_i32(buf, item);\n        }\n    }\n}\n\nfunction _ffi_vec_option_string_to_rust(items: (string | null)[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i8(buf, +(item !== null));\n        if (item !== null) {\n            let item_val_ptr = _ffi_string_to_rust(item), item_val_len = _ffi_len;\n            _ffi_write_i32(buf, item_val_ptr);\n            _ffi_write_i32(buf, item_val_len);\n        }\n    }\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv!.setInt8(ptr, val);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_add_all: (buf_ptr: number, x_len: number) => number,\n    _ffi_fn_add_nested: (buf_ptr: number, has_x: boolean, has_y: boolean) => number,\n    _ffi_fn_add_option: (buf_ptr: number, has_x: boolean, has_y: boolean) => number,\n    _ffi_fn_join_all: (buf_ptr: number, x_len: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_alloc: (len: number) => number,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_option_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_all(buf_ptr: *const u8, x_len: usize) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_all(_ffi_vec_option_i32_from_js(x_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_nested(buf_ptr: *const u8, has_x: bool, has_y: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_nested(\n        has_x.then(|| _ffi_read::<bool>(&mut buf_end).then(|| _ffi_read::<i32>(&mut buf_end))),\n        has_y.then(|| _ffi_read::<bool>(&mut buf_end).then(|| _ffi_read::<i32>(&mut buf_end)))\n    );\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_add_option(buf_ptr: *const u8, has_x: bool, has_y: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_option(has_x.then(|| _ffi_read::<i32>(&mut buf_end)), has_y.then(|| _ffi_read::<i32>(&mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_join_all(buf_ptr: *const u8, x_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(join_all(_ffi_vec_option_string_from_js(x_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_option_i32_from_js(len: usize, end: &mut *const u8) -> Vec<Option<i32>> {\n    let mut items = Vec::<Option<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<bool>(end).then(|| _ffi_read::<i32>(end)));\n    }\n    items\n}\n\nfn _ffi_vec_option_string_from_js(len: usize, end: &mut *const u8) -> Vec<Option<String>> {\n    let mut items = Vec::<Option<String>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<bool>(end).then(|| _ffi_string_from_host(_ffi_read::<*const u8>(end), _ffi_read::<usize>(end))));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_option_in_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function add_option(x: number | null, y: number | null): number;\nexport function add_nested(x: number | null, y: number | null): number;\nexport function add_all(x: (number | null)[]): number;\nexport function join_all(x: (string | null)[]): string;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_option_in_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function add_option(x, y) {\n    let buf = _ffi_new_WriteBuf();\n    let has_x = x !== null;\n    if (x !== null) {\n        _ffi_write_i32(buf, x);\n    }\n    let has_y = y !== null;\n    if (y !== null) {\n        _ffi_write_i32(buf, y);\n    }\n    return _ffi_exports._ffi_fn_add_option(_ffi_buf_to_rust(buf), has_x, has_y);\n}\n\nexport function add_nested(x, y) {\n    let buf = _ffi_new_WriteBuf();\n    let has_x = x !== null;\n    if (x !== null) {\n        let x_val = x;\n        _ffi_write_i8(buf, +(x_val !== null));\n        if (x_val !== null) {\n            _ffi_write_i32(buf, x_val);\n        }\n    }\n    let has_y = y !== null;\n    if (y !== null) {\n        let y_val = y;\n        _ffi_write_i8(buf, +(y_val !== null));\n        if (y_val !== null) {\n            _ffi_write_i32(buf, y_val);\n        }\n    }\n    return _ffi_exports._ffi_fn_add_nested(_ffi_buf_to_rust(buf), has_x, has_y);\n}\n\nexport function add_all(x) {\n    let buf = _ffi_new_WriteBuf();\n    let x_len = x.length;\n    _ffi_vec_option_i32_to_rust(x, buf);\n    return _ffi_exports._ffi_fn_add_all(_ffi_buf_to_rust(buf), x_len);\n}\n\nexport function join_all(x) {\n    let buf = _ffi_new_WriteBuf();\n    let x_len = x.length;\n    _ffi_vec_option_string_to_rust(x, buf);\n    let multi_ret = _ffi_exports._ffi_fn_join_all(_ffi_buf_to_rust(buf), x_len);\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nlet _ffi_len = 0;\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\nlet _ffi_dv;\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_string_from_rust(ptr, len, cap) {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_string_to_rust(str) {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_vec_option_i32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i8(buf, +(item !== null));\n        if (item !== null) {\n            _ffi_write_i32(buf, item);\n        }\n    }\n}\n\nfunction _ffi_vec_option_string_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i8(buf, +(item !== null));\n        if (item !== null) {\n            let item_val_ptr = _ffi_string_to_rust(item), item_val_len = _ffi_len;\n            _ffi_write_i32(buf, item_val_ptr);\n            _ffi_write_i32(buf, item_val_len);\n        }\n    }\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf, val) {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv.setInt8(ptr, val);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_option_in_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function add_option(x: number | null, y: number | null): number {\n    let buf = _ffi_new_WriteBuf();\n    let has_x = x !== null;\n    if (x !== null) {\n        _ffi_write_i32(buf, x);\n    }\n    let has_y = y !== null;\n    if (y !== null) {\n        _ffi_write_i32(buf, y);\n    }\n    return _ffi_exports._ffi_fn_add_option(_ffi_buf_to_rust(buf), has_x, has_y);\n}\n\nexport function add_nested(x: number | null, y: number | null): number {\n    let buf = _ffi_new_WriteBuf();\n    let has_x = x !== null;\n    if (x !== null) {\n        let x_val = x;\n        _ffi_write_i8(buf, +(x_val !== null));\n        if (x_val !== null) {\n            _ffi_write_i32(buf, x_val);\n        }\n    }\n    let has_y = y !== null;\n    if (y !== null) {\n        let y_val = y;\n        _ffi_write_i8(buf, +(y_val !== null));\n        if (y_val !== null) {\n            _ffi_write_i32(buf, y_val);\n        }\n    }\n    return _ffi_exports._ffi_fn_add_nested(_ffi_buf_to_rust(buf), has_x, has_y);\n}\n\nexport function add_all(x: (number | null)[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let x_len = x.length;\n    _ffi_vec_option_i32_to_rust(x, buf);\n    return _ffi_exports._ffi_fn_add_all(_ffi_buf_to_rust(buf), x_len);\n}\n\nexport function join_all(x: (string | null)[]): string {\n    let buf = _ffi_new_WriteBuf();\n    let x_len = x.length;\n    _ffi_vec_option_string_to_rust(x, buf);\n    let multi_ret = _ffi_exports._ffi_fn_join_all(_ffi_buf_to_rust(buf), x_len);\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nlet _ffi_len = 0;\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8: Uint8Array;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\nlet _ffi_dv: DataView;\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_string_from_rust(ptr: number, len: number, cap: number): string {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_string_to_rust(str: string): number {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_vec_option_i32_to_rust(items: (number | null)[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i8(buf, +(item !== null));\n        if (item !== null) {\n            _ffi_write_i32(buf, item);\n        }\n    }\n}\n\nfunction _ffi_vec_option_string_to_rust(items: (string | null)[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i8(buf, +(item !== null));\n        if (item !== null) {\n            let item_val_ptr = _ffi_string_to_rust(item), item_val_len = _ffi_len;\n            _ffi_write_i32(buf, item_val_ptr);\n            _ffi_write_i32(buf, item_val_len);\n        }\n    }\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv!.setInt8(ptr, val);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_add_all: (buf_ptr: number, x_len: number) => number,\n    _ffi_fn_add_nested: (buf_ptr: number, has_x: boolean, has_y: boolean) => number,\n    _ffi_fn_add_option: (buf_ptr: number, has_x: boolean, has_y: boolean) => number,\n    _ffi_fn_join_all: (buf_ptr: number, x_len: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_alloc: (len: number) => number,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_option_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_all(buf_ptr: *const u8, x_len: usize) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_all(_ffi_vec_option_i32_from_js(x_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_nested(buf_ptr: *const u8, has_x: bool, has_y: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_nested(\n        has_x.then(|| _ffi_read::<bool>(&mut buf_end).then(|| _ffi_read::<i32>(&mut buf_end))),\n        has_y.then(|| _ffi_read::<bool>(&mut buf_end).then(|| _ffi_read::<i32>(&mut buf_end)))\n    );\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_add_option(buf_ptr: *const u8, has_x: bool, has_y: bool) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = add_option(has_x.then(|| _ffi_read::<i32>(&mut buf_end)), has_y.then(|| _ffi_read::<i32>(&mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_join_all(buf_ptr: *const u8, x_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(join_all(_ffi_vec_option_string_from_js(x_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_option_i32_from_js(len: usize, end: &mut *const u8) -> Vec<Option<i32>> {\n    let mut items = Vec::<Option<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<bool>(end).then(|| _ffi_read::<i32>(end)));\n    }\n    items\n}\n\nfn _ffi_vec_option_string_from_js(len: usize, end: &mut *const u8) -> Vec<Option<String>> {\n    let mut items = Vec::<Option<String>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<bool>(end).then(|| _ffi_string_from_host(_ffi_read::<*const u8>(end), _ffi_read::<usize>(end))));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_option_out_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function opt_int(x: boolean, y: number): number | null;\nexport function opt_opt_int(x: boolean, y: boolean, z: number): number | null;\nexport function vec_opt_int(n: number): (number | null)[];\nexport function opt_vec_opt_string(n: number): (string | null)[] | null;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_option_out_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function opt_int(x, y) {\n    let multi_ret = _ffi_exports._ffi_fn_opt_int(x, y);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret = _ffi_dv.getUint8(multi_ret + 8);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = has_ret ? _ffi_read_i32(buf) : null;\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function opt_opt_int(x, y, z) {\n    let multi_ret = _ffi_exports._ffi_fn_opt_opt_int(x, y, z);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret = _ffi_dv.getUint8(multi_ret + 8);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = has_ret ? _ffi_read_u8(buf) ? _ffi_read_i32(buf) : null : null;\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function vec_opt_int(n) {\n    let multi_ret = _ffi_exports._ffi_fn_vec_opt_int(n);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_vec_option_i32_from_rust(ret_len, buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function opt_vec_opt_string(n) {\n    let multi_ret = _ffi_exports._ffi_fn_opt_vec_opt_string(n);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret = _ffi_dv.getUint8(multi_ret + 8);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = has_ret ? _ffi_vec_option_string_from_rust(_ffi_read_u32(buf), buf) : null;\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf) {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u8(buf) {\n    return buf.dv.getUint8(buf.off++);\n}\n\nfunction _ffi_string_from_rust(ptr, len, cap) {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_vec_option_i32_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(_ffi_read_u8(buf) ? _ffi_read_i32(buf) : null);\n    }\n    return items;\n}\n\nfunction _ffi_vec_option_string_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(_ffi_read_u8(buf) ? _ffi_string_from_rust(_ffi_read_i32(buf), _ffi_read_u32(buf), _ffi_read_u32(buf)) : null);\n    }\n    return items;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_option_out_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function opt_int(x: boolean, y: number): number | null {\n    let multi_ret = _ffi_exports._ffi_fn_opt_int(x, y);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret = _ffi_dv.getUint8(multi_ret + 8);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret: number | null = has_ret ? _ffi_read_i32(buf) : null;\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function opt_opt_int(x: boolean, y: boolean, z: number): number | null {\n    let multi_ret = _ffi_exports._ffi_fn_opt_opt_int(x, y, z);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret = _ffi_dv.getUint8(multi_ret + 8);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret: number | null = has_ret ? _ffi_read_u8(buf) ? _ffi_read_i32(buf) : null : null;\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function vec_opt_int(n: number): (number | null)[] {\n    let multi_ret = _ffi_exports._ffi_fn_vec_opt_int(n);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_vec_option_i32_from_rust(ret_len, buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function opt_vec_opt_string(n: number): (string | null)[] | null {\n    let multi_ret = _ffi_exports._ffi_fn_opt_vec_opt_string(n);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret = _ffi_dv.getUint8(multi_ret + 8);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret: (string | null)[] | null = has_ret ? _ffi_vec_option_string_from_rust(_ffi_read_u32(buf), buf) : null;\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u8(buf: _ffi_ReadBuf): number {\n    return buf.dv.getUint8(buf.off++);\n}\n\nfunction _ffi_string_from_rust(ptr: number, len: number, cap: number): string {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_vec_option_i32_from_rust(len: number, buf: _ffi_ReadBuf): (number | null)[] {\n    let items: (number | null)[] = [];\n    while (items.length < len) {\n        items.push(_ffi_read_u8(buf) ? _ffi_read_i32(buf) : null);\n    }\n    return items;\n}\n\nfunction _ffi_vec_option_string_from_rust(len: number, buf: _ffi_ReadBuf): (string | null)[] {\n    let items: (string | null)[] = [];\n    while (items.length < len) {\n        items.push(_ffi_read_u8(buf) ? _ffi_string_from_rust(_ffi_read_i32(buf), _ffi_read_u32(buf), _ffi_read_u32(buf)) : null);\n    }\n    return items;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_opt_int: (x: boolean, y: number) => number,\n    _ffi_fn_opt_opt_int: (x: boolean, y: boolean, z: number) => number,\n    _ffi_fn_opt_vec_opt_string: (n: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_vec_opt_int: (n: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_option_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_int(x: bool, y: i32) -> *const _ffi_ret_ptr_usize_bool {\n    let ret = opt_int(x, y);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_USIZE_BOOL = _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE_BOOL)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_opt_int(x: bool, y: bool, z: i32) -> *const _ffi_ret_ptr_usize_bool {\n    let ret = opt_opt_int(x, y, z);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val.is_some(), &mut buf);\n        if let Some(ret_val_val) = ret_val {\n            _ffi_write(ret_val_val, &mut buf);\n        }\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_USIZE_BOOL = _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE_BOOL)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_opt_vec_opt_string(n: i32) -> *const _ffi_ret_ptr_usize_bool {\n    let ret = opt_vec_opt_string(n);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val.len(), &mut buf);\n        _ffi_vec_option_string_to_js(ret_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_USIZE_BOOL = _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE_BOOL)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_vec_opt_int(n: i32) -> *const _ffi_ret_ptr_2_usize {\n    let ret = vec_opt_int(n);\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_option_i32_to_js(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize_bool(*const u8, usize, bool);\nstatic mut _FFI_RET_PTR_USIZE_BOOL: _ffi_ret_ptr_usize_bool = _ffi_ret_ptr_usize_bool(std::ptr::null(), 0, false);\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_option_i32_to_js(items: Vec<Option<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.is_some(), buf);\n        if let Some(item_val) = item {\n            _ffi_write(item_val, buf);\n        }\n    }\n}\n\nfn _ffi_vec_option_string_to_js(items: Vec<Option<String>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.is_some(), buf);\n        if let Some(item_val) = item {\n            let (item_val_ptr, item_val_len, item_val_cap) = _ffi_string_to_host(item_val);\n            _ffi_write(item_val_ptr, buf);\n            _ffi_write(item_val_len, buf);\n            _ffi_write(item_val_cap, buf);\n        }\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_option_out_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function opt_int(x: boolean, y: number): number | null;\nexport function opt_opt_int(x: boolean, y: boolean, z: number): number | null;\nexport function vec_opt_int(n: number): (number | null)[];\nexport function opt_vec_opt_string(n: number): (string | null)[] | null;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_option_out_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function opt_int(x, y) {\n    let multi_ret = _ffi_exports._ffi_fn_opt_int(x, y);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret = _ffi_dv.getUint8(multi_ret + 8);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = has_ret ? _ffi_read_i32(buf) : null;\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function opt_opt_int(x, y, z) {\n    let multi_ret = _ffi_exports._ffi_fn_opt_opt_int(x, y, z);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret = _ffi_dv.getUint8(multi_ret + 8);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = has_ret ? _ffi_read_u8(buf) ? _ffi_read_i32(buf) : null : null;\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function vec_opt_int(n) {\n    let multi_ret = _ffi_exports._ffi_fn_vec_opt_int(n);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_vec_option_i32_from_rust(ret_len, buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function opt_vec_opt_string(n) {\n    let multi_ret = _ffi_exports._ffi_fn_opt_vec_opt_string(n);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret = _ffi_dv.getUint8(multi_ret + 8);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = has_ret ? _ffi_vec_option_string_from_rust(_ffi_read_u32(buf), buf) : null;\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf) {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u8(buf) {\n    return buf.dv.getUint8(buf.off++);\n}\n\nfunction _ffi_string_from_rust(ptr, len, cap) {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_vec_option_i32_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(_ffi_read_u8(buf) ? _ffi_read_i32(buf) : null);\n    }\n    return items;\n}\n\nfunction _ffi_vec_option_string_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(_ffi_read_u8(buf) ? _ffi_string_from_rust(_ffi_read_i32(buf), _ffi_read_u32(buf), _ffi_read_u32(buf)) : null);\n    }\n    return items;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_option_out_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function opt_int(x: boolean, y: number): number | null {\n    let multi_ret = _ffi_exports._ffi_fn_opt_int(x, y);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret = _ffi_dv.getUint8(multi_ret + 8);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret: number | null = has_ret ? _ffi_read_i32(buf) : null;\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function opt_opt_int(x: boolean, y: boolean, z: number): number | null {\n    let multi_ret = _ffi_exports._ffi_fn_opt_opt_int(x, y, z);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret = _ffi_dv.getUint8(multi_ret + 8);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret: number | null = has_ret ? _ffi_read_u8(buf) ? _ffi_read_i32(buf) : null : null;\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function vec_opt_int(n: number): (number | null)[] {\n    let multi_ret = _ffi_exports._ffi_fn_vec_opt_int(n);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_vec_option_i32_from_rust(ret_len, buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function opt_vec_opt_string(n: number): (string | null)[] | null {\n    let multi_ret = _ffi_exports._ffi_fn_opt_vec_opt_string(n);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let has_ret = _ffi_dv.getUint8(multi_ret + 8);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret: (string | null)[] | null = has_ret ? _ffi_vec_option_string_from_rust(_ffi_read_u32(buf), buf) : null;\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u8(buf: _ffi_ReadBuf): number {\n    return buf.dv.getUint8(buf.off++);\n}\n\nfunction _ffi_string_from_rust(ptr: number, len: number, cap: number): string {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_vec_option_i32_from_rust(len: number, buf: _ffi_ReadBuf): (number | null)[] {\n    let items: (number | null)[] = [];\n    while (items.length < len) {\n        items.push(_ffi_read_u8(buf) ? _ffi_read_i32(buf) : null);\n    }\n    return items;\n}\n\nfunction _ffi_vec_option_string_from_rust(len: number, buf: _ffi_ReadBuf): (string | null)[] {\n    let items: (string | null)[] = [];\n    while (items.length < len) {\n        items.push(_ffi_read_u8(buf) ? _ffi_string_from_rust(_ffi_read_i32(buf), _ffi_read_u32(buf), _ffi_read_u32(buf)) : null);\n    }\n    return items;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_opt_int: (x: boolean, y: number) => number,\n    _ffi_fn_opt_opt_int: (x: boolean, y: boolean, z: number) => number,\n    _ffi_fn_opt_vec_opt_string: (n: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_vec_opt_int: (n: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_option_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_int(x: bool, y: i32) -> *const _ffi_ret_ptr_usize_bool {\n    let ret = opt_int(x, y);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_USIZE_BOOL = _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE_BOOL)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_opt_int(x: bool, y: bool, z: i32) -> *const _ffi_ret_ptr_usize_bool {\n    let ret = opt_opt_int(x, y, z);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val.is_some(), &mut buf);\n        if let Some(ret_val_val) = ret_val {\n            _ffi_write(ret_val_val, &mut buf);\n        }\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_USIZE_BOOL = _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE_BOOL)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_opt_vec_opt_string(n: i32) -> *const _ffi_ret_ptr_usize_bool {\n    let ret = opt_vec_opt_string(n);\n    let mut buf = Vec::<u8>::new();\n    let has_ret = ret.is_some();\n    if let Some(ret_val) = ret {\n        _ffi_write(ret_val.len(), &mut buf);\n        _ffi_vec_option_string_to_js(ret_val, &mut buf);\n    }\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_USIZE_BOOL = _ffi_ret_ptr_usize_bool(buf_ptr, buf_cap, has_ret);\n        std::ptr::addr_of!(_FFI_RET_PTR_USIZE_BOOL)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_vec_opt_int(n: i32) -> *const _ffi_ret_ptr_2_usize {\n    let ret = vec_opt_int(n);\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_option_i32_to_js(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize_bool(*const u8, usize, bool);\nstatic mut _FFI_RET_PTR_USIZE_BOOL: _ffi_ret_ptr_usize_bool = _ffi_ret_ptr_usize_bool(std::ptr::null(), 0, false);\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_option_i32_to_js(items: Vec<Option<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.is_some(), buf);\n        if let Some(item_val) = item {\n            _ffi_write(item_val, buf);\n        }\n    }\n}\n\nfn _ffi_vec_option_string_to_js(items: Vec<Option<String>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.is_some(), buf);\n        if let Some(item_val) = item {\n            let (item_val_ptr, item_val_len, item_val_cap) = _ffi_string_to_host(item_val);\n            _ffi_write(item_val_ptr, buf);\n            _ffi_write(item_val_len, buf);\n            _ffi_write(item_val_cap, buf);\n        }\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_payload_in_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport type Foo =\n    | { readonly $: \"Empty\" }\n    | { readonly $: \"Single\", 0: number }\n    | { readonly $: \"Point\", x: number, y: number }\n    | { readonly $: \"Nested\", 0: Foo }\n\nexport function rust_mem_leaked(): number;\nexport function set_tests(tests: Foo[]): boolean;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_payload_in_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_tests(tests) {\n    let buf = _ffi_new_WriteBuf();\n    let tests_len = tests.length;\n    _ffi_vec_Foo_to_rust(tests, buf);\n    let ret = _ffi_exports._ffi_fn_set_tests(_ffi_buf_to_rust(buf), tests_len);\n    return !!ret;\n}\n\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8;\n\nfunction _ffi_box_Foo_to_rust(val, buf) {\n    _ffi_enum_Foo_to_rust(val, buf);\n}\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_enum_Foo_to_rust(val, buf) {\n    switch (val.$) {\n        case \"Empty\":\n            _ffi_write_i32(buf, 0);\n            break;\n        case \"Single\":\n            _ffi_write_i32(buf, 1);\n            _ffi_write_i32(buf, val[0]);\n            break;\n        case \"Point\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.x);\n            _ffi_write_i32(buf, val.y);\n            break;\n        case \"Nested\":\n            _ffi_write_i32(buf, 3);\n            _ffi_box_Foo_to_rust(val[0], buf);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"Foo\\\"\");\n    }\n}\n\nfunction _ffi_vec_Foo_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_enum_Foo_to_rust(item, buf);\n    }\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_payload_in_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport type Foo =\n    | { readonly $: \"Empty\" }\n    | { readonly $: \"Single\", 0: number }\n    | { readonly $: \"Point\", x: number, y: number }\n    | { readonly $: \"Nested\", 0: Foo }\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_tests(tests: Foo[]): boolean {\n    let buf = _ffi_new_WriteBuf();\n    let tests_len = tests.length;\n    _ffi_vec_Foo_to_rust(tests, buf);\n    let ret = _ffi_exports._ffi_fn_set_tests(_ffi_buf_to_rust(buf), tests_len);\n    return !!ret;\n}\n\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8: Uint8Array;\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nfunction _ffi_box_Foo_to_rust(val: Foo, buf: _ffi_WriteBuf): void {\n    _ffi_enum_Foo_to_rust(val, buf);\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_enum_Foo_to_rust(val: Foo, buf: _ffi_WriteBuf): void {\n    switch (val.$) {\n        case \"Empty\":\n            _ffi_write_i32(buf, 0);\n            break;\n        case \"Single\":\n            _ffi_write_i32(buf, 1);\n            _ffi_write_i32(buf, val[0]);\n            break;\n        case \"Point\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.x);\n            _ffi_write_i32(buf, val.y);\n            break;\n        case \"Nested\":\n            _ffi_write_i32(buf, 3);\n            _ffi_box_Foo_to_rust(val[0], buf);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"Foo\\\"\");\n    }\n}\n\nfunction _ffi_vec_Foo_to_rust(items: Foo[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_enum_Foo_to_rust(item, buf);\n    }\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_set_tests: (buf_ptr: number, tests_len: number) => boolean,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_payload_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Foo_from_js(end: &mut *const u8) -> Box<Foo> {\n    Box::new(_ffi_enum_Foo_from_js(end))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_from_js(end: &mut *const u8) -> Foo {\n    match _ffi_read::<i32>(end) {\n        0 => Foo::Empty,\n        1 => Foo::Single(_ffi_read::<i32>(end)),\n        2 => Foo::Point { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        3 => Foo::Nested(_ffi_box_Foo_from_js(end)),\n        _ => panic!(),\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_tests(buf_ptr: *const u8, tests_len: usize) -> bool {\n    let mut buf_end = buf_ptr;\n    let ret = set_tests(_ffi_vec_Foo_from_js(tests_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_from_js(len: usize, end: &mut *const u8) -> Vec<Foo> {\n    let mut items = Vec::<Foo>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_enum_Foo_from_js(end));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_payload_in_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport type Foo =\n    | { readonly $: \"Empty\" }\n    | { readonly $: \"Single\", 0: number }\n    | { readonly $: \"Point\", x: number, y: number }\n    | { readonly $: \"Nested\", 0: Foo }\n\nexport function rust_mem_leaked(): number;\nexport function set_tests(tests: Foo[]): boolean;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_payload_in_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_tests(tests) {\n    let buf = _ffi_new_WriteBuf();\n    let tests_len = tests.length;\n    _ffi_vec_Foo_to_rust(tests, buf);\n    let ret = _ffi_exports._ffi_fn_set_tests(_ffi_buf_to_rust(buf), tests_len);\n    return !!ret;\n}\n\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8;\n\nfunction _ffi_box_Foo_to_rust(val, buf) {\n    _ffi_enum_Foo_to_rust(val, buf);\n}\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_enum_Foo_to_rust(val, buf) {\n    switch (val.$) {\n        case \"Empty\":\n            _ffi_write_i32(buf, 0);\n            break;\n        case \"Single\":\n            _ffi_write_i32(buf, 1);\n            _ffi_write_i32(buf, val[0]);\n            break;\n        case \"Point\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.x);\n            _ffi_write_i32(buf, val.y);\n            break;\n        case \"Nested\":\n            _ffi_write_i32(buf, 3);\n            _ffi_box_Foo_to_rust(val[0], buf);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"Foo\\\"\");\n    }\n}\n\nfunction _ffi_vec_Foo_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_enum_Foo_to_rust(item, buf);\n    }\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_payload_in_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport type Foo =\n    | { readonly $: \"Empty\" }\n    | { readonly $: \"Single\", 0: number }\n    | { readonly $: \"Point\", x: number, y: number }\n    | { readonly $: \"Nested\", 0: Foo }\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_tests(tests: Foo[]): boolean {\n    let buf = _ffi_new_WriteBuf();\n    let tests_len = tests.length;\n    _ffi_vec_Foo_to_rust(tests, buf);\n    let ret = _ffi_exports._ffi_fn_set_tests(_ffi_buf_to_rust(buf), tests_len);\n    return !!ret;\n}\n\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8: Uint8Array;\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nfunction _ffi_box_Foo_to_rust(val: Foo, buf: _ffi_WriteBuf): void {\n    _ffi_enum_Foo_to_rust(val, buf);\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_enum_Foo_to_rust(val: Foo, buf: _ffi_WriteBuf): void {\n    switch (val.$) {\n        case \"Empty\":\n            _ffi_write_i32(buf, 0);\n            break;\n        case \"Single\":\n            _ffi_write_i32(buf, 1);\n            _ffi_write_i32(buf, val[0]);\n            break;\n        case \"Point\":\n            _ffi_write_i32(buf, 2);\n            _ffi_write_i32(buf, val.x);\n            _ffi_write_i32(buf, val.y);\n            break;\n        case \"Nested\":\n            _ffi_write_i32(buf, 3);\n            _ffi_box_Foo_to_rust(val[0], buf);\n            break;\n        default:\n            throw TypeError(\"Invalid value for enum \\\"Foo\\\"\");\n    }\n}\n\nfunction _ffi_vec_Foo_to_rust(items: Foo[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_enum_Foo_to_rust(item, buf);\n    }\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_set_tests: (buf_ptr: number, tests_len: number) => boolean,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_payload_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Foo_from_js(end: &mut *const u8) -> Box<Foo> {\n    Box::new(_ffi_enum_Foo_from_js(end))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_from_js(end: &mut *const u8) -> Foo {\n    match _ffi_read::<i32>(end) {\n        0 => Foo::Empty,\n        1 => Foo::Single(_ffi_read::<i32>(end)),\n        2 => Foo::Point { x: _ffi_read::<i32>(end), y: _ffi_read::<i32>(end) },\n        3 => Foo::Nested(_ffi_box_Foo_from_js(end)),\n        _ => panic!(),\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_tests(buf_ptr: *const u8, tests_len: usize) -> bool {\n    let mut buf_end = buf_ptr;\n    let ret = set_tests(_ffi_vec_Foo_from_js(tests_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_from_js(len: usize, end: &mut *const u8) -> Vec<Foo> {\n    let mut items = Vec::<Foo>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_enum_Foo_from_js(end));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_payload_out_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport type Foo =\n    | { readonly $: \"Empty\" }\n    | { readonly $: \"Single\", 0: number }\n    | { readonly $: \"Point\", x: number, y: number }\n    | { readonly $: \"Nested\", 0: Foo }\n\nexport function rust_mem_leaked(): number;\nexport function get_tests(): Foo[];\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_payload_out_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_tests() {\n    let multi_ret = _ffi_exports._ffi_fn_get_tests();\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_vec_Foo_from_rust(ret_len, buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\nlet _ffi_enum_Foo__Empty = { $: \"Empty\" };\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_box_Foo_from_rust(buf) {\n    return _ffi_enum_Foo_from_rust(buf);\n}\n\nfunction _ffi_enum_Foo_from_rust(buf) {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return _ffi_enum_Foo__Empty;\n        case 1: return { $: \"Single\", 0: _ffi_read_i32(buf) };\n        case 2: return { $: \"Point\", x: _ffi_read_i32(buf), y: _ffi_read_i32(buf) };\n        case 3: return { $: \"Nested\", 0: _ffi_box_Foo_from_rust(buf) };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_vec_Foo_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(_ffi_enum_Foo_from_rust(buf));\n    }\n    return items;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_payload_out_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport type Foo =\n    | { readonly $: \"Empty\" }\n    | { readonly $: \"Single\", 0: number }\n    | { readonly $: \"Point\", x: number, y: number }\n    | { readonly $: \"Nested\", 0: Foo }\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_tests(): Foo[] {\n    let multi_ret = _ffi_exports._ffi_fn_get_tests();\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_vec_Foo_from_rust(ret_len, buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\nlet _ffi_enum_Foo__Empty: Foo = { $: \"Empty\" };\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_box_Foo_from_rust(buf: _ffi_ReadBuf): Foo {\n    return _ffi_enum_Foo_from_rust(buf);\n}\n\nfunction _ffi_enum_Foo_from_rust(buf: _ffi_ReadBuf): Foo {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return _ffi_enum_Foo__Empty;\n        case 1: return { $: \"Single\", 0: _ffi_read_i32(buf) };\n        case 2: return { $: \"Point\", x: _ffi_read_i32(buf), y: _ffi_read_i32(buf) };\n        case 3: return { $: \"Nested\", 0: _ffi_box_Foo_from_rust(buf) };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_vec_Foo_from_rust(len: number, buf: _ffi_ReadBuf): Foo[] {\n    let items: Foo[] = [];\n    while (items.length < len) {\n        items.push(_ffi_enum_Foo_from_rust(buf));\n    }\n    return items;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_get_tests: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_payload_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Foo_to_js(val: Foo, buf: &mut Vec<u8>) {\n    _ffi_enum_Foo_to_js(val, buf);\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_to_js(val: Foo, buf: &mut Vec<u8>) {\n    match val {\n        Foo::Empty => _ffi_write(0 as i32, buf),\n        Foo::Single(x) => {\n            _ffi_write(1 as i32, buf);\n            _ffi_write(x, buf);\n        }\n        Foo::Point { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n        Foo::Nested(x) => {\n            _ffi_write(3 as i32, buf);\n            _ffi_box_Foo_to_js(*x, buf);\n        }\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_tests() -> *const _ffi_ret_ptr_2_usize {\n    let ret = get_tests();\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_Foo_to_js(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_to_js(items: Vec<Foo>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_enum_Foo_to_js(item, buf);\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_payload_out_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport type Foo =\n    | { readonly $: \"Empty\" }\n    | { readonly $: \"Single\", 0: number }\n    | { readonly $: \"Point\", x: number, y: number }\n    | { readonly $: \"Nested\", 0: Foo }\n\nexport function rust_mem_leaked(): number;\nexport function get_tests(): Foo[];\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_payload_out_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_tests() {\n    let multi_ret = _ffi_exports._ffi_fn_get_tests();\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_vec_Foo_from_rust(ret_len, buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\nlet _ffi_enum_Foo__Empty = { $: \"Empty\" };\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_box_Foo_from_rust(buf) {\n    return _ffi_enum_Foo_from_rust(buf);\n}\n\nfunction _ffi_enum_Foo_from_rust(buf) {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return _ffi_enum_Foo__Empty;\n        case 1: return { $: \"Single\", 0: _ffi_read_i32(buf) };\n        case 2: return { $: \"Point\", x: _ffi_read_i32(buf), y: _ffi_read_i32(buf) };\n        case 3: return { $: \"Nested\", 0: _ffi_box_Foo_from_rust(buf) };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_vec_Foo_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(_ffi_enum_Foo_from_rust(buf));\n    }\n    return items;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_payload_out_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport type Foo =\n    | { readonly $: \"Empty\" }\n    | { readonly $: \"Single\", 0: number }\n    | { readonly $: \"Point\", x: number, y: number }\n    | { readonly $: \"Nested\", 0: Foo }\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_tests(): Foo[] {\n    let multi_ret = _ffi_exports._ffi_fn_get_tests();\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_vec_Foo_from_rust(ret_len, buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\nlet _ffi_enum_Foo__Empty: Foo = { $: \"Empty\" };\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_box_Foo_from_rust(buf: _ffi_ReadBuf): Foo {\n    return _ffi_enum_Foo_from_rust(buf);\n}\n\nfunction _ffi_enum_Foo_from_rust(buf: _ffi_ReadBuf): Foo {\n    switch (_ffi_read_i32(buf)) {\n        case 0: return _ffi_enum_Foo__Empty;\n        case 1: return { $: \"Single\", 0: _ffi_read_i32(buf) };\n        case 2: return { $: \"Point\", x: _ffi_read_i32(buf), y: _ffi_read_i32(buf) };\n        case 3: return { $: \"Nested\", 0: _ffi_box_Foo_from_rust(buf) };\n        default: throw Error();\n    }\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_vec_Foo_from_rust(len: number, buf: _ffi_ReadBuf): Foo[] {\n    let items: Foo[] = [];\n    while (items.length < len) {\n        items.push(_ffi_enum_Foo_from_rust(buf));\n    }\n    return items;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_get_tests: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_payload_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[allow(non_snake_case)]\nfn _ffi_box_Foo_to_js(val: Foo, buf: &mut Vec<u8>) {\n    _ffi_enum_Foo_to_js(val, buf);\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Foo_to_js(val: Foo, buf: &mut Vec<u8>) {\n    match val {\n        Foo::Empty => _ffi_write(0 as i32, buf),\n        Foo::Single(x) => {\n            _ffi_write(1 as i32, buf);\n            _ffi_write(x, buf);\n        }\n        Foo::Point { x, y } => {\n            _ffi_write(2 as i32, buf);\n            _ffi_write(x, buf);\n            _ffi_write(y, buf);\n        }\n        Foo::Nested(x) => {\n            _ffi_write(3 as i32, buf);\n            _ffi_box_Foo_to_js(*x, buf);\n        }\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_tests() -> *const _ffi_ret_ptr_2_usize {\n    let ret = get_tests();\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_Foo_to_js(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\n#[allow(non_snake_case)]\nfn _ffi_vec_Foo_to_js(items: Vec<Foo>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_enum_Foo_to_js(item, buf);\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_string_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function reset(): void;\nexport function get_string_len(): number;\nexport function get_string(): string;\nexport function set_string(x: string): void;\nexport function set_str(x: string): void;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_string_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function reset() {\n    _ffi_exports._ffi_fn_reset();\n}\n\nexport function get_string_len() {\n    return _ffi_exports._ffi_fn_get_string_len();\n}\n\nexport function get_string() {\n    let multi_ret = _ffi_exports._ffi_fn_get_string();\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nexport function set_string(x) {\n    let x_ptr = _ffi_string_to_rust(x), x_len = _ffi_len;\n    _ffi_exports._ffi_fn_set_string(x_ptr, x_len);\n}\n\nexport function set_str(x) {\n    let x_ptr = _ffi_string_to_rust(x), x_len = _ffi_len;\n    _ffi_exports._ffi_fn_set_str(x_ptr, x_len);\n}\n\nlet _ffi_len = 0;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\nlet _ffi_u8;\nlet _ffi_dv;\n\nfunction _ffi_string_from_rust(ptr, len, cap) {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_string_to_rust(str) {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_string_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function reset(): void {\n    _ffi_exports._ffi_fn_reset();\n}\n\nexport function get_string_len(): number {\n    return _ffi_exports._ffi_fn_get_string_len();\n}\n\nexport function get_string(): string {\n    let multi_ret = _ffi_exports._ffi_fn_get_string();\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nexport function set_string(x: string): void {\n    let x_ptr = _ffi_string_to_rust(x), x_len = _ffi_len;\n    _ffi_exports._ffi_fn_set_string(x_ptr, x_len);\n}\n\nexport function set_str(x: string): void {\n    let x_ptr = _ffi_string_to_rust(x), x_len = _ffi_len;\n    _ffi_exports._ffi_fn_set_str(x_ptr, x_len);\n}\n\nlet _ffi_len = 0;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\nlet _ffi_u8: Uint8Array;\nlet _ffi_dv: DataView;\n\nfunction _ffi_string_from_rust(ptr: number, len: number, cap: number): string {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_string_to_rust(str: string): number {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_get_string: () => number,\n    _ffi_fn_get_string_len: () => number,\n    _ffi_fn_reset: () => void,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_set_str: (x_ptr: number, x_len: number) => void,\n    _ffi_fn_set_string: (x_ptr: number, x_len: number) => void,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_string_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_string() -> *const _ffi_ret_ptr_2_usize {\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(get_string());\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_string_len() -> i32 {\n    get_string_len()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_reset() {\n    reset();\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_str(x_ptr: *const u8, x_len: usize) {\n    set_str(&_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_string(x_ptr: *const u8, x_len: usize) {\n    set_string(_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_string_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function reset(): void;\nexport function get_string_len(): number;\nexport function get_string(): string;\nexport function set_string(x: string): void;\nexport function set_str(x: string): void;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_string_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function reset() {\n    _ffi_exports._ffi_fn_reset();\n}\n\nexport function get_string_len() {\n    return _ffi_exports._ffi_fn_get_string_len();\n}\n\nexport function get_string() {\n    let multi_ret = _ffi_exports._ffi_fn_get_string();\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nexport function set_string(x) {\n    let x_ptr = _ffi_string_to_rust(x), x_len = _ffi_len;\n    _ffi_exports._ffi_fn_set_string(x_ptr, x_len);\n}\n\nexport function set_str(x) {\n    let x_ptr = _ffi_string_to_rust(x), x_len = _ffi_len;\n    _ffi_exports._ffi_fn_set_str(x_ptr, x_len);\n}\n\nlet _ffi_len = 0;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\nlet _ffi_u8;\nlet _ffi_dv;\n\nfunction _ffi_string_from_rust(ptr, len, cap) {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_string_to_rust(str) {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_string_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function reset(): void {\n    _ffi_exports._ffi_fn_reset();\n}\n\nexport function get_string_len(): number {\n    return _ffi_exports._ffi_fn_get_string_len();\n}\n\nexport function get_string(): string {\n    let multi_ret = _ffi_exports._ffi_fn_get_string();\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nexport function set_string(x: string): void {\n    let x_ptr = _ffi_string_to_rust(x), x_len = _ffi_len;\n    _ffi_exports._ffi_fn_set_string(x_ptr, x_len);\n}\n\nexport function set_str(x: string): void {\n    let x_ptr = _ffi_string_to_rust(x), x_len = _ffi_len;\n    _ffi_exports._ffi_fn_set_str(x_ptr, x_len);\n}\n\nlet _ffi_len = 0;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\nlet _ffi_u8: Uint8Array;\nlet _ffi_dv: DataView;\n\nfunction _ffi_string_from_rust(ptr: number, len: number, cap: number): string {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_string_to_rust(str: string): number {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_get_string: () => number,\n    _ffi_fn_get_string_len: () => number,\n    _ffi_fn_reset: () => void,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_set_str: (x_ptr: number, x_len: number) => void,\n    _ffi_fn_set_string: (x_ptr: number, x_len: number) => void,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_string_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_string() -> *const _ffi_ret_ptr_2_usize {\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(get_string());\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_string_len() -> i32 {\n    get_string_len()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_reset() {\n    reset();\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_str(x_ptr: *const u8, x_len: usize) {\n    set_str(&_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_string(x_ptr: *const u8, x_len: usize) {\n    set_string(_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_struct_in_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface EmptyStruct {\n}\n\nexport interface SingleElementStruct {\n    0: number,\n}\n\nexport interface PairStruct {\n    x: number,\n    y: number,\n}\n\nexport function rust_mem_leaked(): number;\nexport function empty_tuple(x: number, foo: EmptyStruct, y: number): number;\nexport function single_element_tuple(x: SingleElementStruct, y: SingleElementStruct): number;\nexport function multiply_pairs(ab: PairStruct, cd: PairStruct): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_struct_in_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function empty_tuple(x, foo, y) {\n    return _ffi_exports._ffi_fn_empty_tuple(x, y);\n}\n\nexport function single_element_tuple(x, y) {\n    return _ffi_exports._ffi_fn_single_element_tuple(x[0], y[0]);\n}\n\nexport function multiply_pairs(ab, cd) {\n    return _ffi_exports._ffi_fn_multiply_pairs(ab.x, ab.y, cd.x, cd.y);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_struct_in_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface EmptyStruct {\n}\n\nexport interface SingleElementStruct {\n    0: number,\n}\n\nexport interface PairStruct {\n    x: number,\n    y: number,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function empty_tuple(x: number, foo: EmptyStruct, y: number): number {\n    return _ffi_exports._ffi_fn_empty_tuple(x, y);\n}\n\nexport function single_element_tuple(x: SingleElementStruct, y: SingleElementStruct): number {\n    return _ffi_exports._ffi_fn_single_element_tuple(x[0], y[0]);\n}\n\nexport function multiply_pairs(ab: PairStruct, cd: PairStruct): number {\n    return _ffi_exports._ffi_fn_multiply_pairs(ab.x, ab.y, cd.x, cd.y);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_empty_tuple: (x: number, y: number) => number,\n    _ffi_fn_multiply_pairs: (ab_x: number, ab_y: number, cd_x: number, cd_y: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_single_element_tuple: (x_0: number, y_0: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_struct_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_empty_tuple(x: i32, y: i32) -> i32 {\n    empty_tuple(x, EmptyStruct, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_multiply_pairs(ab_x: f32, ab_y: f32, cd_x: f32, cd_y: f32) -> f32 {\n    multiply_pairs(PairStruct { x: ab_x, y: ab_y }, PairStruct { x: cd_x, y: cd_y })\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_single_element_tuple(x_0: i32, y_0: i32) -> i32 {\n    single_element_tuple(SingleElementStruct(x_0), SingleElementStruct(y_0))\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_struct_in_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface EmptyStruct {\n}\n\nexport interface SingleElementStruct {\n    0: number,\n}\n\nexport interface PairStruct {\n    x: number,\n    y: number,\n}\n\nexport function rust_mem_leaked(): number;\nexport function empty_tuple(x: number, foo: EmptyStruct, y: number): number;\nexport function single_element_tuple(x: SingleElementStruct, y: SingleElementStruct): number;\nexport function multiply_pairs(ab: PairStruct, cd: PairStruct): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_struct_in_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function empty_tuple(x, foo, y) {\n    return _ffi_exports._ffi_fn_empty_tuple(x, y);\n}\n\nexport function single_element_tuple(x, y) {\n    return _ffi_exports._ffi_fn_single_element_tuple(x[0], y[0]);\n}\n\nexport function multiply_pairs(ab, cd) {\n    return _ffi_exports._ffi_fn_multiply_pairs(ab.x, ab.y, cd.x, cd.y);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_struct_in_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface EmptyStruct {\n}\n\nexport interface SingleElementStruct {\n    0: number,\n}\n\nexport interface PairStruct {\n    x: number,\n    y: number,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function empty_tuple(x: number, foo: EmptyStruct, y: number): number {\n    return _ffi_exports._ffi_fn_empty_tuple(x, y);\n}\n\nexport function single_element_tuple(x: SingleElementStruct, y: SingleElementStruct): number {\n    return _ffi_exports._ffi_fn_single_element_tuple(x[0], y[0]);\n}\n\nexport function multiply_pairs(ab: PairStruct, cd: PairStruct): number {\n    return _ffi_exports._ffi_fn_multiply_pairs(ab.x, ab.y, cd.x, cd.y);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_empty_tuple: (x: number, y: number) => number,\n    _ffi_fn_multiply_pairs: (ab_x: number, ab_y: number, cd_x: number, cd_y: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_single_element_tuple: (x_0: number, y_0: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_struct_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_empty_tuple(x: i32, y: i32) -> i32 {\n    empty_tuple(x, EmptyStruct, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_multiply_pairs(ab_x: f32, ab_y: f32, cd_x: f32, cd_y: f32) -> f32 {\n    multiply_pairs(PairStruct { x: ab_x, y: ab_y }, PairStruct { x: cd_x, y: cd_y })\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_single_element_tuple(x_0: i32, y_0: i32) -> i32 {\n    single_element_tuple(SingleElementStruct(x_0), SingleElementStruct(y_0))\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_struct_out_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface EmptyStruct {\n}\n\nexport interface SingleElementStruct {\n    0: number,\n}\n\nexport interface PairStruct {\n    x: number,\n    y: number,\n}\n\nexport function rust_mem_leaked(): number;\nexport function empty_struct(): EmptyStruct;\nexport function single_element_struct(x: number): SingleElementStruct;\nexport function make_pair(x: number, y: number): PairStruct;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_struct_out_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function empty_struct() {\n    _ffi_exports._ffi_fn_empty_struct();\n    return {};\n}\n\nexport function single_element_struct(x) {\n    let ret_0 = _ffi_exports._ffi_fn_single_element_struct(x);\n    return { 0: ret_0 };\n}\n\nexport function make_pair(x, y) {\n    let multi_ret = _ffi_exports._ffi_fn_make_pair(x, y);\n    let ret_x = _ffi_update_dv().getFloat32(multi_ret, true);\n    let ret_y = _ffi_dv.getFloat32(multi_ret + 4, true);\n    return { x: ret_x, y: ret_y };\n}\n\nlet _ffi_dv;\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_struct_out_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface EmptyStruct {\n}\n\nexport interface SingleElementStruct {\n    0: number,\n}\n\nexport interface PairStruct {\n    x: number,\n    y: number,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function empty_struct(): EmptyStruct {\n    _ffi_exports._ffi_fn_empty_struct();\n    return {};\n}\n\nexport function single_element_struct(x: number): SingleElementStruct {\n    let ret_0 = _ffi_exports._ffi_fn_single_element_struct(x);\n    return { 0: ret_0 };\n}\n\nexport function make_pair(x: number, y: number): PairStruct {\n    let multi_ret = _ffi_exports._ffi_fn_make_pair(x, y);\n    let ret_x = _ffi_update_dv().getFloat32(multi_ret, true);\n    let ret_y = _ffi_dv.getFloat32(multi_ret + 4, true);\n    return { x: ret_x, y: ret_y };\n}\n\nlet _ffi_dv: DataView;\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_empty_struct: () => void,\n    _ffi_fn_make_pair: (x: number, y: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_single_element_struct: (x: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_struct_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_empty_struct() {\n    _ = empty_struct();\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_make_pair(x: f32, y: f32) -> *const _ffi_ret_2_f32 {\n    let ret = make_pair(x, y);\n    unsafe {\n        _FFI_RET_2_F32 = _ffi_ret_2_f32(ret.x, ret.y);\n        std::ptr::addr_of!(_FFI_RET_2_F32)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_single_element_struct(x: i32) -> i32 {\n    let ret = single_element_struct(x);\n    ret.0\n}\n\n#[repr(C)]\nstruct _ffi_ret_2_f32(f32, f32);\nstatic mut _FFI_RET_2_F32: _ffi_ret_2_f32 = _ffi_ret_2_f32(0.0, 0.0);\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_struct_out_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface EmptyStruct {\n}\n\nexport interface SingleElementStruct {\n    0: number,\n}\n\nexport interface PairStruct {\n    x: number,\n    y: number,\n}\n\nexport function rust_mem_leaked(): number;\nexport function empty_struct(): EmptyStruct;\nexport function single_element_struct(x: number): SingleElementStruct;\nexport function make_pair(x: number, y: number): PairStruct;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_struct_out_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function empty_struct() {\n    _ffi_exports._ffi_fn_empty_struct();\n    return {};\n}\n\nexport function single_element_struct(x) {\n    let ret_0 = _ffi_exports._ffi_fn_single_element_struct(x);\n    return { 0: ret_0 };\n}\n\nexport function make_pair(x, y) {\n    let multi_ret = _ffi_exports._ffi_fn_make_pair(x, y);\n    let ret_x = _ffi_update_dv().getFloat32(multi_ret, true);\n    let ret_y = _ffi_dv.getFloat32(multi_ret + 4, true);\n    return { x: ret_x, y: ret_y };\n}\n\nlet _ffi_dv;\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_struct_out_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface EmptyStruct {\n}\n\nexport interface SingleElementStruct {\n    0: number,\n}\n\nexport interface PairStruct {\n    x: number,\n    y: number,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function empty_struct(): EmptyStruct {\n    _ffi_exports._ffi_fn_empty_struct();\n    return {};\n}\n\nexport function single_element_struct(x: number): SingleElementStruct {\n    let ret_0 = _ffi_exports._ffi_fn_single_element_struct(x);\n    return { 0: ret_0 };\n}\n\nexport function make_pair(x: number, y: number): PairStruct {\n    let multi_ret = _ffi_exports._ffi_fn_make_pair(x, y);\n    let ret_x = _ffi_update_dv().getFloat32(multi_ret, true);\n    let ret_y = _ffi_dv.getFloat32(multi_ret + 4, true);\n    return { x: ret_x, y: ret_y };\n}\n\nlet _ffi_dv: DataView;\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_empty_struct: () => void,\n    _ffi_fn_make_pair: (x: number, y: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_single_element_struct: (x: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_struct_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_empty_struct() {\n    _ = empty_struct();\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_make_pair(x: f32, y: f32) -> *const _ffi_ret_2_f32 {\n    let ret = make_pair(x, y);\n    unsafe {\n        _FFI_RET_2_F32 = _ffi_ret_2_f32(ret.x, ret.y);\n        std::ptr::addr_of!(_FFI_RET_2_F32)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_single_element_struct(x: i32) -> i32 {\n    let ret = single_element_struct(x);\n    ret.0\n}\n\n#[repr(C)]\nstruct _ffi_ret_2_f32(f32, f32);\nstatic mut _FFI_RET_2_F32: _ffi_ret_2_f32 = _ffi_ret_2_f32(0.0, 0.0);\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_tuple_in_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function empty_tuple(x: number, foo: undefined, y: number): number;\nexport function single_element_tuple(x: [number], y: [number]): number;\nexport function multiply_pairs(ab: [number, number], cd: [number, number]): number;\nexport function nesting(x: [number, undefined, [number, [number]]]): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_tuple_in_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function empty_tuple(x, foo, y) {\n    return _ffi_exports._ffi_fn_empty_tuple(x, y);\n}\n\nexport function single_element_tuple(x, y) {\n    return _ffi_exports._ffi_fn_single_element_tuple(x[0], y[0]);\n}\n\nexport function multiply_pairs(ab, cd) {\n    return _ffi_exports._ffi_fn_multiply_pairs(ab[0], ab[1], cd[0], cd[1]);\n}\n\nexport function nesting(x) {\n    return _ffi_exports._ffi_fn_nesting(x[0], x[2][0], x[2][1][0]);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_tuple_in_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function empty_tuple(x: number, foo: undefined, y: number): number {\n    return _ffi_exports._ffi_fn_empty_tuple(x, y);\n}\n\nexport function single_element_tuple(x: [number], y: [number]): number {\n    return _ffi_exports._ffi_fn_single_element_tuple(x[0], y[0]);\n}\n\nexport function multiply_pairs(ab: [number, number], cd: [number, number]): number {\n    return _ffi_exports._ffi_fn_multiply_pairs(ab[0], ab[1], cd[0], cd[1]);\n}\n\nexport function nesting(x: [number, undefined, [number, [number]]]): number {\n    return _ffi_exports._ffi_fn_nesting(x[0], x[2][0], x[2][1][0]);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_empty_tuple: (x: number, y: number) => number,\n    _ffi_fn_multiply_pairs: (ab_0: number, ab_1: number, cd_0: number, cd_1: number) => number,\n    _ffi_fn_nesting: (x_0: number, x_2_0: number, x_2_1_0: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_single_element_tuple: (x_0: number, y_0: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_tuple_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_empty_tuple(x: i32, y: i32) -> i32 {\n    empty_tuple(x, (), y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_multiply_pairs(ab_0: f32, ab_1: f32, cd_0: f32, cd_1: f32) -> f32 {\n    multiply_pairs((ab_0, ab_1), (cd_0, cd_1))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_nesting(x_0: i32, x_2_0: i32, x_2_1_0: i32) -> i32 {\n    nesting((x_0, (), (x_2_0, (x_2_1_0,))))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_single_element_tuple(x_0: i32, y_0: i32) -> i32 {\n    single_element_tuple((x_0,), (y_0,))\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_tuple_in_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function empty_tuple(x: number, foo: undefined, y: number): number;\nexport function single_element_tuple(x: [number], y: [number]): number;\nexport function multiply_pairs(ab: [number, number], cd: [number, number]): number;\nexport function nesting(x: [number, undefined, [number, [number]]]): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_tuple_in_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function empty_tuple(x, foo, y) {\n    return _ffi_exports._ffi_fn_empty_tuple(x, y);\n}\n\nexport function single_element_tuple(x, y) {\n    return _ffi_exports._ffi_fn_single_element_tuple(x[0], y[0]);\n}\n\nexport function multiply_pairs(ab, cd) {\n    return _ffi_exports._ffi_fn_multiply_pairs(ab[0], ab[1], cd[0], cd[1]);\n}\n\nexport function nesting(x) {\n    return _ffi_exports._ffi_fn_nesting(x[0], x[2][0], x[2][1][0]);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_tuple_in_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function empty_tuple(x: number, foo: undefined, y: number): number {\n    return _ffi_exports._ffi_fn_empty_tuple(x, y);\n}\n\nexport function single_element_tuple(x: [number], y: [number]): number {\n    return _ffi_exports._ffi_fn_single_element_tuple(x[0], y[0]);\n}\n\nexport function multiply_pairs(ab: [number, number], cd: [number, number]): number {\n    return _ffi_exports._ffi_fn_multiply_pairs(ab[0], ab[1], cd[0], cd[1]);\n}\n\nexport function nesting(x: [number, undefined, [number, [number]]]): number {\n    return _ffi_exports._ffi_fn_nesting(x[0], x[2][0], x[2][1][0]);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_empty_tuple: (x: number, y: number) => number,\n    _ffi_fn_multiply_pairs: (ab_0: number, ab_1: number, cd_0: number, cd_1: number) => number,\n    _ffi_fn_nesting: (x_0: number, x_2_0: number, x_2_1_0: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_single_element_tuple: (x_0: number, y_0: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_tuple_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_empty_tuple(x: i32, y: i32) -> i32 {\n    empty_tuple(x, (), y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_multiply_pairs(ab_0: f32, ab_1: f32, cd_0: f32, cd_1: f32) -> f32 {\n    multiply_pairs((ab_0, ab_1), (cd_0, cd_1))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_nesting(x_0: i32, x_2_0: i32, x_2_1_0: i32) -> i32 {\n    nesting((x_0, (), (x_2_0, (x_2_1_0,))))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_single_element_tuple(x_0: i32, y_0: i32) -> i32 {\n    single_element_tuple((x_0,), (y_0,))\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_tuple_out_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function single_element_tuple(x: number): [number];\nexport function return_pair(x: number, y: boolean): [number, boolean];\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_tuple_out_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function single_element_tuple(x) {\n    let ret_0 = _ffi_exports._ffi_fn_single_element_tuple(x);\n    return [ret_0];\n}\n\nexport function return_pair(x, y) {\n    let multi_ret = _ffi_exports._ffi_fn_return_pair(x, y);\n    let ret_0 = _ffi_update_dv().getFloat32(multi_ret, true);\n    let ret_1 = _ffi_dv.getUint8(multi_ret + 4);\n    return [ret_0, !!ret_1];\n}\n\nlet _ffi_dv;\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_tuple_out_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function single_element_tuple(x: number): [number] {\n    let ret_0 = _ffi_exports._ffi_fn_single_element_tuple(x);\n    return [ret_0];\n}\n\nexport function return_pair(x: number, y: boolean): [number, boolean] {\n    let multi_ret = _ffi_exports._ffi_fn_return_pair(x, y);\n    let ret_0 = _ffi_update_dv().getFloat32(multi_ret, true);\n    let ret_1 = _ffi_dv.getUint8(multi_ret + 4);\n    return [ret_0, !!ret_1];\n}\n\nlet _ffi_dv: DataView;\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_return_pair: (x: number, y: boolean) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_single_element_tuple: (x: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_tuple_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_return_pair(x: f32, y: bool) -> *const _ffi_ret_f32_bool {\n    let ret = return_pair(x, y);\n    unsafe {\n        _FFI_RET_F32_BOOL = _ffi_ret_f32_bool(ret.0, ret.1);\n        std::ptr::addr_of!(_FFI_RET_F32_BOOL)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_single_element_tuple(x: i32) -> i32 {\n    let ret = single_element_tuple(x);\n    ret.0\n}\n\n#[repr(C)]\nstruct _ffi_ret_f32_bool(f32, bool);\nstatic mut _FFI_RET_F32_BOOL: _ffi_ret_f32_bool = _ffi_ret_f32_bool(0.0, false);\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_tuple_out_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function single_element_tuple(x: number): [number];\nexport function return_pair(x: number, y: boolean): [number, boolean];\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_tuple_out_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function single_element_tuple(x) {\n    let ret_0 = _ffi_exports._ffi_fn_single_element_tuple(x);\n    return [ret_0];\n}\n\nexport function return_pair(x, y) {\n    let multi_ret = _ffi_exports._ffi_fn_return_pair(x, y);\n    let ret_0 = _ffi_update_dv().getFloat32(multi_ret, true);\n    let ret_1 = _ffi_dv.getUint8(multi_ret + 4);\n    return [ret_0, !!ret_1];\n}\n\nlet _ffi_dv;\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_tuple_out_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function single_element_tuple(x: number): [number] {\n    let ret_0 = _ffi_exports._ffi_fn_single_element_tuple(x);\n    return [ret_0];\n}\n\nexport function return_pair(x: number, y: boolean): [number, boolean] {\n    let multi_ret = _ffi_exports._ffi_fn_return_pair(x, y);\n    let ret_0 = _ffi_update_dv().getFloat32(multi_ret, true);\n    let ret_1 = _ffi_dv.getUint8(multi_ret + 4);\n    return [ret_0, !!ret_1];\n}\n\nlet _ffi_dv: DataView;\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_return_pair: (x: number, y: boolean) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_single_element_tuple: (x: number) => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_tuple_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_return_pair(x: f32, y: bool) -> *const _ffi_ret_f32_bool {\n    let ret = return_pair(x, y);\n    unsafe {\n        _FFI_RET_F32_BOOL = _ffi_ret_f32_bool(ret.0, ret.1);\n        std::ptr::addr_of!(_FFI_RET_F32_BOOL)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_single_element_tuple(x: i32) -> i32 {\n    let ret = single_element_tuple(x);\n    ret.0\n}\n\n#[repr(C)]\nstruct _ffi_ret_f32_bool(f32, bool);\nstatic mut _FFI_RET_F32_BOOL: _ffi_ret_f32_bool = _ffi_ret_f32_bool(0.0, false);\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_vec_in_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function sum_u8(values: number[]): number;\nexport function sum_u16(values: number[]): number;\nexport function sum_u32(values: number[]): number;\nexport function sum_usize(values: number[]): number;\nexport function sum_u64(values: bigint[]): bigint;\nexport function sum_i8(values: number[]): number;\nexport function sum_i16(values: number[]): number;\nexport function sum_i32(values: number[]): number;\nexport function sum_isize(values: number[]): number;\nexport function sum_i64(values: bigint[]): bigint;\nexport function sum_f32(values: number[]): number;\nexport function sum_f64(values: number[]): number;\nexport function check_nested(values: number[][]): string;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_vec_in_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function sum_u8(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_u8_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_u8(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_u16(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_u16_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_u16(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_u32(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_u32_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_u32(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_usize(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_usize_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_usize(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_u64(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_u64_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_u64(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_i8(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_i8_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_i8(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_i16(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_i16_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_i16(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_i32(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_i32_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_i32(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_isize(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_isize_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_isize(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_i64(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_i64_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_i64(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_f32(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_f32_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_f32(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_f64(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_f64_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_f64(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function check_nested(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_vec_i32_to_rust(values, buf);\n    let multi_ret = _ffi_exports._ffi_fn_check_nested(_ffi_buf_to_rust(buf), values_len);\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_dv;\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_string_from_rust(ptr, len, cap) {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_vec_f32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_f32(buf, item);\n    }\n}\n\nfunction _ffi_vec_f64_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_f64(buf, item);\n    }\n}\n\nfunction _ffi_vec_i16_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i16(buf, item);\n    }\n}\n\nfunction _ffi_vec_i32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_vec_i64_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i64(buf, item);\n    }\n}\n\nfunction _ffi_vec_i8_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i8(buf, item);\n    }\n}\n\nfunction _ffi_vec_isize_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_vec_u16_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i16(buf, item);\n    }\n}\n\nfunction _ffi_vec_u32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_vec_u64_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i64(buf, item);\n    }\n}\n\nfunction _ffi_vec_u8_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i8(buf, item);\n    }\n}\n\nfunction _ffi_vec_usize_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_vec_vec_i32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item.length);\n        _ffi_vec_i32_to_rust(item, buf);\n    }\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_f32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setFloat32(ptr, val, true);\n}\n\nfunction _ffi_write_f64(buf, val) {\n    let ptr = _ffi_grow(buf, 8);\n    buf.dv.setFloat64(ptr, val, true);\n}\n\nfunction _ffi_write_i16(buf, val) {\n    let ptr = _ffi_grow(buf, 2);\n    buf.dv.setInt16(ptr, val, true);\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i64(buf, val) {\n    let ptr = _ffi_grow(buf, 8);\n    buf.dv.setBigInt64(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf, val) {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv.setInt8(ptr, val);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_vec_in_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function sum_u8(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_u8_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_u8(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_u16(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_u16_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_u16(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_u32(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_u32_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_u32(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_usize(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_usize_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_usize(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_u64(values: bigint[]): bigint {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_u64_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_u64(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_i8(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_i8_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_i8(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_i16(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_i16_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_i16(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_i32(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_i32_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_i32(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_isize(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_isize_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_isize(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_i64(values: bigint[]): bigint {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_i64_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_i64(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_f32(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_f32_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_f32(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_f64(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_f64_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_f64(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function check_nested(values: number[][]): string {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_vec_i32_to_rust(values, buf);\n    let multi_ret = _ffi_exports._ffi_fn_check_nested(_ffi_buf_to_rust(buf), values_len);\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8: Uint8Array;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_dv: DataView;\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_string_from_rust(ptr: number, len: number, cap: number): string {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_vec_f32_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_f32(buf, item);\n    }\n}\n\nfunction _ffi_vec_f64_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_f64(buf, item);\n    }\n}\n\nfunction _ffi_vec_i16_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i16(buf, item);\n    }\n}\n\nfunction _ffi_vec_i32_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_vec_i64_to_rust(items: bigint[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i64(buf, item);\n    }\n}\n\nfunction _ffi_vec_i8_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i8(buf, item);\n    }\n}\n\nfunction _ffi_vec_isize_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_vec_u16_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i16(buf, item);\n    }\n}\n\nfunction _ffi_vec_u32_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_vec_u64_to_rust(items: bigint[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i64(buf, item);\n    }\n}\n\nfunction _ffi_vec_u8_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i8(buf, item);\n    }\n}\n\nfunction _ffi_vec_usize_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_vec_vec_i32_to_rust(items: number[][], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item.length);\n        _ffi_vec_i32_to_rust(item, buf);\n    }\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_f32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setFloat32(ptr, val, true);\n}\n\nfunction _ffi_write_f64(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 8);\n    buf.dv!.setFloat64(ptr, val, true);\n}\n\nfunction _ffi_write_i16(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 2);\n    buf.dv!.setInt16(ptr, val, true);\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i64(buf: _ffi_WriteBuf, val: bigint): void {\n    let ptr = _ffi_grow(buf, 8);\n    buf.dv!.setBigInt64(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv!.setInt8(ptr, val);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_check_nested: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_sum_f32: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_f64: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_i16: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_i32: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_i64: (buf_ptr: number, values_len: number) => bigint,\n    _ffi_fn_sum_i8: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_isize: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_u16: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_u32: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_u64: (buf_ptr: number, values_len: number) => bigint,\n    _ffi_fn_sum_u8: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_usize: (buf_ptr: number, values_len: number) => number,\n    _ffi_alloc: (len: number) => number,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_vec_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_nested(buf_ptr: *const u8, values_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(check_nested(_ffi_vec_vec_i32_from_js(values_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_f32(buf_ptr: *const u8, values_len: usize) -> f32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_f32(_ffi_vec_f32_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_f64(buf_ptr: *const u8, values_len: usize) -> f64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_f64(_ffi_vec_f64_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_i16(buf_ptr: *const u8, values_len: usize) -> i16 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i16(_ffi_vec_i16_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_i32(buf_ptr: *const u8, values_len: usize) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i32(_ffi_vec_i32_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_i64(buf_ptr: *const u8, values_len: usize) -> i64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i64(_ffi_vec_i64_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_i8(buf_ptr: *const u8, values_len: usize) -> i8 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i8(_ffi_vec_i8_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_isize(buf_ptr: *const u8, values_len: usize) -> isize {\n    let mut buf_end = buf_ptr;\n    let ret = sum_isize(_ffi_vec_isize_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_u16(buf_ptr: *const u8, values_len: usize) -> u16 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u16(_ffi_vec_u16_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_u32(buf_ptr: *const u8, values_len: usize) -> u32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u32(_ffi_vec_u32_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_u64(buf_ptr: *const u8, values_len: usize) -> u64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u64(_ffi_vec_u64_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_u8(buf_ptr: *const u8, values_len: usize) -> u8 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u8(_ffi_vec_u8_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_sum_usize(buf_ptr: *const u8, values_len: usize) -> usize {\n    let mut buf_end = buf_ptr;\n    let ret = sum_usize(_ffi_vec_usize_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_f32_from_js(len: usize, end: &mut *const u8) -> Vec<f32> {\n    let mut items = Vec::<f32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<f32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_f64_from_js(len: usize, end: &mut *const u8) -> Vec<f64> {\n    let mut items = Vec::<f64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<f64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i16_from_js(len: usize, end: &mut *const u8) -> Vec<i16> {\n    let mut items = Vec::<i16>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i16>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i32_from_js(len: usize, end: &mut *const u8) -> Vec<i32> {\n    let mut items = Vec::<i32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i64_from_js(len: usize, end: &mut *const u8) -> Vec<i64> {\n    let mut items = Vec::<i64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i8_from_js(len: usize, end: &mut *const u8) -> Vec<i8> {\n    let mut items = Vec::<i8>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i8>(end));\n    }\n    items\n}\n\nfn _ffi_vec_isize_from_js(len: usize, end: &mut *const u8) -> Vec<isize> {\n    let mut items = Vec::<isize>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<isize>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u16_from_js(len: usize, end: &mut *const u8) -> Vec<u16> {\n    let mut items = Vec::<u16>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u16>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u32_from_js(len: usize, end: &mut *const u8) -> Vec<u32> {\n    let mut items = Vec::<u32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u64_from_js(len: usize, end: &mut *const u8) -> Vec<u64> {\n    let mut items = Vec::<u64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u8_from_js(len: usize, end: &mut *const u8) -> Vec<u8> {\n    let mut items = Vec::<u8>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u8>(end));\n    }\n    items\n}\n\nfn _ffi_vec_usize_from_js(len: usize, end: &mut *const u8) -> Vec<usize> {\n    let mut items = Vec::<usize>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<usize>(end));\n    }\n    items\n}\n\nfn _ffi_vec_vec_i32_from_js(len: usize, end: &mut *const u8) -> Vec<Vec<i32>> {\n    let mut items = Vec::<Vec<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_vec_i32_from_js(_ffi_read::<usize>(end), end));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_vec_in_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function sum_u8(values: number[]): number;\nexport function sum_u16(values: number[]): number;\nexport function sum_u32(values: number[]): number;\nexport function sum_usize(values: number[]): number;\nexport function sum_u64(values: bigint[]): bigint;\nexport function sum_i8(values: number[]): number;\nexport function sum_i16(values: number[]): number;\nexport function sum_i32(values: number[]): number;\nexport function sum_isize(values: number[]): number;\nexport function sum_i64(values: bigint[]): bigint;\nexport function sum_f32(values: number[]): number;\nexport function sum_f64(values: number[]): number;\nexport function check_nested(values: number[][]): string;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_vec_in_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function sum_u8(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_u8_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_u8(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_u16(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_u16_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_u16(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_u32(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_u32_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_u32(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_usize(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_usize_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_usize(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_u64(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_u64_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_u64(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_i8(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_i8_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_i8(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_i16(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_i16_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_i16(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_i32(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_i32_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_i32(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_isize(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_isize_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_isize(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_i64(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_i64_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_i64(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_f32(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_f32_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_f32(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_f64(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_f64_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_f64(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function check_nested(values) {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_vec_i32_to_rust(values, buf);\n    let multi_ret = _ffi_exports._ffi_fn_check_nested(_ffi_buf_to_rust(buf), values_len);\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nlet _ffi_new_WriteBuf = () => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_dv;\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }) {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_string_from_rust(ptr, len, cap) {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_vec_f32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_f32(buf, item);\n    }\n}\n\nfunction _ffi_vec_f64_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_f64(buf, item);\n    }\n}\n\nfunction _ffi_vec_i16_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i16(buf, item);\n    }\n}\n\nfunction _ffi_vec_i32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_vec_i64_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i64(buf, item);\n    }\n}\n\nfunction _ffi_vec_i8_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i8(buf, item);\n    }\n}\n\nfunction _ffi_vec_isize_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_vec_u16_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i16(buf, item);\n    }\n}\n\nfunction _ffi_vec_u32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_vec_u64_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i64(buf, item);\n    }\n}\n\nfunction _ffi_vec_u8_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i8(buf, item);\n    }\n}\n\nfunction _ffi_vec_usize_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_vec_vec_i32_to_rust(items, buf) {\n    for (const item of items) {\n        _ffi_write_i32(buf, item.length);\n        _ffi_vec_i32_to_rust(item, buf);\n    }\n}\n\nfunction _ffi_grow(buf, n) {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_f32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setFloat32(ptr, val, true);\n}\n\nfunction _ffi_write_f64(buf, val) {\n    let ptr = _ffi_grow(buf, 8);\n    buf.dv.setFloat64(ptr, val, true);\n}\n\nfunction _ffi_write_i16(buf, val) {\n    let ptr = _ffi_grow(buf, 2);\n    buf.dv.setInt16(ptr, val, true);\n}\n\nfunction _ffi_write_i32(buf, val) {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i64(buf, val) {\n    let ptr = _ffi_grow(buf, 8);\n    buf.dv.setBigInt64(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf, val) {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv.setInt8(ptr, val);\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_vec_in_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function sum_u8(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_u8_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_u8(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_u16(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_u16_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_u16(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_u32(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_u32_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_u32(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_usize(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_usize_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_usize(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_u64(values: bigint[]): bigint {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_u64_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_u64(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_i8(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_i8_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_i8(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_i16(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_i16_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_i16(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_i32(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_i32_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_i32(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_isize(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_isize_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_isize(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_i64(values: bigint[]): bigint {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_i64_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_i64(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_f32(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_f32_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_f32(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function sum_f64(values: number[]): number {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_f64_to_rust(values, buf);\n    return _ffi_exports._ffi_fn_sum_f64(_ffi_buf_to_rust(buf), values_len);\n}\n\nexport function check_nested(values: number[][]): string {\n    let buf = _ffi_new_WriteBuf();\n    let values_len = values.length;\n    _ffi_vec_vec_i32_to_rust(values, buf);\n    let multi_ret = _ffi_exports._ffi_fn_check_nested(_ffi_buf_to_rust(buf), values_len);\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nlet _ffi_new_WriteBuf = (): _ffi_WriteBuf => ({ u8: new Uint8Array(16), dv: null, off: 0 });\nlet _ffi_u8: Uint8Array;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_dv: DataView;\n\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_buf_to_rust({ u8, off }: _ffi_WriteBuf): number {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\nfunction _ffi_string_from_rust(ptr: number, len: number, cap: number): string {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_vec_f32_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_f32(buf, item);\n    }\n}\n\nfunction _ffi_vec_f64_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_f64(buf, item);\n    }\n}\n\nfunction _ffi_vec_i16_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i16(buf, item);\n    }\n}\n\nfunction _ffi_vec_i32_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_vec_i64_to_rust(items: bigint[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i64(buf, item);\n    }\n}\n\nfunction _ffi_vec_i8_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i8(buf, item);\n    }\n}\n\nfunction _ffi_vec_isize_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_vec_u16_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i16(buf, item);\n    }\n}\n\nfunction _ffi_vec_u32_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_vec_u64_to_rust(items: bigint[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i64(buf, item);\n    }\n}\n\nfunction _ffi_vec_u8_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i8(buf, item);\n    }\n}\n\nfunction _ffi_vec_usize_to_rust(items: number[], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item);\n    }\n}\n\nfunction _ffi_vec_vec_i32_to_rust(items: number[][], buf: _ffi_WriteBuf): void {\n    for (const item of items) {\n        _ffi_write_i32(buf, item.length);\n        _ffi_vec_i32_to_rust(item, buf);\n    }\n}\n\nfunction _ffi_grow(buf: _ffi_WriteBuf, n: number): number {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\nfunction _ffi_write_f32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setFloat32(ptr, val, true);\n}\n\nfunction _ffi_write_f64(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 8);\n    buf.dv!.setFloat64(ptr, val, true);\n}\n\nfunction _ffi_write_i16(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 2);\n    buf.dv!.setInt16(ptr, val, true);\n}\n\nfunction _ffi_write_i32(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 4);\n    buf.dv!.setInt32(ptr, val, true);\n}\n\nfunction _ffi_write_i64(buf: _ffi_WriteBuf, val: bigint): void {\n    let ptr = _ffi_grow(buf, 8);\n    buf.dv!.setBigInt64(ptr, val, true);\n}\n\nfunction _ffi_write_i8(buf: _ffi_WriteBuf, val: number): void {\n    let ptr = _ffi_grow(buf, 1);\n    buf.dv!.setInt8(ptr, val);\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_check_nested: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_sum_f32: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_f64: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_i16: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_i32: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_i64: (buf_ptr: number, values_len: number) => bigint,\n    _ffi_fn_sum_i8: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_isize: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_u16: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_u32: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_u64: (buf_ptr: number, values_len: number) => bigint,\n    _ffi_fn_sum_u8: (buf_ptr: number, values_len: number) => number,\n    _ffi_fn_sum_usize: (buf_ptr: number, values_len: number) => number,\n    _ffi_alloc: (len: number) => number,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_vec_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_buf_from_host(ptr: *const u8, end: *const u8) {\n    let len = unsafe { end.byte_offset_from(ptr) } as usize;\n    drop(unsafe { Vec::from_raw_parts(ptr as *mut u8, 0, len) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_nested(buf_ptr: *const u8, values_len: usize) -> *const _ffi_ret_ptr_2_usize {\n    let mut buf_end = buf_ptr;\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(check_nested(_ffi_vec_vec_i32_from_js(values_len, &mut buf_end)));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_f32(buf_ptr: *const u8, values_len: usize) -> f32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_f32(_ffi_vec_f32_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_f64(buf_ptr: *const u8, values_len: usize) -> f64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_f64(_ffi_vec_f64_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_i16(buf_ptr: *const u8, values_len: usize) -> i16 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i16(_ffi_vec_i16_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_i32(buf_ptr: *const u8, values_len: usize) -> i32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i32(_ffi_vec_i32_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_i64(buf_ptr: *const u8, values_len: usize) -> i64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i64(_ffi_vec_i64_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_i8(buf_ptr: *const u8, values_len: usize) -> i8 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_i8(_ffi_vec_i8_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_isize(buf_ptr: *const u8, values_len: usize) -> isize {\n    let mut buf_end = buf_ptr;\n    let ret = sum_isize(_ffi_vec_isize_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_u16(buf_ptr: *const u8, values_len: usize) -> u16 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u16(_ffi_vec_u16_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_u32(buf_ptr: *const u8, values_len: usize) -> u32 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u32(_ffi_vec_u32_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_u64(buf_ptr: *const u8, values_len: usize) -> u64 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u64(_ffi_vec_u64_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_u8(buf_ptr: *const u8, values_len: usize) -> u8 {\n    let mut buf_end = buf_ptr;\n    let ret = sum_u8(_ffi_vec_u8_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_sum_usize(buf_ptr: *const u8, values_len: usize) -> usize {\n    let mut buf_end = buf_ptr;\n    let ret = sum_usize(_ffi_vec_usize_from_js(values_len, &mut buf_end));\n    _ffi_buf_from_host(buf_ptr, buf_end);\n    ret\n}\n\nfn _ffi_read<T: Copy>(ptr: &mut *const u8) -> T {\n    let val = unsafe { (*ptr as *const T).read_unaligned() };\n    *ptr = unsafe { ptr.byte_offset(std::mem::size_of::<T>() as isize) };\n    val\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n\nfn _ffi_vec_f32_from_js(len: usize, end: &mut *const u8) -> Vec<f32> {\n    let mut items = Vec::<f32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<f32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_f64_from_js(len: usize, end: &mut *const u8) -> Vec<f64> {\n    let mut items = Vec::<f64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<f64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i16_from_js(len: usize, end: &mut *const u8) -> Vec<i16> {\n    let mut items = Vec::<i16>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i16>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i32_from_js(len: usize, end: &mut *const u8) -> Vec<i32> {\n    let mut items = Vec::<i32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i64_from_js(len: usize, end: &mut *const u8) -> Vec<i64> {\n    let mut items = Vec::<i64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_i8_from_js(len: usize, end: &mut *const u8) -> Vec<i8> {\n    let mut items = Vec::<i8>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<i8>(end));\n    }\n    items\n}\n\nfn _ffi_vec_isize_from_js(len: usize, end: &mut *const u8) -> Vec<isize> {\n    let mut items = Vec::<isize>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<isize>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u16_from_js(len: usize, end: &mut *const u8) -> Vec<u16> {\n    let mut items = Vec::<u16>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u16>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u32_from_js(len: usize, end: &mut *const u8) -> Vec<u32> {\n    let mut items = Vec::<u32>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u32>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u64_from_js(len: usize, end: &mut *const u8) -> Vec<u64> {\n    let mut items = Vec::<u64>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u64>(end));\n    }\n    items\n}\n\nfn _ffi_vec_u8_from_js(len: usize, end: &mut *const u8) -> Vec<u8> {\n    let mut items = Vec::<u8>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<u8>(end));\n    }\n    items\n}\n\nfn _ffi_vec_usize_from_js(len: usize, end: &mut *const u8) -> Vec<usize> {\n    let mut items = Vec::<usize>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_read::<usize>(end));\n    }\n    items\n}\n\nfn _ffi_vec_vec_i32_from_js(len: usize, end: &mut *const u8) -> Vec<Vec<i32>> {\n    let mut items = Vec::<Vec<i32>>::with_capacity(len);\n    for _ in 0..len {\n        items.push(_ffi_vec_i32_from_js(_ffi_read::<usize>(end), end));\n    }\n    items\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_vec_out_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function get_vec(n: number): number[];\nexport function check_nested(): number[][];\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_vec_out_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_vec(n) {\n    let multi_ret = _ffi_exports._ffi_fn_get_vec(n);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_vec_i32_from_rust(ret_len, buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function check_nested() {\n    let multi_ret = _ffi_exports._ffi_fn_check_nested();\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_vec_vec_i32_from_rust(ret_len, buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf) {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_vec_i32_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(_ffi_read_i32(buf));\n    }\n    return items;\n}\n\nfunction _ffi_vec_vec_i32_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(_ffi_vec_i32_from_rust(_ffi_read_u32(buf), buf));\n    }\n    return items;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_vec_out_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_vec(n: number): number[] {\n    let multi_ret = _ffi_exports._ffi_fn_get_vec(n);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_vec_i32_from_rust(ret_len, buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function check_nested(): number[][] {\n    let multi_ret = _ffi_exports._ffi_fn_check_nested();\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_vec_vec_i32_from_rust(ret_len, buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_vec_i32_from_rust(len: number, buf: _ffi_ReadBuf): number[] {\n    let items: number[] = [];\n    while (items.length < len) {\n        items.push(_ffi_read_i32(buf));\n    }\n    return items;\n}\n\nfunction _ffi_vec_vec_i32_from_rust(len: number, buf: _ffi_ReadBuf): number[][] {\n    let items: number[][] = [];\n    while (items.length < len) {\n        items.push(_ffi_vec_i32_from_rust(_ffi_read_u32(buf), buf));\n    }\n    return items;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_check_nested: () => number,\n    _ffi_fn_get_vec: (n: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_vec_out_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_check_nested() -> *const _ffi_ret_ptr_2_usize {\n    let ret = check_nested();\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_vec_i32_to_js(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_vec(n: i32) -> *const _ffi_ret_ptr_2_usize {\n    let ret = get_vec(n);\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_i32_to_js(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\nfn _ffi_vec_i32_to_js(items: Vec<i32>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item, buf);\n    }\n}\n\nfn _ffi_vec_vec_i32_to_js(items: Vec<Vec<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.len(), buf);\n        _ffi_vec_i32_to_js(item, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_vec_out_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport function rust_mem_leaked(): number;\nexport function get_vec(n: number): number[];\nexport function check_nested(): number[][];\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_vec_out_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_vec(n) {\n    let multi_ret = _ffi_exports._ffi_fn_get_vec(n);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_vec_i32_from_rust(ret_len, buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function check_nested() {\n    let multi_ret = _ffi_exports._ffi_fn_check_nested();\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_vec_vec_i32_from_rust(ret_len, buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv;\nlet _ffi_new_ReadBuf = (off) => ({ dv: _ffi_update_dv(), off });\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_read_i32(buf) {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf) {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_vec_i32_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(_ffi_read_i32(buf));\n    }\n    return items;\n}\n\nfunction _ffi_vec_vec_i32_from_rust(len, buf) {\n    let items = [];\n    while (items.length < len) {\n        items.push(_ffi_vec_i32_from_rust(_ffi_read_u32(buf), buf));\n    }\n    return items;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_vec_out_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_vec(n: number): number[] {\n    let multi_ret = _ffi_exports._ffi_fn_get_vec(n);\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_vec_i32_from_rust(ret_len, buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nexport function check_nested(): number[][] {\n    let multi_ret = _ffi_exports._ffi_fn_check_nested();\n    let buf_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let buf_cap = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 8, true);\n    let buf = _ffi_new_ReadBuf(buf_ptr);\n    let ret = _ffi_vec_vec_i32_from_rust(ret_len, buf);\n    _ffi_exports._ffi_dealloc(buf_ptr, buf_cap);\n    return ret;\n}\n\nlet _ffi_dv: DataView;\nlet _ffi_new_ReadBuf = (off: number): _ffi_ReadBuf => ({ dv: _ffi_update_dv(), off });\n\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nfunction _ffi_read_i32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getInt32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_read_u32(buf: _ffi_ReadBuf): number {\n    let val = buf.dv.getUint32(buf.off, true);\n    buf.off += 4;\n    return val;\n}\n\nfunction _ffi_vec_i32_from_rust(len: number, buf: _ffi_ReadBuf): number[] {\n    let items: number[] = [];\n    while (items.length < len) {\n        items.push(_ffi_read_i32(buf));\n    }\n    return items;\n}\n\nfunction _ffi_vec_vec_i32_from_rust(len: number, buf: _ffi_ReadBuf): number[][] {\n    let items: number[][] = [];\n    while (items.length < len) {\n        items.push(_ffi_vec_i32_from_rust(_ffi_read_u32(buf), buf));\n    }\n    return items;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_fn_check_nested: () => number,\n    _ffi_fn_get_vec: (n: number) => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_fn_vec_out_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_buf_to_host(buf: Vec<u8>) -> (*const u8, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf);\n    (buf.as_ptr(), buf.capacity())\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_check_nested() -> *const _ffi_ret_ptr_2_usize {\n    let ret = check_nested();\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_vec_i32_to_js(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_vec(n: i32) -> *const _ffi_ret_ptr_2_usize {\n    let ret = get_vec(n);\n    let mut buf = Vec::<u8>::new();\n    let ret_len = ret.len();\n    _ffi_vec_i32_to_js(ret, &mut buf);\n    let (buf_ptr, buf_cap) = _ffi_buf_to_host(buf);\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(buf_ptr, buf_cap, ret_len);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\nfn _ffi_vec_i32_to_js(items: Vec<i32>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item, buf);\n    }\n}\n\nfn _ffi_vec_vec_i32_to_js(items: Vec<Vec<i32>>, buf: &mut Vec<u8>) {\n    for item in items {\n        _ffi_write(item.len(), buf);\n        _ffi_vec_i32_to_js(item, buf);\n    }\n}\n\nfn _ffi_write<T: Copy>(val: T, buf: &mut Vec<u8>) {\n    let ptr = std::ptr::addr_of!(val) as *const u8;\n    let len = std::mem::size_of::<T>();\n    buf.extend_from_slice(unsafe { std::slice::from_raw_parts(ptr, len) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_enum_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Foo {\n    set_enum(bar: Bar): void;\n    get_enum(): Bar;\n}\n\nexport const enum Bar {\n    A,\n    B,\n    C,\n}\n\nexport function rust_mem_leaked(): number;\nexport function get_foo(): Foo;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_enum_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport const Bar = {\n    A: 0,\n    B: 1,\n    C: 2,\n};\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_foo() {\n    let ret_ptr = _ffi_exports._ffi_fn_get_foo();\n    return new _ffi_Box_Foo(ret_ptr);\n}\n\nlet _ffi_reg_Box_Foo = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Box_Foo(ptr));\n\nconst _ffi_Box_Foo = class Foo {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Box_Foo.register(this, _);\n    }\n\n    set_enum(bar) {\n        _ffi_exports._ffi_Box_Foo__set_enum(this._, bar);\n    }\n\n    get_enum() {\n        return _ffi_exports._ffi_Box_Foo__get_enum(this._);\n    }\n};\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_enum_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Foo {\n    set_enum(bar: Bar): void;\n    get_enum(): Bar;\n}\n\nexport const enum Bar {\n    A,\n    B,\n    C,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_foo(): Foo {\n    let ret_ptr = _ffi_exports._ffi_fn_get_foo();\n    return new _ffi_Box_Foo(ret_ptr);\n}\n\nlet _ffi_reg_Box_Foo = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Box_Foo(ptr));\n\nconst _ffi_Box_Foo = class Foo implements Foo {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Box_Foo.register(this, _);\n    }\n\n    set_enum(bar: Bar): void {\n        _ffi_exports._ffi_Box_Foo__set_enum(this._, bar);\n    }\n\n    get_enum(): Bar {\n        return _ffi_exports._ffi_Box_Foo__get_enum(this._);\n    }\n};\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Box_Foo__get_enum: (_self: number) => number,\n    _ffi_Box_Foo__set_enum: (_self: number, bar_raw: number) => void,\n    _ffi_fn_get_foo: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_rs_drop_Box_Foo: (ptr: number) => void,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_enum_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Box_Foo__get_enum(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Foo>) };\n    _self.get_enum() as i32\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Box_Foo__set_enum(_self: *const u8, bar_raw: i32) {\n    let _self = unsafe { &*(_self as *const Box<dyn Foo>) };\n    _self.set_enum(_ffi_enum_Bar_from_js(bar_raw));\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Bar_from_js(val: i32) -> Bar {\n    match val {\n        0 => Bar::A,\n        1 => Bar::B,\n        2 => Bar::C,\n        _ => panic!(),\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_foo() -> *const u8 {\n    Box::into_raw(Box::new(get_foo())) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Box_Foo(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Foo>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_enum_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Foo {\n    set_enum(bar: Bar): void;\n    get_enum(): Bar;\n}\n\nexport const enum Bar {\n    A,\n    B,\n    C,\n}\n\nexport function rust_mem_leaked(): number;\nexport function get_foo(): Foo;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_enum_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport const Bar = {\n    A: 0,\n    B: 1,\n    C: 2,\n};\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_foo() {\n    let ret_ptr = _ffi_exports._ffi_fn_get_foo();\n    return new _ffi_Box_Foo(ret_ptr);\n}\n\nlet _ffi_reg_Box_Foo = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Box_Foo(ptr));\n\nconst _ffi_Box_Foo = class Foo {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Box_Foo.register(this, _);\n    }\n\n    set_enum(bar) {\n        _ffi_exports._ffi_Box_Foo__set_enum(this._, bar);\n    }\n\n    get_enum() {\n        return _ffi_exports._ffi_Box_Foo__get_enum(this._);\n    }\n};\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_enum_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Foo {\n    set_enum(bar: Bar): void;\n    get_enum(): Bar;\n}\n\nexport const enum Bar {\n    A,\n    B,\n    C,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_foo(): Foo {\n    let ret_ptr = _ffi_exports._ffi_fn_get_foo();\n    return new _ffi_Box_Foo(ret_ptr);\n}\n\nlet _ffi_reg_Box_Foo = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Box_Foo(ptr));\n\nconst _ffi_Box_Foo = class Foo implements Foo {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Box_Foo.register(this, _);\n    }\n\n    set_enum(bar: Bar): void {\n        _ffi_exports._ffi_Box_Foo__set_enum(this._, bar);\n    }\n\n    get_enum(): Bar {\n        return _ffi_exports._ffi_Box_Foo__get_enum(this._);\n    }\n};\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Box_Foo__get_enum: (_self: number) => number,\n    _ffi_Box_Foo__set_enum: (_self: number, bar_raw: number) => void,\n    _ffi_fn_get_foo: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_rs_drop_Box_Foo: (ptr: number) => void,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_enum_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Box_Foo__get_enum(_self: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Foo>) };\n    _self.get_enum() as i32\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Box_Foo__set_enum(_self: *const u8, bar_raw: i32) {\n    let _self = unsafe { &*(_self as *const Box<dyn Foo>) };\n    _self.set_enum(_ffi_enum_Bar_from_js(bar_raw));\n}\n\n#[allow(non_snake_case)]\nfn _ffi_enum_Bar_from_js(val: i32) -> Bar {\n    match val {\n        0 => Bar::A,\n        1 => Bar::B,\n        2 => Bar::C,\n        _ => panic!(),\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_foo() -> *const u8 {\n    Box::into_raw(Box::new(get_foo())) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Box_Foo(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Foo>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Adder {\n    add(x: number): number;\n}\n\nexport function rust_mem_leaked(): number;\nexport function get_counter(): number;\nexport function get_adder_rc(x: number): Adder;\nexport function get_adder_box(x: number): Adder;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_counter() {\n    return _ffi_exports._ffi_fn_get_counter();\n}\n\nexport function get_adder_rc(x) {\n    let ret_ptr = _ffi_exports._ffi_fn_get_adder_rc(x);\n    return new _ffi_Rc_Adder(ret_ptr);\n}\n\nexport function get_adder_box(x) {\n    let ret_ptr = _ffi_exports._ffi_fn_get_adder_box(x);\n    return new _ffi_Box_Adder(ret_ptr);\n}\n\nlet _ffi_reg_Box_Adder = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Box_Adder(ptr));\nlet _ffi_reg_Rc_Adder = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Rc_Adder(ptr));\n\nconst _ffi_Box_Adder = class Adder {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Box_Adder.register(this, _);\n    }\n\n    add(x) {\n        return _ffi_exports._ffi_Box_Adder__add(this._, x);\n    }\n};\n\nconst _ffi_Rc_Adder = class Adder {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Adder.register(this, _);\n    }\n\n    add(x) {\n        return _ffi_exports._ffi_Rc_Adder__add(this._, x);\n    }\n};\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Adder {\n    add(x: number): number;\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_counter(): number {\n    return _ffi_exports._ffi_fn_get_counter();\n}\n\nexport function get_adder_rc(x: number): Adder {\n    let ret_ptr = _ffi_exports._ffi_fn_get_adder_rc(x);\n    return new _ffi_Rc_Adder(ret_ptr);\n}\n\nexport function get_adder_box(x: number): Adder {\n    let ret_ptr = _ffi_exports._ffi_fn_get_adder_box(x);\n    return new _ffi_Box_Adder(ret_ptr);\n}\n\nlet _ffi_reg_Box_Adder = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Box_Adder(ptr));\nlet _ffi_reg_Rc_Adder = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Rc_Adder(ptr));\n\nconst _ffi_Box_Adder = class Adder implements Adder {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Box_Adder.register(this, _);\n    }\n\n    add(x: number): number {\n        return _ffi_exports._ffi_Box_Adder__add(this._, x);\n    }\n};\n\nconst _ffi_Rc_Adder = class Adder implements Adder {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Adder.register(this, _);\n    }\n\n    add(x: number): number {\n        return _ffi_exports._ffi_Rc_Adder__add(this._, x);\n    }\n};\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Box_Adder__add: (_self: number, x: number) => number,\n    _ffi_Rc_Adder__add: (_self: number, x: number) => number,\n    _ffi_fn_get_adder_box: (x: number) => number,\n    _ffi_fn_get_adder_rc: (x: number) => number,\n    _ffi_fn_get_counter: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_rs_drop_Box_Adder: (ptr: number) => void,\n    _ffi_rs_drop_Rc_Adder: (ptr: number) => void,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Box_Adder__add(_self: *const u8, x: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Adder>) };\n    _self.add(x)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Adder__add(_self: *const u8, x: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Adder>) };\n    _self.add(x)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_adder_box(x: i32) -> *const u8 {\n    Box::into_raw(Box::new(get_adder_box(x))) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_adder_rc(x: i32) -> *const u8 {\n    Box::into_raw(Box::new(get_adder_rc(x))) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Box_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Adder>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Rc_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Adder>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Adder {\n    add(x: number): number;\n}\n\nexport function rust_mem_leaked(): number;\nexport function get_counter(): number;\nexport function get_adder_rc(x: number): Adder;\nexport function get_adder_box(x: number): Adder;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_counter() {\n    return _ffi_exports._ffi_fn_get_counter();\n}\n\nexport function get_adder_rc(x) {\n    let ret_ptr = _ffi_exports._ffi_fn_get_adder_rc(x);\n    return new _ffi_Rc_Adder(ret_ptr);\n}\n\nexport function get_adder_box(x) {\n    let ret_ptr = _ffi_exports._ffi_fn_get_adder_box(x);\n    return new _ffi_Box_Adder(ret_ptr);\n}\n\nlet _ffi_reg_Box_Adder = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Box_Adder(ptr));\nlet _ffi_reg_Rc_Adder = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Rc_Adder(ptr));\n\nconst _ffi_Box_Adder = class Adder {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Box_Adder.register(this, _);\n    }\n\n    add(x) {\n        return _ffi_exports._ffi_Box_Adder__add(this._, x);\n    }\n};\n\nconst _ffi_Rc_Adder = class Adder {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Adder.register(this, _);\n    }\n\n    add(x) {\n        return _ffi_exports._ffi_Rc_Adder__add(this._, x);\n    }\n};\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Adder {\n    add(x: number): number;\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_counter(): number {\n    return _ffi_exports._ffi_fn_get_counter();\n}\n\nexport function get_adder_rc(x: number): Adder {\n    let ret_ptr = _ffi_exports._ffi_fn_get_adder_rc(x);\n    return new _ffi_Rc_Adder(ret_ptr);\n}\n\nexport function get_adder_box(x: number): Adder {\n    let ret_ptr = _ffi_exports._ffi_fn_get_adder_box(x);\n    return new _ffi_Box_Adder(ret_ptr);\n}\n\nlet _ffi_reg_Box_Adder = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Box_Adder(ptr));\nlet _ffi_reg_Rc_Adder = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Rc_Adder(ptr));\n\nconst _ffi_Box_Adder = class Adder implements Adder {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Box_Adder.register(this, _);\n    }\n\n    add(x: number): number {\n        return _ffi_exports._ffi_Box_Adder__add(this._, x);\n    }\n};\n\nconst _ffi_Rc_Adder = class Adder implements Adder {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Adder.register(this, _);\n    }\n\n    add(x: number): number {\n        return _ffi_exports._ffi_Rc_Adder__add(this._, x);\n    }\n};\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Box_Adder__add: (_self: number, x: number) => number,\n    _ffi_Rc_Adder__add: (_self: number, x: number) => number,\n    _ffi_fn_get_adder_box: (x: number) => number,\n    _ffi_fn_get_adder_rc: (x: number) => number,\n    _ffi_fn_get_counter: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_rs_drop_Box_Adder: (ptr: number) => void,\n    _ffi_rs_drop_Rc_Adder: (ptr: number) => void,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Box_Adder__add(_self: *const u8, x: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const Box<dyn Adder>) };\n    _self.add(x)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Adder__add(_self: *const u8, x: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Adder>) };\n    _self.add(x)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_adder_box(x: i32) -> *const u8 {\n    Box::into_raw(Box::new(get_adder_box(x))) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_adder_rc(x: i32) -> *const u8 {\n    Box::into_raw(Box::new(get_adder_rc(x))) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Box_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut Box<dyn Adder>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Rc_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Adder>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_import_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Imported {\n    add(x: number, y: number): number;\n}\n\nexport interface Exported {\n    run(imported: Imported): number;\n}\n\nexport function rust_mem_leaked(): number;\nexport function get_exported(): Exported;\nexport function get_counter(): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_import_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_exported() {\n    let ret_ptr = _ffi_exports._ffi_fn_get_exported();\n    return new _ffi_Rc_Exported(ret_ptr);\n}\n\nexport function get_counter() {\n    return _ffi_exports._ffi_fn_get_counter();\n}\n\nlet _ffi_reg_Rc_Exported = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Rc_Exported(ptr));\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nconst _ffi_Rc_Exported = class Exported {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Exported.register(this, _);\n    }\n\n    run(imported) {\n        return _ffi_exports._ffi_Rc_Exported__run(this._, _ffi_handle_alloc(imported));\n    }\n};\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_Imported__add(self, x, y) {\n        return _ffi_handles.get(self).add(x, y);\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_import_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Imported {\n    add(x: number, y: number): number;\n}\n\nexport interface Exported {\n    run(imported: Imported): number;\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_exported(): Exported {\n    let ret_ptr = _ffi_exports._ffi_fn_get_exported();\n    return new _ffi_Rc_Exported(ret_ptr);\n}\n\nexport function get_counter(): number {\n    return _ffi_exports._ffi_fn_get_counter();\n}\n\nlet _ffi_reg_Rc_Exported = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Rc_Exported(ptr));\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nconst _ffi_Rc_Exported = class Exported implements Exported {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Exported.register(this, _);\n    }\n\n    run(imported: Imported): number {\n        return _ffi_exports._ffi_Rc_Exported__run(this._, _ffi_handle_alloc(imported));\n    }\n};\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Rc_Exported__run: (_self: number, imported_ptr: number) => number,\n    _ffi_fn_get_counter: () => number,\n    _ffi_fn_get_exported: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_rs_drop_Rc_Exported: (ptr: number) => void,\n};\n\nconst _ffi_imports = {\n    _ffi_js_Imported__add(self: number, x: number, y: number): number {\n        return _ffi_handles.get(self).add(x, y);\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_import_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Exported__run(_self: *const u8, imported_ptr: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Exported>) };\n    _self.run(std::rc::Rc::new(_ffi_rs_Imported(imported_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_exported() -> *const u8 {\n    Box::into_raw(Box::new(get_exported())) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Imported(*const u8);\n\nimpl Drop for _ffi_rs_Imported {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Imported for _ffi_rs_Imported {\n    fn add(&self, x: i32, y: i32) -> i32 {\n        extern \"C\" { fn _ffi_js_Imported__add(_: *const u8, x: i32, y: i32) -> i32; }\n        unsafe { _ffi_js_Imported__add(self.0, x, y) }\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Rc_Exported(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Exported>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_import_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Imported {\n    add(x: number, y: number): number;\n}\n\nexport interface Exported {\n    run(imported: Imported): number;\n}\n\nexport function rust_mem_leaked(): number;\nexport function get_exported(): Exported;\nexport function get_counter(): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_import_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_exported() {\n    let ret_ptr = _ffi_exports._ffi_fn_get_exported();\n    return new _ffi_Rc_Exported(ret_ptr);\n}\n\nexport function get_counter() {\n    return _ffi_exports._ffi_fn_get_counter();\n}\n\nlet _ffi_reg_Rc_Exported = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Rc_Exported(ptr));\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nconst _ffi_Rc_Exported = class Exported {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Exported.register(this, _);\n    }\n\n    run(imported) {\n        return _ffi_exports._ffi_Rc_Exported__run(this._, _ffi_handle_alloc(imported));\n    }\n};\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_Imported__add(self, x, y) {\n        return _ffi_handles.get(self).add(x, y);\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_import_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Imported {\n    add(x: number, y: number): number;\n}\n\nexport interface Exported {\n    run(imported: Imported): number;\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_exported(): Exported {\n    let ret_ptr = _ffi_exports._ffi_fn_get_exported();\n    return new _ffi_Rc_Exported(ret_ptr);\n}\n\nexport function get_counter(): number {\n    return _ffi_exports._ffi_fn_get_counter();\n}\n\nlet _ffi_reg_Rc_Exported = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Rc_Exported(ptr));\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nconst _ffi_Rc_Exported = class Exported implements Exported {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Exported.register(this, _);\n    }\n\n    run(imported: Imported): number {\n        return _ffi_exports._ffi_Rc_Exported__run(this._, _ffi_handle_alloc(imported));\n    }\n};\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Rc_Exported__run: (_self: number, imported_ptr: number) => number,\n    _ffi_fn_get_counter: () => number,\n    _ffi_fn_get_exported: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_rs_drop_Rc_Exported: (ptr: number) => void,\n};\n\nconst _ffi_imports = {\n    _ffi_js_Imported__add(self: number, x: number, y: number): number {\n        return _ffi_handles.get(self).add(x, y);\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_import_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Exported__run(_self: *const u8, imported_ptr: *const u8) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Exported>) };\n    _self.run(std::rc::Rc::new(_ffi_rs_Imported(imported_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_exported() -> *const u8 {\n    Box::into_raw(Box::new(get_exported())) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Imported(*const u8);\n\nimpl Drop for _ffi_rs_Imported {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Imported for _ffi_rs_Imported {\n    fn add(&self, x: i32, y: i32) -> i32 {\n        unsafe extern \"C\" { fn _ffi_js_Imported__add(_: *const u8, x: i32, y: i32) -> i32; }\n        unsafe { _ffi_js_Imported__add(self.0, x, y) }\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Rc_Exported(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Exported>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_nested_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Getter {\n    get_adder(): Adder;\n}\n\nexport interface Adder {\n    add(x: number, y: number): number;\n}\n\nexport function rust_mem_leaked(): number;\nexport function get_getter_counter(): number;\nexport function get_adder_counter(): number;\nexport function get_getter(): Getter;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_nested_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_getter_counter() {\n    return _ffi_exports._ffi_fn_get_getter_counter();\n}\n\nexport function get_adder_counter() {\n    return _ffi_exports._ffi_fn_get_adder_counter();\n}\n\nexport function get_getter() {\n    let ret_ptr = _ffi_exports._ffi_fn_get_getter();\n    return new _ffi_Rc_Getter(ret_ptr);\n}\n\nlet _ffi_reg_Rc_Adder = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Rc_Adder(ptr));\nlet _ffi_reg_Rc_Getter = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Rc_Getter(ptr));\n\nconst _ffi_Rc_Adder = class Adder {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Adder.register(this, _);\n    }\n\n    add(x, y) {\n        return _ffi_exports._ffi_Rc_Adder__add(this._, x, y);\n    }\n};\n\nconst _ffi_Rc_Getter = class Getter {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Getter.register(this, _);\n    }\n\n    get_adder() {\n        let ret_ptr = _ffi_exports._ffi_Rc_Getter__get_adder(this._);\n        return new _ffi_Rc_Adder(ret_ptr);\n    }\n};\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_nested_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Getter {\n    get_adder(): Adder;\n}\n\nexport interface Adder {\n    add(x: number, y: number): number;\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_getter_counter(): number {\n    return _ffi_exports._ffi_fn_get_getter_counter();\n}\n\nexport function get_adder_counter(): number {\n    return _ffi_exports._ffi_fn_get_adder_counter();\n}\n\nexport function get_getter(): Getter {\n    let ret_ptr = _ffi_exports._ffi_fn_get_getter();\n    return new _ffi_Rc_Getter(ret_ptr);\n}\n\nlet _ffi_reg_Rc_Adder = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Rc_Adder(ptr));\nlet _ffi_reg_Rc_Getter = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Rc_Getter(ptr));\n\nconst _ffi_Rc_Adder = class Adder implements Adder {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Adder.register(this, _);\n    }\n\n    add(x: number, y: number): number {\n        return _ffi_exports._ffi_Rc_Adder__add(this._, x, y);\n    }\n};\n\nconst _ffi_Rc_Getter = class Getter implements Getter {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Getter.register(this, _);\n    }\n\n    get_adder(): Adder {\n        let ret_ptr = _ffi_exports._ffi_Rc_Getter__get_adder(this._);\n        return new _ffi_Rc_Adder(ret_ptr);\n    }\n};\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Rc_Adder__add: (_self: number, x: number, y: number) => number,\n    _ffi_Rc_Getter__get_adder: (_self: number) => number,\n    _ffi_fn_get_adder_counter: () => number,\n    _ffi_fn_get_getter: () => number,\n    _ffi_fn_get_getter_counter: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_rs_drop_Rc_Adder: (ptr: number) => void,\n    _ffi_rs_drop_Rc_Getter: (ptr: number) => void,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_nested_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Adder__add(_self: *const u8, x: i32, y: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Adder>) };\n    _self.add(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Getter__get_adder(_self: *const u8) -> *const u8 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Getter>) };\n    Box::into_raw(Box::new(_self.get_adder())) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_adder_counter() -> u32 {\n    get_adder_counter()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_getter() -> *const u8 {\n    Box::into_raw(Box::new(get_getter())) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_getter_counter() -> u32 {\n    get_getter_counter()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Rc_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Adder>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Rc_Getter(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Getter>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_nested_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Getter {\n    get_adder(): Adder;\n}\n\nexport interface Adder {\n    add(x: number, y: number): number;\n}\n\nexport function rust_mem_leaked(): number;\nexport function get_getter_counter(): number;\nexport function get_adder_counter(): number;\nexport function get_getter(): Getter;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_nested_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_getter_counter() {\n    return _ffi_exports._ffi_fn_get_getter_counter();\n}\n\nexport function get_adder_counter() {\n    return _ffi_exports._ffi_fn_get_adder_counter();\n}\n\nexport function get_getter() {\n    let ret_ptr = _ffi_exports._ffi_fn_get_getter();\n    return new _ffi_Rc_Getter(ret_ptr);\n}\n\nlet _ffi_reg_Rc_Adder = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Rc_Adder(ptr));\nlet _ffi_reg_Rc_Getter = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Rc_Getter(ptr));\n\nconst _ffi_Rc_Adder = class Adder {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Adder.register(this, _);\n    }\n\n    add(x, y) {\n        return _ffi_exports._ffi_Rc_Adder__add(this._, x, y);\n    }\n};\n\nconst _ffi_Rc_Getter = class Getter {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Getter.register(this, _);\n    }\n\n    get_adder() {\n        let ret_ptr = _ffi_exports._ffi_Rc_Getter__get_adder(this._);\n        return new _ffi_Rc_Adder(ret_ptr);\n    }\n};\n\nlet _ffi_exports;\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_nested_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Getter {\n    get_adder(): Adder;\n}\n\nexport interface Adder {\n    add(x: number, y: number): number;\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_getter_counter(): number {\n    return _ffi_exports._ffi_fn_get_getter_counter();\n}\n\nexport function get_adder_counter(): number {\n    return _ffi_exports._ffi_fn_get_adder_counter();\n}\n\nexport function get_getter(): Getter {\n    let ret_ptr = _ffi_exports._ffi_fn_get_getter();\n    return new _ffi_Rc_Getter(ret_ptr);\n}\n\nlet _ffi_reg_Rc_Adder = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Rc_Adder(ptr));\nlet _ffi_reg_Rc_Getter = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Rc_Getter(ptr));\n\nconst _ffi_Rc_Adder = class Adder implements Adder {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Adder.register(this, _);\n    }\n\n    add(x: number, y: number): number {\n        return _ffi_exports._ffi_Rc_Adder__add(this._, x, y);\n    }\n};\n\nconst _ffi_Rc_Getter = class Getter implements Getter {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Getter.register(this, _);\n    }\n\n    get_adder(): Adder {\n        let ret_ptr = _ffi_exports._ffi_Rc_Getter__get_adder(this._);\n        return new _ffi_Rc_Adder(ret_ptr);\n    }\n};\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Rc_Adder__add: (_self: number, x: number, y: number) => number,\n    _ffi_Rc_Getter__get_adder: (_self: number) => number,\n    _ffi_fn_get_adder_counter: () => number,\n    _ffi_fn_get_getter: () => number,\n    _ffi_fn_get_getter_counter: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_rs_drop_Rc_Adder: (ptr: number) => void,\n    _ffi_rs_drop_Rc_Getter: (ptr: number) => void,\n};\n\nconst _ffi_imports = {};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_export_nested_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Adder__add(_self: *const u8, x: i32, y: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Adder>) };\n    _self.add(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Getter__get_adder(_self: *const u8) -> *const u8 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Getter>) };\n    Box::into_raw(Box::new(_self.get_adder())) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_adder_counter() -> u32 {\n    get_adder_counter()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_getter() -> *const u8 {\n    Box::into_raw(Box::new(get_getter())) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_getter_counter() -> u32 {\n    get_getter_counter()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Rc_Adder(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Adder>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Rc_Getter(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Getter>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Adder {\n    add(y: number): number;\n}\n\nexport function rust_mem_leaked(): number;\nexport function set_adder_rc(adder: Adder): number;\nexport function set_adder_box(adder: Adder): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_adder_rc(adder) {\n    return _ffi_exports._ffi_fn_set_adder_rc(_ffi_handle_alloc(adder));\n}\n\nexport function set_adder_box(adder) {\n    return _ffi_exports._ffi_fn_set_adder_box(_ffi_handle_alloc(adder));\n}\n\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_Adder__add(self, y) {\n        return _ffi_handles.get(self).add(y);\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Adder {\n    add(y: number): number;\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_adder_rc(adder: Adder): number {\n    return _ffi_exports._ffi_fn_set_adder_rc(_ffi_handle_alloc(adder));\n}\n\nexport function set_adder_box(adder: Adder): number {\n    return _ffi_exports._ffi_fn_set_adder_box(_ffi_handle_alloc(adder));\n}\n\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_set_adder_box: (adder_ptr: number) => number,\n    _ffi_fn_set_adder_rc: (adder_ptr: number) => number,\n};\n\nconst _ffi_imports = {\n    _ffi_js_Adder__add(self: number, y: number): number {\n        return _ffi_handles.get(self).add(y);\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_adder_box(adder_ptr: *const u8) -> i32 {\n    set_adder_box(Box::new(_ffi_rs_Adder(adder_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_adder_rc(adder_ptr: *const u8) -> i32 {\n    set_adder_rc(std::rc::Rc::new(_ffi_rs_Adder(adder_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Adder(*const u8);\n\nimpl Drop for _ffi_rs_Adder {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Adder for _ffi_rs_Adder {\n    fn add(&self, y: i32) -> i32 {\n        extern \"C\" { fn _ffi_js_Adder__add(_: *const u8, y: i32) -> i32; }\n        unsafe { _ffi_js_Adder__add(self.0, y) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Adder {\n    add(y: number): number;\n}\n\nexport function rust_mem_leaked(): number;\nexport function set_adder_rc(adder: Adder): number;\nexport function set_adder_box(adder: Adder): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_adder_rc(adder) {\n    return _ffi_exports._ffi_fn_set_adder_rc(_ffi_handle_alloc(adder));\n}\n\nexport function set_adder_box(adder) {\n    return _ffi_exports._ffi_fn_set_adder_box(_ffi_handle_alloc(adder));\n}\n\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_Adder__add(self, y) {\n        return _ffi_handles.get(self).add(y);\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Adder {\n    add(y: number): number;\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_adder_rc(adder: Adder): number {\n    return _ffi_exports._ffi_fn_set_adder_rc(_ffi_handle_alloc(adder));\n}\n\nexport function set_adder_box(adder: Adder): number {\n    return _ffi_exports._ffi_fn_set_adder_box(_ffi_handle_alloc(adder));\n}\n\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_set_adder_box: (adder_ptr: number) => number,\n    _ffi_fn_set_adder_rc: (adder_ptr: number) => number,\n};\n\nconst _ffi_imports = {\n    _ffi_js_Adder__add(self: number, y: number): number {\n        return _ffi_handles.get(self).add(y);\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_adder_box(adder_ptr: *const u8) -> i32 {\n    set_adder_box(Box::new(_ffi_rs_Adder(adder_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_adder_rc(adder_ptr: *const u8) -> i32 {\n    set_adder_rc(std::rc::Rc::new(_ffi_rs_Adder(adder_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Adder(*const u8);\n\nimpl Drop for _ffi_rs_Adder {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Adder for _ffi_rs_Adder {\n    fn add(&self, y: i32) -> i32 {\n        unsafe extern \"C\" { fn _ffi_js_Adder__add(_: *const u8, y: i32) -> i32; }\n        unsafe { _ffi_js_Adder__add(self.0, y) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_export_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Imported {\n    run(exported: Exported): number;\n}\n\nexport interface Exported {\n    add(x: number, y: number): number;\n}\n\nexport function rust_mem_leaked(): number;\nexport function get_counter(): number;\nexport function set_imported(imported: Imported): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_export_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_counter() {\n    return _ffi_exports._ffi_fn_get_counter();\n}\n\nexport function set_imported(imported) {\n    return _ffi_exports._ffi_fn_set_imported(_ffi_handle_alloc(imported));\n}\n\nlet _ffi_reg_Rc_Exported = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Rc_Exported(ptr));\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nconst _ffi_Rc_Exported = class Exported {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Exported.register(this, _);\n    }\n\n    add(x, y) {\n        return _ffi_exports._ffi_Rc_Exported__add(this._, x, y);\n    }\n};\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_Imported__run(self, exported_ptr) {\n        return _ffi_handles.get(self).run(new _ffi_Rc_Exported(exported_ptr));\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_export_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Imported {\n    run(exported: Exported): number;\n}\n\nexport interface Exported {\n    add(x: number, y: number): number;\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_counter(): number {\n    return _ffi_exports._ffi_fn_get_counter();\n}\n\nexport function set_imported(imported: Imported): number {\n    return _ffi_exports._ffi_fn_set_imported(_ffi_handle_alloc(imported));\n}\n\nlet _ffi_reg_Rc_Exported = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Rc_Exported(ptr));\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nconst _ffi_Rc_Exported = class Exported implements Exported {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Exported.register(this, _);\n    }\n\n    add(x: number, y: number): number {\n        return _ffi_exports._ffi_Rc_Exported__add(this._, x, y);\n    }\n};\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Rc_Exported__add: (_self: number, x: number, y: number) => number,\n    _ffi_fn_get_counter: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_set_imported: (imported_ptr: number) => number,\n    _ffi_rs_drop_Rc_Exported: (ptr: number) => void,\n};\n\nconst _ffi_imports = {\n    _ffi_js_Imported__run(self: number, exported_ptr: number): number {\n        return _ffi_handles.get(self).run(new _ffi_Rc_Exported(exported_ptr));\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_export_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Exported__add(_self: *const u8, x: i32, y: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Exported>) };\n    _self.add(x, y)\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_imported(imported_ptr: *const u8) -> i32 {\n    set_imported(std::rc::Rc::new(_ffi_rs_Imported(imported_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Imported(*const u8);\n\nimpl Drop for _ffi_rs_Imported {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Imported for _ffi_rs_Imported {\n    fn run(&self, exported: std::rc::Rc<dyn Exported>) -> i32 {\n        extern \"C\" { fn _ffi_js_Imported__run(_: *const u8, exported_ptr: *const u8) -> i32; }\n        unsafe { _ffi_js_Imported__run(self.0, Box::into_raw(Box::new(exported)) as *const u8) }\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Rc_Exported(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Exported>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_export_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Imported {\n    run(exported: Exported): number;\n}\n\nexport interface Exported {\n    add(x: number, y: number): number;\n}\n\nexport function rust_mem_leaked(): number;\nexport function get_counter(): number;\nexport function set_imported(imported: Imported): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_export_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_counter() {\n    return _ffi_exports._ffi_fn_get_counter();\n}\n\nexport function set_imported(imported) {\n    return _ffi_exports._ffi_fn_set_imported(_ffi_handle_alloc(imported));\n}\n\nlet _ffi_reg_Rc_Exported = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Rc_Exported(ptr));\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nconst _ffi_Rc_Exported = class Exported {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Exported.register(this, _);\n    }\n\n    add(x, y) {\n        return _ffi_exports._ffi_Rc_Exported__add(this._, x, y);\n    }\n};\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_Imported__run(self, exported_ptr) {\n        return _ffi_handles.get(self).run(new _ffi_Rc_Exported(exported_ptr));\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_export_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Imported {\n    run(exported: Exported): number;\n}\n\nexport interface Exported {\n    add(x: number, y: number): number;\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_counter(): number {\n    return _ffi_exports._ffi_fn_get_counter();\n}\n\nexport function set_imported(imported: Imported): number {\n    return _ffi_exports._ffi_fn_set_imported(_ffi_handle_alloc(imported));\n}\n\nlet _ffi_reg_Rc_Exported = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Rc_Exported(ptr));\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nconst _ffi_Rc_Exported = class Exported implements Exported {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Exported.register(this, _);\n    }\n\n    add(x: number, y: number): number {\n        return _ffi_exports._ffi_Rc_Exported__add(this._, x, y);\n    }\n};\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Rc_Exported__add: (_self: number, x: number, y: number) => number,\n    _ffi_fn_get_counter: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_set_imported: (imported_ptr: number) => number,\n    _ffi_rs_drop_Rc_Exported: (ptr: number) => void,\n};\n\nconst _ffi_imports = {\n    _ffi_js_Imported__run(self: number, exported_ptr: number): number {\n        return _ffi_handles.get(self).run(new _ffi_Rc_Exported(exported_ptr));\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_export_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Exported__add(_self: *const u8, x: i32, y: i32) -> i32 {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Exported>) };\n    _self.add(x, y)\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_counter() -> u32 {\n    get_counter()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_imported(imported_ptr: *const u8) -> i32 {\n    set_imported(std::rc::Rc::new(_ffi_rs_Imported(imported_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Imported(*const u8);\n\nimpl Drop for _ffi_rs_Imported {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Imported for _ffi_rs_Imported {\n    fn run(&self, exported: std::rc::Rc<dyn Exported>) -> i32 {\n        unsafe extern \"C\" { fn _ffi_js_Imported__run(_: *const u8, exported_ptr: *const u8) -> i32; }\n        unsafe { _ffi_js_Imported__run(self.0, Box::into_raw(Box::new(exported)) as *const u8) }\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Rc_Exported(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Exported>) });\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_nested_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Getter {\n    get_adder(): Adder;\n}\n\nexport interface Adder {\n    add(x: number, y: number): number;\n}\n\nexport function rust_mem_leaked(): number;\nexport function set_getter(getter: Getter): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_nested_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_getter(getter) {\n    return _ffi_exports._ffi_fn_set_getter(_ffi_handle_alloc(getter));\n}\n\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_Adder__add(self, x, y) {\n        return _ffi_handles.get(self).add(x, y);\n    },\n\n    _ffi_js_Getter__get_adder(self) {\n        return _ffi_handle_alloc(_ffi_handles.get(self).get_adder());\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_nested_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Getter {\n    get_adder(): Adder;\n}\n\nexport interface Adder {\n    add(x: number, y: number): number;\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_getter(getter: Getter): number {\n    return _ffi_exports._ffi_fn_set_getter(_ffi_handle_alloc(getter));\n}\n\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_set_getter: (getter_ptr: number) => number,\n};\n\nconst _ffi_imports = {\n    _ffi_js_Adder__add(self: number, x: number, y: number): number {\n        return _ffi_handles.get(self).add(x, y);\n    },\n\n    _ffi_js_Getter__get_adder(self: number): number {\n        return _ffi_handle_alloc(_ffi_handles.get(self).get_adder());\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_nested_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_getter(getter_ptr: *const u8) -> i32 {\n    set_getter(std::rc::Rc::new(_ffi_rs_Getter(getter_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Adder(*const u8);\n\nimpl Drop for _ffi_rs_Adder {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Adder for _ffi_rs_Adder {\n    fn add(&self, x: i32, y: i32) -> i32 {\n        extern \"C\" { fn _ffi_js_Adder__add(_: *const u8, x: i32, y: i32) -> i32; }\n        unsafe { _ffi_js_Adder__add(self.0, x, y) }\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Getter(*const u8);\n\nimpl Drop for _ffi_rs_Getter {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Getter for _ffi_rs_Getter {\n    fn get_adder(&self) -> std::rc::Rc<dyn Adder> {\n        extern \"C\" { fn _ffi_js_Getter__get_adder(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_js_Getter__get_adder(self.0) };\n        std::rc::Rc::new(_ffi_rs_Adder(ret_ptr))\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_nested_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Getter {\n    get_adder(): Adder;\n}\n\nexport interface Adder {\n    add(x: number, y: number): number;\n}\n\nexport function rust_mem_leaked(): number;\nexport function set_getter(getter: Getter): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_nested_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_getter(getter) {\n    return _ffi_exports._ffi_fn_set_getter(_ffi_handle_alloc(getter));\n}\n\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_Adder__add(self, x, y) {\n        return _ffi_handles.get(self).add(x, y);\n    },\n\n    _ffi_js_Getter__get_adder(self) {\n        return _ffi_handle_alloc(_ffi_handles.get(self).get_adder());\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_nested_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Getter {\n    get_adder(): Adder;\n}\n\nexport interface Adder {\n    add(x: number, y: number): number;\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_getter(getter: Getter): number {\n    return _ffi_exports._ffi_fn_set_getter(_ffi_handle_alloc(getter));\n}\n\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_set_getter: (getter_ptr: number) => number,\n};\n\nconst _ffi_imports = {\n    _ffi_js_Adder__add(self: number, x: number, y: number): number {\n        return _ffi_handles.get(self).add(x, y);\n    },\n\n    _ffi_js_Getter__get_adder(self: number): number {\n        return _ffi_handle_alloc(_ffi_handles.get(self).get_adder());\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_nested_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_getter(getter_ptr: *const u8) -> i32 {\n    set_getter(std::rc::Rc::new(_ffi_rs_Getter(getter_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Adder(*const u8);\n\nimpl Drop for _ffi_rs_Adder {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Adder for _ffi_rs_Adder {\n    fn add(&self, x: i32, y: i32) -> i32 {\n        unsafe extern \"C\" { fn _ffi_js_Adder__add(_: *const u8, x: i32, y: i32) -> i32; }\n        unsafe { _ffi_js_Adder__add(self.0, x, y) }\n    }\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Getter(*const u8);\n\nimpl Drop for _ffi_rs_Getter {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Getter for _ffi_rs_Getter {\n    fn get_adder(&self) -> std::rc::Rc<dyn Adder> {\n        unsafe extern \"C\" { fn _ffi_js_Getter__get_adder(_: *const u8) -> *const u8; }\n        let ret_ptr = unsafe { _ffi_js_Getter__get_adder(self.0) };\n        std::rc::Rc::new(_ffi_rs_Adder(ret_ptr))\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_struct_in_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface StructIn {\n    empty_struct(x: number, foo: EmptyStruct, y: number): number;\n    single_element_struct(x: SingleElementStruct, y: SingleElementStruct): number;\n    multiply_pairs(ab: PairStruct, cd: PairStruct): number;\n}\n\nexport interface EmptyStruct {\n}\n\nexport interface SingleElementStruct {\n    0: number,\n}\n\nexport interface PairStruct {\n    x: number,\n    y: number,\n}\n\nexport function rust_mem_leaked(): number;\nexport function set_empty_struct(struct_in: StructIn): number;\nexport function set_single_element_struct(struct_in: StructIn): number;\nexport function set_multiply_pairs(struct_in: StructIn): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_struct_in_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_empty_struct(struct_in) {\n    return _ffi_exports._ffi_fn_set_empty_struct(_ffi_handle_alloc(struct_in));\n}\n\nexport function set_single_element_struct(struct_in) {\n    return _ffi_exports._ffi_fn_set_single_element_struct(_ffi_handle_alloc(struct_in));\n}\n\nexport function set_multiply_pairs(struct_in) {\n    return _ffi_exports._ffi_fn_set_multiply_pairs(_ffi_handle_alloc(struct_in));\n}\n\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_StructIn__empty_struct(self, x, y) {\n        return _ffi_handles.get(self).empty_struct(x, {}, y);\n    },\n\n    _ffi_js_StructIn__multiply_pairs(self, ab_x, ab_y, cd_x, cd_y) {\n        return _ffi_handles.get(self).multiply_pairs({ x: ab_x, y: ab_y }, { x: cd_x, y: cd_y });\n    },\n\n    _ffi_js_StructIn__single_element_struct(self, x_0, y_0) {\n        return _ffi_handles.get(self).single_element_struct({ 0: x_0 }, { 0: y_0 });\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_struct_in_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface StructIn {\n    empty_struct(x: number, foo: EmptyStruct, y: number): number;\n    single_element_struct(x: SingleElementStruct, y: SingleElementStruct): number;\n    multiply_pairs(ab: PairStruct, cd: PairStruct): number;\n}\n\nexport interface EmptyStruct {\n}\n\nexport interface SingleElementStruct {\n    0: number,\n}\n\nexport interface PairStruct {\n    x: number,\n    y: number,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_empty_struct(struct_in: StructIn): number {\n    return _ffi_exports._ffi_fn_set_empty_struct(_ffi_handle_alloc(struct_in));\n}\n\nexport function set_single_element_struct(struct_in: StructIn): number {\n    return _ffi_exports._ffi_fn_set_single_element_struct(_ffi_handle_alloc(struct_in));\n}\n\nexport function set_multiply_pairs(struct_in: StructIn): number {\n    return _ffi_exports._ffi_fn_set_multiply_pairs(_ffi_handle_alloc(struct_in));\n}\n\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_set_empty_struct: (struct_in_ptr: number) => number,\n    _ffi_fn_set_multiply_pairs: (struct_in_ptr: number) => number,\n    _ffi_fn_set_single_element_struct: (struct_in_ptr: number) => number,\n};\n\nconst _ffi_imports = {\n    _ffi_js_StructIn__empty_struct(self: number, x: number, y: number): number {\n        return _ffi_handles.get(self).empty_struct(x, {}, y);\n    },\n\n    _ffi_js_StructIn__multiply_pairs(self: number, ab_x: number, ab_y: number, cd_x: number, cd_y: number): number {\n        return _ffi_handles.get(self).multiply_pairs({ x: ab_x, y: ab_y }, { x: cd_x, y: cd_y });\n    },\n\n    _ffi_js_StructIn__single_element_struct(self: number, x_0: number, y_0: number): number {\n        return _ffi_handles.get(self).single_element_struct({ 0: x_0 }, { 0: y_0 });\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_struct_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_empty_struct(struct_in_ptr: *const u8) -> i32 {\n    set_empty_struct(std::rc::Rc::new(_ffi_rs_StructIn(struct_in_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_multiply_pairs(struct_in_ptr: *const u8) -> f32 {\n    set_multiply_pairs(std::rc::Rc::new(_ffi_rs_StructIn(struct_in_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_single_element_struct(struct_in_ptr: *const u8) -> i32 {\n    set_single_element_struct(std::rc::Rc::new(_ffi_rs_StructIn(struct_in_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_StructIn(*const u8);\n\nimpl Drop for _ffi_rs_StructIn {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl StructIn for _ffi_rs_StructIn {\n    fn empty_struct(&self, x: i32, foo: EmptyStruct, y: i32) -> i32 {\n        extern \"C\" { fn _ffi_js_StructIn__empty_struct(_: *const u8, x: i32, y: i32) -> i32; }\n        _ = foo;\n        unsafe { _ffi_js_StructIn__empty_struct(self.0, x, y) }\n    }\n\n    fn single_element_struct(&self, x: SingleElementStruct, y: SingleElementStruct) -> i32 {\n        extern \"C\" { fn _ffi_js_StructIn__single_element_struct(_: *const u8, x_0: i32, y_0: i32) -> i32; }\n        unsafe { _ffi_js_StructIn__single_element_struct(self.0, x.0, y.0) }\n    }\n\n    fn multiply_pairs(&self, ab: PairStruct, cd: PairStruct) -> f32 {\n        extern \"C\" { fn _ffi_js_StructIn__multiply_pairs(_: *const u8, ab_x: f32, ab_y: f32, cd_x: f32, cd_y: f32) -> f32; }\n        unsafe { _ffi_js_StructIn__multiply_pairs(self.0, ab.x, ab.y, cd.x, cd.y) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_struct_in_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface StructIn {\n    empty_struct(x: number, foo: EmptyStruct, y: number): number;\n    single_element_struct(x: SingleElementStruct, y: SingleElementStruct): number;\n    multiply_pairs(ab: PairStruct, cd: PairStruct): number;\n}\n\nexport interface EmptyStruct {\n}\n\nexport interface SingleElementStruct {\n    0: number,\n}\n\nexport interface PairStruct {\n    x: number,\n    y: number,\n}\n\nexport function rust_mem_leaked(): number;\nexport function set_empty_struct(struct_in: StructIn): number;\nexport function set_single_element_struct(struct_in: StructIn): number;\nexport function set_multiply_pairs(struct_in: StructIn): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_struct_in_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_empty_struct(struct_in) {\n    return _ffi_exports._ffi_fn_set_empty_struct(_ffi_handle_alloc(struct_in));\n}\n\nexport function set_single_element_struct(struct_in) {\n    return _ffi_exports._ffi_fn_set_single_element_struct(_ffi_handle_alloc(struct_in));\n}\n\nexport function set_multiply_pairs(struct_in) {\n    return _ffi_exports._ffi_fn_set_multiply_pairs(_ffi_handle_alloc(struct_in));\n}\n\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_StructIn__empty_struct(self, x, y) {\n        return _ffi_handles.get(self).empty_struct(x, {}, y);\n    },\n\n    _ffi_js_StructIn__multiply_pairs(self, ab_x, ab_y, cd_x, cd_y) {\n        return _ffi_handles.get(self).multiply_pairs({ x: ab_x, y: ab_y }, { x: cd_x, y: cd_y });\n    },\n\n    _ffi_js_StructIn__single_element_struct(self, x_0, y_0) {\n        return _ffi_handles.get(self).single_element_struct({ 0: x_0 }, { 0: y_0 });\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_struct_in_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface StructIn {\n    empty_struct(x: number, foo: EmptyStruct, y: number): number;\n    single_element_struct(x: SingleElementStruct, y: SingleElementStruct): number;\n    multiply_pairs(ab: PairStruct, cd: PairStruct): number;\n}\n\nexport interface EmptyStruct {\n}\n\nexport interface SingleElementStruct {\n    0: number,\n}\n\nexport interface PairStruct {\n    x: number,\n    y: number,\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_empty_struct(struct_in: StructIn): number {\n    return _ffi_exports._ffi_fn_set_empty_struct(_ffi_handle_alloc(struct_in));\n}\n\nexport function set_single_element_struct(struct_in: StructIn): number {\n    return _ffi_exports._ffi_fn_set_single_element_struct(_ffi_handle_alloc(struct_in));\n}\n\nexport function set_multiply_pairs(struct_in: StructIn): number {\n    return _ffi_exports._ffi_fn_set_multiply_pairs(_ffi_handle_alloc(struct_in));\n}\n\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_set_empty_struct: (struct_in_ptr: number) => number,\n    _ffi_fn_set_multiply_pairs: (struct_in_ptr: number) => number,\n    _ffi_fn_set_single_element_struct: (struct_in_ptr: number) => number,\n};\n\nconst _ffi_imports = {\n    _ffi_js_StructIn__empty_struct(self: number, x: number, y: number): number {\n        return _ffi_handles.get(self).empty_struct(x, {}, y);\n    },\n\n    _ffi_js_StructIn__multiply_pairs(self: number, ab_x: number, ab_y: number, cd_x: number, cd_y: number): number {\n        return _ffi_handles.get(self).multiply_pairs({ x: ab_x, y: ab_y }, { x: cd_x, y: cd_y });\n    },\n\n    _ffi_js_StructIn__single_element_struct(self: number, x_0: number, y_0: number): number {\n        return _ffi_handles.get(self).single_element_struct({ 0: x_0 }, { 0: y_0 });\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_struct_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_empty_struct(struct_in_ptr: *const u8) -> i32 {\n    set_empty_struct(std::rc::Rc::new(_ffi_rs_StructIn(struct_in_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_multiply_pairs(struct_in_ptr: *const u8) -> f32 {\n    set_multiply_pairs(std::rc::Rc::new(_ffi_rs_StructIn(struct_in_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_single_element_struct(struct_in_ptr: *const u8) -> i32 {\n    set_single_element_struct(std::rc::Rc::new(_ffi_rs_StructIn(struct_in_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_StructIn(*const u8);\n\nimpl Drop for _ffi_rs_StructIn {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl StructIn for _ffi_rs_StructIn {\n    fn empty_struct(&self, x: i32, foo: EmptyStruct, y: i32) -> i32 {\n        unsafe extern \"C\" { fn _ffi_js_StructIn__empty_struct(_: *const u8, x: i32, y: i32) -> i32; }\n        _ = foo;\n        unsafe { _ffi_js_StructIn__empty_struct(self.0, x, y) }\n    }\n\n    fn single_element_struct(&self, x: SingleElementStruct, y: SingleElementStruct) -> i32 {\n        unsafe extern \"C\" { fn _ffi_js_StructIn__single_element_struct(_: *const u8, x_0: i32, y_0: i32) -> i32; }\n        unsafe { _ffi_js_StructIn__single_element_struct(self.0, x.0, y.0) }\n    }\n\n    fn multiply_pairs(&self, ab: PairStruct, cd: PairStruct) -> f32 {\n        unsafe extern \"C\" { fn _ffi_js_StructIn__multiply_pairs(_: *const u8, ab_x: f32, ab_y: f32, cd_x: f32, cd_y: f32) -> f32; }\n        unsafe { _ffi_js_StructIn__multiply_pairs(self.0, ab.x, ab.y, cd.x, cd.y) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_tuple_in_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface TupleIn {\n    empty_tuple(x: number, foo: undefined, y: number): number;\n    single_element_tuple(x: [number], y: [number]): number;\n    multiply_pairs(ab: [number, number], cd: [number, number]): number;\n}\n\nexport function rust_mem_leaked(): number;\nexport function set_empty_tuple(tuple_in: TupleIn): number;\nexport function set_single_element_tuple(tuple_in: TupleIn): number;\nexport function set_multiply_pairs(tuple_in: TupleIn): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_tuple_in_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_empty_tuple(tuple_in) {\n    return _ffi_exports._ffi_fn_set_empty_tuple(_ffi_handle_alloc(tuple_in));\n}\n\nexport function set_single_element_tuple(tuple_in) {\n    return _ffi_exports._ffi_fn_set_single_element_tuple(_ffi_handle_alloc(tuple_in));\n}\n\nexport function set_multiply_pairs(tuple_in) {\n    return _ffi_exports._ffi_fn_set_multiply_pairs(_ffi_handle_alloc(tuple_in));\n}\n\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_TupleIn__empty_tuple(self, x, y) {\n        return _ffi_handles.get(self).empty_tuple(x, undefined, y);\n    },\n\n    _ffi_js_TupleIn__multiply_pairs(self, ab_0, ab_1, cd_0, cd_1) {\n        return _ffi_handles.get(self).multiply_pairs([ab_0, ab_1], [cd_0, cd_1]);\n    },\n\n    _ffi_js_TupleIn__single_element_tuple(self, x_0, y_0) {\n        return _ffi_handles.get(self).single_element_tuple([x_0], [y_0]);\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_tuple_in_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface TupleIn {\n    empty_tuple(x: number, foo: undefined, y: number): number;\n    single_element_tuple(x: [number], y: [number]): number;\n    multiply_pairs(ab: [number, number], cd: [number, number]): number;\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_empty_tuple(tuple_in: TupleIn): number {\n    return _ffi_exports._ffi_fn_set_empty_tuple(_ffi_handle_alloc(tuple_in));\n}\n\nexport function set_single_element_tuple(tuple_in: TupleIn): number {\n    return _ffi_exports._ffi_fn_set_single_element_tuple(_ffi_handle_alloc(tuple_in));\n}\n\nexport function set_multiply_pairs(tuple_in: TupleIn): number {\n    return _ffi_exports._ffi_fn_set_multiply_pairs(_ffi_handle_alloc(tuple_in));\n}\n\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_set_empty_tuple: (tuple_in_ptr: number) => number,\n    _ffi_fn_set_multiply_pairs: (tuple_in_ptr: number) => number,\n    _ffi_fn_set_single_element_tuple: (tuple_in_ptr: number) => number,\n};\n\nconst _ffi_imports = {\n    _ffi_js_TupleIn__empty_tuple(self: number, x: number, y: number): number {\n        return _ffi_handles.get(self).empty_tuple(x, undefined, y);\n    },\n\n    _ffi_js_TupleIn__multiply_pairs(self: number, ab_0: number, ab_1: number, cd_0: number, cd_1: number): number {\n        return _ffi_handles.get(self).multiply_pairs([ab_0, ab_1], [cd_0, cd_1]);\n    },\n\n    _ffi_js_TupleIn__single_element_tuple(self: number, x_0: number, y_0: number): number {\n        return _ffi_handles.get(self).single_element_tuple([x_0], [y_0]);\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_tuple_in_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_empty_tuple(tuple_in_ptr: *const u8) -> i32 {\n    set_empty_tuple(std::rc::Rc::new(_ffi_rs_TupleIn(tuple_in_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_multiply_pairs(tuple_in_ptr: *const u8) -> f32 {\n    set_multiply_pairs(std::rc::Rc::new(_ffi_rs_TupleIn(tuple_in_ptr)))\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_single_element_tuple(tuple_in_ptr: *const u8) -> i32 {\n    set_single_element_tuple(std::rc::Rc::new(_ffi_rs_TupleIn(tuple_in_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_TupleIn(*const u8);\n\nimpl Drop for _ffi_rs_TupleIn {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl TupleIn for _ffi_rs_TupleIn {\n    fn empty_tuple(&self, x: i32, foo: (), y: i32) -> i32 {\n        extern \"C\" { fn _ffi_js_TupleIn__empty_tuple(_: *const u8, x: i32, y: i32) -> i32; }\n        _ = foo;\n        unsafe { _ffi_js_TupleIn__empty_tuple(self.0, x, y) }\n    }\n\n    fn single_element_tuple(&self, x: (i32,), y: (i32,)) -> i32 {\n        extern \"C\" { fn _ffi_js_TupleIn__single_element_tuple(_: *const u8, x_0: i32, y_0: i32) -> i32; }\n        unsafe { _ffi_js_TupleIn__single_element_tuple(self.0, x.0, y.0) }\n    }\n\n    fn multiply_pairs(&self, ab: (f32, f32), cd: (f32, f32)) -> f32 {\n        extern \"C\" { fn _ffi_js_TupleIn__multiply_pairs(_: *const u8, ab_0: f32, ab_1: f32, cd_0: f32, cd_1: f32) -> f32; }\n        unsafe { _ffi_js_TupleIn__multiply_pairs(self.0, ab.0, ab.1, cd.0, cd.1) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_tuple_in_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface TupleIn {\n    empty_tuple(x: number, foo: undefined, y: number): number;\n    single_element_tuple(x: [number], y: [number]): number;\n    multiply_pairs(ab: [number, number], cd: [number, number]): number;\n}\n\nexport function rust_mem_leaked(): number;\nexport function set_empty_tuple(tuple_in: TupleIn): number;\nexport function set_single_element_tuple(tuple_in: TupleIn): number;\nexport function set_multiply_pairs(tuple_in: TupleIn): number;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_tuple_in_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_empty_tuple(tuple_in) {\n    return _ffi_exports._ffi_fn_set_empty_tuple(_ffi_handle_alloc(tuple_in));\n}\n\nexport function set_single_element_tuple(tuple_in) {\n    return _ffi_exports._ffi_fn_set_single_element_tuple(_ffi_handle_alloc(tuple_in));\n}\n\nexport function set_multiply_pairs(tuple_in) {\n    return _ffi_exports._ffi_fn_set_multiply_pairs(_ffi_handle_alloc(tuple_in));\n}\n\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_TupleIn__empty_tuple(self, x, y) {\n        return _ffi_handles.get(self).empty_tuple(x, undefined, y);\n    },\n\n    _ffi_js_TupleIn__multiply_pairs(self, ab_0, ab_1, cd_0, cd_1) {\n        return _ffi_handles.get(self).multiply_pairs([ab_0, ab_1], [cd_0, cd_1]);\n    },\n\n    _ffi_js_TupleIn__single_element_tuple(self, x_0, y_0) {\n        return _ffi_handles.get(self).single_element_tuple([x_0], [y_0]);\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_tuple_in_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface TupleIn {\n    empty_tuple(x: number, foo: undefined, y: number): number;\n    single_element_tuple(x: [number], y: [number]): number;\n    multiply_pairs(ab: [number, number], cd: [number, number]): number;\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function set_empty_tuple(tuple_in: TupleIn): number {\n    return _ffi_exports._ffi_fn_set_empty_tuple(_ffi_handle_alloc(tuple_in));\n}\n\nexport function set_single_element_tuple(tuple_in: TupleIn): number {\n    return _ffi_exports._ffi_fn_set_single_element_tuple(_ffi_handle_alloc(tuple_in));\n}\n\nexport function set_multiply_pairs(tuple_in: TupleIn): number {\n    return _ffi_exports._ffi_fn_set_multiply_pairs(_ffi_handle_alloc(tuple_in));\n}\n\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_set_empty_tuple: (tuple_in_ptr: number) => number,\n    _ffi_fn_set_multiply_pairs: (tuple_in_ptr: number) => number,\n    _ffi_fn_set_single_element_tuple: (tuple_in_ptr: number) => number,\n};\n\nconst _ffi_imports = {\n    _ffi_js_TupleIn__empty_tuple(self: number, x: number, y: number): number {\n        return _ffi_handles.get(self).empty_tuple(x, undefined, y);\n    },\n\n    _ffi_js_TupleIn__multiply_pairs(self: number, ab_0: number, ab_1: number, cd_0: number, cd_1: number): number {\n        return _ffi_handles.get(self).multiply_pairs([ab_0, ab_1], [cd_0, cd_1]);\n    },\n\n    _ffi_js_TupleIn__single_element_tuple(self: number, x_0: number, y_0: number): number {\n        return _ffi_handles.get(self).single_element_tuple([x_0], [y_0]);\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_import_tuple_in_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_empty_tuple(tuple_in_ptr: *const u8) -> i32 {\n    set_empty_tuple(std::rc::Rc::new(_ffi_rs_TupleIn(tuple_in_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_multiply_pairs(tuple_in_ptr: *const u8) -> f32 {\n    set_multiply_pairs(std::rc::Rc::new(_ffi_rs_TupleIn(tuple_in_ptr)))\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_single_element_tuple(tuple_in_ptr: *const u8) -> i32 {\n    set_single_element_tuple(std::rc::Rc::new(_ffi_rs_TupleIn(tuple_in_ptr)))\n}\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_TupleIn(*const u8);\n\nimpl Drop for _ffi_rs_TupleIn {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl TupleIn for _ffi_rs_TupleIn {\n    fn empty_tuple(&self, x: i32, foo: (), y: i32) -> i32 {\n        unsafe extern \"C\" { fn _ffi_js_TupleIn__empty_tuple(_: *const u8, x: i32, y: i32) -> i32; }\n        _ = foo;\n        unsafe { _ffi_js_TupleIn__empty_tuple(self.0, x, y) }\n    }\n\n    fn single_element_tuple(&self, x: (i32,), y: (i32,)) -> i32 {\n        unsafe extern \"C\" { fn _ffi_js_TupleIn__single_element_tuple(_: *const u8, x_0: i32, y_0: i32) -> i32; }\n        unsafe { _ffi_js_TupleIn__single_element_tuple(self.0, x.0, y.0) }\n    }\n\n    fn multiply_pairs(&self, ab: (f32, f32), cd: (f32, f32)) -> f32 {\n        unsafe extern \"C\" { fn _ffi_js_TupleIn__multiply_pairs(_: *const u8, ab_0: f32, ab_1: f32, cd_0: f32, cd_1: f32) -> f32; }\n        unsafe { _ffi_js_TupleIn__multiply_pairs(self.0, ab.0, ab.1, cd.0, cd.1) }\n    }\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_string_2021/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Test {\n    get_string(): string;\n    set_string(x: string): void;\n    set_str(x: string): void;\n}\n\nexport function rust_mem_leaked(): number;\nexport function get_test(): Test;\nexport function set_test(test: Test): string;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_string_2021/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_test() {\n    let ret_ptr = _ffi_exports._ffi_fn_get_test();\n    return new _ffi_Rc_Test(ret_ptr);\n}\n\nexport function set_test(test) {\n    let multi_ret = _ffi_exports._ffi_fn_set_test(_ffi_handle_alloc(test));\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nlet _ffi_len = 0;\nlet _ffi_reg_Rc_Test = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Rc_Test(ptr));\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\nlet _ffi_u8;\nlet _ffi_dv;\n\nconst _ffi_Rc_Test = class Test {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Test.register(this, _);\n    }\n\n    get_string() {\n        let multi_ret = _ffi_exports._ffi_Rc_Test__get_string(this._);\n        let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n        let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n        let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n        return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n    }\n\n    set_string(x) {\n        let x_ptr = _ffi_string_to_rust(x), x_len = _ffi_len;\n        _ffi_exports._ffi_Rc_Test__set_string(this._, x_ptr, x_len);\n    }\n\n    set_str(x) {\n        let x_ptr = _ffi_string_to_rust(x), x_len = _ffi_len;\n        _ffi_exports._ffi_Rc_Test__set_str(this._, x_ptr, x_len);\n    }\n};\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nfunction _ffi_string_from_rust(ptr, len, cap) {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_string_to_rust(str) {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_Test__get_string(self, _ffi_ret_ptr_usize) {\n        let ret_ptr = _ffi_string_to_rust(_ffi_handles.get(self).get_string()), ret_len = _ffi_len;\n        _ffi_update_dv().setInt32(_ffi_ret_ptr_usize, ret_ptr, true);\n        _ffi_dv.setInt32(_ffi_ret_ptr_usize + 4, ret_len, true);\n    },\n\n    _ffi_js_Test__set_str(self, x_ptr, x_len, x_cap) {\n        _ffi_handles.get(self).set_str(_ffi_string_from_rust(x_ptr, x_len, x_cap));\n    },\n\n    _ffi_js_Test__set_string(self, x_ptr, x_len, x_cap) {\n        _ffi_handles.get(self).set_string(_ffi_string_from_rust(x_ptr, x_len, x_cap));\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_string_2021/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Test {\n    get_string(): string;\n    set_string(x: string): void;\n    set_str(x: string): void;\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_test(): Test {\n    let ret_ptr = _ffi_exports._ffi_fn_get_test();\n    return new _ffi_Rc_Test(ret_ptr);\n}\n\nexport function set_test(test: Test): string {\n    let multi_ret = _ffi_exports._ffi_fn_set_test(_ffi_handle_alloc(test));\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nlet _ffi_len = 0;\nlet _ffi_reg_Rc_Test = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Rc_Test(ptr));\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\nlet _ffi_u8: Uint8Array;\nlet _ffi_dv: DataView;\n\nconst _ffi_Rc_Test = class Test implements Test {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Test.register(this, _);\n    }\n\n    get_string(): string {\n        let multi_ret = _ffi_exports._ffi_Rc_Test__get_string(this._);\n        let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n        let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n        let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n        return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n    }\n\n    set_string(x: string): void {\n        let x_ptr = _ffi_string_to_rust(x), x_len = _ffi_len;\n        _ffi_exports._ffi_Rc_Test__set_string(this._, x_ptr, x_len);\n    }\n\n    set_str(x: string): void {\n        let x_ptr = _ffi_string_to_rust(x), x_len = _ffi_len;\n        _ffi_exports._ffi_Rc_Test__set_str(this._, x_ptr, x_len);\n    }\n};\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nfunction _ffi_string_from_rust(ptr: number, len: number, cap: number): string {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_string_to_rust(str: string): number {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Rc_Test__get_string: (_self: number) => number,\n    _ffi_Rc_Test__set_str: (_self: number, x_ptr: number, x_len: number) => void,\n    _ffi_Rc_Test__set_string: (_self: number, x_ptr: number, x_len: number) => void,\n    _ffi_fn_get_test: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_set_test: (test_ptr: number) => number,\n    _ffi_rs_drop_Rc_Test: (ptr: number) => void,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {\n    _ffi_js_Test__get_string(self: number, _ffi_ret_ptr_usize: number): void {\n        let ret_ptr = _ffi_string_to_rust(_ffi_handles.get(self).get_string()), ret_len = _ffi_len;\n        _ffi_update_dv().setInt32(_ffi_ret_ptr_usize, ret_ptr, true);\n        _ffi_dv.setInt32(_ffi_ret_ptr_usize + 4, ret_len, true);\n    },\n\n    _ffi_js_Test__set_str(self: number, x_ptr: number, x_len: number, x_cap: number): void {\n        _ffi_handles.get(self).set_str(_ffi_string_from_rust(x_ptr, x_len, x_cap));\n    },\n\n    _ffi_js_Test__set_string(self: number, x_ptr: number, x_len: number, x_cap: number): void {\n        _ffi_handles.get(self).set_string(_ffi_string_from_rust(x_ptr, x_len, x_cap));\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_string_2021/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Test__get_string(_self: *const u8) -> *const _ffi_ret_ptr_2_usize {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(_self.get_string());\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Test__set_str(_self: *const u8, x_ptr: *const u8, x_len: usize) {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    _self.set_str(&_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_Rc_Test__set_string(_self: *const u8, x_ptr: *const u8, x_len: usize) {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    _self.set_string(_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_get_test() -> *const u8 {\n    Box::into_raw(Box::new(get_test())) as *const u8\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_fn_set_test(test_ptr: *const u8) -> *const _ffi_ret_ptr_2_usize {\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(set_test(std::rc::Rc::new(_ffi_rs_Test(test_ptr))));\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\nstatic mut _FFI_RET_PTR_USIZE: _ffi_ret_ptr_usize = _ffi_ret_ptr_usize(std::ptr::null(), 0);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Test(*const u8);\n\nimpl Drop for _ffi_rs_Test {\n    fn drop(&mut self) {\n        extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Test for _ffi_rs_Test {\n    fn get_string(&self) -> String {\n        extern \"C\" { fn _ffi_js_Test__get_string(_: *const u8, _: *const _ffi_ret_ptr_usize); }\n        unsafe { _ffi_js_Test__get_string(self.0, std::ptr::addr_of!(_FFI_RET_PTR_USIZE)) }\n        let ret_ptr = unsafe { _FFI_RET_PTR_USIZE.0 };\n        let ret_len = unsafe { _FFI_RET_PTR_USIZE.1 };\n        _ffi_string_from_host(ret_ptr, ret_len)\n    }\n\n    fn set_string(&self, x: String) {\n        extern \"C\" { fn _ffi_js_Test__set_string(_: *const u8, x_ptr: *const u8, x_len: usize, x_cap: usize); }\n        let (x_ptr, x_len, x_cap) = _ffi_string_to_host(x);\n        unsafe { _ffi_js_Test__set_string(self.0, x_ptr, x_len, x_cap) };\n    }\n\n    fn set_str(&self, x: &str) {\n        extern \"C\" { fn _ffi_js_Test__set_str(_: *const u8, x_ptr: *const u8, x_len: usize, x_cap: usize); }\n        let (x_ptr, x_len, x_cap) = _ffi_string_to_host(x.into());\n        unsafe { _ffi_js_Test__set_str(self.0, x_ptr, x_len, x_cap) };\n    }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_rs_drop_Rc_Test(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Test>) });\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[no_mangle]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_string_2024/ffi.d.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\nexport function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }>;\n\nexport interface Test {\n    get_string(): string;\n    set_string(x: string): void;\n    set_str(x: string): void;\n}\n\nexport function rust_mem_leaked(): number;\nexport function get_test(): Test;\nexport function set_test(test: Test): string;\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_string_2024/ffi.mjs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source, imports) {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports;\n    return { memory: _ffi_exports.memory };\n}\n\nexport function rust_mem_leaked() {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_test() {\n    let ret_ptr = _ffi_exports._ffi_fn_get_test();\n    return new _ffi_Rc_Test(ret_ptr);\n}\n\nexport function set_test(test) {\n    let multi_ret = _ffi_exports._ffi_fn_set_test(_ffi_handle_alloc(test));\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nlet _ffi_len = 0;\nlet _ffi_reg_Rc_Test = new FinalizationRegistry((ptr) => _ffi_exports._ffi_rs_drop_Rc_Test(ptr));\nlet _ffi_handles = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\nlet _ffi_u8;\nlet _ffi_dv;\n\nconst _ffi_Rc_Test = class Test {\n    constructor(_) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Test.register(this, _);\n    }\n\n    get_string() {\n        let multi_ret = _ffi_exports._ffi_Rc_Test__get_string(this._);\n        let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n        let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n        let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n        return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n    }\n\n    set_string(x) {\n        let x_ptr = _ffi_string_to_rust(x), x_len = _ffi_len;\n        _ffi_exports._ffi_Rc_Test__set_string(this._, x_ptr, x_len);\n    }\n\n    set_str(x) {\n        let x_ptr = _ffi_string_to_rust(x), x_len = _ffi_len;\n        _ffi_exports._ffi_Rc_Test__set_str(this._, x_ptr, x_len);\n    }\n};\n\nfunction _ffi_handle_alloc(obj) {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nfunction _ffi_string_from_rust(ptr, len, cap) {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_u8() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_string_to_rust(str) {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_update_dv() {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports;\n\nconst _ffi_imports = {\n    _ffi_js_Test__get_string(self, _ffi_ret_ptr_usize) {\n        let ret_ptr = _ffi_string_to_rust(_ffi_handles.get(self).get_string()), ret_len = _ffi_len;\n        _ffi_update_dv().setInt32(_ffi_ret_ptr_usize, ret_ptr, true);\n        _ffi_dv.setInt32(_ffi_ret_ptr_usize + 4, ret_len, true);\n    },\n\n    _ffi_js_Test__set_str(self, x_ptr, x_len, x_cap) {\n        _ffi_handles.get(self).set_str(_ffi_string_from_rust(x_ptr, x_len, x_cap));\n    },\n\n    _ffi_js_Test__set_string(self, x_ptr, x_len, x_cap) {\n        _ffi_handles.get(self).set_string(_ffi_string_from_rust(x_ptr, x_len, x_cap));\n    },\n\n    _ffi_js_drop(handle) {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_string_2024/ffi.mts",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\nexport async function instantiate(bytes: BufferSource, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport async function instantiateStreaming(source: Response | PromiseLike<Response>, imports?: WebAssembly.ModuleImports): Promise<{ memory: WebAssembly.Memory }> {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports as any;\n    return { memory: _ffi_exports.memory };\n}\n\nexport interface Test {\n    get_string(): string;\n    set_string(x: string): void;\n    set_str(x: string): void;\n}\n\nexport function rust_mem_leaked(): number {\n    return _ffi_exports._ffi_fn_rust_mem_leaked();\n}\n\nexport function get_test(): Test {\n    let ret_ptr = _ffi_exports._ffi_fn_get_test();\n    return new _ffi_Rc_Test(ret_ptr);\n}\n\nexport function set_test(test: Test): string {\n    let multi_ret = _ffi_exports._ffi_fn_set_test(_ffi_handle_alloc(test));\n    let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n    let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n    let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n    return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n}\n\nlet _ffi_len = 0;\nlet _ffi_reg_Rc_Test = new FinalizationRegistry((ptr: number) => _ffi_exports._ffi_rs_drop_Rc_Test(ptr));\nlet _ffi_handles: Map<number, any> = /* @__PURE__ */ new Map;\nlet _ffi_next_handle = 0;\nlet _ffi_decoder = /* @__PURE__ */ new TextDecoder;\nlet _ffi_encoder = /* @__PURE__ */ new TextEncoder;\nlet _ffi_u8: Uint8Array;\nlet _ffi_dv: DataView;\n\nconst _ffi_Rc_Test = class Test implements Test {\n    declare readonly _: number;\n\n    constructor(_: number) {\n        Object.defineProperty(this, \"_\", { value: _ });\n        _ffi_reg_Rc_Test.register(this, _);\n    }\n\n    get_string(): string {\n        let multi_ret = _ffi_exports._ffi_Rc_Test__get_string(this._);\n        let ret_ptr = _ffi_update_dv().getInt32(multi_ret, true);\n        let ret_len = _ffi_dv.getUint32(multi_ret + 4, true);\n        let ret_cap = _ffi_dv.getUint32(multi_ret + 8, true);\n        return _ffi_string_from_rust(ret_ptr, ret_len, ret_cap);\n    }\n\n    set_string(x: string): void {\n        let x_ptr = _ffi_string_to_rust(x), x_len = _ffi_len;\n        _ffi_exports._ffi_Rc_Test__set_string(this._, x_ptr, x_len);\n    }\n\n    set_str(x: string): void {\n        let x_ptr = _ffi_string_to_rust(x), x_len = _ffi_len;\n        _ffi_exports._ffi_Rc_Test__set_str(this._, x_ptr, x_len);\n    }\n};\n\nfunction _ffi_handle_alloc(obj: any): number {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\nfunction _ffi_string_from_rust(ptr: number, len: number, cap: number): string {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\nfunction _ffi_update_u8(): Uint8Array {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\nfunction _ffi_string_to_rust(str: string): number {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\nfunction _ffi_update_dv(): DataView {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\nlet _ffi_exports: {\n    memory: WebAssembly.Memory,\n    _ffi_Rc_Test__get_string: (_self: number) => number,\n    _ffi_Rc_Test__set_str: (_self: number, x_ptr: number, x_len: number) => void,\n    _ffi_Rc_Test__set_string: (_self: number, x_ptr: number, x_len: number) => void,\n    _ffi_fn_get_test: () => number,\n    _ffi_fn_rust_mem_leaked: () => number,\n    _ffi_fn_set_test: (test_ptr: number) => number,\n    _ffi_rs_drop_Rc_Test: (ptr: number) => void,\n    _ffi_dealloc: (ptr: number, capacity: number) => void,\n    _ffi_alloc: (len: number) => number,\n};\n\nconst _ffi_imports = {\n    _ffi_js_Test__get_string(self: number, _ffi_ret_ptr_usize: number): void {\n        let ret_ptr = _ffi_string_to_rust(_ffi_handles.get(self).get_string()), ret_len = _ffi_len;\n        _ffi_update_dv().setInt32(_ffi_ret_ptr_usize, ret_ptr, true);\n        _ffi_dv.setInt32(_ffi_ret_ptr_usize + 4, ret_len, true);\n    },\n\n    _ffi_js_Test__set_str(self: number, x_ptr: number, x_len: number, x_cap: number): void {\n        _ffi_handles.get(self).set_str(_ffi_string_from_rust(x_ptr, x_len, x_cap));\n    },\n\n    _ffi_js_Test__set_string(self: number, x_ptr: number, x_len: number, x_cap: number): void {\n        _ffi_handles.get(self).set_string(_ffi_string_from_rust(x_ptr, x_len, x_cap));\n    },\n\n    _ffi_js_drop(handle: number): void {\n        _ffi_handles.delete(handle);\n    },\n};\n"
  },
  {
    "path": "src/tests/snapshots/wasm_trait_string_2024/miniffi.rs",
    "content": "// This file was generated by miniffi v0.1.0. Do not edit.\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Test__get_string(_self: *const u8) -> *const _ffi_ret_ptr_2_usize {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(_self.get_string());\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Test__set_str(_self: *const u8, x_ptr: *const u8, x_len: usize) {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    _self.set_str(&_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_Rc_Test__set_string(_self: *const u8, x_ptr: *const u8, x_len: usize) {\n    let _self = unsafe { &*(_self as *const std::rc::Rc<dyn Test>) };\n    _self.set_string(_ffi_string_from_host(x_ptr, x_len));\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_get_test() -> *const u8 {\n    Box::into_raw(Box::new(get_test())) as *const u8\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_rust_mem_leaked() -> usize {\n    rust_mem_leaked()\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_fn_set_test(test_ptr: *const u8) -> *const _ffi_ret_ptr_2_usize {\n    let (ret_ptr, ret_len, ret_cap) = _ffi_string_to_host(set_test(std::rc::Rc::new(_ffi_rs_Test(test_ptr))));\n    unsafe {\n        _FFI_RET_PTR_2_USIZE = _ffi_ret_ptr_2_usize(ret_ptr, ret_len, ret_cap);\n        std::ptr::addr_of!(_FFI_RET_PTR_2_USIZE)\n    }\n}\n\n#[repr(C)]\nstruct _ffi_ret_ptr_2_usize(*const u8, usize, usize);\nstatic mut _FFI_RET_PTR_2_USIZE: _ffi_ret_ptr_2_usize = _ffi_ret_ptr_2_usize(std::ptr::null(), 0, 0);\n\n#[repr(C)]\nstruct _ffi_ret_ptr_usize(*const u8, usize);\nstatic mut _FFI_RET_PTR_USIZE: _ffi_ret_ptr_usize = _ffi_ret_ptr_usize(std::ptr::null(), 0);\n\n#[allow(non_camel_case_types)]\nstruct _ffi_rs_Test(*const u8);\n\nimpl Drop for _ffi_rs_Test {\n    fn drop(&mut self) {\n        unsafe extern \"C\" { fn _ffi_js_drop(_: *const u8); }\n        unsafe { _ffi_js_drop(self.0) };\n    }\n}\n\nimpl Test for _ffi_rs_Test {\n    fn get_string(&self) -> String {\n        unsafe extern \"C\" { fn _ffi_js_Test__get_string(_: *const u8, _: *const _ffi_ret_ptr_usize); }\n        unsafe { _ffi_js_Test__get_string(self.0, std::ptr::addr_of!(_FFI_RET_PTR_USIZE)) }\n        let ret_ptr = unsafe { _FFI_RET_PTR_USIZE.0 };\n        let ret_len = unsafe { _FFI_RET_PTR_USIZE.1 };\n        _ffi_string_from_host(ret_ptr, ret_len)\n    }\n\n    fn set_string(&self, x: String) {\n        unsafe extern \"C\" { fn _ffi_js_Test__set_string(_: *const u8, x_ptr: *const u8, x_len: usize, x_cap: usize); }\n        let (x_ptr, x_len, x_cap) = _ffi_string_to_host(x);\n        unsafe { _ffi_js_Test__set_string(self.0, x_ptr, x_len, x_cap) };\n    }\n\n    fn set_str(&self, x: &str) {\n        unsafe extern \"C\" { fn _ffi_js_Test__set_str(_: *const u8, x_ptr: *const u8, x_len: usize, x_cap: usize); }\n        let (x_ptr, x_len, x_cap) = _ffi_string_to_host(x.into());\n        unsafe { _ffi_js_Test__set_str(self.0, x_ptr, x_len, x_cap) };\n    }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_rs_drop_Rc_Test(ptr: *const u8) {\n    drop(unsafe { Box::from_raw(ptr as *mut std::rc::Rc<dyn Test>) });\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_alloc(len: usize) -> *const u8 {\n    Box::into_raw([0 as u8].repeat(len).into_boxed_slice()) as *const u8\n}\n\nfn _ffi_string_from_host(ptr: *const u8, len: usize) -> String {\n    unsafe { String::from_raw_parts(ptr as *mut u8, len, len) }\n}\n\n#[unsafe(no_mangle)]\nextern \"C\" fn _ffi_dealloc(ptr: *mut u8, capacity: usize) {\n    drop(unsafe { Vec::from_raw_parts(ptr, 0, capacity) });\n}\n\nfn _ffi_string_to_host(buf: String) -> (*const u8, usize, usize) {\n    let buf = std::mem::ManuallyDrop::new(buf.into_bytes());\n    (buf.as_ptr(), buf.len(), buf.capacity())\n}\n"
  },
  {
    "path": "src/tests/swift.rs",
    "content": "use super::*;\nuse std::borrow::Cow;\n\npub fn run_test(name: &str, case: &TestCase, edition: usize) {\n    let name = Path::new(name).file_stem().unwrap();\n    let name = &format!(\"swift_{}_{edition}\", name.to_string_lossy());\n    let test_dir = &Path::new(\".temp\").join(name);\n    let src_dir = &test_dir.join(\"src\");\n    std::fs::create_dir_all(src_dir).expect(\"failed to create directory `src`\");\n\n    let TestCase {\n        rust,\n        swift_pre,\n        swift_post,\n        checks,\n        ..\n    } = case;\n    let checks = checks.iter().map(to_str).collect::<Vec<_>>().join(\"\\n\");\n\n    std::fs::write(\n        src_dir.join(\"lib.rs\"),\n        format!(\n            r#\"\n            #![deny(warnings)]\n            {}\n            {rust}\n            include!(concat!(env!(\"OUT_DIR\"), \"/miniffi.rs\"));\n            \"#,\n            rust_leak_check()\n        ),\n    )\n    .expect(\"failed to write file `src/lib.rs`\");\n\n    std::fs::write(\n        test_dir.join(\"build.rs\"),\n        format!(\n            r#\"\n            fn main() {{\n                use miniffi::*;\n                let mut result = SwiftTarget::new()\n                    .rust_edition({edition})\n                    .write_swift_to(\"ffi.swift\")\n                    .write_header_to(\"ffi.h\")\n                    .build()\n                    .convert_warnings_to_errors();\n                result.finish();\n                for output in &result.output_files {{\n                    if output.path.extension().unwrap() == \"rs\" {{\n                        std::fs::copy(&output.path, \"miniffi.rs\").unwrap();\n                    }}\n                }}\n            }}\n            \"#\n        ),\n    )\n    .expect(\"failed to write file `build.rs`\");\n\n    std::fs::write(\n        test_dir.join(\"Cargo.toml\"),\n        format!(\n            r#\"\n            [package]\n            name = \"{name}\"\n            version = \"0.1.0\"\n            edition = \"{edition}\"\n            [lib]\n            crate-type = [\"staticlib\"]\n            [build-dependencies]\n            miniffi = {{ path = \"../..\" }}\n            \"#\n        ),\n    )\n    .expect(\"failed to write file `Cargo.toml`\");\n\n    std::fs::write(\n        test_dir.join(\"main.swift\"),\n        format!(\n            r#\"\n            extension DefaultStringInterpolation {{\n                mutating func appendInterpolation<T>(_ x: T?) {{\n                    appendInterpolation(String(describing: x))\n                }}\n            }}\n            {swift_pre}\n            do {{\n                {checks}\n            }}\n            {swift_post}\n            assert(rust_mem_leaked() == 0, \"\\(rust_mem_leaked()) bytes leaked\")\n            \"#\n        ),\n    )\n    .expect(\"failed to write file `main.swift`\");\n\n    cargo_build(test_dir, None);\n\n    copy_snapshot(name, test_dir.join(\"miniffi.rs\"));\n    copy_snapshot(name, test_dir.join(\"ffi.swift\"));\n    copy_snapshot(name, test_dir.join(\"ffi.h\"));\n\n    check_output(\n        Command::new(\"swiftc\")\n            .current_dir(test_dir)\n            .arg(\"main.swift\")\n            .arg(\"ffi.swift\")\n            .args([\"-import-objc-header\", \"ffi.h\"])\n            .arg(format!(\"../target/debug/lib{name}.a\"))\n            .arg(\"-warnings-as-errors\")\n            .output()\n            .expect(\"failed to run command `swiftc`\"),\n    );\n\n    check_output(\n        Command::new(\"./main\")\n            .current_dir(test_dir)\n            .env(\"RUST_BACKTRACE\", \"1\")\n            .output()\n            .expect(\"failed to run command `./main`\"),\n    );\n\n    _ = std::fs::remove_dir_all(test_dir);\n}\n\nfn ty_to_str(ty: &ExprTy) -> String {\n    match ty {\n        TyBool => \"Bool\".to_string(),\n        TyU8 => \"UInt8\".to_string(),\n        TyU16 => \"UInt16\".to_string(),\n        TyU32 => \"UInt32\".to_string(),\n        TyUsize => \"UInt\".to_string(),\n        TyU64 => \"UInt64\".to_string(),\n        TyI8 => \"Int8\".to_string(),\n        TyI16 => \"Int16\".to_string(),\n        TyI32 => \"Int32\".to_string(),\n        TyIsize => \"Int\".to_string(),\n        TyI64 => \"Int64\".to_string(),\n        TyF32 => \"Float32\".to_string(),\n        TyF64 => \"Float64\".to_string(),\n        TyString => \"String\".to_string(),\n        TyTuple(x) => format!(\n            \"({})\",\n            x.iter().map(ty_to_str).collect::<Vec<_>>().join(\", \")\n        ),\n        TyOption(x) => format!(\"{}?\", ty_to_str(x)),\n        TyVec(x) => format!(\"[{}]\", ty_to_str(x)),\n        TyBox(x) => ty_to_str(x),\n        TyName(x) => format!(\"{x}\"),\n    }\n}\n\nfn key_to_str(x: &'static str) -> Cow<'static, str> {\n    match starts_with_digit(x) {\n        false => Cow::Borrowed(x),\n        true => Cow::Owned(format!(\"_{x}\")),\n    }\n}\n\nfn many_to_str(x: &[Expr]) -> String {\n    x.iter().map(to_str).collect::<Vec<_>>().join(\", \")\n}\n\nfn to_str(expr: &Expr) -> String {\n    match expr {\n        Bool(x) => format!(\"{x}\"),\n        U8(x) => format!(\"UInt8({x})\"),\n        U16(x) => format!(\"UInt16({x})\"),\n        U32(x) => format!(\"UInt32({x})\"),\n        Usize(x) => format!(\"UInt({x})\"),\n        U64(x) => format!(\"UInt64({x})\"),\n        I8(x) => format!(\"Int8({x})\"),\n        I16(x) => format!(\"Int16({x})\"),\n        I32(x) => format!(\"Int32({x})\"),\n        Isize(x) => format!(\"Int({x})\"),\n        I64(x) => format!(\"Int64({x})\"),\n        F32(x) => format!(\"Float32({x:?})\"),\n        F64(x) => format!(\"Float64({x:?})\"),\n        Str(x) => format!(\"{x:?}\"),\n        Export(x) => format!(\"{x}\"),\n        Enum(x, y) => format!(\"{x}.{y}\"),\n        EnumPayload(x, y, z) if z.is_empty() => format!(\"{x}.{y}\"),\n        EnumPayload(x, y, z) => format!(\n            \"{x}.{y}({})\",\n            z.iter()\n                .map(|(k, v)| match starts_with_digit(k) {\n                    false => format!(\"{}: {}\", key_to_str(k), to_str(v)),\n                    true => to_str(v),\n                })\n                .collect::<Vec<_>>()\n                .join(\", \")\n        ),\n        DeclareMutableLocal(x, y) => format!(\"var {x} = {}\", to_str(y)),\n        DeclareImmutableLocal(x, y) => format!(\"let {x} = {}\", to_str(y)),\n        LoadLocal(x) => format!(\"{x}\"),\n        StoreLocal(x, y) => format!(\"{x} = {}\", to_str(y)),\n        NewBox(_, x, y) | NewRc(_, x, y) => format!(\"{x}({})\", many_to_str(y)),\n        Tuple(x) => format!(\"({})\", many_to_str(x)),\n        Vector(x) => format!(\"[{}]\", many_to_str(x)),\n        EmptyVector(_) => \"[]\".to_string(),\n        Struct(x, y) => format!(\n            \"{x}({})\",\n            y.iter()\n                .map(|(k, v)| format!(\"{}: {}\", key_to_str(k), to_str(v)))\n                .collect::<Vec<_>>()\n                .join(\", \")\n        ),\n        AssertEqual(x, y) => match &**y {\n            F32(y) if *y == 0.0 => {\n                let sign = if y.is_sign_negative() {\n                    \"minus\"\n                } else {\n                    \"plus\"\n                };\n                format!(\n                    r#\"do {{\n                        let left = {}\n                        assert(left == 0.0 && left.sign == .{sign}, \"\\(left) == {y:?}\")\n                    }}\"#,\n                    to_str(x)\n                )\n            }\n            F64(y) if *y == 0.0 => {\n                let sign = if y.is_sign_negative() {\n                    \"minus\"\n                } else {\n                    \"plus\"\n                };\n                format!(\n                    r#\"do {{\n                        let left = {}\n                        assert(left == 0.0 && left.sign == .{sign}, \"\\(left) == {y:?}\")\n                    }}\"#,\n                    to_str(x)\n                )\n            }\n            _ => {\n                let ty = match (&**x, &**y) {\n                    // Avoid \"constant inferred to have type '()', which may be unexpected\"\n                    (Tuple(z), _) | (_, Tuple(z)) if z.is_empty() => \": ()\",\n                    _ => \"\",\n                };\n                format!(\n                    r#\"do {{\n                        let left{ty} = {}\n                        let right{ty} = {}\n                        assert(left == right, \"\\(left) == \\(right)\")\n                    }}\"#,\n                    to_str(x),\n                    to_str(y)\n                )\n            }\n        },\n        AssertNotEqual(x, y) => match &**y {\n            F32(y) if *y == 0.0 => {\n                let sign = if y.is_sign_negative() {\n                    \"minus\"\n                } else {\n                    \"plus\"\n                };\n                format!(\n                    r#\"do {{\n                        let left = {}\n                        assert(left != 0.0 || left.sign != .{sign}, \"\\(left) != {y:?}\")\n                    }}\"#,\n                    to_str(x)\n                )\n            }\n            F64(y) if *y == 0.0 => {\n                let sign = if y.is_sign_negative() {\n                    \"minus\"\n                } else {\n                    \"plus\"\n                };\n                format!(\n                    r#\"do {{\n                        let left = {}\n                        assert(left != 0.0 || left.sign == .{sign}, \"\\(left) != {y:?}\")\n                    }}\"#,\n                    to_str(x)\n                )\n            }\n            _ => {\n                let ty = match (&**x, &**y) {\n                    // Avoid \"constant inferred to have type '()', which may be unexpected\"\n                    (Tuple(z), _) | (_, Tuple(z)) if z.is_empty() => \": ()\",\n                    _ => \"\",\n                };\n                format!(\n                    r#\"do {{\n                        let left{ty} = {}\n                        let right{ty} = {}\n                        assert(left != right, \"\\(left) != \\(right)\")\n                    }}\"#,\n                    to_str(x),\n                    to_str(y)\n                )\n            }\n        },\n        StrConcat(x, y) => format!(\"({}) + ({})\", to_str(x), to_str(y)),\n        Call(x, y) => format!(\"{}({})\", to_str(x), many_to_str(y)),\n        CallMethod(x, y, z) => format!(\"({}).{y}({})\", to_str(x), many_to_str(z)),\n        TupleMember(x, y) => format!(\"({}).{y}\", to_str(x)),\n        StructMember(x, y) => format!(\"({}).{y}\", to_str(x)),\n        VectorMember(x, y) => format!(\"({})[{y}]\", to_str(x)),\n        VectorLen(x) => format!(\"UInt(({}).count)\", to_str(x)),\n        AfterGC(x) => to_str(x),\n        OptNone(x) => format!(\"Optional<{}>.none\", ty_to_str(x)),\n        OptSome(x) => format!(\"Optional.some({})\", to_str(x)),\n        Boxed(_, x) => to_str(x),\n    }\n}\n"
  },
  {
    "path": "src/tests/warnings.rs",
    "content": "use super::*;\n\n#[test]\nfn syntax_error() {\n    check_warnings(\n        \"\n        fn main() {\n            this is a syntax error\n        }\n        \",\n        &[\"{MESSAGE}\n --> src/lib.rs:3:18\n  |\n3 |             this is a syntax error\n  |                  ^^\n\"],\n    );\n}\n\n#[test]\nfn unsupported_variant_discriminant() {\n    check_warnings(\n        r#\"\n        pub enum Foo {\n            A,\n            B = 123,\n            C = include!(\"./foo.txt\"),\n        }\n        \"#,\n        &[\n            r#\"unsupported discriminant `include!(\"./foo.txt\")` for variant `C` in enum `Foo`\n --> src/lib.rs:5:17\n  |\n5 |             C = include!(\"./foo.txt\"),\n  |                 ^^^^^^^^^^^^^^^^^^^^^ must be an integer literal\n\"#,\n        ],\n    );\n}\n\n#[test]\nfn unsupported_constant_type() {\n    check_warnings(\n        \"\n        pub const FOO: i128 = 0;\n        \",\n        &[\"unsupported type `i128` for constant `FOO`\n --> src/lib.rs:2:24\n  |\n2 |         pub const FOO: i128 = 0;\n  |                        ^^^^\n\"],\n    );\n}\n\n#[test]\nfn unsupported_constant_value() {\n    check_warnings(\n        \"\n        pub const FOO: bool = cfg!(unix);\n        \",\n        &[\"unsupported value `cfg!(unix)` for constant `FOO`\n --> src/lib.rs:2:31\n  |\n2 |         pub const FOO: bool = cfg!(unix);\n  |                               ^^^^^^^^^^ only literals are supported\n\"],\n    );\n}\n\n#[test]\nfn unsupported_trait_item() {\n    check_warnings(\n        r\"\n        pub trait Foo {\n            type Bar = Foo;\n        }\n        \",\n        &[r\"unsupported item `type Bar = Foo;` for trait `Foo`\n --> src/lib.rs:3:13\n  |\n3 |             type Bar = Foo;\n  |             ^^^^^^^^^^^^^^^ only functions are supported\n\"],\n    );\n}\n\n#[test]\nfn unsupported_field_type() {\n    check_warnings(\n        \"\n        pub struct Foo(i128);\n        pub struct Bar { x: i128 }\n        pub enum A { Foo(i128) }\n        pub enum B { Bar { x: i128 } }\n        \",\n        &[\n            \"unsupported type `i128` for field `0` in struct `Foo`\n --> src/lib.rs:2:24\n  |\n2 |         pub struct Foo(i128);\n  |                        ^^^^\n\",\n            \"unsupported type `i128` for field `x` in struct `Bar`\n --> src/lib.rs:3:29\n  |\n3 |         pub struct Bar { x: i128 }\n  |                             ^^^^\n\",\n            \"unsupported type `i128` for field `0` in variant `A::Foo`\n --> src/lib.rs:4:26\n  |\n4 |         pub enum A { Foo(i128) }\n  |                          ^^^^\n\",\n            \"unsupported type `i128` for field `x` in variant `B::Bar`\n --> src/lib.rs:5:31\n  |\n5 |         pub enum B { Bar { x: i128 } }\n  |                               ^^^^\n\",\n        ],\n    );\n}\n\n#[test]\nfn unsupported_fn_arg_pattern() {\n    check_warnings(\n        \"\n        pub fn foo((x, y): (i32, i32)) {}\n        \",\n        &[\"unsupported pattern `(x, y)` for function `foo`\n --> src/lib.rs:2:20\n  |\n2 |         pub fn foo((x, y): (i32, i32)) {}\n  |                    ^^^^^^ only identifiers are supported\n\"],\n    );\n}\n\n#[test]\nfn unsupported_fn_arg_type() {\n    check_warnings(\n        \"\n        pub fn foo(x: i128) {}\n        \",\n        &[\"unsupported type `i128` for argument `x`\n --> src/lib.rs:2:23\n  |\n2 |         pub fn foo(x: i128) {}\n  |                       ^^^^\n\"],\n    );\n}\n\n#[test]\nfn unsupported_fn_return_type() {\n    check_warnings(\n        \"\n        pub fn foo() -> i128 { 0 }\n        \",\n        &[\"unsupported return type `i128` for function `foo`\n --> src/lib.rs:2:25\n  |\n2 |         pub fn foo() -> i128 { 0 }\n  |                         ^^^^\n\"],\n    );\n}\n\n#[test]\nfn unsupported_fn_receiver() {\n    check_warnings(\n        \"\n        pub trait ByVal {\n            fn foo(self, x: i32);\n        }\n        pub trait ByMutRef {\n            fn foo(&mut self, x: i32);\n        }\n        pub trait ByBox {\n            fn foo(self: &Box<Self>, x: i32);\n        }\n        pub trait NoReceiver {\n            fn foo(x: i32);\n        }\n        pub fn foo(&self, x: i32) {}\n        \",\n        &[\n            \"unsupported receiver `self` for argument `foo` in trait `ByVal`\n --> src/lib.rs:3:20\n  |\n3 |             fn foo(self, x: i32);\n  |                    ^^^^ use `&self` instead\n\",\n            \"unsupported receiver `&mut self` for argument `foo` in trait `ByMutRef`\n --> src/lib.rs:6:20\n  |\n6 |             fn foo(&mut self, x: i32);\n  |                    ^^^^^^^^^ use `&self` instead\n\",\n            \"unsupported receiver `self: &Box<Self>` for argument `foo` in trait `ByBox`\n --> src/lib.rs:9:20\n  |\n9 |             fn foo(self: &Box<Self>, x: i32);\n  |                    ^^^^^^^^^^^^^^^^ use `&self` instead\n\",\n            \"unsupported function `foo` for trait `NoReceiver`\n  --> src/lib.rs:12:16\n   |\n12 |             fn foo(x: i32);\n   |                ^^^ methods on public traits must use `&self`\n\",\n            \"unsupported argument `self` for function `foo`\n  --> src/lib.rs:14:21\n   |\n14 |         pub fn foo(&self, x: i32) {}\n   |                     ^^^^\n\",\n        ],\n    );\n}\n\nfn check_warnings(contents: &str, expected_warnings: &[&str]) {\n    #[derive(Eq, PartialEq)]\n    struct Wrapper(String);\n    impl std::fmt::Debug for Wrapper {\n        fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n            f.write_fmt(format_args!(\"\\n{}\", self.0))\n        }\n    }\n    let suffix = r#\"include!(concat!(env!(\"OUT_DIR\"), \"/miniffi.rs\"));\"#;\n    let input_file = FileData {\n        path: \"src/lib.rs\".parse().unwrap(),\n        contents: format!(\"{contents}{suffix}\"),\n    };\n    let result = NullTarget::new().build_custom(input_file, \"miniffi.rs\".parse().unwrap());\n    assert_eq!(result.errors, Vec::<String>::new());\n    assert_eq!(\n        result\n            .warnings\n            .iter()\n            .map(|w| Wrapper(w.to_human_string()))\n            .collect::<Vec<_>>(),\n        expected_warnings\n            .iter()\n            .enumerate()\n            .map(|(i, w)| {\n                // Be robust to different versions of the \"syn\" crate returning different errors\n                if w.contains(\"{MESSAGE}\") && result.warnings.len() == expected_warnings.len() {\n                    Wrapper(w.replace(\"{MESSAGE}\", &result.warnings[i].message))\n                } else {\n                    Wrapper(w.to_string())\n                }\n            })\n            .collect::<Vec<_>>()\n    );\n}\n"
  },
  {
    "path": "src/tests/wasm.rs",
    "content": "use super::*;\n\npub fn run_test(name: &str, case: &TestCase, edition: usize) {\n    let name = Path::new(name).file_stem().unwrap();\n    let name = &format!(\"wasm_{}_{edition}\", name.to_string_lossy());\n    let test_dir = &std::env::current_dir().unwrap().join(\".temp\").join(name);\n    let src_dir = &test_dir.join(\"src\");\n    let pkg_json_dir = &test_dir.join(\"..\");\n    let tsc_path = &pkg_json_dir\n        .join(\"node_modules\")\n        .join(\"typescript\")\n        .join(\"lib\")\n        .join(\"tsc.js\");\n    std::fs::create_dir_all(src_dir).expect(\"failed to create directory `src`\");\n\n    let TestCase {\n        rust,\n        js_pre,\n        js_post,\n        checks,\n        ..\n    } = case;\n    let checks = checks.iter().map(to_str).collect::<Vec<_>>().join(\";\\n\");\n\n    // Install TypeScript for type checking\n    if !tsc_path.exists() {\n        std::fs::write(pkg_json_dir.join(\"package.json\"), \"{}\")\n            .expect(\"failed to write file `package.json`\");\n        check_output(\n            Command::new(\"npm\")\n                .current_dir(pkg_json_dir)\n                .arg(\"i\")\n                .arg(\"typescript@5.9.2\")\n                .output()\n                .expect(\"failed to run command `npm`\"),\n        );\n    }\n\n    std::fs::write(\n        src_dir.join(\"lib.rs\"),\n        format!(\n            r#\"\n            #![deny(warnings)]\n            {}\n            {rust}\n            include!(concat!(env!(\"OUT_DIR\"), \"/miniffi.rs\"));\n            \"#,\n            rust_leak_check()\n        ),\n    )\n    .expect(\"failed to create file `src/lib.rs`\");\n\n    std::fs::write(\n        test_dir.join(\"build.rs\"),\n        format!(\n            r#\"\n            fn main() {{\n                use miniffi::*;\n                let mut result = WasmTarget::new()\n                    .rust_edition({edition})\n                    .write_js_to(\"ffi.mjs\")\n                    .write_ts_to(\"ffi.mts\")\n                    .write_d_ts_to(\"ffi.d.mts\")\n                    .build()\n                    .convert_warnings_to_errors();\n                result.finish();\n                for output in &result.output_files {{\n                    if output.path.extension().unwrap() == \"rs\" {{\n                        std::fs::copy(&output.path, \"miniffi.rs\").unwrap();\n                    }}\n                }}\n            }}\n            \"#\n        ),\n    )\n    .expect(\"failed to create file `build.rs`\");\n\n    std::fs::write(\n        test_dir.join(\"Cargo.toml\"),\n        format!(\n            r#\"\n            [package]\n            name = \"{name}\"\n            version = \"0.1.0\"\n            edition = \"{edition}\"\n            [lib]\n            crate-type = [\"cdylib\"]\n            [build-dependencies]\n            miniffi = {{ path = \"../..\" }}\n            \"#\n        ),\n    )\n    .expect(\"failed to create file `Cargo.toml`\");\n\n    std::fs::write(\n        test_dir.join(\"test.mjs\"),\n        format!(\n            r#\"\n            import * as assert from \"assert\";\n            import * as fs from \"fs\";\n            import * as ffi from \"./ffi.mjs\";\n\n            Error.stackTraceLimit = Infinity;\n            await ffi.instantiate(fs.readFileSync(\n                \"../target/wasm32-unknown-unknown/debug/{name}.wasm\"));\n\n            {js_pre}\n\n            // Use a function wrapper to allow for garbage collection\n            async function __TEST_MAIN__() {{\n                {checks}\n            }}\n            await __TEST_MAIN__();\n\n            {js_post}\n\n            if (globalThis.gc) {{\n                globalThis.gc()\n                await new Promise(r => setTimeout(r, 100)) // Try to run finalizers\n                assert.deepStrictEqual(ffi.rust_mem_leaked(), 0, ffi.rust_mem_leaked() + \" bytes leaked\");\n            }}\n            \"#\n        ),\n    )\n    .expect(\"failed to create file `test.mjs`\");\n\n    std::fs::write(\n        test_dir.join(\"tsconfig.json\"),\n        r#\"{\n            \"compilerOptions\": {\n                \"target\": \"ESNext\",\n                \"module\": \"ESNext\",\n                \"strict\": true,\n            },\n        }\"#,\n    )\n    .expect(\"failed to create file `tsconfig.json`\");\n\n    cargo_build(test_dir, Some(\"wasm32-unknown-unknown\"));\n\n    copy_snapshot(name, test_dir.join(\"miniffi.rs\"));\n    copy_snapshot(name, test_dir.join(\"ffi.mjs\"));\n    copy_snapshot(name, test_dir.join(\"ffi.mts\"));\n    copy_snapshot(name, test_dir.join(\"ffi.d.mts\"));\n\n    // Run the JavaScript code\n    check_output(\n        Command::new(\"node\")\n            .current_dir(test_dir)\n            .env(\"FORCE_COLOR\", \"1\")\n            .arg(\"--expose-gc\")\n            .arg(\"test.mjs\")\n            .output()\n            .unwrap(),\n    );\n\n    // Check for TypeScript errors\n    check_output(\n        Command::new(\"node\")\n            .current_dir(test_dir)\n            .arg(tsc_path)\n            .arg(\"-noEmit\")\n            .args([\"-p\", \"tsconfig.json\"])\n            .output()\n            .unwrap(),\n    );\n\n    _ = std::fs::remove_dir_all(test_dir);\n}\n\nfn to_str(expr: &Expr) -> String {\n    fn many_to_str(x: &[Expr]) -> String {\n        x.iter().map(to_str).collect::<Vec<_>>().join(\", \")\n    }\n    match expr {\n        Bool(x) => format!(\"{x}\"),\n        U8(x) => format!(\"{x}\"),\n        U16(x) => format!(\"{x}\"),\n        U32(x) => format!(\"{x}\"),\n        Usize(x) => format!(\"{x}\"),\n        U64(x) => format!(\"{x}n\"),\n        I8(x) => format!(\"{x}\"),\n        I16(x) => format!(\"{x}\"),\n        I32(x) => format!(\"{x}\"),\n        Isize(x) => format!(\"{x}\"),\n        I64(x) => format!(\"{x}n\"),\n        F32(x) => format!(\"{}\", *x as f64),\n        F64(x) => format!(\"{x}\"),\n        Str(x) => format!(\"{x:?}\"),\n        Export(x) => format!(\"ffi.{x}\"),\n        Enum(x, y) => format!(\"ffi.{x}.{y}\"),\n        EnumPayload(_, x, y) => format!(\n            \"{{ $: {x:?}{} }}\",\n            y.iter()\n                .map(|(k, v)| format!(\", {k}: {}\", to_str(v)))\n                .collect::<Vec<_>>()\n                .join(\"\")\n        ),\n        DeclareMutableLocal(x, y) => format!(\"let {x} = {}\", to_str(y)),\n        DeclareImmutableLocal(x, y) => format!(\"const {x} = {}\", to_str(y)),\n        LoadLocal(x) => format!(\"{x}\"),\n        StoreLocal(x, y) => format!(\"{x} = {}\", to_str(y)),\n        NewBox(_, x, y) | NewRc(_, x, y) => format!(\"new {x}({})\", many_to_str(y)),\n        Tuple(x) if x.is_empty() => \"undefined\".to_string(),\n        Tuple(x) | Vector(x) => format!(\"[{}]\", many_to_str(x)),\n        EmptyVector(_) => \"[]\".to_string(),\n        Struct(_, x) => format!(\n            \"{{{}}}\",\n            x.iter()\n                .map(|(k, v)| format!(\"{k}: {}\", to_str(v)))\n                .collect::<Vec<_>>()\n                .join(\", \")\n        ),\n        AssertEqual(x, y) => match &**y {\n            F32(y) if *y == 0.0 => {\n                format!(\"assert.default(Object.is({}, {y}))\", to_str(x))\n            }\n            F64(y) if *y == 0.0 => {\n                format!(\"assert.default(Object.is({}, {y}))\", to_str(x))\n            }\n            _ => {\n                format!(\"assert.deepStrictEqual({}, {})\", to_str(x), to_str(y))\n            }\n        },\n        AssertNotEqual(x, y) => match &**y {\n            F32(y) if *y == 0.0 => {\n                format!(\"assert.default(!Object.is({}, {y}))\", to_str(x))\n            }\n            F64(y) if *y == 0.0 => {\n                format!(\"assert.default(!Object.is({}, {y}))\", to_str(x))\n            }\n            _ => {\n                format!(\"assert.notDeepStrictEqual({}, {})\", to_str(x), to_str(y))\n            }\n        },\n        StrConcat(x, y) => format!(\"({}) + ({})\", to_str(x), to_str(y)),\n        Call(x, y) => format!(\"{}({})\", to_str(x), many_to_str(y)),\n        CallMethod(x, y, z) => {\n            format!(\"({}).{y}({})\", to_str(x), many_to_str(z))\n        }\n        TupleMember(x, y) => format!(\"({})[{y}]\", to_str(x)),\n        StructMember(x, y) => format!(\"({}).{y}\", to_str(x)),\n        VectorMember(x, y) => format!(\"({})[{y}]\", to_str(x)),\n        VectorLen(x) => format!(\"({}).length\", to_str(x)),\n        AfterGC(x) => format!(\n            \"\n            if (globalThis.gc) {{\n                globalThis.gc()\n                await new Promise(r => setTimeout(r, 100)) // Try to run finalizers\n                {}\n            }}\n            \",\n            to_str(x)\n        ),\n        OptNone(_) => \"null\".into(),\n        OptSome(x) => to_str(x),\n        Boxed(_, x) => to_str(x),\n    }\n}\n"
  },
  {
    "path": "src/util.rs",
    "content": "use super::*;\nuse std::borrow::Cow;\nuse std::cell::{Cell, RefCell};\nuse std::collections::{HashMap, HashSet};\nuse std::fmt::Debug;\nuse std::hash::Hash;\nuse std::path::{Path, PathBuf};\nuse std::rc::Rc;\n\n#[derive(Clone, Default)]\npub struct NameSet {\n    used: HashSet<String>,\n}\n\nimpl NameSet {\n    pub fn contains(&self, name: &str) -> bool {\n        self.used.contains(name)\n    }\n\n    pub fn find(&self, base: &str) -> String {\n        let mut name = base.to_string();\n        let mut tries = match name.as_str() {\n            \"_\" => 0,\n            _ => 1,\n        };\n        while self.used.contains(&name) {\n            tries += 1;\n            name = format!(\"{base}{tries}\");\n        }\n        name\n    }\n\n    pub fn add(&mut self, name: String) {\n        self.used.insert(name);\n    }\n\n    pub fn create(&mut self, base: &str) -> String {\n        let name = self.find(base);\n        self.add(name.clone());\n        name\n    }\n}\n\n#[derive(Default)]\nstruct HelperFlags {\n    is_used: bool,\n    is_forward_decl: bool,\n}\n\npub struct Helper<G: Copy + Debug + Eq + Hash + Ord, T> {\n    code: T,\n    deps: Vec<(G, String)>,\n    forward_decls: Vec<(G, String)>,\n    flags: RefCell<HelperFlags>,\n}\n\nimpl<G: Copy + Debug + Eq + Hash + Ord, T> Helper<G, T> {\n    pub fn add_dep_group(&mut self, group: G, name: &str) -> &mut Self {\n        self.deps.push((group, name.into()));\n        self\n    }\n\n    pub fn add_deps_group(&mut self, deps: HashSet<(G, String)>) -> &mut Self {\n        let mut deps: Vec<_> = deps.into_iter().collect();\n        deps.sort();\n        self.deps.extend(deps.into_iter());\n        self\n    }\n\n    pub fn add_forward_decl_group(&mut self, group: G, name: &str) -> &mut Self {\n        self.forward_decls.push((group, name.into()));\n        self\n    }\n\n    pub fn mark_used(&self) {\n        self.flags.borrow_mut().is_used = true;\n    }\n\n    pub fn set_is_forward_decl(&self) {\n        self.flags.borrow_mut().is_forward_decl = true;\n    }\n}\n\nimpl<T> Helper<(), T> {\n    pub fn add_dep(&mut self, name: &str) -> &mut Self {\n        self.deps.push(((), name.into()));\n        self\n    }\n}\n\npub struct HelperSet<G: Copy + Debug + Eq + Hash + Ord, T> {\n    map: HashMap<(G, String), Helper<G, T>>,\n}\n\nimpl<G: Copy + Debug + Eq + Hash + Ord, T> Default for HelperSet<G, T> {\n    fn default() -> HelperSet<G, T> {\n        HelperSet {\n            map: HashMap::new(),\n        }\n    }\n}\n\nimpl<G: Copy + Debug + Eq + Hash + Ord, T> HelperSet<G, T> {\n    pub fn was_added(&self, group: G, key: &str) -> bool {\n        self.map.contains_key(&(group, key.into()))\n    }\n\n    pub fn add_group<I: Into<T>>(&mut self, group: G, name: &str, code: I) -> &mut Helper<G, T> {\n        let key = (group, name.to_string());\n        debug_assert!(\n            !self.map.contains_key(&key),\n            \"{name:?} was added to group \\\"{group:?}\\\" more than once\"\n        );\n        self.map.entry(key).or_insert(Helper {\n            code: code.into(),\n            deps: Vec::new(),\n            forward_decls: Vec::new(),\n            flags: HelperFlags::default().into(),\n        })\n    }\n\n    pub fn mark_used_group(&mut self, group: G, name: &str) {\n        get_key_in_map(&(group, name.into()), &self.map).mark_used();\n    }\n\n    pub fn mark_all_used_group(&mut self, all: HashSet<(G, String)>) {\n        for key in all {\n            get_key_in_map(&key, &self.map).mark_used();\n        }\n    }\n\n    pub fn code_by_group_in_order(&self) -> HashMap<G, Vec<&T>> {\n        enum VisitStatus {\n            Visiting,\n            Visited,\n        }\n\n        // Sort dependencies before dependents in case that matters\n        fn visit<'a, G: Copy + Debug + Eq + Hash + Ord, T>(\n            key: &'a (G, String),\n            map: &'a HashMap<(G, String), Helper<G, T>>,\n            result: &mut HashMap<G, Vec<&'a T>>,\n            visits: &mut HashMap<&'a (G, String), VisitStatus>,\n        ) {\n            let helper = get_key_in_map(key, map);\n            match visits.get(key) {\n                Some(VisitStatus::Visited) => {}\n                Some(VisitStatus::Visiting) => {\n                    // Insert forward declarations as needed for C++\n                    for dep in &helper.forward_decls {\n                        visit(dep, map, result, visits);\n                    }\n                }\n                None => {\n                    visits.insert(key, VisitStatus::Visiting);\n                    for dep in &helper.deps {\n                        visit(dep, map, result, visits);\n                    }\n                    result\n                        .entry(key.0)\n                        .or_default()\n                        .push(&map.get(key).unwrap().code);\n                    visits.insert(key, VisitStatus::Visited);\n                }\n            }\n        }\n\n        let mut result = HashMap::new();\n        let mut visits = HashMap::new();\n        let mut keys: Vec<_> = self.map.keys().collect();\n        keys.sort();\n        for key in keys {\n            if self.map.get(key).unwrap().flags.borrow().is_used {\n                visit(key, &self.map, &mut result, &mut visits);\n            }\n        }\n        result\n    }\n}\n\nimpl<T> HelperSet<(), T> {\n    pub fn add<I: Into<T>>(&mut self, name: &str, code: I) -> &mut Helper<(), T> {\n        self.add_group((), name, code)\n    }\n\n    pub fn mark_used(&mut self, name: &str) {\n        self.mark_used_group((), name);\n    }\n\n    pub fn code_in_order(&self) -> Vec<&T> {\n        self.code_by_group_in_order()\n            .into_iter()\n            .next()\n            .unwrap_or_else(|| ((), Vec::new()))\n            .1\n    }\n}\n\nfn get_key_in_map<'a, G: Copy + Debug + Eq + Hash + Ord, T>(\n    key: &(G, String),\n    map: &'a HashMap<(G, String), Helper<G, T>>,\n) -> &'a Helper<G, T> {\n    debug_assert!(\n        map.contains_key(key),\n        \"missing helper named {:?} in group \\\"{:?}\\\"\",\n        key.1,\n        key.0\n    );\n    map.get(&key).unwrap()\n}\n\n// This is sort of like a language-agnostic AST (Abstract Syntax Tree). It lets\n// us emit variable declarations in the \"FnBuilder\" and then optionally inline\n// them into one or more of the following lines later on. For example, consider\n// the following code:\n//\n//     let x = 1;\n//     let y = 2;\n//     let z = foo(x, y);\n//     return z;\n//\n// That would be represented like this:\n//\n//     Decl(\"x\", \"1\"),\n//     Decl(\"y\", \"2\"),\n//     Decl(\"z\", \"foo(x, y)\"),\n//     Line(\"return z;\"),\n//\n// When the code constructing each \"Line\" uses \"RefInline\", the result will\n// become this (which is more concise and often easier to read):\n//\n//     return foo(1, 2);\n//\n// However, if some other code inserts something in the middle, then the sub-\n// expressions will naturally be broken out into separate variable declarations.\n// Consider something that needs to call \"cleanup()\" before returning:\n//\n//     Decl(\"x\", \"1\"),\n//     Decl(\"y\", \"2\"),\n//     Decl(\"z\", \"foo(x, y)\"),\n//     Line(\"cleanup();\"),\n//     Line(\"return z;\"),\n//\n// Then when the code constructing each \"Line\" uses \"RefInline\", the result\n// will become this instead:\n//\n//     let z = foo(1, 2);\n//     cleanup();\n//     return z;\n//\n#[derive(Eq, PartialEq)]\npub enum Line {\n    Plain(String),\n\n    // Two alternative lines (first when false, second when true)\n    PlainAlt(String, String, Rc<Cell<bool>>),\n\n    // Local declaration with an optional type annotation\n    Decl(String, Option<RustType>, String),\n}\n\npub struct Decl {\n    pub code: String,\n    pub pure: bool,\n}\n\npub use RefKind::*;\n\n#[derive(Clone, Copy, Eq, PartialEq)]\npub enum RefKind {\n    // This should always be safe. Use this when a value may be used multiple\n    // times. We can't inline the value into every use because that may have\n    // side effects.\n    RefMany,\n\n    // Only use this when values are guaranteed to be used once in declaration\n    // order. For example, this should not be used in C++ when there are\n    // multiple sibling sub-expressions because C++ doesn't specify the\n    // evaluation order of sub-expressions in a function call.\n    RefInline,\n\n    // C++ needs \"std::move()\" to handle non-copyable lvalues such as a local\n    // variable holding a \"std::unique_ptr\".\n    RefStdMove,\n}\n\n#[derive(Default)]\npub struct FnBuilder {\n    lines: Vec<Line>,\n    deferred_lines: Vec<Line>, // Deferred lines go at the end of the function\n    pure: HashMap<String, String>,\n}\n\nimpl FnBuilder {\n    pub fn is_empty(&self) -> bool {\n        self.lines.is_empty() && self.deferred_lines.is_empty()\n    }\n\n    pub fn take_lines(&mut self) -> Vec<Line> {\n        self.lines.append(&mut self.deferred_lines);\n        self.lines.drain(..).collect()\n    }\n\n    pub fn extend(&mut self, other: FnBuilder) {\n        self.lines.extend(other.lines);\n        self.deferred_lines.extend(other.deferred_lines);\n        self.pure.extend(other.pure);\n    }\n\n    pub fn insert_deferred_lines_here(&mut self) {\n        self.lines.append(&mut self.deferred_lines);\n    }\n\n    // Here \"pure\" means \"can be duplicated, reordered, and/or removed\" (e.g. a field access)\n    pub fn mark_pure(&mut self, name: &str) {\n        self.pure.insert(name.to_string(), name.to_string());\n    }\n\n    pub fn line(&mut self, text: String) {\n        self.lines.push(Line::Plain(text));\n    }\n\n    pub fn line_alt(&mut self, when_false: String, when_true: String, flag: Rc<Cell<bool>>) {\n        self.lines.push(Line::PlainAlt(when_false, when_true, flag));\n    }\n\n    pub fn decl<T: Into<String>>(&mut self, name: T, text: String) {\n        self.lines.push(Line::Decl(name.into(), None, text));\n    }\n\n    pub fn decl_ty<T: Into<String>>(&mut self, name: T, ty: RustType, text: String) {\n        self.lines.push(Line::Decl(name.into(), Some(ty), text));\n    }\n\n    pub fn pure_decl<T: Into<String>>(&mut self, name: T, text: String) {\n        self.pure.insert(name.into(), text);\n    }\n\n    pub fn maybe_pure_decl<T: Debug + Into<String>>(&mut self, pure: bool, name: T, text: String) {\n        if pure {\n            self.pure_decl(name, text);\n        } else {\n            self.decl(name, text);\n        }\n    }\n\n    pub fn defer_line(&mut self, text: String) {\n        self.deferred_lines.push(Line::Plain(text));\n    }\n\n    pub fn defer_decl<T: Into<String>>(&mut self, name: T, text: String) {\n        self.deferred_lines\n            .push(Line::Decl(name.into(), None, text));\n    }\n\n    pub fn pop_line_if<F: FnOnce(&mut Line) -> bool>(&mut self, predicate: F) -> Option<Line> {\n        if predicate(self.lines.last_mut()?) {\n            self.lines.pop()\n        } else {\n            None\n        }\n    }\n\n    pub fn find(&mut self, name: &str, ty: &RustType, kind: RefKind) -> Decl {\n        if let Some(code) = self.pure.get(name) {\n            // This is an lvalue\n            let code = if kind == RefStdMove && needs_std_move(ty) {\n                format!(\"std::move({code})\")\n            } else {\n                code.clone()\n            };\n            return Decl { code, pure: true };\n        }\n\n        if kind == RefInline {\n            if let Some(Line::Decl(last_name, _, last_code)) = self.lines.last() {\n                if last_name == name {\n                    // This is an rvalue\n                    let code = last_code.to_string();\n                    self.lines.pop();\n                    return Decl { code, pure: false };\n                }\n            }\n        }\n\n        // This is an lvalue\n        let code = if kind == RefStdMove && needs_std_move(ty) {\n            format!(\"std::move({name})\")\n        } else {\n            name.to_string()\n        };\n        Decl { code, pure: false }\n    }\n\n    pub fn find_args(&mut self, args: &Vec<RustArg>, kind: RefKind) -> String {\n        // Inline is ok if there's only one sub-expression\n        let kind = if kind == RefMany && args.len() == 1 {\n            RefInline\n        } else {\n            kind\n        };\n\n        // Inline in reverse so we pop the stack of args that were pushed earlier\n        let mut parts = Vec::new();\n        for arg in args.iter().rev() {\n            parts.push(self.find(&arg.name, &arg.ty, kind).code);\n        }\n        parts.reverse();\n\n        // Split up long multi-argument lists across multiple lines\n        if parts.len() > 1 {\n            maybe_split_across_lines(&parts, \"\", \"\")\n        } else {\n            parts.join(\", \")\n        }\n    }\n\n    pub fn find_fields(\n        &mut self,\n        fields: &Vec<RustField>,\n        names: Vec<Cow<str>>,\n        kind: RefKind,\n        open: &str,\n        close: &str,\n    ) -> String {\n        debug_assert_eq!(fields.len(), names.len());\n\n        // Inline is ok if there's only one sub-expression\n        let kind = if kind == RefMany && names.len() == 1 {\n            RefInline\n        } else {\n            kind\n        };\n\n        // Inline in reverse so we pop the stack of args that were pushed earlier\n        let mut parts = Vec::new();\n        for (f, name) in fields.iter().rev().zip(names.iter().rev()) {\n            let code = self.find(name, &f.ty, kind).code;\n            parts.push(match f.name.as_str() {\n                \"\" => code,\n                _ => format!(\"{}: {}\", f.name, code),\n            });\n        }\n        parts.reverse();\n\n        // Split up long lists of fields across multiple lines\n        maybe_split_across_lines(&parts, open, close)\n    }\n}\n\nfn maybe_split_across_lines(parts: &[String], mut open: &str, mut close: &str) -> String {\n    let is_multi_line = parts.iter().any(|x| x.contains('\\n'))\n        || parts.iter().map(|x| x.len()).sum::<usize>() > 100;\n    if is_multi_line {\n        open = open.trim_end();\n        close = close.trim_start();\n    }\n    let mut result: String = open.into();\n    for (i, part) in parts.iter().enumerate() {\n        result.push_str(match (is_multi_line, i > 0) {\n            (false, false) => \"\",\n            (false, true) => \", \",\n            (true, false) => \"\\n\",\n            (true, true) => \",\\n\",\n        });\n        result.push_str(part);\n    }\n    if is_multi_line {\n        result.push_str(\"\\n\");\n    }\n    result.push_str(close);\n    result\n}\n\nfn needs_std_move(ty: &RustType) -> bool {\n    use RustType::*;\n    match ty {\n        Pair { other, .. } => needs_std_move(other),\n        Bool | U8 | U16 | U32 | Usize | U64 | I8 | I16 | I32 | Isize | I64 | F32 | F64\n        | ForeignHandle => false,\n        _ => true,\n    }\n}\n\n// This is a copy of an old \"Path\" method in the Rust standard library that was\n// never stabilized. It's copied here because there still isn't a way in Rust's\n// standard library to compute the relative path between two paths.\npub fn path_relative_from(path: &Path, base: &Path) -> Option<PathBuf> {\n    use std::path::Component;\n    if path.is_absolute() != base.is_absolute() {\n        if path.is_absolute() {\n            Some(PathBuf::from(path))\n        } else {\n            None\n        }\n    } else {\n        let mut ita = path.components();\n        let mut itb = base.components();\n        let mut comps: Vec<Component> = vec![];\n        loop {\n            match (ita.next(), itb.next()) {\n                (None, None) => break,\n                (Some(a), None) => {\n                    comps.push(a);\n                    comps.extend(ita.by_ref());\n                    break;\n                }\n                (None, _) => comps.push(Component::ParentDir),\n                (Some(a), Some(b)) if comps.is_empty() && a == b => (),\n                (Some(a), Some(b)) if b == Component::CurDir => comps.push(a),\n                (Some(_), Some(b)) if b == Component::ParentDir => return None,\n                (Some(a), Some(_)) => {\n                    comps.push(Component::ParentDir);\n                    for _ in itb {\n                        comps.push(Component::ParentDir);\n                    }\n                    comps.push(a);\n                    comps.extend(ita.by_ref());\n                    break;\n                }\n            }\n        }\n        Some(comps.iter().map(|c| c.as_os_str()).collect())\n    }\n}\n\npub struct SharedBuf {\n    buf_name: String,\n    end_name: String,\n    is_buf_name_used: Rc<Cell<bool>>,\n    is_end_name_used: Rc<Cell<bool>>,\n}\n\nimpl SharedBuf {\n    pub fn new(buf_name: &str, end_name: &str) -> Rc<SharedBuf> {\n        Rc::new(SharedBuf {\n            buf_name: buf_name.to_string(),\n            end_name: end_name.to_string(),\n            is_buf_name_used: Rc::new(Cell::new(false)),\n            is_end_name_used: Rc::new(Cell::new(false)),\n        })\n    }\n\n    pub fn buf_name(&self) -> &str {\n        self.is_buf_name_used.set(true);\n        &self.buf_name\n    }\n\n    pub fn end_name(&self) -> &str {\n        self.is_end_name_used.set(true);\n        &self.end_name\n    }\n\n    pub fn is_buf_name_used_flag(&self) -> Rc<Cell<bool>> {\n        self.is_buf_name_used.clone()\n    }\n\n    pub fn is_end_name_used_flag(&self) -> Rc<Cell<bool>> {\n        self.is_end_name_used.clone()\n    }\n\n    pub fn final_buf_name_for_rust(&self) -> &str {\n        match self.is_buf_name_used.get() {\n            false => \"_\", // Rust uses \"_\" to disable unused variable warnings\n            true => &self.buf_name,\n        }\n    }\n\n    pub fn final_end_name_for_rust(&self) -> &str {\n        match self.is_end_name_used.get() {\n            false => \"_\", // Rust uses \"_\" to disable unused variable warnings\n            true => &self.end_name,\n        }\n    }\n}\n\n#[derive(Clone, Copy, Default, Eq, PartialEq)]\npub enum BufStatus {\n    #[default]\n    Outside,\n    Inside,\n}\n\npub fn starts_with_digit(name: &str) -> bool {\n    name.chars().next().unwrap().is_ascii_digit()\n}\n\npub fn with_digit_prefix(name: &str) -> Cow<'_, str> {\n    if starts_with_digit(name) {\n        Cow::Owned(format!(\"_{name}\"))\n    } else {\n        Cow::Borrowed(name)\n    }\n}\n\npub fn name_for_match(name: &str, count: usize) -> Cow<'_, str> {\n    match starts_with_digit(name) {\n        false => Cow::Borrowed(name),\n        true if count == 1 => Cow::Borrowed(\"x\"),\n        true => Cow::Owned(format!(\"x{}\", name)),\n    }\n}\n"
  },
  {
    "path": "src/wasm.rs",
    "content": "use super::*;\nuse std::borrow::Cow;\nuse std::collections::{HashMap, HashSet};\nuse std::rc::Rc;\n\n/// Use this target when the host language is JavaScript or TypeScript.\n///\n/// This can either generate a `.js` file or a `.ts` file depending on how you\n/// want to import the API. If you're using a `.js` file, you may also want to\n/// generate a `.d.ts` file to improve type checking in your IDE. If no file is\n/// explicitly requested, a file named `miniffi.js` will be written to the\n/// directory containing your `Cargo.toml` file. You can customize these paths\n/// before calling [`build`](Target::build):\n///\n/// ```no_run\n/// use miniffi::*;\n///\n/// fn main() {\n///     if true {\n///         // You probably either want both `.js` and `.d.ts`:\n///         WasmTarget::new()\n///             .write_js_to(\"../app/rust.js\")\n///             .write_d_ts_to(\"../app/rust.d.ts\")\n///             .build();\n///     } else {\n///         // Or just a `.ts`:\n///         WasmTarget::new()\n///             .write_ts_to(\"../app/rust.ts\")\n///             .build();\n///     }\n/// }\n/// ```\n///\n/// If your `src/lib.rs` looks like this:\n///\n/// ```no_run\n/// pub fn add(left: u32, right: u32) -> u32 {\n///     left + right\n/// }\n///\n/// # macro_rules! env { ($a:expr) => { $a } }\n/// # macro_rules! include { ($a:expr) => { $a } }\n/// include!(concat!(env!(\"OUT_DIR\"), \"/miniffi.rs\"));\n/// ```\n///\n/// You can call that from JavaScript like this:\n///\n/// ```text\n/// import * as rust from \"./miniffi.js\"\n///\n/// // First instantiate the WASM module\n/// await rust.instantiate(...) // See below\n///\n/// // Then call your Rust code\n/// console.log(\"1 + 2 =\", rust.add(1, 2))\n/// ```\n///\n/// One way to build your Rust code into a `.wasm` module is to use the\n/// `cdylib` crate type and the `wasm32-unknown-unknown` cargo target. That can\n/// be done from the command line like this:\n///\n/// ```text\n/// cargo rustc --crate-type=cdylib --target=wasm32-unknown-unknown\n/// ```\n///\n/// Instantiating a `.wasm` module may need to work differently depending on\n/// the JavaScript environment, so miniffi doesn't attempt to do it for you.\n/// How you do it depends on whether you are using node or the browser.\n///\n/// ## Using from node\n///\n/// If you're using JavaScript in node, you'll have to load the `.wasm` module\n/// using node's file system APIs and call `instantiate`. That might look\n/// like this:\n///\n/// ```js\n/// import * as rust from \"./miniffi.js\"\n/// import fs from \"fs\"\n///\n/// // First instantiate the WASM module\n/// await rust.instantiate(fs.readFileSync(\n///     \"./target/wasm32-unknown-unknown/debug/example.wasm\"))\n///\n/// // Then call your Rust code\n/// console.log(\"1 + 2 =\", rust.add(1, 2))\n/// ```\n///\n/// The `instantiate` function exported by the FFI bindings deliberately\n/// mirrors the standard [`WebAssembly.instantiate`][WASM_instantiate] API.\n/// However, it's important to use the exported `instantiate` function as it\n/// imports additional JavaScript helper code related to the FFI bindings.\n///\n/// [WASM_instantiate]: https://developer.mozilla.org/en-US/docs/WebAssembly/Reference/JavaScript_interface/instantiate_static\n///\n/// ## Using from the browser\n///\n/// If you're using JavaScript in the browser, you'll have to download the\n/// `.wasm` module from the server and call `instantiateStreaming`. That\n/// might look like this:\n///\n/// ```html\n/// <script type=\"module\">\n/// import * as rust from \"./miniffi.js\"\n///\n/// // First instantiate the WASM module\n/// await rust.instantiateStreaming(fetch(\n///     \"./target/wasm32-unknown-unknown/debug/example.wasm\"))\n///\n/// // Then call your Rust code\n/// console.log(\"1 + 2 =\", rust.add(1, 2))\n/// </script>\n/// ```\n///\n/// The `instantiateStreaming` function exported by the FFI bindings\n/// deliberately mirrors the standard\n/// [`WebAssembly.instantiateStreaming`][WASM_instantiateStreaming] API.\n/// However, it's important to use the exported `instantiateStreaming` function\n/// as it imports additional JavaScript helper code related to the FFI bindings.\n///\n/// Also note that the `.wasm` file must be served using a MIME type of\n/// `application/wasm` by the server or the browser won't compile it.\n///\n/// [WASM_instantiateStreaming]: https://developer.mozilla.org/en-US/docs/WebAssembly/Reference/JavaScript_interface/instantiateStreaming_static\n///\n/// ## Additional notes\n///\n/// The generated WebAssembly code is written assuming a single-threaded\n/// environment, which is normally the case when using WebAssembly. Specifically\n/// mutable global variables may be used to pass data across the FFI boundary to\n/// avoid allocation overhead. This is different than miniffi's other targets,\n/// which allocate temporary buffers for this instead since they need to work in\n/// a multi-threaded environment.\npub struct WasmTarget {\n    common_options: CommonOptions,\n    js_path: Option<PathBuf>,\n    ts_path: Option<PathBuf>,\n    d_ts_path: Option<PathBuf>,\n    set_panic_hook: bool,\n}\n\nimpl WasmTarget {\n    pub fn new() -> WasmTarget {\n        WasmTarget {\n            common_options: CommonOptions::default(),\n            js_path: None,\n            ts_path: None,\n            d_ts_path: None,\n            set_panic_hook: false,\n        }\n    }\n\n    pub fn write_js_to<T: Into<PathBuf>>(mut self, path: T) -> Self {\n        self.js_path = Some(path.into());\n        self\n    }\n\n    pub fn write_ts_to<T: Into<PathBuf>>(mut self, path: T) -> Self {\n        self.ts_path = Some(path.into());\n        self\n    }\n\n    pub fn write_d_ts_to<T: Into<PathBuf>>(mut self, path: T) -> Self {\n        self.d_ts_path = Some(path.into());\n        self\n    }\n\n    /// Unfortunately Rust's standard library unconditionally deletes all code\n    /// that writes to stdout and stderr when building for `wasm32`, which can\n    /// make debugging difficult. One difficulty is that panics in Rust will no\n    /// longer print any useful error message. Luckily Rust's panic feature can\n    /// be customized with [`std::panic::set_hook`], so panic support can be\n    /// added back.\n    ///\n    /// Call this to generate an appropriate panic hook and automatically\n    /// register it when the WASM module is instantiated.\n    ///\n    /// Note that this will throw a JavaScript `Error` object, which will unwind\n    /// the stack without Rust being able to catch it using\n    /// [`std::panic::catch_unwind`]. However, Rust compiles `panic!()` to\n    /// abort when building for `wasm32` anyway, so `catch_unwind` already\n    /// doesn't work regardless of whatever this custom panic hook does.\n    pub fn set_panic_hook(mut self) -> Self {\n        self.set_panic_hook = true;\n        self\n    }\n}\n\npub const JS_KEYWORDS: &[&str] = &[\n    \"abstract\",\n    \"await\",\n    \"boolean\",\n    \"break\",\n    \"byte\",\n    \"case\",\n    \"catch\",\n    \"char\",\n    \"class\",\n    \"const\",\n    \"continue\",\n    \"debugger\",\n    \"default\",\n    \"delete\",\n    \"do\",\n    \"double\",\n    \"else\",\n    \"export\",\n    \"extends\",\n    \"false\",\n    \"final\",\n    \"finally\",\n    \"float\",\n    \"for\",\n    \"function\",\n    \"goto\",\n    \"if\",\n    \"implements\",\n    \"import\",\n    \"in\",\n    \"instanceof\",\n    \"int\",\n    \"interface\",\n    \"let\",\n    \"long\",\n    \"native\",\n    \"new\",\n    \"null\",\n    \"package\",\n    \"private\",\n    \"protected\",\n    \"public\",\n    \"return\",\n    \"short\",\n    \"static\",\n    \"super\",\n    \"switch\",\n    \"synchronized\",\n    \"this\",\n    \"throw\",\n    \"throws\",\n    \"transient\",\n    \"true\",\n    \"try\",\n    \"typeof\",\n    \"undefined\",\n    \"var\",\n    \"void\",\n    \"volatile\",\n    \"while\",\n    \"with\",\n    \"yield\",\n];\n\n#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]\nenum JsGroup {\n    Let,\n    Imports,\n    Exports,\n    Other,\n}\n\nimpl Compile for WasmTarget {\n    fn common_options(&mut self) -> &mut CommonOptions {\n        &mut self.common_options\n    }\n\n    fn compile(&self, mut ast: AST, rust_path: PathBuf) -> Vec<FileData> {\n        let syntax = RustSyntax::with_edition(self.common_options.edition);\n        let mut js_helpers = HelperSet::<JsGroup, JsString>::default();\n        let mut rust_helpers = HelperSet::<(), String>::default();\n\n        add_common_rust_helpers(&syntax, &mut rust_helpers);\n        ast.rename_keywords(JS_KEYWORDS);\n\n        js_helpers.add_group(\n            JsGroup::Exports,\n            \"_ffi_alloc\",\n            JsString::from_template(\"«    _ffi_alloc: (len: number) => number,\\n»\"),\n        );\n\n        js_helpers.add_group(\n            JsGroup::Exports,\n            \"_ffi_dealloc\",\n            JsString::from_template(\n                \"«    _ffi_dealloc: (ptr: number, capacity: number) => void,\\n»\",\n            ),\n        );\n\n        js_helpers.add_group(\n            JsGroup::Exports,\n            \"_ffi_set_panic_hook\",\n            JsString::from_template(\"«    _ffi_set_panic_hook: () => void,\\n»\"),\n        );\n\n        js_helpers.add_group(\n            JsGroup::Imports,\n            \"_ffi_js_drop\",\n            JsString::from_template(\n                \"\n    _ffi_js_drop(handle«: number»)«: void» {\n        _ffi_handles.delete(handle);\n    },\n\",\n            ),\n        );\n\n        js_helpers.add_group(\n            JsGroup::Other,\n            \"_ffi_WriteBuf\",\n            JsString::from_template(\n                \"«\ninterface _ffi_WriteBuf {\n    u8: Uint8Array,\n    dv: DataView | null,\n    off: number,\n}\n»\",\n            ),\n        );\n\n        js_helpers.add_group(\n            JsGroup::Other,\n            \"_ffi_ReadBuf\",\n            JsString::from_template(\n                \"«\ninterface _ffi_ReadBuf {\n    dv: DataView,\n    off: number,\n}\n»\",\n            ),\n        );\n\n        js_helpers\n            .add_group(\n                JsGroup::Let,\n                \"_ffi_new_WriteBuf\",\n                JsString::from_template(\n                    \"let _ffi_new_WriteBuf = ()«: _ffi_WriteBuf» => \\\n                        ({ u8: new Uint8Array(16), dv: null, off: 0 });\\n\",\n                ),\n            )\n            .add_dep_group(JsGroup::Other, \"_ffi_WriteBuf\");\n\n        js_helpers\n            .add_group(\n                JsGroup::Let,\n                \"_ffi_new_ReadBuf\",\n                JsString::from_template(\n                    \"let _ffi_new_ReadBuf = (off«: number»)«: _ffi_ReadBuf» => \\\n                        ({ dv: _ffi_update_dv(), off });\\n\",\n                ),\n            )\n            .add_dep_group(JsGroup::Other, \"_ffi_ReadBuf\")\n            .add_dep_group(JsGroup::Other, \"_ffi_update_dv\");\n\n        js_helpers.add_group(\n            JsGroup::Other,\n            \"_ffi_grow\",\n            JsString::from_template(\n                \"\nfunction _ffi_grow(buf«: _ffi_WriteBuf», n«: number»)«: number» {\n    let off = buf.off;\n    let u8 = buf.u8;\n    if (off + n > u8.length) {\n        (buf.u8 = new Uint8Array((off + n) << 1)).set(u8);\n        buf.dv = null;\n    }\n    buf.off += n;\n    if (!buf.dv) buf.dv = new DataView(buf.u8.buffer);\n    return off;\n}\n\",\n            ),\n        );\n\n        js_helpers\n            .add_group(\n                JsGroup::Other,\n                \"_ffi_buf_to_rust\",\n                JsString::from_template(\n                    \"\nfunction _ffi_buf_to_rust({ u8, off }«: _ffi_WriteBuf»)«: number» {\n    let ptr = _ffi_exports._ffi_alloc(off);\n    _ffi_update_u8().set(u8.length > off ? u8.subarray(0, off) : u8, ptr);\n    return ptr;\n}\n\",\n                ),\n            )\n            .add_dep_group(JsGroup::Exports, \"_ffi_alloc\")\n            .add_dep_group(JsGroup::Other, \"_ffi_update_u8\");\n\n        js_helpers.add_group(\n            JsGroup::Let,\n            \"_ffi_next_handle\",\n            \"let _ffi_next_handle = 0;\\n\",\n        );\n        js_helpers.add_group(\n            JsGroup::Let,\n            \"_ffi_handles\",\n            JsString::from_template(\n                \"let _ffi_handles«: Map<number, any>» = /* @__PURE__ */ new Map;\\n\",\n            ),\n        );\n        js_helpers.add_group(\n            JsGroup::Let,\n            \"_ffi_encoder\",\n            \"let _ffi_encoder = /* @__PURE__ */ new TextEncoder;\\n\",\n        );\n        js_helpers.add_group(\n            JsGroup::Let,\n            \"_ffi_decoder\",\n            \"let _ffi_decoder = /* @__PURE__ */ new TextDecoder;\\n\",\n        );\n        js_helpers.add_group(\n            JsGroup::Let,\n            \"_ffi_u8\",\n            JsString::from_template(\"let _ffi_u8«: Uint8Array»;\\n\"),\n        );\n        js_helpers.add_group(\n            JsGroup::Let,\n            \"_ffi_dv\",\n            JsString::from_template(\"let _ffi_dv«: DataView»;\\n\"),\n        );\n        js_helpers.add_group(JsGroup::Let, \"_ffi_len\", \"let _ffi_len = 0;\\n\");\n\n        js_helpers\n            .add_group(\n                JsGroup::Other,\n                \"_ffi_handle_alloc\",\n                JsString::from_template(\n                    \"\nfunction _ffi_handle_alloc(obj«: any»)«: number» {\n    _ffi_handles.set(++_ffi_next_handle, obj);\n    return _ffi_next_handle;\n}\n\",\n                ),\n            )\n            .add_dep_group(JsGroup::Let, \"_ffi_handles\")\n            .add_dep_group(JsGroup::Let, \"_ffi_next_handle\");\n\n        js_helpers\n            .add_group(\n                JsGroup::Other,\n                \"_ffi_string_to_rust\",\n                JsString::from_template(\n                    \"\nfunction _ffi_string_to_rust(str«: string»)«: number» {\n    let buf = _ffi_encoder.encode(str);\n    let ptr = _ffi_exports._ffi_alloc(_ffi_len = buf.length);\n    _ffi_update_u8().set(buf, ptr);\n    return ptr;\n}\n\",\n                ),\n            )\n            .add_dep_group(JsGroup::Let, \"_ffi_len\")\n            .add_dep_group(JsGroup::Let, \"_ffi_encoder\")\n            .add_dep_group(JsGroup::Exports, \"_ffi_alloc\")\n            .add_dep_group(JsGroup::Other, \"_ffi_update_u8\");\n\n        js_helpers\n            .add_group(\n                JsGroup::Other,\n                \"_ffi_string_from_rust\",\n                JsString::from_template(\n                    \"\nfunction _ffi_string_from_rust(ptr«: number», len«: number», cap«: number»)«: string» {\n    let str = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len));\n    _ffi_exports._ffi_dealloc(ptr, cap);\n    return str;\n}\n\",\n                ),\n            )\n            .add_dep_group(JsGroup::Let, \"_ffi_decoder\")\n            .add_dep_group(JsGroup::Exports, \"_ffi_dealloc\");\n\n        js_helpers\n            .add_group(\n                JsGroup::Other,\n                \"_ffi_update_u8\",\n                JsString::from_template(\n                    \"\nfunction _ffi_update_u8()«: Uint8Array» {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_u8 || _ffi_u8.buffer !== buffer) _ffi_u8 = new Uint8Array(buffer);\n    return _ffi_u8;\n}\n\",\n                ),\n            )\n            .add_dep_group(JsGroup::Let, \"_ffi_u8\");\n\n        js_helpers\n            .add_group(\n                JsGroup::Other,\n                \"_ffi_update_dv\",\n                JsString::from_template(\n                    \"\nfunction _ffi_update_dv()«: DataView» {\n    let buffer = _ffi_exports.memory.buffer;\n    if (!_ffi_dv || _ffi_dv.buffer !== buffer) _ffi_dv = new DataView(buffer);\n    return _ffi_dv;\n}\n\",\n                ),\n            )\n            .add_dep_group(JsGroup::Let, \"_ffi_dv\");\n\n        js_helpers\n            .add_group(\n                JsGroup::Imports,\n                \"_ffi_throw_panic\",\n                JsString::from_template(\n                    r#\"\n    _ffi_throw_panic(ptr«: number», len«: number»)«: void» {\n        let legacy_demangle = (_«: string», t«: string») => {\n            let e«: any» = { SP: \"@\", BP: \"*\", RF: \"&\", LT: \"<\", GT: \">\", LP: \"(\", RP: \")\", C: \",\" }, p«: string[]» = [], i = 3;\n            for (let n«: any»; n = /^\\d+/.exec(t.slice(i)); )\n                p.push(t.slice(i += n[0].length, i += +n[0]).replace(/^_\\$/, \"$\").replace(/\\.\\./g, \"::\").replace(/\\$(\\w|\\w\\w|u[0-9a-f]+)\\$/g,\n                    (a, b) => b[0] == \"u\" ? String.fromCodePoint(parseInt(b.slice(1), 16)) : e[b] || a));\n            if (/^h[0-9a-f]+$/.test(p[p.length - 1])) p.pop();\n            return p.join(\"::\") + (t[i] == \"E\" ? t.slice(i + 1).replace(/^\\.llvm\\.[0-9A-F@]+$/, \"\") : \"\");\n        };\n        let msg = _ffi_decoder.decode(new Uint8Array(_ffi_exports.memory.buffer, ptr, len)), Err«: any» = Error, old = Err.stackTraceLimit;\n        Err.stackTraceLimit = 99;\n        let err = Err(msg);\n        Err.stackTraceLimit = old;\n        let stack = (err.stack || \"\").replace(/\\b(?:[\\w\\-]+[\\.\\[])*(_ZN[^ @\\]]+)/g, legacy_demangle);\n        if (stack.startsWith(\"Error: \")) err.stack = stack;\n        else err = Err(msg + \"\\nstack backtrace:\\n\" + stack);\n        throw err;\n    },\n\"#,\n                    ),\n            )\n            .add_dep_group(JsGroup::Let, \"_ffi_decoder\");\n\n        rust_helpers.add(\n            \"_ffi_set_panic_hook\",\n            format!(\n                r#\"\n{}\nextern \"C\" fn _ffi_set_panic_hook() {{\n    #[cfg(target_arch = \"wasm32\")]\n    std::panic::set_hook(Box::new(|info| {{\n        let location = info.location().unwrap();\n        let thread = std::thread::current();\n        let name = thread.name().unwrap_or(\"<unnamed>\");\n        let payload = info.payload();\n        let payload = if let Some(&s) = payload.downcast_ref::<&'static str>() {{\n            s\n        }} else if let Some(s) = payload.downcast_ref::<String>() {{\n            s.as_str()\n        }} else {{\n            \"Box<dyn Any>\"\n        }};\n        let text = format!(\"thread '{{name}}' panicked at {{location}}:\\n{{payload}}\");\n        unsafe extern \"C\" {{\n            fn _ffi_throw_panic(ptr: *const u8, len: usize);\n        }}\n        unsafe {{ _ffi_throw_panic(text.as_ptr(), text.len()) }}\n    }}));\n}}\n\"#,\n                syntax.unsafe_no_mangle()\n            ),\n        );\n\n        let js_path =\n            if self.js_path.is_none() && self.ts_path.is_none() && self.d_ts_path.is_none() {\n                Some(\"miniffi.js\".into())\n            } else {\n                self.js_path.clone()\n            };\n\n        if self.set_panic_hook {\n            js_helpers.mark_used_group(JsGroup::Imports, \"_ffi_throw_panic\");\n            rust_helpers.mark_used(\"_ffi_set_panic_hook\");\n        }\n\n        let mut rust = format!(\"// {DO_NOT_EDIT_COMMENT}\\n\");\n        let mut dts = format!(\"// {DO_NOT_EDIT_COMMENT}\\n\");\n        let mut js = JsString::default();\n        _ = write!(js, \"// {DO_NOT_EDIT_COMMENT}\\n\");\n\n        // \"instantiate\" helper\n        dts.push_str(\n            \"\\nexport function instantiate(\\\n                bytes: BufferSource, \\\n                imports?: WebAssembly.ModuleImports\\\n            ): Promise<{ memory: WebAssembly.Memory }>;\\n\",\n        );\n        js.push_template(\n            \"\nexport async function instantiate(\\\n    bytes«: BufferSource», \\\n    imports«?: WebAssembly.ModuleImports»\\\n)«: Promise<{ memory: WebAssembly.Memory }>» {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiate(bytes, { env });\n    _ffi_exports = (await promise).instance.exports« as any»;\n\",\n        );\n        if self.set_panic_hook {\n            js.push_both(\"    _ffi_exports._ffi_set_panic_hook();\\n\");\n            js_helpers.mark_used_group(JsGroup::Exports, \"_ffi_set_panic_hook\");\n        }\n        js.push_both(\"    return { memory: _ffi_exports.memory };\\n}\\n\");\n\n        // \"instantiateStreaming\" helper\n        dts.push_str(\n            \"export function instantiateStreaming(\\\n                source: Response | PromiseLike<Response>, \\\n                imports?: WebAssembly.ModuleImports\\\n            ): Promise<{ memory: WebAssembly.Memory }>;\\n\",\n        );\n        js.push_template(\n            \"\nexport async function instantiateStreaming(\\\n    source«: Response | PromiseLike<Response>», \\\n    imports«?: WebAssembly.ModuleImports»\\\n)«: Promise<{ memory: WebAssembly.Memory }>» {\n    let env = Object.assign({}, imports, _ffi_imports);\n    let promise = WebAssembly.instantiateStreaming(source, { env });\n    _ffi_exports = (await promise).instance.exports« as any»;\n\",\n        );\n        if self.set_panic_hook {\n            js.push_both(\"    _ffi_exports._ffi_set_panic_hook();\\n\");\n        }\n        js.push_both(\"    return { memory: _ffi_exports.memory };\\n}\\n\");\n\n        // Traits\n        for t in &ast.traits {\n            let mut ts = JsString::default();\n            ts.push_ts(&format!(\"\\nexport interface {} {{\\n\", t.name));\n            for f in &t.fns {\n                ts.push_ts(\"    \");\n                ts.push_ts(&f.name);\n                ts.push_ts(\"(\");\n                for (i, arg) in f.args.iter().enumerate() {\n                    if i > 0 {\n                        ts.push_ts(\", \");\n                    }\n                    ts.push_ts(&arg.name);\n                    ts.push_ts(\": \");\n                    append_ts_type(&mut ts, &ast, &arg.ty);\n                }\n                ts.push_ts(\")\");\n                if let Some(returns) = &f.returns {\n                    ts.push_ts(\": \");\n                    append_ts_type(&mut ts, &ast, &returns.ty);\n                } else {\n                    ts.push_ts(\": void\");\n                }\n                ts.push_ts(\";\\n\");\n            }\n            ts.push_ts(\"}\\n\");\n            js.extend_from(&ts);\n            dts.push_str(&ts.with_types);\n        }\n\n        // Enums\n        for e in &ast.enums {\n            let mut ts = JsString::default();\n            if !e.has_fields() {\n                // Enums without fields just map to TypeScript enums (i.e. integers)\n                let mut discriminant = 0;\n                ts.push_js(&format!(\"\\nexport const {} = {{\\n\", e.name));\n                ts.push_ts(&format!(\"\\nexport const enum {} {{\\n\", e.name));\n                for v in &e.variants {\n                    ts.push_js(&format!(\"    {}: {},\\n\", v.name, v.discriminant));\n                    if v.discriminant == discriminant {\n                        ts.push_ts(&format!(\"    {},\\n\", v.name));\n                    } else {\n                        ts.push_ts(&format!(\"    {} = {},\\n\", v.name, v.discriminant));\n                    }\n                    discriminant = v.discriminant.wrapping_add(1);\n                }\n                ts.push_js(\"};\\n\");\n                ts.push_ts(\"}\\n\");\n            } else {\n                // Enums with fields map to objects with a special \"$\" field\n                ts.push_ts(&format!(\"\\nexport type {} =\\n\", e.name));\n                for v in &e.variants {\n                    ts.push_ts(&format!(\"    | {{ readonly $: {:?}\", v.name));\n                    for f in &v.fields {\n                        ts.push_ts(&format!(\", {}: \", f.name));\n                        append_ts_type(&mut ts, &ast, &f.ty);\n                    }\n                    ts.push_ts(\" }\\n\");\n                }\n            }\n            js.extend_from(&ts);\n            dts.push_str(&ts.with_types);\n        }\n\n        // Structs\n        for s in &ast.structs {\n            let mut ts = JsString::default();\n            ts.push_ts(&format!(\"\\nexport interface {} {{\\n\", s.name));\n            for f in &s.fields {\n                ts.push_ts(\"    \");\n                ts.push_ts(&f.name);\n                ts.push_ts(\": \");\n                append_ts_type(&mut ts, &ast, &f.ty);\n                ts.push_ts(\",\\n\");\n            }\n            ts.push_ts(\"}\\n\");\n            js.extend_from(&ts);\n            dts.push_str(&ts.with_types);\n        }\n\n        // Constants\n        if !ast.consts.is_empty() {\n            js.push_both(\"\\n\");\n            dts.push('\\n');\n            for c in &ast.consts {\n                let mut ts_type = JsString::default();\n                append_ts_type(&mut ts_type, &ast, &c.ty);\n                _ = write!(dts, \"export const {}: {};\\n\", c.name, ts_type.with_types);\n                js.push_both(\"export const \");\n                js.push_both(&c.name);\n                js.push_ts(\": \");\n                js.extend_from(&ts_type);\n                js.push_both(\" = \");\n                append_js_val(&mut js, &c.val);\n                js.push_both(\";\\n\");\n            }\n        }\n\n        let mut ctx = WasmCtx {\n            syntax,\n            js_helpers,\n            rust_helpers,\n            ..WasmCtx::default()\n        };\n\n        // Functions\n        for (i, f) in ast.fns.iter().enumerate() {\n            generate_js_to_rust_fn(&ast, &mut ctx, f, &mut js, None);\n\n            // Also generate a type declaration for the function\n            let mut ts = JsString::default();\n            if i == 0 {\n                ts.push_both(\"\\n\");\n            }\n            _ = write!(ts, \"export function {}(\", f.name);\n            for (j, arg) in f.args.iter().enumerate() {\n                if j > 0 {\n                    ts.push_ts(\", \");\n                }\n                ts.push_both(&arg.name);\n                ts.push_ts(\": \");\n                append_ts_type(&mut ts, &ast, &arg.ty);\n            }\n            ts.push_both(\")\");\n            if let Some(returns) = &f.returns {\n                ts.push_ts(\": \");\n                append_ts_type(&mut ts, &ast, &returns.ty);\n            } else {\n                ts.push_ts(\": void\");\n            }\n            ts.push_both(\";\\n\");\n            dts.push_str(&ts.with_types);\n        }\n\n        for it in ctx.rust_helpers.code_in_order() {\n            rust.push_str(it);\n        }\n\n        let js_code = ctx.js_helpers.code_by_group_in_order();\n\n        for group in [JsGroup::Let, JsGroup::Other] {\n            if let Some(code) = js_code.get(&group) {\n                if group == JsGroup::Let || group == JsGroup::Let {\n                    js.push_both(\"\\n\");\n                }\n                for it in code {\n                    js.extend_from(&it);\n                }\n            }\n        }\n\n        // Export object\n        js.push_both(\"\\nlet _ffi_exports\");\n        js.push_ts(\": {\\n\");\n        js.push_ts(\"    memory: WebAssembly.Memory,\\n\");\n        if let Some(code) = js_code.get(&JsGroup::Exports) {\n            for it in code {\n                js.extend_from(&it);\n            }\n        }\n        js.push_ts(\"}\");\n        js.push_both(\";\\n\");\n\n        // Import object\n        js.push_both(\"\\nconst _ffi_imports = {\");\n        if let Some(code) = js_code.get(&JsGroup::Imports) {\n            for it in code {\n                js.extend_from(&it);\n            }\n        }\n        js.push_both(\"};\\n\");\n\n        let mut output_files = vec![FileData {\n            path: rust_path,\n            contents: rust,\n        }];\n        if let Some(path) = js_path {\n            output_files.push(FileData {\n                path,\n                contents: js.without_types,\n            });\n        }\n        if let Some(path) = &self.ts_path {\n            output_files.push(FileData {\n                path: path.clone(),\n                contents: js.with_types,\n            });\n        }\n        if let Some(path) = &self.d_ts_path {\n            output_files.push(FileData {\n                path: path.clone(),\n                contents: dts,\n            });\n        }\n        output_files\n    }\n}\n\n#[derive(Default)]\nstruct WasmCtx {\n    syntax: RustSyntax,\n    helper_names: NameSet,\n    js_helpers: HelperSet<JsGroup, JsString>,\n    rust_helpers: HelperSet<(), String>,\n    multi_ret_helpers: HashMap<Vec<RustType>, (String, String)>,\n    trait_to_rust_helpers: HashMap<usize, String>,\n    trait_to_js_helpers: HashMap<(RustPtr, usize), String>,\n    vec_to_rust_helpers: HashMap<RustType, (String, String)>,\n    vec_to_js_helpers: HashMap<RustType, (String, String)>,\n    box_to_rust_helpers: HashMap<RustType, (String, String)>,\n    box_to_js_helpers: HashMap<RustType, (String, String)>,\n    enum_to_rust_helpers: HashMap<usize, (String, String)>,\n    enum_to_js_helpers: HashMap<usize, (String, String)>,\n}\n\n#[derive(Default)]\nstruct Transform {\n    js: FnBuilder,\n    rust: FnBuilder,\n    ffi_args: Vec<RustArg>,\n    buf: Option<Rc<SharedBuf>>,\n    buf_status: BufStatus,\n    buf_ref: &'static str,\n}\n\n#[derive(Default)]\nstruct JsString {\n    without_types: String,\n    with_types: String,\n}\n\nimpl JsString {\n    fn extend_from(&mut self, it: &JsString) {\n        self.without_types.push_str(&it.without_types);\n        self.with_types.push_str(&it.with_types);\n    }\n\n    fn push_js(&mut self, text: &str) {\n        self.without_types.push_str(text);\n    }\n\n    fn push_ts(&mut self, text: &str) {\n        self.with_types.push_str(text);\n    }\n\n    fn push_both(&mut self, text: &str) {\n        self.without_types.push_str(text);\n        self.with_types.push_str(text);\n    }\n\n    fn push_template(&mut self, text: &str) {\n        for (i, part) in text.split(&['«', '»']).enumerate() {\n            if i % 2 == 0 {\n                self.without_types.push_str(part);\n            }\n            self.with_types.push_str(part);\n        }\n    }\n\n    fn from_template(text: &str) -> JsString {\n        let mut js = JsString::default();\n        js.push_template(text);\n        js\n    }\n}\n\nimpl From<&str> for JsString {\n    fn from(value: &str) -> JsString {\n        JsString {\n            without_types: value.to_string(),\n            with_types: value.to_string(),\n        }\n    }\n}\n\nimpl std::fmt::Write for JsString {\n    fn write_str(&mut self, text: &str) -> Result<(), std::fmt::Error> {\n        self.push_both(text);\n        Ok(())\n    }\n}\n\nstruct TraitInfo<'a> {\n    t: &'a RustTrait,\n    kind: RustPtr,\n}\n\nfn generate_js_to_rust_fn(\n    ast: &AST,\n    ctx: &mut WasmCtx,\n    f: &RustFn,\n    js: &mut JsString,\n    trait_info: Option<TraitInfo>,\n) {\n    let ffi_name = ctx.helper_names.create(&match &trait_info {\n        None => format!(\"_ffi_fn_{}\", f.name),\n        Some(info) => format!(\"_ffi_{:?}_{}__{}\", info.kind, info.t.name, f.name),\n    });\n    let mut names = NameSet::default();\n    for arg in &f.args {\n        names.add(arg.name.clone());\n    }\n    if let Some(ret) = &f.returns {\n        names.add(ret.name.clone());\n    }\n\n    // Transform the arguments\n    let mut arg_tfm = Transform::default();\n    if let Some(info) = &trait_info {\n        arg_tfm.rust.line(format!(\n            \"let _self = unsafe {{ &*(_self as *const {}<dyn {}>) }};\",\n            info.kind.path(),\n            info.t.name\n        ));\n    }\n    for arg in &f.args {\n        arg_tfm.js.mark_pure(&arg.name);\n        transform_to_rust(ast, ctx, &mut names, &mut arg_tfm, &arg.name, &arg.ty);\n    }\n    arg_tfm.js.insert_deferred_lines_here();\n\n    // Generate the Rust call to the API function\n    let mut rust_call = String::new();\n    if trait_info.is_some() {\n        rust_call.push_str(\"_self.\");\n    }\n    _ = write!(rust_call, \"{}(\", f.name);\n    rust_call.push_str(&arg_tfm.rust.find_args(&f.args, RefInline));\n    rust_call.push(')');\n\n    // Transform the result\n    let mut ret_tfm = Transform::default();\n    if let Some(ret) = &f.returns {\n        ret_tfm.rust.decl(&ret.name, rust_call);\n        transform_to_js(ast, ctx, &mut names, &mut ret_tfm, &ret.name, &ret.ty);\n    } else {\n        rust_call.push(';');\n        ret_tfm.rust.line(rust_call);\n    }\n\n    // Generate the JavaScript call to the FFI function\n    let mut js_call = String::new();\n    _ = write!(js_call, \"_ffi_exports.{ffi_name}(\");\n    if trait_info.is_some() {\n        js_call.push_str(\"this._\");\n        if !arg_tfm.ffi_args.is_empty() {\n            js_call.push_str(\", \");\n        }\n    }\n    js_call.push_str(&arg_tfm.js.find_args(&arg_tfm.ffi_args, RefInline));\n    js_call.push(')');\n\n    // JavaScript\n    {\n        // Handle the return values\n        let mut fb = arg_tfm.js;\n        match &ret_tfm.ffi_args[..] {\n            [] => {\n                js_call.push(';');\n                fb.line(js_call)\n            }\n            [arg] => fb.decl(&arg.name, js_call),\n            _ => {\n                let ret = names.create(\"multi_ret\");\n                let mut view = \"_ffi_update_dv()\";\n                let mut offset = 0;\n                fb.decl(&ret, js_call);\n                for arg in &ret_tfm.ffi_args {\n                    fb.decl(\n                        &arg.name,\n                        js_multi_ret_load(view, &ret, &arg.ty, &mut offset),\n                    );\n                    view = \"_ffi_dv\";\n                    ctx.js_helpers\n                        .mark_used_group(JsGroup::Other, \"_ffi_update_dv\");\n                }\n            }\n        };\n\n        // Return from the function\n        fb.extend(ret_tfm.js);\n        fb.insert_deferred_lines_here();\n        if let Some(ret) = &f.returns {\n            let code = fb.find(&ret.name, &ret.ty, RefInline).code;\n            fb.line(format!(\"return {code};\"));\n        }\n\n        // Write out the final function\n        let (_, indent) = match &trait_info {\n            None => (write!(js, \"\\nexport function {}(\", f.name), \"    \"),\n            Some(_) => (write!(js, \"\\n    {}(\", f.name), \"        \"),\n        };\n        for (i, arg) in f.args.iter().enumerate() {\n            if i > 0 {\n                js.push_both(\", \");\n            }\n            js.push_both(&arg.name);\n            js.push_ts(\": \");\n            append_ts_type(js, ast, &arg.ty);\n        }\n        js.push_both(\")\");\n        if let Some(returns) = &f.returns {\n            js.push_ts(\": \");\n            append_ts_type(js, ast, &returns.ty);\n        } else {\n            js.push_ts(\": void\");\n        }\n        js.push_both(\" {\\n\");\n        fb.write_to_js(ast, js, indent);\n        _ = write!(js, \"{}}}\\n\", &indent[4..]);\n    }\n\n    // TypeScript (export)\n    {\n        let mut js = JsString::default();\n        js.push_ts(&format!(\"    {ffi_name}: (\"));\n        if trait_info.is_some() {\n            js.push_ts(\"_self: number\");\n        }\n        for (i, arg) in arg_tfm.ffi_args.iter().enumerate() {\n            if trait_info.is_some() || i > 0 {\n                js.push_ts(\", \");\n            }\n            js.push_ts(&arg.name);\n            js.push_ts(\": \");\n            append_ts_type(&mut js, ast, &arg.ty);\n        }\n        js.push_ts(\") => \");\n        match &ret_tfm.ffi_args[..] {\n            [] => js.push_ts(\"void\"),\n            [arg] => append_ts_type(&mut js, ast, &arg.ty),\n            _ => js.push_ts(\"number\"),\n        }\n        js.push_ts(\",\\n\");\n        ctx.js_helpers\n            .add_group(JsGroup::Exports, &ffi_name, js)\n            .mark_used();\n    }\n\n    // Rust\n    {\n        // Return from the function\n        let mut fb = arg_tfm.rust;\n        fb.extend(ret_tfm.rust);\n        fb.insert_deferred_lines_here();\n        match &ret_tfm.ffi_args[..] {\n            [] => {}\n            [arg] => {\n                let code = fb.find(&arg.name, &arg.ty, RefInline).code;\n                fb.line(code);\n            }\n            _ => {\n                let (ty_name, static_name) = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n                let args = fb.find_args(&ret_tfm.ffi_args, RefInline);\n\n                // Note: This must be formatted this way (both lines in one\n                // unsafe block) to work correctly across different versions\n                // of Rust. Older versions of Rust give an error if \"unsafe\"\n                // is missing and newer versions of Rust give an error if\n                // \"unsafe\" is present.\n                fb.line(\"unsafe {\".into());\n                fb.line(format!(\"{static_name} = {ty_name}({args});\"));\n                fb.line(format!(\"std::ptr::addr_of!({static_name})\"));\n                fb.line(\"}\".into());\n            }\n        }\n\n        // Write out the final function\n        let mut rust = String::new();\n        _ = write!(rust, \"\\n{}\\n\", ctx.syntax.unsafe_no_mangle());\n        _ = write!(rust, \"extern \\\"C\\\" fn {ffi_name}(\");\n        if trait_info.is_some() {\n            rust.push_str(\"_self: *const u8\");\n        }\n        for (i, arg) in arg_tfm.ffi_args.iter().enumerate() {\n            if trait_info.is_some() || i > 0 {\n                rust.push_str(\", \");\n            }\n            _ = write!(rust, \"{}: \", arg.name);\n            append_rust_type(&mut rust, ast, &arg.ty);\n        }\n        rust.push(')');\n        match &ret_tfm.ffi_args[..] {\n            [] => {}\n            [arg] => {\n                rust.push_str(\" -> \");\n                append_rust_type(&mut rust, ast, &arg.ty);\n            }\n            _ => {\n                let (ty_name, _) = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n                _ = write!(rust, \" -> *const {ty_name}\");\n            }\n        }\n        rust.push_str(\" {\\n\");\n        fb.write_to_rust(ast, &mut rust, \"    \");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&ffi_name, rust).mark_used();\n    }\n}\n\nfn generate_rust_to_js_fn(\n    ast: &AST,\n    ctx: &mut WasmCtx,\n    t: &RustTrait,\n    f: &RustFn,\n    rust: &mut String,\n) {\n    let ffi_name = ctx\n        .helper_names\n        .create(&format!(\"_ffi_js_{}__{}\", t.name, f.name));\n    let mut names = NameSet::default();\n    for arg in &f.args {\n        names.add(arg.name.clone());\n    }\n    if let Some(ret) = &f.returns {\n        names.add(ret.name.clone());\n    }\n\n    // Transform the arguments\n    let mut arg_tfm = Transform::default();\n    for arg in &f.args {\n        arg_tfm.rust.mark_pure(&arg.name);\n        transform_to_js(ast, ctx, &mut names, &mut arg_tfm, &arg.name, &arg.ty);\n    }\n    arg_tfm.rust.insert_deferred_lines_here();\n\n    // Generate the JavaScript call to the API function\n    let mut js_call = format!(\"_ffi_handles.get(self).{}(\", f.name);\n    js_call.push_str(&arg_tfm.js.find_args(&f.args, RefInline));\n    js_call.push(')');\n\n    // Transform the result\n    let mut ret_tfm = Transform::default();\n    if let Some(ret) = &f.returns {\n        ret_tfm.js.decl(&ret.name, js_call);\n        transform_to_rust(ast, ctx, &mut names, &mut ret_tfm, &ret.name, &ret.ty);\n    } else {\n        js_call.push(';');\n        ret_tfm.js.line(js_call);\n    }\n\n    // Generate the Rust call to the FFI function\n    let mut rust_call = format!(\"unsafe {{ {ffi_name}(self.0\");\n    if !arg_tfm.ffi_args.is_empty() {\n        rust_call.push_str(\", \");\n    }\n    rust_call.push_str(&arg_tfm.rust.find_args(&arg_tfm.ffi_args, RefInline));\n    if ret_tfm.ffi_args.len() > 1 {\n        let (_, static_name) = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n        _ = write!(rust_call, \", std::ptr::addr_of!({static_name})\");\n    }\n    rust_call.push_str(\") }\");\n\n    // Rust\n    {\n        // Handle the return values\n        let mut fb = arg_tfm.rust;\n        match &ret_tfm.ffi_args[..] {\n            [] => {\n                rust_call.push(';');\n                fb.line(rust_call);\n            }\n            [arg] => fb.decl(&arg.name, rust_call),\n            _ => {\n                let (_, static_name) = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n                fb.line(rust_call);\n                for (i, arg) in ret_tfm.ffi_args.iter().enumerate() {\n                    fb.decl(&arg.name, format!(\"unsafe {{ {static_name}.{i} }}\"));\n                }\n            }\n        };\n\n        // Return from the function\n        fb.extend(ret_tfm.rust);\n        fb.insert_deferred_lines_here();\n        if let Some(ret) = &f.returns {\n            let code = fb.find(&ret.name, &ret.ty, RefInline).code;\n            fb.line(code);\n        }\n\n        // Write out the final function\n        _ = write!(rust, \"\\n    fn {}(&self\", f.name);\n        for arg in &f.args {\n            _ = write!(rust, \", {}: \", arg.name);\n            append_rust_type(rust, ast, &arg.ty);\n        }\n        rust.push(')');\n        if let Some(returns) = &f.returns {\n            rust.push_str(\" -> \");\n            append_rust_type(rust, ast, &returns.ty);\n        }\n        rust.push_str(\" {\\n\");\n        _ = write!(\n            rust,\n            \"        {} \\\"C\\\" {{ fn {ffi_name}(_: *const u8\",\n            ctx.syntax.unsafe_extern()\n        );\n        for arg in &arg_tfm.ffi_args {\n            _ = write!(rust, \", {}: \", arg.name);\n            append_rust_type(rust, ast, &arg.ty);\n        }\n        match &ret_tfm.ffi_args[..] {\n            [] => rust.push(')'),\n            [arg] => {\n                rust.push_str(\") -> \");\n                append_rust_type(rust, ast, &arg.ty);\n            }\n            _ => {\n                let (ty_name, _) = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n                _ = write!(rust, \", _: *const {ty_name})\");\n            }\n        }\n        rust.push_str(\"; }\\n\");\n        fb.write_to_rust(ast, rust, \"        \");\n        rust.push_str(\"    }\\n\");\n    }\n\n    // JavaScript\n    {\n        // Return from the function\n        let mut fb = arg_tfm.js;\n        fb.extend(ret_tfm.js);\n        fb.insert_deferred_lines_here();\n        match &ret_tfm.ffi_args[..] {\n            [] => {}\n            [arg] => {\n                let code = fb.find(&arg.name, &arg.ty, RefInline).code;\n                fb.line(format!(\"return {code};\"));\n            }\n            _ => {\n                let (ty_name, _) = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n                let mut offset = 0;\n                let mut offsets = Vec::new();\n                for arg in &ret_tfm.ffi_args {\n                    let size = js_multi_ret_size(&arg.ty);\n                    offset = (offset + (size - 1)) & !(size - 1);\n                    offsets.push(offset);\n                    offset += size;\n                }\n                let mut stores = Vec::new();\n                for (offset, arg) in offsets.iter().zip(ret_tfm.ffi_args.iter()).rev() {\n                    let code = fb.find(&arg.name, &arg.ty, RefInline).code;\n                    stores.push(js_multi_ret_store(\n                        match offset {\n                            0 => \"_ffi_update_dv()\",\n                            _ => \"_ffi_dv\",\n                        },\n                        &ty_name,\n                        &code,\n                        &arg.ty,\n                        *offset,\n                    ));\n                }\n                for store in stores.into_iter().rev() {\n                    fb.line(store);\n                }\n                ctx.js_helpers\n                    .mark_used_group(JsGroup::Other, \"_ffi_update_dv\");\n            }\n        }\n\n        // Write out the final function\n        let mut js = JsString::default();\n        _ = write!(js, \"\\n    {ffi_name}(self\");\n        js.push_ts(\": number\");\n        for arg in &arg_tfm.ffi_args {\n            js.push_both(\", \");\n            js.push_both(&arg.name);\n            js.push_ts(\": \");\n            append_ts_type(&mut js, ast, &arg.ty);\n        }\n        if ret_tfm.ffi_args.len() > 1 {\n            let (ty_name, _) = multi_ret_helper(ast, ctx, &ret_tfm.ffi_args);\n            js.push_both(\", \");\n            js.push_both(&ty_name);\n            js.push_ts(\": number\");\n        }\n        js.push_both(\")\");\n        match &ret_tfm.ffi_args[..] {\n            [arg] => {\n                js.push_ts(\": \");\n                append_ts_type(&mut js, ast, &arg.ty);\n            }\n            _ => js.push_ts(\": void\"),\n        }\n        js.push_both(\" {\\n\");\n        fb.write_to_js(ast, &mut js, \"        \");\n        js.push_both(\"    },\\n\");\n        ctx.js_helpers\n            .add_group(JsGroup::Imports, &ffi_name, js)\n            .mark_used();\n    }\n}\n\nfn transform_to_rust(\n    ast: &AST,\n    ctx: &mut WasmCtx,\n    names: &mut NameSet,\n    tfm: &mut Transform,\n    name: &str,\n    ty: &RustType,\n) {\n    use RustType::*;\n\n    fn add_ffi_arg(ast: &AST, ctx: &mut WasmCtx, tfm: &mut Transform, name: &str, ty: &RustType) {\n        match tfm.buf_status {\n            BufStatus::Outside => tfm.ffi_args.push(RustArg {\n                name: name.to_string(),\n                ty: ty.clone(),\n            }),\n            BufStatus::Inside => {\n                let buf = tfm.buf.as_ref().unwrap();\n\n                // JavaScript (write)\n                let code = tfm.js.find(name, ty, RefInline).code;\n                tfm.js.line(js_write(ctx, buf.buf_name(), &code, ty));\n\n                // Rust (read)\n                let mut rust = \"_ffi_read::<\".to_string();\n                append_rust_type(&mut rust, ast, ty);\n                _ = write!(rust, \">({}{})\", tfm.buf_ref, buf.end_name());\n                tfm.rust.decl(name, rust);\n                ctx.rust_helpers.mark_used(\"_ffi_read\");\n            }\n        }\n    }\n\n    match ty {\n        Bool | U8 | U16 | U32 | Usize | U64 | I8 | I16 | I32 | Isize | I64 | F32 | F64\n        | ForeignHandle => add_ffi_arg(ast, ctx, tfm, name, ty),\n\n        RefStr | OwnStr => {\n            let js_code = tfm.js.find(name, ty, RefInline).code;\n            let ptr_name = names.create(&format!(\"{name}_ptr\"));\n            let len_name = names.create(&format!(\"{name}_len\"));\n            let opt_ref = match ty {\n                RefStr => \"&\",\n                _ => \"\",\n            };\n            tfm.js.line(format!(\n                \"let {ptr_name} = _ffi_string_to_rust({js_code}), {len_name} = _ffi_len;\"\n            ));\n            ctx.js_helpers.mark_used_group(JsGroup::Let, \"_ffi_len\");\n            ctx.js_helpers\n                .mark_used_group(JsGroup::Other, \"_ffi_string_to_rust\");\n            add_ffi_arg(ast, ctx, tfm, &ptr_name, &ForeignHandle);\n            add_ffi_arg(ast, ctx, tfm, &len_name, &Usize);\n            let len_code = tfm.rust.find(&len_name, &Usize, RefInline).code;\n            let ptr_code = tfm.rust.find(&ptr_name, &ForeignHandle, RefInline).code;\n            tfm.rust.decl(\n                name,\n                format!(\"{opt_ref}_ffi_string_from_host({ptr_code}, {len_code})\"),\n            );\n            ctx.rust_helpers.mark_used(\"_ffi_string_from_host\");\n        }\n\n        Enum(enum_index) => {\n            let js = tfm.js.find(name, ty, RefInline);\n            let e = &ast.enums[*enum_index];\n            let (js_helper, rust_helper) = enum_to_rust_helper(ast, ctx, *enum_index);\n            if !e.has_fields() {\n                let raw_name = names.create(&format!(\"{name}_raw\"));\n                tfm.js.maybe_pure_decl(js.pure, &raw_name, js.code);\n                add_ffi_arg(ast, ctx, tfm, &raw_name, &I32);\n                tfm.rust.decl(name, format!(\"{rust_helper}({raw_name})\"));\n            } else {\n                let buf = ensure_js_buf(ctx, names, tfm);\n                tfm.js\n                    .line(format!(\"{js_helper}({}, {});\", js.code, buf.buf_name()));\n                tfm.rust.decl(\n                    name,\n                    format!(\"{rust_helper}({}{})\", tfm.buf_ref, buf.end_name()),\n                );\n            }\n        }\n\n        Struct(struct_index) => {\n            let js = tfm.js.find(name, ty, RefMany);\n            let s = &ast.structs[*struct_index];\n            let mut item_names = Vec::new();\n            for f in &s.fields {\n                let item_name = names.create(&format!(\"{name}_{}\", f.name));\n                tfm.js\n                    .maybe_pure_decl(js.pure, &item_name, member_access(&js.code, &f.name));\n                transform_to_rust(ast, ctx, names, tfm, &item_name, &f.ty);\n                item_names.push(item_name.into());\n            }\n            rust_decl_ctor(&mut tfm.rust, name, &s.name, &s.fields, item_names);\n        }\n\n        Tuple(types) => {\n            let js = tfm.js.find(name, ty, RefMany);\n            let mut item_args = Vec::new();\n            for (i, item_ty) in types.iter().enumerate() {\n                let item_name = names.create(&format!(\"{name}_{i}\"));\n                tfm.js\n                    .maybe_pure_decl(js.pure, &item_name, format!(\"{}[{i}]\", js.code));\n                transform_to_rust(ast, ctx, names, tfm, &item_name, &item_ty);\n                item_args.push(RustArg {\n                    name: item_name,\n                    ty: item_ty.clone(),\n                });\n            }\n            let mut rust_code = tfm.rust.find_args(&item_args, RefInline);\n            if types.len() == 1 {\n                rust_code.push(',');\n            }\n            tfm.rust.decl(name, format!(\"({rust_code})\"));\n        }\n\n        Ptr(kind, inner_ty) => {\n            if let DynTrait(trait_index) = &**inner_ty {\n                let js_code = tfm.js.find(name, ty, RefInline).code;\n                let ptr_name = names.create(&format!(\"{name}_ptr\"));\n                let rust_helper = trait_to_rust_helper(ast, ctx, *trait_index);\n                let js_code = format!(\"_ffi_handle_alloc({js_code})\");\n                ctx.js_helpers\n                    .mark_used_group(JsGroup::Other, \"_ffi_handle_alloc\");\n                tfm.js.decl(&ptr_name, js_code);\n                add_ffi_arg(ast, ctx, tfm, &ptr_name, &ForeignHandle);\n                let ptr_code = tfm.rust.find(&ptr_name, &ForeignHandle, RefInline).code;\n                tfm.rust.decl(\n                    name,\n                    format!(\"{}::new({rust_helper}({ptr_code}))\", kind.path()),\n                );\n            } else if *kind == RustPtr::Box {\n                let js_code = tfm.js.find(name, ty, RefMany).code;\n                let (js_helper, rust_helper) = box_to_rust_helper(ast, ctx, inner_ty);\n                let buf = ensure_js_buf(ctx, names, tfm);\n                tfm.js\n                    .line(format!(\"{js_helper}({js_code}, {});\", buf.buf_name()));\n                tfm.rust.decl(\n                    name,\n                    format!(\"{rust_helper}({}{})\", tfm.buf_ref, buf.end_name()),\n                );\n            } else {\n                unreachable!()\n            }\n        }\n\n        Vector(inner_ty) => {\n            let js_code = tfm.js.find(name, ty, RefMany).code;\n            let len_name = names.create(&format!(\"{name}_len\"));\n            let (js_helper, rust_helper) = vec_to_rust_helper(ast, ctx, inner_ty);\n            let buf = ensure_js_buf(ctx, names, tfm);\n            tfm.js.decl(&len_name, format!(\"{js_code}.length\"));\n            add_ffi_arg(ast, ctx, tfm, &len_name, &Usize);\n            tfm.js\n                .line(format!(\"{js_helper}({js_code}, {});\", buf.buf_name()));\n            let len_code = tfm.rust.find(&len_name, ty, RefInline).code;\n            tfm.rust.decl(\n                name,\n                format!(\n                    \"{rust_helper}({len_code}, {}{})\",\n                    tfm.buf_ref,\n                    buf.end_name()\n                ),\n            );\n        }\n\n        Optional(inner_ty) => {\n            let js_code = tfm.js.find(name, ty, RefMany).code;\n            let has_name = names.create(&format!(\"has_{name}\"));\n            let val_name = names.create(&format!(\"{name}_val\"));\n            ensure_js_buf(ctx, names, tfm);\n\n            tfm.js.decl(&has_name, format!(\"{js_code} !== null\"));\n            add_ffi_arg(ast, ctx, tfm, &has_name, &Bool);\n\n            let mut rust = FnBuilder::default();\n            tfm.js.line(format!(\"if ({js_code} !== null) {{\"));\n            tfm.js.decl(&val_name, format!(\"{js_code}\"));\n            {\n                let old = tfm.buf_status;\n                tfm.buf_status = BufStatus::Inside;\n                std::mem::swap(&mut tfm.rust, &mut rust);\n                transform_to_rust(ast, ctx, names, tfm, &val_name, inner_ty);\n                std::mem::swap(&mut tfm.rust, &mut rust);\n                tfm.buf_status = old;\n            }\n            tfm.js.line(\"}\".into());\n\n            let has_code = tfm.rust.find(&has_name, ty, RefInline).code;\n            let val_code = rust.find(&val_name, ty, RefInline).code;\n            if rust.is_empty() {\n                tfm.rust\n                    .decl(name, format!(\"{has_code}.then(|| {val_code})\"));\n            } else {\n                rust.insert_deferred_lines_here();\n                rust.line(val_code);\n                tfm.rust.line(format!(\"let {name} = {has_code}.then(|| {{\"));\n                tfm.rust.extend(rust);\n                tfm.rust.line(\"});\".to_string());\n            }\n        }\n\n        Pair { .. } | Verbatim(_) | DynTrait(_) => unreachable!(),\n    }\n}\n\nfn transform_to_js(\n    ast: &AST,\n    ctx: &mut WasmCtx,\n    names: &mut NameSet,\n    tfm: &mut Transform,\n    name: &str,\n    ty: &RustType,\n) {\n    use RustType::*;\n\n    fn add_ffi_arg(ctx: &mut WasmCtx, tfm: &mut Transform, name: &str, ty: &RustType) {\n        match tfm.buf_status {\n            BufStatus::Outside => {\n                tfm.ffi_args.push(RustArg {\n                    name: name.to_string(),\n                    ty: ty.clone(),\n                });\n                if let Bool = ty {\n                    // This comes over the FFI as an integer and needs a cast\n                    tfm.js.pure_decl(name, format!(\"!!{name}\"));\n                }\n            }\n            BufStatus::Inside => {\n                let buf_name = tfm.buf.as_ref().unwrap().buf_name();\n\n                // Rust (write)\n                let code = tfm.rust.find(name, ty, RefInline).code;\n                tfm.rust\n                    .line(format!(\"_ffi_write({code}, {}{buf_name});\", tfm.buf_ref));\n                ctx.rust_helpers.mark_used(\"_ffi_write\");\n\n                // JavaScript (read)\n                tfm.js.decl(name, js_read(ctx, buf_name, ty));\n            }\n        }\n    }\n\n    match ty {\n        Bool | U8 | U16 | U32 | Usize | U64 | I8 | I16 | I32 | Isize | I64 | F32 | F64\n        | ForeignHandle => {\n            add_ffi_arg(ctx, tfm, name, ty);\n        }\n\n        RefStr | OwnStr => {\n            let mut rust_code = tfm.rust.find(name, ty, RefInline).code;\n            let ptr_name = names.create(&format!(\"{name}_ptr\"));\n            let len_name = names.create(&format!(\"{name}_len\"));\n            let cap_name = names.create(&format!(\"{name}_cap\"));\n            if let RefStr = ty {\n                rust_code.push_str(\".into()\");\n            }\n            tfm.rust.line(format!(\n                \"let ({ptr_name}, {len_name}, {cap_name}) = _ffi_string_to_host({rust_code});\"\n            ));\n            ctx.rust_helpers.mark_used(\"_ffi_string_to_host\");\n            add_ffi_arg(ctx, tfm, &ptr_name, &ForeignHandle);\n            add_ffi_arg(ctx, tfm, &len_name, &Usize);\n            add_ffi_arg(ctx, tfm, &cap_name, &Usize);\n            let cap_code = tfm.js.find(&cap_name, &Usize, RefInline).code;\n            let len_code = tfm.js.find(&len_name, &Usize, RefInline).code;\n            let ptr_code = tfm.js.find(&ptr_name, &ForeignHandle, RefInline).code;\n            tfm.js.decl(\n                name,\n                format!(\"_ffi_string_from_rust({ptr_code}, {len_code}, {cap_code})\"),\n            );\n            ctx.js_helpers\n                .mark_used_group(JsGroup::Other, \"_ffi_string_from_rust\");\n        }\n\n        Enum(enum_index) => {\n            let rust = tfm.rust.find(name, ty, RefInline);\n            let e = &ast.enums[*enum_index];\n            if !e.has_fields() {\n                tfm.rust\n                    .maybe_pure_decl(rust.pure, name, format!(\"{} as i32\", rust.code));\n                add_ffi_arg(ctx, tfm, name, &I32);\n            } else {\n                let (js_helper, rust_helper) = enum_to_js_helper(ast, ctx, *enum_index);\n                let buf = ensure_rust_buf(ctx, names, tfm);\n                tfm.rust.line(format!(\n                    \"{rust_helper}({}, {}{});\",\n                    rust.code,\n                    tfm.buf_ref,\n                    buf.buf_name()\n                ));\n                tfm.js\n                    .decl_ty(name, ty.clone(), format!(\"{js_helper}({})\", buf.buf_name()));\n            }\n        }\n\n        Struct(struct_index) => {\n            let rust = tfm.rust.find(name, ty, RefMany);\n            let s = &ast.structs[*struct_index];\n            let mut item_names = Vec::new();\n            for f in &s.fields {\n                let item_name = names.create(&format!(\"{name}_{}\", f.name));\n                tfm.rust.maybe_pure_decl(\n                    rust.pure,\n                    &item_name,\n                    format!(\"{}.{}\", rust.code, f.name),\n                );\n                transform_to_js(ast, ctx, names, tfm, &item_name, &f.ty);\n                item_names.push(item_name.into());\n            }\n            if s.fields.is_empty() {\n                tfm.js.decl_ty(name, ty.clone(), \"{}\".to_string());\n\n                // Avoid an unused variable warning in Rust\n                let code = tfm.rust.find(name, ty, RefInline).code;\n                tfm.rust.line(format!(\"_ = {code};\"));\n            } else {\n                let fields = tfm\n                    .js\n                    .find_fields(&s.fields, item_names, RefInline, \"{ \", \" }\");\n                tfm.js.decl_ty(name, ty.clone(), fields);\n            }\n        }\n\n        Tuple(types) => {\n            let rust = tfm.rust.find(name, ty, RefMany);\n            let mut item_args = Vec::new();\n            for (i, item_ty) in types.iter().enumerate() {\n                let item_name = names.create(&format!(\"{name}_{i}\"));\n                tfm.rust\n                    .maybe_pure_decl(rust.pure, &item_name, format!(\"{}.{i}\", rust.code));\n                transform_to_js(ast, ctx, names, tfm, &item_name, &item_ty);\n                item_args.push(RustArg {\n                    name: item_name,\n                    ty: item_ty.clone(),\n                });\n            }\n            if types.is_empty() {\n                tfm.js.pure_decl(name, \"undefined\".to_string());\n\n                // Avoid an unused variable warning in Rust\n                let code = tfm.rust.find(name, ty, RefInline).code;\n                tfm.rust.line(format!(\"_ = {code};\"));\n            } else {\n                let js_code = tfm.js.find_args(&item_args, RefInline);\n                tfm.js.decl_ty(name, ty.clone(), format!(\"[{js_code}]\"));\n            }\n        }\n\n        Ptr(kind, inner_ty) => {\n            if let DynTrait(trait_index) = &**inner_ty {\n                let rust_code = tfm.rust.find(name, ty, RefInline).code;\n                let ptr_name = names.create(&format!(\"{name}_ptr\"));\n                let js_helper = trait_to_js_helper(ast, ctx, *trait_index, *kind);\n                tfm.rust.decl(\n                    &ptr_name,\n                    format!(\"Box::into_raw(Box::new({rust_code})) as *const u8\"),\n                );\n                add_ffi_arg(ctx, tfm, &ptr_name, &ForeignHandle);\n                let ptr_code = tfm.js.find(&ptr_name, &ForeignHandle, RefInline).code;\n                tfm.js\n                    .decl_ty(name, ty.clone(), format!(\"new {js_helper}({ptr_code})\"));\n            } else if *kind == RustPtr::Box {\n                let rust_code = tfm.rust.find(name, ty, RefInline).code;\n                let (js_helper, rust_helper) = box_to_js_helper(ast, ctx, inner_ty);\n                let buf = ensure_rust_buf(ctx, names, tfm);\n                tfm.rust.line(format!(\n                    \"{rust_helper}(*{rust_code}, {}{});\",\n                    tfm.buf_ref,\n                    buf.buf_name()\n                ));\n                tfm.js\n                    .decl(name, format!(\"{js_helper}({})\", buf.buf_name()));\n            } else {\n                unreachable!()\n            }\n        }\n\n        Vector(inner_ty) => {\n            let rust_code = tfm.rust.find(name, ty, RefMany).code;\n            let len_name = names.create(&format!(\"{name}_len\"));\n            let (js_helper, rust_helper) = vec_to_js_helper(ast, ctx, inner_ty);\n            let buf = ensure_rust_buf(ctx, names, tfm);\n            tfm.rust.decl(&len_name, format!(\"{rust_code}.len()\"));\n            add_ffi_arg(ctx, tfm, &len_name, &Usize);\n            tfm.rust.line(format!(\n                \"{rust_helper}({rust_code}, {}{});\",\n                tfm.buf_ref,\n                buf.buf_name()\n            ));\n            let len_code = tfm.js.find(&len_name, ty, RefInline).code;\n            tfm.js\n                .decl(name, format!(\"{js_helper}({len_code}, {})\", buf.buf_name()));\n        }\n\n        Optional(inner_ty) => {\n            let rust_code = tfm.rust.find(name, ty, RefMany).code;\n            let has_name = names.create(&format!(\"has_{name}\"));\n            let val_name = names.create(&format!(\"{name}_val\"));\n            ensure_rust_buf(ctx, names, tfm);\n\n            tfm.rust.decl(&has_name, format!(\"{rust_code}.is_some()\"));\n            add_ffi_arg(ctx, tfm, &has_name, &Bool);\n\n            let mut js = FnBuilder::default();\n            tfm.rust\n                .line(format!(\"if let Some({val_name}) = {rust_code} {{\"));\n            {\n                let old = tfm.buf_status;\n                tfm.buf_status = BufStatus::Inside;\n                std::mem::swap(&mut tfm.js, &mut js);\n                transform_to_js(ast, ctx, names, tfm, &val_name, inner_ty);\n                std::mem::swap(&mut tfm.js, &mut js);\n                tfm.buf_status = old;\n            }\n            tfm.rust.line(\"}\".into());\n\n            let has_code = tfm.js.find(&has_name, ty, RefInline).code;\n            let has_code = has_code.strip_prefix(\"!!\").unwrap_or(&has_code);\n            let val_code = js.find(&val_name, ty, RefInline).code;\n            if js.is_empty() {\n                tfm.js\n                    .decl_ty(name, ty.clone(), format!(\"{has_code} ? {val_code} : null\"));\n            } else {\n                js.insert_deferred_lines_here();\n                js.line(format!(\"{name} = {val_code};\"));\n                tfm.js.decl_ty(name, ty.clone(), \"null\".into());\n                tfm.js.line(format!(\"if ({has_code}) {{\"));\n                tfm.js.extend(js);\n                tfm.js.line(\"}\".to_string());\n            }\n        }\n\n        Pair { .. } | Verbatim(_) | DynTrait(_) => unreachable!(),\n    }\n}\n\nfn ensure_js_buf(ctx: &mut WasmCtx, names: &mut NameSet, tfm: &mut Transform) -> Rc<SharedBuf> {\n    if let Some(buf) = &tfm.buf {\n        return buf.clone();\n    }\n\n    let buf_name = names.create(\"buf\");\n    let ptr_name = names.create(\"buf_ptr\");\n    let end_name = names.create(\"buf_end\");\n    let buf = SharedBuf::new(&buf_name, &end_name);\n\n    // JavaScript (write)\n    tfm.js\n        .line(format!(\"let {buf_name} = _ffi_new_WriteBuf();\"));\n    tfm.js\n        .defer_decl(&ptr_name, format!(\"_ffi_buf_to_rust({buf_name})\"));\n    ctx.js_helpers\n        .mark_used_group(JsGroup::Let, \"_ffi_new_WriteBuf\");\n    ctx.js_helpers\n        .mark_used_group(JsGroup::Other, \"_ffi_buf_to_rust\");\n\n    // Rust (read)\n    tfm.rust.line_alt(\n        // Avoid a warning about an unnecessarily mutable variable\n        format!(\"let {end_name} = {ptr_name};\"),\n        format!(\"let mut {end_name} = {ptr_name};\"),\n        buf.is_buf_name_used_flag(),\n    );\n    tfm.rust\n        .defer_line(format!(\"_ffi_buf_from_host({ptr_name}, {end_name});\"));\n    ctx.rust_helpers.mark_used(\"_ffi_buf_from_host\");\n\n    // FFI\n    tfm.buf = Some(buf.clone());\n    tfm.buf_ref = \"&mut \";\n    tfm.ffi_args.push(RustArg {\n        name: ptr_name,\n        ty: RustType::ForeignHandle,\n    });\n    buf\n}\n\nfn ensure_rust_buf(ctx: &mut WasmCtx, names: &mut NameSet, tfm: &mut Transform) -> Rc<SharedBuf> {\n    if let Some(buf) = &tfm.buf {\n        return buf.clone();\n    }\n\n    let buf_name = names.create(\"buf\");\n    let ptr_name = names.create(\"buf_ptr\");\n    let cap_name = names.create(\"buf_cap\");\n    let buf = SharedBuf::new(&buf_name, \"\");\n\n    // Rust (write)\n    tfm.rust.line_alt(\n        // Avoid a warning about an unnecessarily mutable variable\n        format!(\"let {buf_name} = Vec::<u8>::new();\"),\n        format!(\"let mut {buf_name} = Vec::<u8>::new();\"),\n        buf.is_buf_name_used_flag(),\n    );\n    tfm.rust.defer_line(format!(\n        \"let ({ptr_name}, {cap_name}) = _ffi_buf_to_host({buf_name});\"\n    ));\n    ctx.rust_helpers.mark_used(\"_ffi_buf_to_host\");\n\n    // JavaScript (read)\n    tfm.js\n        .line(format!(\"let {buf_name} = _ffi_new_ReadBuf({ptr_name});\"));\n    tfm.js.defer_line(format!(\n        \"_ffi_exports._ffi_dealloc({ptr_name}, {cap_name});\"\n    ));\n    ctx.js_helpers\n        .mark_used_group(JsGroup::Let, \"_ffi_new_ReadBuf\");\n    ctx.js_helpers\n        .mark_used_group(JsGroup::Exports, \"_ffi_dealloc\");\n\n    // FFI\n    tfm.buf = Some(buf.clone());\n    tfm.buf_ref = \"&mut \";\n    tfm.ffi_args.push(RustArg {\n        name: ptr_name,\n        ty: RustType::ForeignHandle,\n    });\n    tfm.ffi_args.push(RustArg {\n        name: cap_name,\n        ty: RustType::Usize,\n    });\n    buf\n}\n\nfn vec_to_rust_helper(ast: &AST, ctx: &mut WasmCtx, inner_ty: &RustType) -> (String, String) {\n    if let Some(result) = ctx.vec_to_rust_helpers.get(inner_ty) {\n        return result.clone();\n    }\n\n    let mut base_name = \"_ffi_vec_\".to_string();\n    append_type_name_hint(&mut base_name, ast, inner_ty);\n    let js_name = ctx.helper_names.create(&format!(\"{base_name}_to_rust\"));\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_from_js\"));\n\n    // This must be done first to avoid a stack overflow\n    ctx.vec_to_rust_helpers\n        .insert(inner_ty.clone(), (js_name.clone(), rust_name.clone()));\n\n    let mut locals = NameSet::default();\n    let vec_name = locals.create(\"items\");\n    let item_name = locals.create(\"item\");\n    let end_name = locals.create(\"end\");\n    let len_name = locals.create(\"len\");\n    let buf_name = locals.create(\"buf\");\n\n    // Transform the items\n    let mut tfm = Transform::default();\n    let buf = SharedBuf::new(&buf_name, &end_name);\n    tfm.buf = Some(buf.clone());\n    tfm.buf_status = BufStatus::Inside;\n    tfm.js.mark_pure(&item_name);\n    transform_to_rust(ast, ctx, &mut locals, &mut tfm, &item_name, &inner_ty);\n    let item_code = tfm.rust.find(&item_name, inner_ty, RefInline).code;\n    tfm.rust.line(format!(\"{vec_name}.push({item_code});\"));\n\n    // JavaScript\n    {\n        let mut js = JsString::default();\n        _ = write!(js, \"\\nfunction {js_name}({vec_name}\");\n        js.push_ts(\": \");\n        append_ts_type(&mut js, ast, &RustType::Vector(inner_ty.clone().into()));\n        _ = write!(js, \", {buf_name}\");\n        js.push_ts(\": _ffi_WriteBuf\");\n        js.push_both(\")\");\n        js.push_ts(\": void\");\n        js.push_both(\" {\\n\");\n        if !tfm.js.is_empty() {\n            _ = write!(js, \"    for (const {item_name} of {vec_name}) {{\\n\");\n            tfm.js.write_to_js(ast, &mut js, \"        \");\n            js.push_both(\"    }\\n\");\n        }\n        js.push_both(\"}\\n\");\n        ctx.js_helpers\n            .add_group(JsGroup::Other, &js_name, js)\n            .add_dep_group(JsGroup::Other, \"_ffi_WriteBuf\")\n            .mark_used();\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        let mut item_ty = String::new();\n        let end_name = buf.final_end_name_for_rust();\n        append_rust_type(&mut item_ty, ast, inner_ty);\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(\n            rust,\n            \"\\nfn {rust_name}({len_name}: usize, {end_name}: &mut *const u8) -> Vec<{item_ty}> {{\\n\"\n        );\n        _ = write!(\n            rust,\n            \"    let mut {vec_name} = Vec::<{item_ty}>::with_capacity({len_name});\\n\"\n        );\n        _ = write!(rust, \"    for _ in 0..{len_name} {{\\n\");\n        tfm.rust.write_to_rust(ast, &mut rust, \"        \");\n        rust.push_str(\"    }\\n\");\n        _ = write!(rust, \"    {vec_name}\\n\");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n    }\n\n    (js_name, rust_name)\n}\n\nfn vec_to_js_helper(ast: &AST, ctx: &mut WasmCtx, inner_ty: &RustType) -> (String, String) {\n    if let Some(result) = ctx.vec_to_js_helpers.get(inner_ty) {\n        return result.clone();\n    }\n\n    let mut base_name = \"_ffi_vec_\".to_string();\n    append_type_name_hint(&mut base_name, ast, inner_ty);\n    let js_name = ctx.helper_names.create(&format!(\"{base_name}_from_rust\"));\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_to_js\"));\n\n    // This must be done first to avoid a stack overflow\n    ctx.vec_to_js_helpers\n        .insert(inner_ty.clone(), (js_name.clone(), rust_name.clone()));\n\n    let mut locals = NameSet::default();\n    let vec_name = locals.create(\"items\");\n    let item_name = locals.create(\"item\");\n    let len_name = locals.create(\"len\");\n    let buf_name = locals.create(\"buf\");\n\n    // Transform the items\n    let mut tfm = Transform::default();\n    let buf = SharedBuf::new(&buf_name, \"\");\n    tfm.buf = Some(buf.clone());\n    tfm.buf_status = BufStatus::Inside;\n    tfm.rust.mark_pure(&item_name);\n    transform_to_js(ast, ctx, &mut locals, &mut tfm, &item_name, &inner_ty);\n    let item_code = tfm.js.find(&item_name, inner_ty, RefInline).code;\n    tfm.js.line(format!(\"{vec_name}.push({item_code});\"));\n\n    // Rust\n    {\n        let mut rust = String::new();\n        let buf_name = buf.final_buf_name_for_rust();\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(rust, \"\\nfn {rust_name}({vec_name}: Vec<\");\n        append_rust_type(&mut rust, ast, inner_ty);\n        _ = write!(rust, \">, {buf_name}: &mut Vec<u8>) {{\\n\");\n        if !tfm.rust.is_empty() {\n            _ = write!(rust, \"    for {item_name} in {vec_name} {{\\n\");\n            tfm.rust.write_to_rust(ast, &mut rust, \"        \");\n            rust.push_str(\"    }\\n\");\n        }\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n    }\n\n    // JavaScript\n    {\n        let mut js = JsString::default();\n        let array_ty = RustType::Vector(inner_ty.clone().into());\n        _ = write!(js, \"\\nfunction {js_name}({len_name}\");\n        js.push_ts(\": number\");\n        _ = write!(js, \", {buf_name}\");\n        js.push_ts(\": _ffi_ReadBuf\");\n        js.push_both(\")\");\n        js.push_ts(\": \");\n        append_ts_type(&mut js, ast, &array_ty);\n        js.push_both(\" {\\n\");\n        _ = write!(js, \"    let {vec_name}\");\n        js.push_ts(\": \");\n        append_ts_type(&mut js, ast, &array_ty);\n        js.push_both(\" = [];\\n\");\n        _ = write!(js, \"    while ({vec_name}.length < {len_name}) {{\\n\");\n        tfm.js.write_to_js(ast, &mut js, \"        \");\n        js.push_both(\"    }\\n\");\n        _ = write!(js, \"    return {vec_name};\\n\");\n        js.push_both(\"}\\n\");\n        ctx.js_helpers\n            .add_group(JsGroup::Other, &js_name, js)\n            .add_dep_group(JsGroup::Other, \"_ffi_ReadBuf\")\n            .mark_used();\n    }\n\n    (js_name, rust_name)\n}\n\nfn trait_to_rust_helper(ast: &AST, ctx: &mut WasmCtx, trait_index: usize) -> String {\n    if let Some(result) = ctx.trait_to_rust_helpers.get(&trait_index) {\n        return result.clone();\n    }\n\n    let t = &ast.traits[trait_index];\n    let rust_name = format!(\"_ffi_rs_{}\", t.name);\n\n    // This must be done first to avoid a stack overflow\n    ctx.trait_to_rust_helpers\n        .insert(trait_index, rust_name.clone());\n\n    // Rust\n    {\n        let mut rust = String::new();\n        allow_non_camel_case_types(&mut rust, &rust_name);\n        _ = write!(rust, \"\\nstruct {rust_name}(*const u8);\\n\");\n        _ = write!(rust, \"\\nimpl Drop for {rust_name} {{\\n\");\n        rust.push_str(\"    fn drop(&mut self) {\\n\");\n        _ = write!(\n            rust,\n            \"        {} \\\"C\\\" {{ fn _ffi_js_drop(_: *const u8); }}\\n\",\n            ctx.syntax.unsafe_extern()\n        );\n        _ = write!(rust, \"        unsafe {{ _ffi_js_drop(self.0) }};\\n\");\n        rust.push_str(\"    }\\n\");\n        rust.push_str(\"}\\n\");\n        _ = write!(rust, \"\\nimpl {} for {rust_name} {{\", t.name);\n        for f in &t.fns {\n            generate_rust_to_js_fn(ast, ctx, t, f, &mut rust);\n        }\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n        ctx.js_helpers\n            .mark_used_group(JsGroup::Imports, \"_ffi_js_drop\");\n    }\n\n    rust_name\n}\n\nfn trait_to_js_helper(ast: &AST, ctx: &mut WasmCtx, trait_index: usize, kind: RustPtr) -> String {\n    if let Some(result) = ctx.trait_to_js_helpers.get(&(kind, trait_index)) {\n        return result.clone();\n    }\n\n    let t = &ast.traits[trait_index];\n    let drop_name = format!(\"_ffi_rs_drop_{kind:?}_{}\", t.name);\n    let reg_name = format!(\"_ffi_reg_{kind:?}_{}\", t.name);\n    let js_name = format!(\"_ffi_{kind:?}_{}\", t.name);\n\n    // This must be done first to avoid a stack overflow\n    ctx.trait_to_js_helpers\n        .insert((kind, trait_index), js_name.clone());\n\n    // JavaScript\n    {\n        let reg_js = JsString::from_template(&format!(\n            \"let {reg_name} = new FinalizationRegistry((ptr«: number») => _ffi_exports.{drop_name}(ptr));\\n\"\n        ));\n        let mut js = JsString::from_template(&format!(\n            r#\"\nconst {js_name} = class {}« implements {}» {{\n«    declare readonly _: number;\n\n»    constructor(_«: number») {{\n        Object.defineProperty(this, \"_\", {{ value: _ }});\n        {reg_name}.register(this, _);\n    }}\n\"#,\n            t.name, t.name\n        ));\n        for f in &t.fns {\n            let info = Some(TraitInfo { t, kind });\n            generate_js_to_rust_fn(ast, ctx, f, &mut js, info);\n        }\n        js.push_both(\"};\\n\");\n        ctx.js_helpers.add_group(JsGroup::Let, &reg_name, reg_js);\n        ctx.js_helpers\n            .add_group(JsGroup::Other, &js_name, js)\n            .add_dep_group(JsGroup::Let, &reg_name)\n            .mark_used();\n    }\n\n    // TypeScript (export)\n    {\n        ctx.js_helpers\n            .add_group(\n                JsGroup::Exports,\n                &drop_name,\n                JsString::from_template(&format!(\"«    {drop_name}: (ptr: number) => void,\\n»\")),\n            )\n            .mark_used();\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        _ = write!(rust, \"\\n{}\\n\", ctx.syntax.unsafe_no_mangle());\n        _ = write!(rust, \"extern \\\"C\\\" fn {drop_name}(ptr: *const u8) {{\\n\");\n        _ = write!(\n            rust,\n            \"    drop(unsafe {{ Box::from_raw(ptr as *mut {}<dyn {}>) }});\\n\",\n            kind.path(),\n            t.name\n        );\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&drop_name, rust).mark_used();\n    }\n\n    js_name\n}\n\nfn box_to_rust_helper(ast: &AST, ctx: &mut WasmCtx, inner_ty: &RustType) -> (String, String) {\n    if let Some(result) = ctx.box_to_rust_helpers.get(inner_ty) {\n        return result.clone();\n    }\n\n    let mut base_name = \"_ffi_box_\".to_string();\n    append_type_name_hint(&mut base_name, ast, inner_ty);\n    let js_name = ctx.helper_names.create(&format!(\"{base_name}_to_rust\"));\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_from_js\"));\n\n    // This must be done first to avoid a stack overflow\n    ctx.box_to_rust_helpers\n        .insert(inner_ty.clone(), (js_name.clone(), rust_name.clone()));\n\n    let mut locals = NameSet::default();\n    let val_name = locals.create(\"val\");\n    let end_name = locals.create(\"end\");\n    let buf_name = locals.create(\"buf\");\n\n    // Transform the value\n    let mut tfm = Transform::default();\n    let buf = SharedBuf::new(&buf_name, &end_name);\n    tfm.buf = Some(buf.clone());\n    tfm.buf_status = BufStatus::Inside;\n    tfm.js.mark_pure(&val_name);\n    transform_to_rust(ast, ctx, &mut locals, &mut tfm, &val_name, &inner_ty);\n    let val_code = tfm.rust.find(&val_name, inner_ty, RefInline).code;\n    tfm.rust.line(format!(\"Box::new({val_code})\"));\n\n    // JavaScript\n    {\n        let mut js = JsString::default();\n        _ = write!(js, \"\\nfunction {js_name}({val_name}\");\n        js.push_ts(\": \");\n        append_ts_type(&mut js, ast, &inner_ty);\n        _ = write!(js, \", {buf_name}\");\n        js.push_ts(\": _ffi_WriteBuf\");\n        js.push_both(\")\");\n        js.push_ts(\": void\");\n        js.push_both(\" {\\n\");\n        tfm.js.write_to_js(ast, &mut js, \"    \");\n        js.push_both(\"}\\n\");\n        ctx.js_helpers\n            .add_group(JsGroup::Other, &js_name, js)\n            .add_dep_group(JsGroup::Other, \"_ffi_WriteBuf\")\n            .mark_used();\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        let mut item_ty = String::new();\n        let end_name = buf.final_end_name_for_rust();\n        append_rust_type(&mut item_ty, ast, inner_ty);\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(\n            rust,\n            \"\\nfn {rust_name}({end_name}: &mut *const u8) -> Box<{item_ty}> {{\\n\"\n        );\n        tfm.rust.write_to_rust(ast, &mut rust, \"    \");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n    }\n\n    (js_name, rust_name)\n}\n\nfn box_to_js_helper(ast: &AST, ctx: &mut WasmCtx, inner_ty: &RustType) -> (String, String) {\n    if let Some(result) = ctx.box_to_js_helpers.get(inner_ty) {\n        return result.clone();\n    }\n\n    let mut base_name = \"_ffi_box_\".to_string();\n    append_type_name_hint(&mut base_name, ast, inner_ty);\n    let js_name = ctx.helper_names.create(&format!(\"{base_name}_from_rust\"));\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_to_js\"));\n\n    // This must be done first to avoid a stack overflow\n    ctx.box_to_js_helpers\n        .insert(inner_ty.clone(), (js_name.clone(), rust_name.clone()));\n\n    let mut locals = NameSet::default();\n    let val_name = locals.create(\"val\");\n    let buf_name = locals.create(\"buf\");\n\n    // Transform the value\n    let mut tfm = Transform::default();\n    let buf = SharedBuf::new(&buf_name, \"\");\n    tfm.buf = Some(buf.clone());\n    tfm.buf_status = BufStatus::Inside;\n    tfm.rust.mark_pure(&val_name);\n    transform_to_js(ast, ctx, &mut locals, &mut tfm, &val_name, &inner_ty);\n    let val_code = tfm.js.find(&val_name, inner_ty, RefInline).code;\n    tfm.js.line(format!(\"return {val_code};\"));\n\n    // Rust\n    {\n        let mut rust = String::new();\n        let buf_name = buf.final_buf_name_for_rust();\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(rust, \"\\nfn {rust_name}({val_name}: \");\n        append_rust_type(&mut rust, ast, inner_ty);\n        _ = write!(rust, \", {buf_name}: &mut Vec<u8>) {{\\n\");\n        tfm.rust.write_to_rust(ast, &mut rust, \"    \");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n    }\n\n    // JavaScript\n    {\n        let mut js = JsString::default();\n        _ = write!(js, \"\\nfunction {js_name}({buf_name}\");\n        js.push_ts(\": _ffi_ReadBuf\");\n        js.push_both(\")\");\n        js.push_ts(\": \");\n        append_ts_type(&mut js, ast, &inner_ty);\n        js.push_both(\" {\\n\");\n        tfm.js.write_to_js(ast, &mut js, \"    \");\n        js.push_both(\"}\\n\");\n        ctx.js_helpers\n            .add_group(JsGroup::Other, &js_name, js)\n            .add_dep_group(JsGroup::Other, \"_ffi_ReadBuf\")\n            .mark_used();\n    }\n\n    (js_name, rust_name)\n}\n\nfn enum_to_rust_helper(ast: &AST, ctx: &mut WasmCtx, enum_index: usize) -> (String, String) {\n    if let Some(result) = ctx.enum_to_rust_helpers.get(&enum_index) {\n        return result.clone();\n    }\n\n    let e = &ast.enums[enum_index];\n    let base_name = format!(\"_ffi_enum_{}\", e.name);\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_from_js\"));\n    let js_name = ctx.helper_names.create(&format!(\"{base_name}_to_rust\"));\n\n    // This must be done first to avoid a stack overflow\n    ctx.enum_to_rust_helpers\n        .insert(enum_index, (js_name.clone(), rust_name.clone()));\n\n    let mut locals = NameSet::default();\n    let val_name = locals.create(\"val\");\n    let buf_name = locals.create(\"buf\");\n    let end_name = locals.create(\"end\");\n    let mut branches = Vec::new();\n\n    // Enums without fields are just integers\n    if !e.has_fields() {\n        let mut rust = String::new();\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(rust, \"\\nfn {rust_name}({val_name}: i32) -> {} {{\\n\", e.name);\n        _ = write!(rust, \"    match {val_name} {{\\n\");\n        for v in &e.variants {\n            _ = write!(\n                rust,\n                \"        {} => {}::{},\\n\",\n                v.discriminant, e.name, v.name\n            );\n        }\n        rust.push_str(\"        _ => panic!(),\\n\");\n        rust.push_str(\"    }\\n\");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers.add(&rust_name, rust).mark_used();\n        return (js_name, rust_name);\n    }\n\n    struct Branch {\n        tfm: Transform,\n    }\n\n    // Transform all fields for each variant in a separate branch\n    for v in &e.variants {\n        let mut branch_locals = locals.clone();\n        let mut fields = Vec::new();\n        let mut tfm = Transform::default();\n        let buf = SharedBuf::new(&buf_name, &end_name);\n        tfm.buf = Some(buf.clone());\n        tfm.buf_status = BufStatus::Inside;\n        for f in &v.fields {\n            let field_name = branch_locals.create(&name_for_match(&f.name, v.fields.len()));\n            tfm.js\n                .pure_decl(field_name.clone(), member_access(&val_name, &f.name));\n            transform_to_rust(ast, ctx, &mut branch_locals, &mut tfm, &field_name, &f.ty);\n            fields.push(field_name);\n        }\n        rust_decl_ctor(\n            &mut tfm.rust,\n            &val_name,\n            &format!(\"{}::{}\", e.name, v.name),\n            &v.fields,\n            fields.iter().map(|x| Cow::Borrowed(x.as_str())).collect(),\n        );\n        branches.push(Branch { tfm });\n    }\n\n    // JavaScript\n    {\n        let mut js = JsString::from_template(&format!(\n            \"\\nfunction {js_name}({val_name}«: {}», {buf_name}«: _ffi_WriteBuf»)«: void» {{\\n\",\n            e.name\n        ));\n        _ = write!(js, \"    switch ({val_name}.$) {{\\n\");\n        for (v, branch) in e.variants.iter().zip(&mut branches) {\n            let write = js_write(\n                ctx,\n                &buf_name,\n                &format!(\"{}\", v.discriminant),\n                &RustType::I32,\n            );\n            _ = write!(js, \"        case {:?}:\\n\", v.name);\n            _ = write!(js, \"            {}\\n\", write);\n            branch.tfm.js.write_to_js(ast, &mut js, \"            \");\n            js.push_both(\"            break;\\n\");\n        }\n        js.push_both(\"        default:\\n\");\n        _ = write!(\n            js,\n            \"            throw TypeError({:?});\\n\",\n            format!(\"Invalid value for enum {:?}\", e.name)\n        );\n        js.push_both(\"    }\\n\");\n        js.push_both(\"}\\n\");\n        ctx.js_helpers\n            .add_group(JsGroup::Other, &js_name, js)\n            .add_dep_group(JsGroup::Other, \"_ffi_WriteBuf\")\n            .mark_used();\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(\n            rust,\n            \"\\nfn {rust_name}({end_name}: &mut *const u8) -> {} {{\\n\",\n            e.name\n        );\n        _ = write!(rust, \"    match _ffi_read::<i32>({end_name}) {{\\n\");\n        for (v, branch) in e.variants.iter().zip(&mut branches) {\n            let val_code = branch\n                .tfm\n                .rust\n                .find(&val_name, &RustType::Enum(enum_index), RefInline)\n                .code;\n            if branch.tfm.rust.is_empty() {\n                let val_code = format!(\"{} => {val_code},\", v.discriminant);\n                branch.tfm.rust.line(val_code);\n                branch.tfm.rust.write_to_rust(ast, &mut rust, \"        \");\n            } else {\n                _ = write!(rust, \"        {} => {{\", v.discriminant);\n                branch.tfm.rust.line(val_code);\n                branch\n                    .tfm\n                    .rust\n                    .write_to_rust(ast, &mut rust, \"            \");\n                rust.push_str(\"        }\\n\");\n            }\n        }\n        rust.push_str(\"        _ => panic!(),\\n\");\n        rust.push_str(\"    }\\n\");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers\n            .add(&rust_name, rust)\n            .add_dep(\"_ffi_read\")\n            .mark_used();\n    }\n\n    (js_name, rust_name)\n}\n\nfn enum_to_js_helper(ast: &AST, ctx: &mut WasmCtx, enum_index: usize) -> (String, String) {\n    if let Some(result) = ctx.enum_to_js_helpers.get(&enum_index) {\n        return result.clone();\n    }\n\n    let e = &ast.enums[enum_index];\n    let base_name = format!(\"_ffi_enum_{}\", e.name);\n    let js_name = ctx.helper_names.create(&format!(\"{base_name}_from_rust\"));\n    let rust_name = ctx.helper_names.create(&format!(\"{base_name}_to_js\"));\n\n    // This must be done first to avoid a stack overflow\n    ctx.enum_to_js_helpers\n        .insert(enum_index, (js_name.clone(), rust_name.clone()));\n\n    struct Branch {\n        tfm: Transform,\n        fields: Vec<String>,\n    }\n\n    let mut locals = NameSet::default();\n    let val_name = locals.create(\"val\");\n    let buf_name = locals.create(\"buf\");\n    let mut branches = Vec::new();\n    let mut js_deps = HashSet::new();\n\n    // Transform all fields for each variant in a separate branch\n    for v in &e.variants {\n        let mut branch_locals = locals.clone();\n        let mut fields = Vec::new();\n        let mut tfm = Transform::default();\n        let buf = SharedBuf::new(&buf_name, \"\");\n        tfm.buf = Some(buf.clone());\n        tfm.buf_status = BufStatus::Inside;\n        for f in &v.fields {\n            let field_name = branch_locals.create(&name_for_match(&f.name, v.fields.len()));\n            tfm.rust.mark_pure(&field_name);\n            transform_to_js(ast, ctx, &mut branch_locals, &mut tfm, &field_name, &f.ty);\n            fields.push(field_name);\n        }\n        let mut val_fields = vec![RustField {\n            name: \"$\".to_string(),\n            ty: RustType::ForeignHandle,\n        }];\n        let mut val_names = vec![Cow::Owned(format!(\"{:?}\", v.name))];\n        val_fields.extend_from_slice(&v.fields);\n        for name in &fields {\n            val_names.push(Cow::Borrowed(name.as_str()));\n        }\n        let val_code = tfm\n            .js\n            .find_fields(&val_fields, val_names, RefInline, \"{ \", \" }\");\n        if v.fields.is_empty() {\n            // Turn enums without fields into singletons to reduce garbage generation\n            let singleton_name = ctx\n                .helper_names\n                .create(&format!(\"_ffi_enum_{}__{}\", e.name, v.name));\n            let mut js =\n                JsString::from_template(&format!(\"let {}«: {}» = \", singleton_name, e.name));\n            js.push_both(&val_code);\n            js.push_both(\";\\n\");\n            ctx.js_helpers.add_group(JsGroup::Let, &singleton_name, js);\n            tfm.js.pure_decl(&val_name, singleton_name.clone());\n            js_deps.insert((JsGroup::Let, singleton_name));\n        } else {\n            tfm.js.decl(&val_name, val_code);\n        }\n        branches.push(Branch { tfm, fields });\n    }\n\n    // Rust\n    {\n        let mut rust = String::new();\n        allow_non_snake_case(&mut rust, &rust_name);\n        _ = write!(\n            rust,\n            \"\\nfn {rust_name}({val_name}: {}, {buf_name}: &mut Vec<u8>) {{\\n\",\n            e.name\n        );\n        _ = write!(rust, \"    match {val_name} {{\\n\");\n        for (v, branch) in e.variants.iter().zip(&mut branches) {\n            _ = write!(rust, \"        {}::{}\", e.name, v.name);\n            if v.fields.iter().any(|f| starts_with_digit(&f.name)) {\n                rust.push_str(\"(\");\n                for (i, name) in branch.fields.iter().enumerate() {\n                    rust.push_str(if i > 0 { \", \" } else { \"\" });\n                    rust.push_str(name);\n                }\n                rust.push_str(\")\");\n            } else if !v.fields.is_empty() {\n                rust.push_str(\" {\");\n                for (i, (f, name)) in v.fields.iter().zip(&branch.fields).enumerate() {\n                    rust.push_str(if i > 0 { \", \" } else { \" \" });\n                    if f.name != *name {\n                        _ = write!(rust, \"{}: \", f.name);\n                    }\n                    rust.push_str(name);\n                }\n                rust.push_str(\" }\");\n            }\n            if branch.tfm.rust.is_empty() {\n                _ = write!(\n                    rust,\n                    \" => _ffi_write({} as i32, {buf_name}),\\n\",\n                    v.discriminant\n                );\n            } else {\n                rust.push_str(\" => {\\n\");\n                _ = write!(\n                    rust,\n                    \"            _ffi_write({} as i32, {buf_name});\\n\",\n                    v.discriminant\n                );\n                branch\n                    .tfm\n                    .rust\n                    .write_to_rust(ast, &mut rust, \"            \");\n                rust.push_str(\"        }\\n\");\n            }\n        }\n        rust.push_str(\"    }\\n\");\n        rust.push_str(\"}\\n\");\n        ctx.rust_helpers\n            .add(&rust_name, rust)\n            .add_dep(\"_ffi_write\")\n            .mark_used();\n    }\n\n    // JavaScript\n    {\n        let mut js = JsString::from_template(&format!(\n            \"\\nfunction {js_name}({buf_name}«: _ffi_ReadBuf»)«: {}» {{\\n\",\n            e.name\n        ));\n        let read = js_read(ctx, &buf_name, &RustType::I32);\n        _ = write!(js, \"    switch ({read}) {{\\n\",);\n        for (v, branch) in e.variants.iter().zip(&mut branches) {\n            let val_code = branch\n                .tfm\n                .js\n                .find(&val_name, &RustType::Enum(enum_index), RefInline)\n                .code;\n            if branch.tfm.js.is_empty() {\n                let val_code = format!(\"case {}: return {val_code};\", v.discriminant);\n                branch.tfm.js.line(val_code);\n                branch.tfm.js.write_to_js(ast, &mut js, \"        \");\n            } else {\n                _ = write!(js, \"        case {}: {{\\n\", v.discriminant);\n                branch.tfm.js.line(format!(\"return {val_code};\"));\n                branch.tfm.js.write_to_js(ast, &mut js, \"            \");\n                js.push_both(\"        }\\n\");\n            }\n        }\n        js.push_both(\"        default: throw Error();\\n\");\n        js.push_both(\"    }\\n\");\n        js.push_both(\"}\\n\");\n        ctx.js_helpers\n            .add_group(JsGroup::Other, &js_name, js)\n            .add_dep_group(JsGroup::Other, \"_ffi_ReadBuf\")\n            .add_deps_group(js_deps)\n            .mark_used();\n    }\n\n    (js_name, rust_name)\n}\n\nfn multi_ret_helper(ast: &AST, ctx: &mut WasmCtx, args: &[RustArg]) -> (String, String) {\n    let types: Vec<_> = args.iter().map(|arg| arg.ty.clone()).collect();\n    if let Some(result) = ctx.multi_ret_helpers.get(&types) {\n        return result.clone();\n    }\n\n    let mut ty_name = \"_ffi_ret_\".to_string();\n    append_type_name_hints(&mut ty_name, ast, &types);\n    let ty_name = ctx.helper_names.create(&ty_name);\n    let static_name = ty_name.to_uppercase();\n\n    // Rust\n    {\n        let mut rust = String::new();\n        _ = write!(rust, \"\\n#[repr(C)]\\nstruct {ty_name}(\");\n        for (i, ty) in types.iter().enumerate() {\n            if i > 0 {\n                rust.push_str(\", \");\n            }\n            append_rust_type(&mut rust, ast, ty);\n        }\n        rust.push_str(\");\\n\");\n        _ = write!(rust, \"static mut {static_name}: {ty_name} = {ty_name}(\");\n        for (i, ty) in types.iter().enumerate() {\n            if i > 0 {\n                rust.push_str(\", \");\n            }\n            append_rust_default_val(&mut rust, ast, ty);\n        }\n        rust.push_str(\");\\n\");\n        ctx.rust_helpers.add(&ty_name, rust).mark_used();\n    }\n\n    ctx.multi_ret_helpers\n        .insert(types, (ty_name.clone(), static_name.clone()));\n    (ty_name, static_name)\n}\n\nfn js_multi_ret_load(view: &str, ptr: &str, ty: &RustType, offset: &mut usize) -> String {\n    use RustType::*;\n    let (size, method) = match ty {\n        Bool | U8 => (1, \"getUint8\"), // Note: the \"!!\" int-to-bool cast is added elsewhere\n        I8 => (1, \"getInt8\"),\n        U16 => (2, \"getUint16\"),\n        I16 => (2, \"getInt16\"),\n        U32 | Usize => (4, \"getUint32\"),\n        I32 | Isize | ForeignHandle => (4, \"getInt32\"),\n        U64 => (8, \"setBigUint64\"),\n        I64 => (8, \"setBigInt64\"),\n        F32 => (4, \"getFloat32\"),\n        F64 => (8, \"getFloat64\"),\n        _ => unreachable!(),\n    };\n    *offset = (*offset + (size - 1)) & !(size - 1);\n    let load = match (*offset, size) {\n        (0, 1) => format!(\"{view}.{method}({ptr})\"),\n        (0, _) => format!(\"{view}.{method}({ptr}, true)\"),\n        (_, 1) => format!(\"{view}.{method}({ptr} + {offset})\"),\n        (_, _) => format!(\"{view}.{method}({ptr} + {offset}, true)\"),\n    };\n    *offset += size;\n    load\n}\n\nfn js_multi_ret_size(ty: &RustType) -> u32 {\n    use RustType::*;\n    match ty {\n        Bool | U8 | I8 => 1,\n        U16 | I16 => 2,\n        U32 | Usize | I32 | Isize | ForeignHandle => 4,\n        U64 | I64 => 8,\n        F32 => 4,\n        F64 => 8,\n        _ => unreachable!(),\n    }\n}\n\nfn js_multi_ret_store(view: &str, ptr: &str, val: &str, ty: &RustType, offset: u32) -> String {\n    use RustType::*;\n    let method = match ty {\n        Bool | U8 | I8 => \"setInt8\",\n        U16 | I16 => \"setInt16\",\n        U32 | Usize | I32 | Isize | ForeignHandle => \"setInt32\",\n        U64 | I64 => \"setBigInt64\",\n        F32 => \"setFloat32\",\n        F64 => \"setFloat64\",\n        _ => unreachable!(),\n    };\n    match (offset, method != \"setInt8\") {\n        (0, false) => format!(\"{view}.{method}({ptr}, {val});\"),\n        (0, true) => format!(\"{view}.{method}({ptr}, {val}, true);\"),\n        (_, false) => format!(\"{view}.{method}({ptr} + {offset}, {val});\"),\n        (_, true) => format!(\"{view}.{method}({ptr} + {offset}, {val}, true);\"),\n    }\n}\n\nfn js_write(ctx: &mut WasmCtx, buf: &str, val: &str, ty: &RustType) -> String {\n    use RustType::*;\n    let mut cast = \"\";\n    let (size, method, helper) = match ty {\n        Pair { other, .. } => return js_write(ctx, buf, val, other),\n        Bool => {\n            cast = \"+\";\n            (1, \"setInt8\", \"_ffi_write_i8\")\n        }\n        U8 | I8 => (1, \"setInt8\", \"_ffi_write_i8\"),\n        U16 | I16 => (2, \"setInt16\", \"_ffi_write_i16\"),\n        U32 | Usize | I32 | Isize | ForeignHandle => (4, \"setInt32\", \"_ffi_write_i32\"),\n        U64 | I64 => (8, \"setBigInt64\", \"_ffi_write_i64\"),\n        F32 => (4, \"setFloat32\", \"_ffi_write_f32\"),\n        F64 => (8, \"setFloat64\", \"_ffi_write_f64\"),\n        _ => unreachable!(),\n    };\n    let result = if !cast.is_empty() && val.chars().any(|c| !c.is_alphanumeric()) {\n        format!(\"{helper}({buf}, {cast}({val}));\")\n    } else {\n        format!(\"{helper}({buf}, {cast}{val});\")\n    };\n    if ctx.js_helpers.was_added(JsGroup::Other, helper) {\n        return result;\n    }\n    let val_ty = match ty {\n        U64 | I64 => \"bigint\",\n        _ => \"number\",\n    };\n    let is_le = if size == 1 { \"\" } else { \", true\" };\n    let js = JsString::from_template(&format!(\n        \"\nfunction {helper}(buf«: _ffi_WriteBuf», val«: {val_ty}»)«: void» {{\n    let ptr = _ffi_grow(buf, {size});\n    buf.dv«!».{method}(ptr, val{is_le});\n}}\n\"\n    ));\n    ctx.js_helpers\n        .add_group(JsGroup::Other, helper, js)\n        .add_dep_group(JsGroup::Other, \"_ffi_WriteBuf\")\n        .add_dep_group(JsGroup::Other, \"_ffi_grow\")\n        .mark_used();\n    result\n}\n\nfn js_read(ctx: &mut WasmCtx, buf: &str, ty: &RustType) -> String {\n    use RustType::*;\n    let mut prefix = \"\";\n    let (size, method, helper) = match ty {\n        Pair { other, .. } => return js_read(ctx, buf, other),\n        Bool => {\n            prefix = \"!!\";\n            (1, \"getUint8\", \"_ffi_read_u8\")\n        }\n        U8 => (1, \"getUint8\", \"_ffi_read_u8\"),\n        I8 => (1, \"getInt8\", \"_ffi_read_i8\"),\n        U16 => (2, \"getUint16\", \"_ffi_read_u16\"),\n        I16 => (2, \"getInt16\", \"_ffi_read_i16\"),\n        U32 | Usize => (4, \"getUint32\", \"_ffi_read_u32\"),\n        I32 | Isize | ForeignHandle => (4, \"getInt32\", \"_ffi_read_i32\"),\n        U64 => (8, \"setBigUint64\", \"_ffi_read_u64\"),\n        I64 => (8, \"setBigInt64\", \"_ffi_read_i64\"),\n        F32 => (4, \"getFloat32\", \"_ffi_read_f32\"),\n        F64 => (8, \"getFloat64\", \"_ffi_read_f64\"),\n        _ => unreachable!(),\n    };\n    let result = format!(\"{prefix}{helper}({buf})\");\n    if ctx.js_helpers.was_added(JsGroup::Other, helper) {\n        return result;\n    }\n    let val_ty = match ty {\n        U64 | I64 => \"bigint\",\n        _ => \"number\",\n    };\n    let mut js = JsString::from_template(&format!(\n        \"\\nfunction {helper}(buf«: _ffi_ReadBuf»)«: {val_ty}» {{\\n\"\n    ));\n    if size == 1 {\n        _ = write!(js, \"    return buf.dv.{method}({buf}.off++);\\n\");\n    } else {\n        let is_le = if size == 1 { \"\" } else { \", true\" };\n        _ = write!(js, \"    let val = buf.dv.{method}({buf}.off{is_le});\\n\");\n        _ = write!(js, \"    buf.off += {size};\\n\");\n        js.push_both(\"    return val;\\n\");\n    }\n    js.push_both(\"}\\n\");\n    ctx.js_helpers\n        .add_group(JsGroup::Other, helper, js)\n        .add_dep_group(JsGroup::Other, \"_ffi_ReadBuf\")\n        .mark_used();\n    result\n}\n\nfn append_ts_type(ts: &mut JsString, ast: &AST, ty: &RustType) {\n    use RustType::*;\n\n    #[derive(Eq, PartialEq)]\n    enum Parent {\n        Top,\n        Vector,\n        Optional,\n    }\n\n    fn append(ts: &mut JsString, ast: &AST, ty: &RustType, parent: Parent) {\n        match ty {\n            Pair { other, .. } => append(ts, ast, other, parent),\n            Verbatim(text) => ts.push_ts(text),\n            Bool => ts.push_ts(\"boolean\"),\n            U8 | U16 | U32 | Usize => ts.push_ts(\"number\"),\n            I8 | I16 | I32 | Isize => ts.push_ts(\"number\"),\n            F32 | F64 | ForeignHandle => ts.push_ts(\"number\"),\n            U64 | I64 => ts.push_ts(\"bigint\"),\n            RefStr | OwnStr => ts.push_ts(\"string\"),\n            Struct(index) => ts.push_ts(&ast.structs[*index].name),\n            Enum(index) => ts.push_ts(&ast.enums[*index].name),\n            DynTrait(index) => ts.push_ts(&ast.traits[*index].name),\n            Ptr(_, inner) => append(ts, ast, inner, parent),\n            Vector(inner) => {\n                append(ts, ast, &inner, Parent::Vector);\n                ts.push_ts(\"[]\");\n            }\n            Tuple(types) if types.is_empty() => ts.push_ts(\"undefined\"),\n            Tuple(types) => {\n                ts.push_ts(\"[\");\n                for (i, ty) in types.iter().enumerate() {\n                    if i > 0 {\n                        ts.push_ts(\", \");\n                    }\n                    append(ts, ast, ty, Parent::Top);\n                }\n                ts.push_ts(\"]\");\n            }\n            Optional(inner) if parent == Parent::Optional => append(ts, ast, inner, parent),\n            Optional(inner) => {\n                let wrap = parent == Parent::Vector;\n                if wrap {\n                    ts.push_ts(\"(\");\n                }\n                append(ts, ast, &inner, Parent::Optional);\n                ts.push_ts(\" | null\");\n                if wrap {\n                    ts.push_ts(\")\");\n                }\n            }\n        }\n    }\n\n    append(ts, ast, ty, Parent::Top)\n}\n\nfn append_js_val(js: &mut JsString, val: &RustVal) {\n    use RustVal::*;\n    match val {\n        Bool(x) => _ = write!(js, \"{x}\"),\n\n        U8(x) => _ = write!(js, \"{x}\"),\n        U16(x) => _ = write!(js, \"{x}\"),\n        U32(x) => _ = write!(js, \"{x}\"),\n        U64(x) => _ = write!(js, \"{x}n\"),\n\n        I8(x) => _ = write!(js, \"{x}\"),\n        I16(x) => _ = write!(js, \"{x}\"),\n        I32(x) => _ = write!(js, \"{x}\"),\n        I64(x) => _ = write!(js, \"{x}n\"),\n\n        F32(x) => _ = write!(js, \"{}\", *x as f64),\n        F64(x) => _ = write!(js, \"{x}\"),\n\n        Str(x) => append_js_quoted(js, x),\n    }\n}\n\nfn append_js_quoted(js: &mut JsString, text: &str) {\n    js.push_both(\"\\\"\");\n    for c in text.chars() {\n        match c {\n            '\\t' => js.push_both(\"\\\\t\"),\n            '\\n' => js.push_both(\"\\\\n\"),\n            '\\r' => js.push_both(\"\\\\r\"),\n            '\\\\' => js.push_both(\"\\\\\\\\\"),\n            '\\\"' => js.push_both(\"\\\\\\\"\"),\n            c if (c as u32) < 0x20 => _ = write!(js, \"\\\\x{:02x}\", c as u32),\n            _ => _ = write!(js, \"{c}\"),\n        }\n    }\n    js.push_both(\"\\\"\");\n}\n\nfn member_access(object: &str, member: &str) -> String {\n    match starts_with_digit(member) {\n        false => format!(\"{object}.{member}\"),\n        true => format!(\"{object}[{member}]\"),\n    }\n}\n\nimpl FnBuilder {\n    fn write_to_js(&mut self, ast: &AST, out: &mut JsString, base_indent: &str) {\n        let callback = |line: &str, out: &mut String, indent: &mut usize| {\n            if line.starts_with(&['}', ']', ')']) {\n                *indent -= 1;\n            }\n            _ = write!(out, \"{base_indent}{}{line}\\n\", \"    \".repeat(*indent));\n            if line.ends_with(&['{', '[', '(']) {\n                *indent += 1;\n            }\n        };\n        let mut js_indent = 0;\n        let mut ts_indent = 0;\n        for line in self.take_lines() {\n            match line {\n                Line::Plain(text) => {\n                    for line in text.split('\\n') {\n                        callback(line, &mut out.without_types, &mut js_indent);\n                        callback(line, &mut out.with_types, &mut ts_indent);\n                    }\n                }\n                Line::PlainAlt(when_false, when_true, flag) => {\n                    let text = match flag.get() {\n                        false if when_false.is_empty() => continue,\n                        false => when_false,\n                        true => when_true,\n                    };\n                    for line in text.split('\\n') {\n                        callback(line, &mut out.without_types, &mut js_indent);\n                        callback(line, &mut out.with_types, &mut ts_indent);\n                    }\n                }\n                Line::Decl(name, ty, text) => {\n                    for line in format!(\"let {name} = {text};\").split('\\n') {\n                        callback(line, &mut out.without_types, &mut js_indent);\n                        if ty.is_none() {\n                            callback(line, &mut out.with_types, &mut ts_indent);\n                        }\n                    }\n\n                    // Handle optional type annotations separately\n                    if let Some(ty) = ty {\n                        let mut decl_ty = JsString::default();\n                        append_ts_type(&mut decl_ty, ast, &ty);\n                        let text = format!(\"let {name}: {} = {text};\", decl_ty.with_types);\n                        for line in text.split('\\n') {\n                            callback(line, &mut out.with_types, &mut js_indent);\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  }
]