// The Wasmer C/C++ header file compatible with the [`wasm-c-api`]
// standard API, as `wasm.h` (included here).
//
// This file is automatically generated by `lib/c-api/build.rs` of the
// [`wasmer-c-api`] Rust crate.
//
// # Stability
//
// The [`wasm-c-api`] standard API is a _living_ standard. There is no
// commitment for stability yet. We (Wasmer) will try our best to keep
// backward compatibility as much as possible. Nonetheless, some
// necessary API aren't yet standardized, and as such, we provide a
// custom API, e.g. `wasi_*` types and functions.
//
// The documentation makes it clear whether a function is unstable.
// 
// When a type or a function will be deprecated, it will be marked as
// such with the appropriated compiler warning, and will be removed at
// the next release round.
//
// # Documentation
//
// At the time of writing, the [`wasm-c-api`] standard has no
// documentation. This file also does not include inline
// documentation. However, we have made (and we continue to make) an
// important effort to document everything. [See the documentation
// online][documentation]. Please refer to this page for the real
// canonical documentation. It also contains numerous examples.
//
// To generate the documentation locally, run `cargo doc --open` from
// within the [`wasmer-c-api`] Rust crate.
//
// [`wasm-c-api`]: https://github.com/WebAssembly/wasm-c-api
// [`wasmer-c-api`]: https://github.com/wasmerio/wasmer/tree/main/lib/c-api
// [documentation]: https://wasmerio.github.io/wasmer/crates/wasmer_c_api/

#if !defined(WASMER_H_PRELUDE)

#define WASMER_H_PRELUDE

// Define the `ARCH_X86_X64` constant.
#if defined(MSVC) && defined(_M_AMD64)
#  define ARCH_X86_64
#elif (defined(GCC) || defined(__GNUC__) || defined(__clang__)) && defined(__x86_64__)
#  define ARCH_X86_64
#endif

// Compatibility with non-Clang compilers.
#if !defined(__has_attribute)
#  define __has_attribute(x) 0
#endif

// Compatibility with non-Clang compilers.
#if !defined(__has_declspec_attribute)
#  define __has_declspec_attribute(x) 0
#endif

// Define the `DEPRECATED` macro.
#if defined(GCC) || defined(__GNUC__) || __has_attribute(deprecated)
#  define DEPRECATED(message) __attribute__((deprecated(message)))
#elif defined(MSVC) || __has_declspec_attribute(deprecated)
#  define DEPRECATED(message) __declspec(deprecated(message))
#endif

// The `compiler` feature has been enabled for this build.
#define WASMER_UNIVERSAL_ENABLED

// The `compiler` feature has been enabled for this build.
#define WASMER_COMPILER_ENABLED

// The `wasi` feature has been enabled for this build.
#define WASMER_WASI_ENABLED

// The `middlewares` feature has been enabled for this build.
#define WASMER_MIDDLEWARES_ENABLED

// This file corresponds to the following Wasmer version.
#define WASMER_VERSION "7.3.0"
#define WASMER_VERSION_MAJOR 7
#define WASMER_VERSION_MINOR 3
#define WASMER_VERSION_PATCH 0
#define WASMER_VERSION_PRE ""

#endif // WASMER_H_PRELUDE


//
// OK, here we go. The code below is automatically generated.
//


#ifndef WASMER_H
#define WASMER_H

#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include "wasm.h"

#if defined(WASMER_WASI_ENABLED)
typedef enum wasi_version_t {
#if defined(WASMER_WASI_ENABLED)
  INVALID_VERSION = -1,
#endif
#if defined(WASMER_WASI_ENABLED)
  LATEST = 0,
#endif
#if defined(WASMER_WASI_ENABLED)
  SNAPSHOT0 = 1,
#endif
#if defined(WASMER_WASI_ENABLED)
  SNAPSHOT1 = 2,
#endif
#if defined(WASMER_WASI_ENABLED)
  WASIX32V1 = 3,
#endif
#if defined(WASMER_WASI_ENABLED)
  WASIX64V1 = 4,
#endif
} wasi_version_t;
#endif

typedef enum wasmer_backend_t {
  CRANELIFT = 0,
  LLVM,
  SINGLEPASS,
  HEADLESS,
  V8,
} wasmer_backend_t;

