///
/// NitroTorch-Swift-Cxx-Bridge.hpp
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © 2025 Marc Rousavy @ Margelo
///

#pragma once

// Forward declarations of C++ defined types
// Forward declaration of `HybridTorchSpec` to properly resolve imports.
namespace margelo::nitro::nitrotorch { class HybridTorchSpec; }

// Forward declarations of Swift defined types
// Forward declaration of `HybridTorchSpec_cxx` to properly resolve imports.
namespace NitroTorch { class HybridTorchSpec_cxx; }

// Include C++ defined types
#include "HybridTorchSpec.hpp"
#include <NitroModules/Promise.hpp>
#include <NitroModules/PromiseHolder.hpp>
#include <NitroModules/Result.hpp>
#include <exception>
#include <functional>
#include <memory>
#include <optional>

/**
 * Contains specialized versions of C++ templated types so they can be accessed from Swift,
 * as well as helper functions to interact with those C++ types from Swift.
 */
namespace margelo::nitro::nitrotorch::bridge::swift {

  // pragma MARK: std::shared_ptr<Promise<void>>
  /**
   * Specialized version of `std::shared_ptr<Promise<void>>`.
   */
  using std__shared_ptr_Promise_void__ = std::shared_ptr<Promise<void>>;
  inline std::shared_ptr<Promise<void>> create_std__shared_ptr_Promise_void__() noexcept {
    return Promise<void>::create();
  }
  inline PromiseHolder<void> wrap_std__shared_ptr_Promise_void__(std::shared_ptr<Promise<void>> promise) noexcept {
    return PromiseHolder<void>(std::move(promise));
  }
  