typedef enum wasmer_parser_operator_t {
  Unreachable,
  Nop,
  Block,
  Loop,
  If,
  Else,
  Try,
  Catch,
  CatchAll,
  Delegate,
  Throw,
  Rethrow,
  Unwind,
  End,
  Br,
  BrIf,
  BrTable,
  Return,
  Call,
  CallIndirect,
  ReturnCall,
  ReturnCallIndirect,
  Drop,
  Select,
  TypedSelect,
  LocalGet,
  LocalSet,
  LocalTee,
  GlobalGet,
  GlobalSet,
  I32Load,
  I64Load,
  F32Load,
  F64Load,
  I32Load8S,
  I32Load8U,
  I32Load16S,
  I32Load16U,
  I64Load8S,
  I64Load8U,
  I64Load16S,
  I64Load16U,
  I64Load32S,
  I64Load32U,
  I32Store,
  I64Store,
  F32Store,
  F64Store,
  I32Store8,
  I32Store16,
  I64Store8,
  I64Store16,
  I64Store32,
  MemorySize,
  MemoryGrow,
  I32Const,
  I64Const,
  F32Const,
  F64Const,
  RefNull,
  RefIsNull,
  RefFunc,
  I32Eqz,
  I32Eq,
  I32Ne,
  I32LtS,
  I32LtU,
  I32GtS,
  I32GtU,
  I32LeS,
  I32LeU,
  I32GeS,
  I32GeU,
  I64Eqz,
  I64Eq,
  I64Ne,
  I64LtS,
  I64LtU,
  I64GtS,
  I64GtU,
  I64LeS,
  I64LeU,
  I64GeS,
  I64GeU,
  F32Eq,
  F32Ne,
  F32Lt,
  F32Gt,
  F32Le,
  F32Ge,
  F64Eq,
  F64Ne,
  F64Lt,
  F64Gt,
  F64Le,
  F64Ge,
  I32Clz,
  I32Ctz,
  I32Popcnt,
  I32Add,
  I32Sub,
  I32Mul,
  I32DivS,
  I32DivU,
  I32RemS,
  I32RemU,
  I32And,
  I32Or,
  I32Xor,
  I32Shl,
  I32ShrS,
  I32ShrU,
  I32Rotl,
  I32Rotr,
  I64Clz,
  I64Ctz,
  I64Popcnt,
  I64Add,
  I64Sub,
  I64Mul,
  I64DivS,
  I64DivU,
  I64RemS,
  I64RemU,
  I64And,
  I64Or,
  I64Xor,
  I64Shl,
  I64ShrS,
  I64ShrU,
  I64Rotl,
  I64Rotr,
  F32Abs,
  F32Neg,
  F32Ceil,
  F32Floor,
  F32Trunc,
  F32Nearest,
  F32Sqrt,
  F32Add,
  F32Sub,
  F32Mul,
  F32Div,
  F32Min,
  F32Max,
  F32Copysign,
  F64Abs,
  F64Neg,
  F64Ceil,
  F64Floor,
  F64Trunc,
  F64Nearest,
  F64Sqrt,
  F64Add,
  F64Sub,
  F64Mul,
  F64Div,
  F64Min,
  F64Max,
  F64Copysign,
  I32WrapI64,
  I32TruncF32S,
  I32TruncF32U,
  I32TruncF64S,
  I32TruncF64U,
  I64ExtendI32S,
  I64ExtendI32U,
  I64TruncF32S,
  I64TruncF32U,
  I64TruncF64S,
  I64TruncF64U,
  F32ConvertI32S,
  F32ConvertI32U,
  F32ConvertI64S,
  F32ConvertI64U,
  F32DemoteF64,
  F64ConvertI32S,
  F64ConvertI32U,
  F64ConvertI64S,
  F64ConvertI64U,
  F64PromoteF32,
  I32ReinterpretF32,
  I64ReinterpretF64,
  F32ReinterpretI32,
  F64ReinterpretI64,
  I32Extend8S,
  I32Extend16S,
  I64Extend8S,
  I64Extend16S,
  I64Extend32S,
  I32TruncSatF32S,
  I32TruncSatF32U,
  I32TruncSatF64S,
  I32TruncSatF64U,
  I64TruncSatF32S,
  I64TruncSatF32U,
  I64TruncSatF64S,
  I64TruncSatF64U,
  MemoryInit,
  DataDrop,
  MemoryCopy,
  MemoryFill,
  TableInit,
  ElemDrop,
  TableCopy,
  TableFill,
  TableGet,
  TableSet,
  TableGrow,
  TableSize,
  MemoryAtomicNotify,
  MemoryAtomicWait32,
  MemoryAtomicWait64,
  AtomicFence,
  I32AtomicLoad,
  I64AtomicLoad,
  I32AtomicLoad8U,
  I32AtomicLoad16U,
  I64AtomicLoad8U,
  I64AtomicLoad16U,
  I64AtomicLoad32U,
  I32AtomicStore,
  I64AtomicStore,
  I32AtomicStore8,
  I32AtomicStore16,
  I64AtomicStore8,
  I64AtomicStore16,
  I64AtomicStore32,
  I32AtomicRmwAdd,
  I64AtomicRmwAdd,
  I32AtomicRmw8AddU,
  I32AtomicRmw16AddU,
  I64AtomicRmw8AddU,
  I64AtomicRmw16AddU,
  I64AtomicRmw32AddU,
  I32AtomicRmwSub,
  I64AtomicRmwSub,
  I32AtomicRmw8SubU,
  I32AtomicRmw16SubU,
  I64AtomicRmw8SubU,
  I64AtomicRmw16SubU,
  I64AtomicRmw32SubU,
  I32AtomicRmwAnd,
  I64AtomicRmwAnd,
  I32AtomicRmw8AndU,
  I32AtomicRmw16AndU,
  I64AtomicRmw8AndU,
  I64AtomicRmw16AndU,
  I64AtomicRmw32AndU,
  I32AtomicRmwOr,
  I64AtomicRmwOr,
  I32AtomicRmw8OrU,
  I32AtomicRmw16OrU,
  I64AtomicRmw8OrU,
  I64AtomicRmw16OrU,
  I64AtomicRmw32OrU,
  I32AtomicRmwXor,
  I64AtomicRmwXor,
  I32AtomicRmw8XorU,
  I32AtomicRmw16XorU,
  I64AtomicRmw8XorU,
  I64AtomicRmw16XorU,
  I64AtomicRmw32XorU,
  I32AtomicRmwXchg,
  I64AtomicRmwXchg,
  I32AtomicRmw8XchgU,
  I32AtomicRmw16XchgU,
  I64AtomicRmw8XchgU,
  I64AtomicRmw16XchgU,
  I64AtomicRmw32XchgU,
  I32AtomicRmwCmpxchg,
  I64AtomicRmwCmpxchg,
  I32AtomicRmw8CmpxchgU,
  I32AtomicRmw16CmpxchgU,
  I64AtomicRmw8CmpxchgU,
  I64AtomicRmw16CmpxchgU,
  I64AtomicRmw32CmpxchgU,
  V128Load,
  V128Store,
  V128Const,
  I8x16Splat,
  I8x16ExtractLaneS,
  I8x16ExtractLaneU,
  I8x16ReplaceLane,
  I16x8Splat,
  I16x8ExtractLaneS,
  I16x8ExtractLaneU,
  I16x8ReplaceLane,
  I32x4Splat,
  I32x4ExtractLane,
  I32x4ReplaceLane,
  I64x2Splat,
  I64x2ExtractLane,
  I64x2ReplaceLane,
  F32x4Splat,
  F32x4ExtractLane,
  F32x4ReplaceLane,
  F64x2Splat,
  F64x2ExtractLane,
  F64x2ReplaceLane,
  I8x16Eq,
  I8x16Ne,
  I8x16LtS,
  I8x16LtU,
  I8x16GtS,
  I8x16GtU,
  I8x16LeS,
  I8x16LeU,
  I8x16GeS,
  I8x16GeU,
  I16x8Eq,
  I16x8Ne,
  I16x8LtS,
  I16x8LtU,
  I16x8GtS,
  I16x8GtU,
  I16x8LeS,
  I16x8LeU,
  I16x8GeS,
  I16x8GeU,
  I32x4Eq,
  I32x4Ne,
  I32x4LtS,
  I32x4LtU,
  I32x4GtS,
  I32x4GtU,
  I32x4LeS,
  I32x4LeU,
  I32x4GeS,
  I32x4GeU,
  I64x2Eq,
  I64x2Ne,
  I64x2LtS,
  I64x2GtS,
  I64x2LeS,
  I64x2GeS,
  F32x4Eq,
  F32x4Ne,
  F32x4Lt,
  F32x4Gt,
  F32x4Le,
  F32x4Ge,
  F64x2Eq,
  F64x2Ne,
  F64x2Lt,
  F64x2Gt,
  F64x2Le,
  F64x2Ge,
  V128Not,
  V128And,
  V128AndNot,
  V128Or,
  V128Xor,
  V128Bitselect,
  V128AnyTrue,
  I8x16Abs,
  I8x16Neg,
  I8x16AllTrue,
  I8x16Bitmask,
  I8x16Shl,
  I8x16ShrS,
  I8x16ShrU,
  I8x16Add,
  I8x16AddSatS,
  I8x16AddSatU,
  I8x16Sub,
  I8x16SubSatS,
  I8x16SubSatU,
  I8x16MinS,
  I8x16MinU,
  I8x16MaxS,
  I8x16MaxU,
  I8x16Popcnt,
  I16x8Abs,
  I16x8Neg,
  I16x8AllTrue,
  I16x8Bitmask,
  I16x8Shl,
  I16x8ShrS,
  I16x8ShrU,
  I16x8Add,
  I16x8AddSatS,
  I16x8AddSatU,
  I16x8Sub,
  I16x8SubSatS,
  I16x8SubSatU,
  I16x8Mul,
  I16x8MinS,
  I16x8MinU,
  I16x8MaxS,
  I16x8MaxU,
  I16x8ExtAddPairwiseI8x16S,
  I16x8ExtAddPairwiseI8x16U,
  I32x4Abs,
  I32x4Neg,
  I32x4AllTrue,
  I32x4Bitmask,
  I32x4Shl,
  I32x4ShrS,
  I32x4ShrU,
  I32x4Add,
  I32x4Sub,
  I32x4Mul,
  I32x4MinS,
  I32x4MinU,
  I32x4MaxS,
  I32x4MaxU,
  I32x4DotI16x8S,
  I32x4ExtAddPairwiseI16x8S,
  I32x4ExtAddPairwiseI16x8U,
  I64x2Abs,
  I64x2Neg,
  I64x2AllTrue,
  I64x2Bitmask,
  I64x2Shl,
  I64x2ShrS,
  I64x2ShrU,
  I64x2Add,
  I64x2Sub,
  I64x2Mul,
  F32x4Ceil,
  F32x4Floor,
  F32x4Trunc,
  F32x4Nearest,
  F64x2Ceil,
  F64x2Floor,
  F64x2Trunc,
  F64x2Nearest,
  F32x4Abs,
  F32x4Neg,
  F32x4Sqrt,
  F32x4Add,
  F32x4Sub,
  F32x4Mul,
  F32x4Div,
  F32x4Min,
  F32x4Max,
  F32x4PMin,
  F32x4PMax,
  F64x2Abs,
  F64x2Neg,
  F64x2Sqrt,
  F64x2Add,
  F64x2Sub,
  F64x2Mul,
  F64x2Div,
  F64x2Min,
  F64x2Max,
  F64x2PMin,
  F64x2PMax,
  I32x4TruncSatF32x4S,
  I32x4TruncSatF32x4U,
  F32x4ConvertI32x4S,
  F32x4ConvertI32x4U,
  I8x16Swizzle,
  I8x16Shuffle,
  V128Load8Splat,
  V128Load16Splat,
  V128Load32Splat,
  V128Load32Zero,
  V128Load64Splat,
  V128Load64Zero,
  I8x16NarrowI16x8S,
  I8x16NarrowI16x8U,
  I16x8NarrowI32x4S,
  I16x8NarrowI32x4U,
  I16x8ExtendLowI8x16S,
  I16x8ExtendHighI8x16S,
  I16x8ExtendLowI8x16U,
  I16x8ExtendHighI8x16U,
  I32x4ExtendLowI16x8S,
  I32x4ExtendHighI16x8S,
  I32x4ExtendLowI16x8U,
  I32x4ExtendHighI16x8U,
  I64x2ExtendLowI32x4S,
  I64x2ExtendHighI32x4S,
  I64x2ExtendLowI32x4U,
  I64x2ExtendHighI32x4U,
  I16x8ExtMulLowI8x16S,
  I16x8ExtMulHighI8x16S,
  I16x8ExtMulLowI8x16U,
  I16x8ExtMulHighI8x16U,
  I32x4ExtMulLowI16x8S,
  I32x4ExtMulHighI16x8S,
  I32x4ExtMulLowI16x8U,
  I32x4ExtMulHighI16x8U,
  I64x2ExtMulLowI32x4S,
  I64x2ExtMulHighI32x4S,
  I64x2ExtMulLowI32x4U,
  I64x2ExtMulHighI32x4U,
  V128Load8x8S,
  V128Load8x8U,
  V128Load16x4S,
  V128Load16x4U,
  V128Load32x2S,
  V128Load32x2U,
  V128Load8Lane,
  V128Load16Lane,
  V128Load32Lane,
  V128Load64Lane,
  V128Store8Lane,
  V128Store16Lane,
  V128Store32Lane,
  V128Store64Lane,
  I8x16RoundingAverageU,
  I16x8RoundingAverageU,
  I16x8Q15MulrSatS,
  F32x4DemoteF64x2Zero,
  F64x2PromoteLowF32x4,
  F64x2ConvertLowI32x4S,
  F64x2ConvertLowI32x4U,
  I32x4TruncSatF64x2SZero,
  I32x4TruncSatF64x2UZero,
  I8x16RelaxedSwizzle,
  I32x4RelaxedTruncSatF32x4S,
  I32x4RelaxedTruncSatF32x4U,
  I32x4RelaxedTruncSatF64x2SZero,
  I32x4RelaxedTruncSatF64x2UZero,
  F32x4Fma,
  F32x4Fms,
  F64x2Fma,
  F64x2Fms,
  I8x16LaneSelect,
  I16x8LaneSelect,
  I32x4LaneSelect,
  I64x2LaneSelect,
  F32x4RelaxedMin,
  F32x4RelaxedMax,
  F64x2RelaxedMin,
  F64x2RelaxedMax,
  I16x8RelaxedQ15mulrS,
  I16x8DotI8x16I7x16S,
  I32x4DotI8x16I7x16AddS,
  F32x4RelaxedDotBf16x8AddF32x4,
} wasmer_parser_operator_t;

#if defined(WASMER_WASI_ENABLED)
typedef struct wasi_config_t wasi_config_t;
#endif

#if defined(WASMER_WASI_ENABLED)
typedef struct wasi_env_t wasi_env_t;
#endif

typedef struct wasmer_cpu_features_t wasmer_cpu_features_t;

typedef struct wasmer_features_t wasmer_features_t;

typedef struct wasmer_metering_t wasmer_metering_t;

typedef struct wasmer_middleware_t wasmer_middleware_t;

#if defined(WASMER_WASI_ENABLED)
typedef struct wasmer_named_extern_t wasmer_named_extern_t;
#endif

typedef struct wasmer_target_t wasmer_target_t;

typedef struct wasmer_triple_t wasmer_triple_t;

#if defined(WASMER_WASI_ENABLED)
typedef struct wasi_filesystem_t {
  const char *ptr;
  uintptr_t size;
} wasi_filesystem_t;
#endif

#if defined(WASMER_WASI_ENABLED)
typedef struct wasmer_named_extern_vec_t {
  uintptr_t size;
  struct wasmer_named_extern_t **data;
} wasmer_named_extern_vec_t;
#endif

typedef struct FunctionCEnv {
  void *inner;
} FunctionCEnv;

typedef struct wasmer_funcenv_t {
  struct FunctionCEnv inner;
} wasmer_funcenv_t;