  // pragma MARK: std::function<void()>
  /**
   * Specialized version of `std::function<void()>`.
   */
  using Func_void = std::function<void()>;
  /**
   * Wrapper class for a `std::function<void()>`, this can be used from Swift.
   */
  class Func_void_Wrapper final {
  public:
    explicit Func_void_Wrapper(std::function<void()>&& func): _function(std::make_unique<std::function<void()>>(std::move(func))) {}
    inline void call() const noexcept {
      _function->operator()();
    }
  private:
    std::unique_ptr<std::function<void()>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void create_Func_void(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_Wrapper wrap_Func_void(Func_void value) noexcept {
    return Func_void_Wrapper(std::move(value));
  }
  
  // pragma MARK: std::function<void(const std::exception_ptr& /* error */)>
  /**
   * Specialized version of `std::function<void(const std::exception_ptr&)>`.
   */
  using Func_void_std__exception_ptr = std::function<void(const std::exception_ptr& /* error */)>;
  /**
   * Wrapper class for a `std::function<void(const std::exception_ptr& / * error * /)>`, this can be used from Swift.
   */
  class Func_void_std__exception_ptr_Wrapper final {
  public:
    explicit Func_void_std__exception_ptr_Wrapper(std::function<void(const std::exception_ptr& /* error */)>&& func): _function(std::make_unique<std::function<void(const std::exception_ptr& /* error */)>>(std::move(func))) {}
    inline void call(std::exception_ptr error) const noexcept {
      _function->operator()(error);
    }
  private:
    std::unique_ptr<std::function<void(const std::exception_ptr& /* error */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_std__exception_ptr create_Func_void_std__exception_ptr(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_std__exception_ptr_Wrapper wrap_Func_void_std__exception_ptr(Func_void_std__exception_ptr value) noexcept {
    return Func_void_std__exception_ptr_Wrapper(std::move(value));
  }
  
  // pragma MARK: std::function<void(bool /* state */)>
  /**
   * Specialized version of `std::function<void(bool)>`.
   */
  using Func_void_bool = std::function<void(bool /* state */)>;
  /**
   * Wrapper class for a `std::function<void(bool / * state * /)>`, this can be used from Swift.
   */
  class Func_void_bool_Wrapper final {
  public:
    explicit Func_void_bool_Wrapper(std::function<void(bool /* state */)>&& func): _function(std::make_unique<std::function<void(bool /* state */)>>(std::move(func))) {}
    inline void call(bool state) const noexcept {
      _function->operator()(state);
    }
  private:
    std::unique_ptr<std::function<void(bool /* state */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_bool create_Func_void_bool(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_bool_Wrapper wrap_Func_void_bool(Func_void_bool value) noexcept {
    return Func_void_bool_Wrapper(std::move(value));
  }
  
  // pragma MARK: std::optional<std::function<void(bool /* state */)>>
  /**
   * Specialized version of `std::optional<std::function<void(bool / * state * /)>>`.
   */
  using std__optional_std__function_void_bool____state______ = std::optional<std::function<void(bool /* state */)>>;
  inline std::optional<std::function<void(bool /* state */)>> create_std__optional_std__function_void_bool____state______(const std::function<void(bool /* state */)>& value) noexcept {
    return std::optional<std::function<void(bool /* state */)>>(value);
  }
  inline bool has_value_std__optional_std__function_void_bool____state______(const std::optional<std::function<void(bool /* state */)>>& optional) noexcept {
    return optional.has_value();
  }
  inline std::function<void(bool /* state */)> get_std__optional_std__function_void_bool____state______(const std::optional<std::function<void(bool /* state */)>>& optional) noexcept {
    return *optional;
  }
  
  // pragma MARK: std::optional<double>
  /**
   * Specialized version of `std::optional<double>`.
   */
  using std__optional_double_ = std::optional<double>;
  inline std::optional<double> create_std__optional_double_(const double& value) noexcept {
    return std::optional<double>(value);
  }
  inline bool has_value_std__optional_double_(const std::optional<double>& optional) noexcept {
    return optional.has_value();
  }
  inline double get_std__optional_double_(const std::optional<double>& optional) noexcept {
    return *optional;
  }
  
  // pragma MARK: std::function<void(std::optional<double> /* level */)>
  /**
   * Specialized version of `std::function<void(std::optional<double>)>`.
   */
  using Func_void_std__optional_double_ = std::function<void(std::optional<double> /* level */)>;
  /**
   * Wrapper class for a `std::function<void(std::optional<double> / * level * /)>`, this can be used from Swift.
   */
  class Func_void_std__optional_double__Wrapper final {
  public:
    explicit Func_void_std__optional_double__Wrapper(std::function<void(std::optional<double> /* level */)>&& func): _function(std::make_unique<std::function<void(std::optional<double> /* level */)>>(std::move(func))) {}
    inline void call(std::optional<double> level) const noexcept {
      _function->operator()(level);
    }
  private:
    std::unique_ptr<std::function<void(std::optional<double> /* level */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_std__optional_double_ create_Func_void_std__optional_double_(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_std__optional_double__Wrapper wrap_Func_void_std__optional_double_(Func_void_std__optional_double_ value) noexcept {
    return Func_void_std__optional_double__Wrapper(std::move(value));
  }
  
  // pragma MARK: std::optional<std::function<void(std::optional<double> /* level */)>>
  /**
   * Specialized version of `std::optional<std::function<void(std::optional<double> / * level * /)>>`.
   */
  using std__optional_std__function_void_std__optional_double_____level______ = std::optional<std::function<void(std::optional<double> /* level */)>>;
  inline std::optional<std::function<void(std::optional<double> /* level */)>> create_std__optional_std__function_void_std__optional_double_____level______(const std::function<void(std::optional<double> /* level */)>& value) noexcept {
    return std::optional<std::function<void(std::optional<double> /* level */)>>(value);
  }
  inline bool has_value_std__optional_std__function_void_std__optional_double_____level______(const std::optional<std::function<void(std::optional<double> /* level */)>>& optional) noexcept {
    return optional.has_value();
  }
  inline std::function<void(std::optional<double> /* level */)> get_std__optional_std__function_void_std__optional_double_____level______(const std::optional<std::function<void(std::optional<double> /* level */)>>& optional) noexcept {
    return *optional;
  }
  
  // pragma MARK: std::optional<bool>
  /**
   * Specialized version of `std::optional<bool>`.
   */
  using std__optional_bool_ = std::optional<bool>;
  inline std::optional<bool> create_std__optional_bool_(const bool& value) noexcept {
    return std::optional<bool>(value);
  }
  inline bool has_value_std__optional_bool_(const std::optional<bool>& optional) noexcept {
    return optional.has_value();
  }
  inline bool get_std__optional_bool_(const std::optional<bool>& optional) noexcept {
    return *optional;
  }
  
  // pragma MARK: std::shared_ptr<HybridTorchSpec>
  /**
   * Specialized version of `std::shared_ptr<HybridTorchSpec>`.
   */
  using std__shared_ptr_HybridTorchSpec_ = std::shared_ptr<HybridTorchSpec>;
  std::shared_ptr<HybridTorchSpec> create_std__shared_ptr_HybridTorchSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_HybridTorchSpec_(std__shared_ptr_HybridTorchSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<HybridTorchSpec>
  using std__weak_ptr_HybridTorchSpec_ = std::weak_ptr<HybridTorchSpec>;
  inline std__weak_ptr_HybridTorchSpec_ weakify_std__shared_ptr_HybridTorchSpec_(const std::shared_ptr<HybridTorchSpec>& strong) noexcept { return strong; }
  
  // pragma MARK: Result<std::shared_ptr<Promise<void>>>
  using Result_std__shared_ptr_Promise_void___ = Result<std::shared_ptr<Promise<void>>>;
  inline Result_std__shared_ptr_Promise_void___ create_Result_std__shared_ptr_Promise_void___(const std::shared_ptr<Promise<void>>& value) noexcept {
    return Result<std::shared_ptr<Promise<void>>>::withValue(value);
  }
  inline Result_std__shared_ptr_Promise_void___ create_Result_std__shared_ptr_Promise_void___(const std::exception_ptr& error) noexcept {
    return Result<std::shared_ptr<Promise<void>>>::withError(error);
  }
  
  // pragma MARK: Result<std::optional<double>>
  using Result_std__optional_double__ = Result<std::optional<double>>;
  inline Result_std__optional_double__ create_Result_std__optional_double__(std::optional<double> value) noexcept {
    return Result<std::optional<double>>::withValue(std::move(value));
  }
  inline Result_std__optional_double__ create_Result_std__optional_double__(const std::exception_ptr& error) noexcept {
    return Result<std::optional<double>>::withError(error);
  }

} // namespace margelo::nitro::nitrotorch::bridge::swift