typedef uint64_t (*wasmer_metering_cost_function_t)(enum wasmer_parser_operator_t wasm_operator);

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

#if defined(WASMER_WASI_ENABLED)
void wasi_config_arg(struct wasi_config_t *config, const char *arg);
#endif

#if defined(WASMER_WASI_ENABLED)
void wasi_config_capture_stderr(struct wasi_config_t *config);
#endif

#if defined(WASMER_WASI_ENABLED)
void wasi_config_capture_stdout(struct wasi_config_t *config);
#endif

#if defined(WASMER_WASI_ENABLED)
void wasi_config_env(struct wasi_config_t *config, const char *key, const char *value);
#endif

#if defined(WASMER_WASI_ENABLED)
void wasi_config_inherit_stderr(struct wasi_config_t *config);
#endif

#if defined(WASMER_WASI_ENABLED)
void wasi_config_inherit_stdin(struct wasi_config_t *config);
#endif

#if defined(WASMER_WASI_ENABLED)
void wasi_config_inherit_stdout(struct wasi_config_t *config);
#endif

#if defined(WASMER_WASI_ENABLED)
bool wasi_config_mapdir(struct wasi_config_t *config, const char *alias, const char *dir);
#endif

#if defined(WASMER_WASI_ENABLED)
struct wasi_config_t *wasi_config_new(const char *program_name);
#endif

#if defined(WASMER_WASI_ENABLED)
bool wasi_config_preopen_dir(struct wasi_config_t *config, const char *dir);
#endif

#if defined(WASMER_WASI_ENABLED)
void wasi_env_delete(struct wasi_env_t *state);
#endif

#if defined(WASMER_WASI_ENABLED)
bool wasi_env_initialize_instance(struct wasi_env_t *wasi_env,
                                  wasm_store_t *store,
                                  wasm_instance_t *instance);
#endif

#if defined(WASMER_WASI_ENABLED)
struct wasi_env_t *wasi_env_new(wasm_store_t *store, struct wasi_config_t *config);
#endif

#if defined(WASMER_WASI_ENABLED)
intptr_t wasi_env_read_stderr(struct wasi_env_t *env, char *buffer, uintptr_t buffer_len);
#endif

#if defined(WASMER_WASI_ENABLED)
intptr_t wasi_env_read_stdout(struct wasi_env_t *env, char *buffer, uintptr_t buffer_len);
#endif

#if defined(WASMER_WASI_ENABLED)
void wasi_env_set_memory(struct wasi_env_t *_env, const wasm_memory_t *_memory);
#endif

#if defined(WASMER_WASI_ENABLED)
struct wasi_env_t *wasi_env_with_filesystem(struct wasi_config_t *config,
                                            wasm_store_t *store,
                                            const wasm_module_t *module,
                                            const struct wasi_filesystem_t *fs,
                                            wasm_extern_vec_t *imports,
                                            const char *package);
#endif

#if defined(WASMER_WASI_ENABLED)
void wasi_filesystem_delete(struct wasi_filesystem_t *_ptr);
#endif

#if defined(WASMER_WASI_ENABLED)
struct wasi_filesystem_t *wasi_filesystem_init_static_memory(const wasm_byte_vec_t *volume_bytes);
#endif

#if defined(WASMER_WASI_ENABLED)
bool wasi_get_imports(const wasm_store_t *_store,
                      struct wasi_env_t *wasi_env,
                      const wasm_module_t *module,
                      wasm_extern_vec_t *imports);
#endif

#if defined(WASMER_WASI_ENABLED)
wasm_func_t *wasi_get_start_function(wasm_instance_t *instance);
#endif

#if defined(WASMER_WASI_ENABLED)
bool wasi_get_unordered_imports(struct wasi_env_t *wasi_env,
                                const wasm_module_t *module,
                                struct wasmer_named_extern_vec_t *imports);
#endif

#if defined(WASMER_WASI_ENABLED)
enum wasi_version_t wasi_get_wasi_version(const wasm_module_t *module);
#endif

void wasm_config_push_middleware(wasm_config_t *config, struct wasmer_middleware_t *middleware);

void wasm_config_set_backend(wasm_config_t *config, enum wasmer_backend_t engine);

void wasm_config_set_features(wasm_config_t *config, struct wasmer_features_t *features);

void wasm_config_set_target(wasm_config_t *config, struct wasmer_target_t *target);

void wasm_config_sys_canonicalize_nans(wasm_config_t *config, bool enable);

wasm_engine_t *wasm_engine_new(void);

bool wasmer_cpu_features_add(struct wasmer_cpu_features_t *cpu_features,
                             const wasm_name_t *feature);

void wasmer_cpu_features_delete(struct wasmer_cpu_features_t *_cpu_features);

struct wasmer_cpu_features_t *wasmer_cpu_features_new(void);

bool wasmer_features_bulk_memory(struct wasmer_features_t *features, bool enable);

void wasmer_features_delete(struct wasmer_features_t *_features);

bool wasmer_features_exceptions(struct wasmer_features_t *features, bool enable);

bool wasmer_features_extended_const(struct wasmer_features_t *features, bool enable);

bool wasmer_features_memory64(struct wasmer_features_t *features, bool enable);

bool wasmer_features_module_linking(struct wasmer_features_t *features, bool enable);

bool wasmer_features_multi_memory(struct wasmer_features_t *features, bool enable);

bool wasmer_features_multi_value(struct wasmer_features_t *features, bool enable);

struct wasmer_features_t *wasmer_features_new(void);

bool wasmer_features_reference_types(struct wasmer_features_t *features, bool enable);

bool wasmer_features_relaxed_simd(struct wasmer_features_t *features, bool enable);

bool wasmer_features_simd(struct wasmer_features_t *features, bool enable);

bool wasmer_features_tail_call(struct wasmer_features_t *features, bool enable);

bool wasmer_features_threads(struct wasmer_features_t *features, bool enable);

bool wasmer_features_wide_arithmetic(struct wasmer_features_t *features, bool enable);

void wasmer_funcenv_delete(struct wasmer_funcenv_t *_funcenv);

struct wasmer_funcenv_t *wasmer_funcenv_new(wasm_store_t *store, void *data);

bool wasmer_is_backend_available(enum wasmer_backend_t backend);

bool wasmer_is_headless(void);

int wasmer_last_error_length(void);

int wasmer_last_error_message(char *buffer, int length);

struct wasmer_middleware_t *wasmer_metering_as_middleware(struct wasmer_metering_t *metering);

void wasmer_metering_delete(struct wasmer_metering_t *_metering);

uint64_t wasmer_metering_get_remaining_points(wasm_instance_t *instance);

struct wasmer_metering_t *wasmer_metering_new(uint64_t initial_limit,
                                              wasmer_metering_cost_function_t cost_function);

bool wasmer_metering_points_are_exhausted(wasm_instance_t *instance);

void wasmer_metering_set_remaining_points(wasm_instance_t *instance, uint64_t new_limit);

void wasmer_module_name(const wasm_module_t *module, wasm_name_t *out);

wasm_module_t *wasmer_module_new(wasm_engine_t *engine, const wasm_byte_vec_t *bytes);

bool wasmer_module_set_name(wasm_module_t *module, const wasm_name_t *name);

#if defined(WASMER_WASI_ENABLED)
const wasm_name_t *wasmer_named_extern_module(const struct wasmer_named_extern_t *named_extern);
#endif

#if defined(WASMER_WASI_ENABLED)
const wasm_name_t *wasmer_named_extern_name(const struct wasmer_named_extern_t *named_extern);
#endif

#if defined(WASMER_WASI_ENABLED)
const wasm_extern_t *wasmer_named_extern_unwrap(const struct wasmer_named_extern_t *named_extern);
#endif

#if defined(WASMER_WASI_ENABLED)
void wasmer_named_extern_vec_copy(struct wasmer_named_extern_vec_t *out_ptr,
                                  const struct wasmer_named_extern_vec_t *in_ptr);
#endif

#if defined(WASMER_WASI_ENABLED)
void wasmer_named_extern_vec_delete(struct wasmer_named_extern_vec_t *ptr);
#endif

#if defined(WASMER_WASI_ENABLED)
void wasmer_named_extern_vec_new(struct wasmer_named_extern_vec_t *out,
                                 uintptr_t length,
                                 struct wasmer_named_extern_t *const *init);
#endif

#if defined(WASMER_WASI_ENABLED)
void wasmer_named_extern_vec_new_empty(struct wasmer_named_extern_vec_t *out);
#endif

#if defined(WASMER_WASI_ENABLED)
void wasmer_named_extern_vec_new_uninitialized(struct wasmer_named_extern_vec_t *out,
                                               uintptr_t length);
#endif

void wasmer_setup_tracing(int verbosity_level, int use_color);

void wasmer_target_delete(struct wasmer_target_t *_target);

struct wasmer_target_t *wasmer_target_new(struct wasmer_triple_t *triple,
                                          struct wasmer_cpu_features_t *cpu_features);

void wasmer_triple_delete(struct wasmer_triple_t *_triple);

struct wasmer_triple_t *wasmer_triple_new(const wasm_name_t *triple);

struct wasmer_triple_t *wasmer_triple_new_from_host(void);

const char *wasmer_version(void);

uint8_t wasmer_version_major(void);

uint8_t wasmer_version_minor(void);

uint8_t wasmer_version_patch(void);

const char *wasmer_version_pre(void);

void wat2wasm(const wasm_byte_vec_t *wat, wasm_byte_vec_t *out);

#ifdef __cplusplus
}  // extern "C"
#endif  // __cplusplus

#endif  /* WASMER_H */
