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

#pragma once

// Forward declarations of C++ defined types
// Forward declaration of `ArrayBufferHolder` to properly resolve imports.
namespace NitroModules { class ArrayBufferHolder; }
// Forward declaration of `BLEDevice` to properly resolve imports.
namespace margelo::nitro::co::zyke::ble { struct BLEDevice; }
// Forward declaration of `BLEState` to properly resolve imports.
namespace margelo::nitro::co::zyke::ble { enum class BLEState; }
// Forward declaration of `HybridNativeBleNitroFactorySpec` to properly resolve imports.
namespace margelo::nitro::co::zyke::ble { class HybridNativeBleNitroFactorySpec; }
// Forward declaration of `HybridNativeBleNitroSpec` to properly resolve imports.
namespace margelo::nitro::co::zyke::ble { class HybridNativeBleNitroSpec; }
// Forward declaration of `ManufacturerDataEntry` to properly resolve imports.
namespace margelo::nitro::co::zyke::ble { struct ManufacturerDataEntry; }
// Forward declaration of `ManufacturerData` to properly resolve imports.
namespace margelo::nitro::co::zyke::ble { struct ManufacturerData; }
// Forward declaration of `OperationResult` to properly resolve imports.
namespace margelo::nitro::co::zyke::ble { struct OperationResult; }
// Forward declaration of `ServiceDataEntry` to properly resolve imports.
namespace margelo::nitro::co::zyke::ble { struct ServiceDataEntry; }
// Forward declaration of `ServiceData` to properly resolve imports.
namespace margelo::nitro::co::zyke::ble { struct ServiceData; }

// Forward declarations of Swift defined types
// Forward declaration of `HybridNativeBleNitroFactorySpec_cxx` to properly resolve imports.
namespace BleNitro { class HybridNativeBleNitroFactorySpec_cxx; }
// Forward declaration of `HybridNativeBleNitroSpec_cxx` to properly resolve imports.
namespace BleNitro { class HybridNativeBleNitroSpec_cxx; }

// Include C++ defined types
#include "BLEDevice.hpp"
#include "BLEState.hpp"
#include "HybridNativeBleNitroFactorySpec.hpp"
#include "HybridNativeBleNitroSpec.hpp"
#include "ManufacturerData.hpp"
#include "ManufacturerDataEntry.hpp"
#include "OperationResult.hpp"
#include "ServiceData.hpp"
#include "ServiceDataEntry.hpp"
#include <NitroModules/ArrayBuffer.hpp>
#include <NitroModules/ArrayBufferHolder.hpp>
#include <NitroModules/Null.hpp>
#include <NitroModules/Promise.hpp>
#include <NitroModules/PromiseHolder.hpp>
#include <NitroModules/Result.hpp>
#include <exception>
#include <functional>
#include <memory>
#include <optional>
#include <string>
#include <variant>
#include <vector>

/**
 * 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::co::zyke::ble::bridge::swift {

  // pragma MARK: std::optional<std::string>
  /**
   * Specialized version of `std::optional<std::string>`.
   */
  using std__optional_std__string_ = std::optional<std::string>;
  inline std::optional<std::string> create_std__optional_std__string_(const std::string& value) noexcept {
    return std::optional<std::string>(value);
  }
  inline bool has_value_std__optional_std__string_(const std::optional<std::string>& optional) noexcept {
    return optional.has_value();
  }
  inline std::string get_std__optional_std__string_(const std::optional<std::string>& optional) noexcept {
    return optional.value();
  }
  
  // pragma MARK: std::vector<ManufacturerDataEntry>
  /**
   * Specialized version of `std::vector<ManufacturerDataEntry>`.
   */
  using std__vector_ManufacturerDataEntry_ = std::vector<ManufacturerDataEntry>;
  inline std::vector<ManufacturerDataEntry> create_std__vector_ManufacturerDataEntry_(size_t size) noexcept {
    std::vector<ManufacturerDataEntry> vector;
    vector.reserve(size);
    return vector;
  }
  
  // pragma MARK: std::vector<ServiceDataEntry>
  /**
   * Specialized version of `std::vector<ServiceDataEntry>`.
   */
  using std__vector_ServiceDataEntry_ = std::vector<ServiceDataEntry>;
  inline std::vector<ServiceDataEntry> create_std__vector_ServiceDataEntry_(size_t size) noexcept {
    std::vector<ServiceDataEntry> vector;
    vector.reserve(size);
    return vector;
  }
  
  // pragma MARK: std::vector<std::string>
  /**
   * Specialized version of `std::vector<std::string>`.
   */
  using std__vector_std__string_ = std::vector<std::string>;
  inline std::vector<std::string> create_std__vector_std__string_(size_t size) noexcept {
    std::vector<std::string> vector;
    vector.reserve(size);
    return vector;
  }
  
  // pragma MARK: std::vector<BLEDevice>
  /**
   * Specialized version of `std::vector<BLEDevice>`.
   */
  using std__vector_BLEDevice_ = std::vector<BLEDevice>;
  inline std::vector<BLEDevice> create_std__vector_BLEDevice_(size_t size) noexcept {
    std::vector<BLEDevice> vector;
    vector.reserve(size);
    return vector;
  }
  
  // pragma MARK: std::function<void(const std::vector<BLEDevice>& /* restoredPeripherals */)>
  /**
   * Specialized version of `std::function<void(const std::vector<BLEDevice>&)>`.
   */
  using Func_void_std__vector_BLEDevice_ = std::function<void(const std::vector<BLEDevice>& /* restoredPeripherals */)>;
  /**
   * Wrapper class for a `std::function<void(const std::vector<BLEDevice>& / * restoredPeripherals * /)>`, this can be used from Swift.
   */
  class Func_void_std__vector_BLEDevice__Wrapper final {
  public:
    explicit Func_void_std__vector_BLEDevice__Wrapper(std::function<void(const std::vector<BLEDevice>& /* restoredPeripherals */)>&& func): _function(std::make_unique<std::function<void(const std::vector<BLEDevice>& /* restoredPeripherals */)>>(std::move(func))) {}
    inline void call(std::vector<BLEDevice> restoredPeripherals) const noexcept {
      _function->operator()(restoredPeripherals);
    }
  private:
    std::unique_ptr<std::function<void(const std::vector<BLEDevice>& /* restoredPeripherals */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_std__vector_BLEDevice_ create_Func_void_std__vector_BLEDevice_(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_std__vector_BLEDevice__Wrapper wrap_Func_void_std__vector_BLEDevice_(Func_void_std__vector_BLEDevice_ value) noexcept {
    return Func_void_std__vector_BLEDevice__Wrapper(std::move(value));
  }
  
  // pragma MARK: std::variant<nitro::NullType, BLEDevice>
  /**
   * Wrapper struct for `std::variant<nitro::NullType, BLEDevice>`.
   * std::variant cannot be used in Swift because of a Swift bug.
   * Not even specializing it works. So we create a wrapper struct.
   */
  struct std__variant_nitro__NullType__BLEDevice_ final {
    std::variant<nitro::NullType, BLEDevice> variant;
    std__variant_nitro__NullType__BLEDevice_(std::variant<nitro::NullType, BLEDevice> variant): variant(variant) { }
    operator std::variant<nitro::NullType, BLEDevice>() const noexcept {
      return variant;
    }
    inline size_t index() const noexcept {
      return variant.index();
    }
    inline nitro::NullType get_0() const noexcept {
      return std::get<0>(variant);
    }
    inline BLEDevice get_1() const noexcept {
      return std::get<1>(variant);
    }
  };
  inline std__variant_nitro__NullType__BLEDevice_ create_std__variant_nitro__NullType__BLEDevice_(nitro::NullType value) noexcept {
    return std__variant_nitro__NullType__BLEDevice_(value);
  }
  inline std__variant_nitro__NullType__BLEDevice_ create_std__variant_nitro__NullType__BLEDevice_(const BLEDevice& value) noexcept {
    return std__variant_nitro__NullType__BLEDevice_(value);
  }
  
  // pragma MARK: std::optional<std::variant<nitro::NullType, BLEDevice>>
  /**
   * Specialized version of `std::optional<std::variant<nitro::NullType, BLEDevice>>`.
   */
  using std__optional_std__variant_nitro__NullType__BLEDevice__ = std::optional<std::variant<nitro::NullType, BLEDevice>>;
  inline std::optional<std::variant<nitro::NullType, BLEDevice>> create_std__optional_std__variant_nitro__NullType__BLEDevice__(const std::variant<nitro::NullType, BLEDevice>& value) noexcept {
    return std::optional<std::variant<nitro::NullType, BLEDevice>>(value);
  }
  inline bool has_value_std__optional_std__variant_nitro__NullType__BLEDevice__(const std::optional<std::variant<nitro::NullType, BLEDevice>>& optional) noexcept {
    return optional.has_value();
  }
  inline std::variant<nitro::NullType, BLEDevice> get_std__optional_std__variant_nitro__NullType__BLEDevice__(const std::optional<std::variant<nitro::NullType, BLEDevice>>& optional) noexcept {
    return optional.value();
  }
  
  // pragma MARK: std::variant<nitro::NullType, std::string>
  /**
   * Wrapper struct for `std::variant<nitro::NullType, std::string>`.
   * std::variant cannot be used in Swift because of a Swift bug.
   * Not even specializing it works. So we create a wrapper struct.
   */
  struct std__variant_nitro__NullType__std__string_ final {
    std::variant<nitro::NullType, std::string> variant;
    std__variant_nitro__NullType__std__string_(std::variant<nitro::NullType, std::string> variant): variant(variant) { }
    operator std::variant<nitro::NullType, std::string>() const noexcept {
      return variant;
    }
    inline size_t index() const noexcept {
      return variant.index();
    }
    inline nitro::NullType get_0() const noexcept {
      return std::get<0>(variant);
    }
    inline std::string get_1() const noexcept {
      return std::get<1>(variant);
    }
  };
  inline std__variant_nitro__NullType__std__string_ create_std__variant_nitro__NullType__std__string_(nitro::NullType value) noexcept {
    return std__variant_nitro__NullType__std__string_(value);
  }
  inline std__variant_nitro__NullType__std__string_ create_std__variant_nitro__NullType__std__string_(const std::string& value) noexcept {
    return std__variant_nitro__NullType__std__string_(value);
  }
  
  // pragma MARK: std::optional<std::variant<nitro::NullType, std::string>>
  /**
   * Specialized version of `std::optional<std::variant<nitro::NullType, std::string>>`.
   */
  using std__optional_std__variant_nitro__NullType__std__string__ = std::optional<std::variant<nitro::NullType, std::string>>;
  inline std::optional<std::variant<nitro::NullType, std::string>> create_std__optional_std__variant_nitro__NullType__std__string__(const std::variant<nitro::NullType, std::string>& value) noexcept {
    return std::optional<std::variant<nitro::NullType, std::string>>(value);
  }
  inline bool has_value_std__optional_std__variant_nitro__NullType__std__string__(const std::optional<std::variant<nitro::NullType, std::string>>& optional) noexcept {
    return optional.has_value();
  }
  inline std::variant<nitro::NullType, std::string> get_std__optional_std__variant_nitro__NullType__std__string__(const std::optional<std::variant<nitro::NullType, std::string>>& optional) noexcept {
    return optional.value();
  }
  
  // pragma MARK: std::function<void(const std::optional<std::variant<nitro::NullType, BLEDevice>>& /* device */, const std::optional<std::variant<nitro::NullType, std::string>>& /* error */)>
  /**
   * Specialized version of `std::function<void(const std::optional<std::variant<nitro::NullType, BLEDevice>>&, const std::optional<std::variant<nitro::NullType, std::string>>&)>`.
   */
  using Func_void_std__optional_std__variant_nitro__NullType__BLEDevice___std__optional_std__variant_nitro__NullType__std__string__ = std::function<void(const std::optional<std::variant<nitro::NullType, BLEDevice>>& /* device */, const std::optional<std::variant<nitro::NullType, std::string>>& /* error */)>;
  /**
   * Wrapper class for a `std::function<void(const std::optional<std::variant<nitro::NullType, BLEDevice>>& / * device * /, const std::optional<std::variant<nitro::NullType, std::string>>& / * error * /)>`, this can be used from Swift.
   */
  class Func_void_std__optional_std__variant_nitro__NullType__BLEDevice___std__optional_std__variant_nitro__NullType__std__string___Wrapper final {
  public:
    explicit Func_void_std__optional_std__variant_nitro__NullType__BLEDevice___std__optional_std__variant_nitro__NullType__std__string___Wrapper(std::function<void(const std::optional<std::variant<nitro::NullType, BLEDevice>>& /* device */, const std::optional<std::variant<nitro::NullType, std::string>>& /* error */)>&& func): _function(std::make_unique<std::function<void(const std::optional<std::variant<nitro::NullType, BLEDevice>>& /* device */, const std::optional<std::variant<nitro::NullType, std::string>>& /* error */)>>(std::move(func))) {}
    inline void call(std::optional<std::variant<nitro::NullType, BLEDevice>> device, std::optional<std::variant<nitro::NullType, std::string>> error) const noexcept {
      _function->operator()(device, error);
    }
  private:
    std::unique_ptr<std::function<void(const std::optional<std::variant<nitro::NullType, BLEDevice>>& /* device */, const std::optional<std::variant<nitro::NullType, std::string>>& /* error */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_std__optional_std__variant_nitro__NullType__BLEDevice___std__optional_std__variant_nitro__NullType__std__string__ create_Func_void_std__optional_std__variant_nitro__NullType__BLEDevice___std__optional_std__variant_nitro__NullType__std__string__(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_std__optional_std__variant_nitro__NullType__BLEDevice___std__optional_std__variant_nitro__NullType__std__string___Wrapper wrap_Func_void_std__optional_std__variant_nitro__NullType__BLEDevice___std__optional_std__variant_nitro__NullType__std__string__(Func_void_std__optional_std__variant_nitro__NullType__BLEDevice___std__optional_std__variant_nitro__NullType__std__string__ value) noexcept {
    return Func_void_std__optional_std__variant_nitro__NullType__BLEDevice___std__optional_std__variant_nitro__NullType__std__string___Wrapper(std::move(value));
  }
  
  // pragma MARK: std::function<void(bool /* success */, const std::string& /* deviceId */, const std::string& /* error */)>
  /**
   * Specialized version of `std::function<void(bool, const std::string&, const std::string&)>`.
   */
  using Func_void_bool_std__string_std__string = std::function<void(bool /* success */, const std::string& /* deviceId */, const std::string& /* error */)>;
  /**
   * Wrapper class for a `std::function<void(bool / * success * /, const std::string& / * deviceId * /, const std::string& / * error * /)>`, this can be used from Swift.
   */
  class Func_void_bool_std__string_std__string_Wrapper final {
  public:
    explicit Func_void_bool_std__string_std__string_Wrapper(std::function<void(bool /* success */, const std::string& /* deviceId */, const std::string& /* error */)>&& func): _function(std::make_unique<std::function<void(bool /* success */, const std::string& /* deviceId */, const std::string& /* error */)>>(std::move(func))) {}
    inline void call(bool success, std::string deviceId, std::string error) const noexcept {
      _function->operator()(success, deviceId, error);
    }
  private:
    std::unique_ptr<std::function<void(bool /* success */, const std::string& /* deviceId */, const std::string& /* error */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_bool_std__string_std__string create_Func_void_bool_std__string_std__string(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_bool_std__string_std__string_Wrapper wrap_Func_void_bool_std__string_std__string(Func_void_bool_std__string_std__string value) noexcept {
    return Func_void_bool_std__string_std__string_Wrapper(std::move(value));
  }
  
  // pragma MARK: std::function<void(const std::string& /* deviceId */, bool /* interrupted */, const std::string& /* error */)>
  /**
   * Specialized version of `std::function<void(const std::string&, bool, const std::string&)>`.
   */
  using Func_void_std__string_bool_std__string = std::function<void(const std::string& /* deviceId */, bool /* interrupted */, const std::string& /* error */)>;
  /**
   * Wrapper class for a `std::function<void(const std::string& / * deviceId * /, bool / * interrupted * /, const std::string& / * error * /)>`, this can be used from Swift.
   */
  class Func_void_std__string_bool_std__string_Wrapper final {
  public:
    explicit Func_void_std__string_bool_std__string_Wrapper(std::function<void(const std::string& /* deviceId */, bool /* interrupted */, const std::string& /* error */)>&& func): _function(std::make_unique<std::function<void(const std::string& /* deviceId */, bool /* interrupted */, const std::string& /* error */)>>(std::move(func))) {}
    inline void call(std::string deviceId, bool interrupted, std::string error) const noexcept {
      _function->operator()(deviceId, interrupted, error);
    }
  private:
    std::unique_ptr<std::function<void(const std::string& /* deviceId */, bool /* interrupted */, const std::string& /* error */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_std__string_bool_std__string create_Func_void_std__string_bool_std__string(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_std__string_bool_std__string_Wrapper wrap_Func_void_std__string_bool_std__string(Func_void_std__string_bool_std__string value) noexcept {
    return Func_void_std__string_bool_std__string_Wrapper(std::move(value));
  }
  
  // pragma MARK: std::optional<std::function<void(const std::string& /* deviceId */, bool /* interrupted */, const std::string& /* error */)>>
  /**
   * Specialized version of `std::optional<std::function<void(const std::string& / * deviceId * /, bool / * interrupted * /, const std::string& / * error * /)>>`.
   */
  using std__optional_std__function_void_const_std__string_____deviceId_____bool____interrupted_____const_std__string_____error______ = std::optional<std::function<void(const std::string& /* deviceId */, bool /* interrupted */, const std::string& /* error */)>>;
  inline std::optional<std::function<void(const std::string& /* deviceId */, bool /* interrupted */, const std::string& /* error */)>> create_std__optional_std__function_void_const_std__string_____deviceId_____bool____interrupted_____const_std__string_____error______(const std::function<void(const std::string& /* deviceId */, bool /* interrupted */, const std::string& /* error */)>& value) noexcept {
    return std::optional<std::function<void(const std::string& /* deviceId */, bool /* interrupted */, const std::string& /* error */)>>(value);
  }
  inline bool has_value_std__optional_std__function_void_const_std__string_____deviceId_____bool____interrupted_____const_std__string_____error______(const std::optional<std::function<void(const std::string& /* deviceId */, bool /* interrupted */, const std::string& /* error */)>>& optional) noexcept {
    return optional.has_value();
  }
  inline std::function<void(const std::string& /* deviceId */, bool /* interrupted */, const std::string& /* error */)> get_std__optional_std__function_void_const_std__string_____deviceId_____bool____interrupted_____const_std__string_____error______(const std::optional<std::function<void(const std::string& /* deviceId */, bool /* interrupted */, const std::string& /* error */)>>& optional) noexcept {
    return optional.value();
  }
  
  // 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.value();
  }
  
  // pragma MARK: std::function<void(bool /* success */, const std::string& /* error */)>
  /**
   * Specialized version of `std::function<void(bool, const std::string&)>`.
   */
  using Func_void_bool_std__string = std::function<void(bool /* success */, const std::string& /* error */)>;
  /**
   * Wrapper class for a `std::function<void(bool / * success * /, const std::string& / * error * /)>`, this can be used from Swift.
   */
  class Func_void_bool_std__string_Wrapper final {
  public:
    explicit Func_void_bool_std__string_Wrapper(std::function<void(bool /* success */, const std::string& /* error */)>&& func): _function(std::make_unique<std::function<void(bool /* success */, const std::string& /* error */)>>(std::move(func))) {}
    inline void call(bool success, std::string error) const noexcept {
      _function->operator()(success, error);
    }
  private:
    std::unique_ptr<std::function<void(bool /* success */, const std::string& /* error */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_bool_std__string create_Func_void_bool_std__string(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_bool_std__string_Wrapper wrap_Func_void_bool_std__string(Func_void_bool_std__string value) noexcept {
    return Func_void_bool_std__string_Wrapper(std::move(value));
  }
  
  // pragma MARK: std::function<void(bool /* success */, double /* rssi */, const std::string& /* error */)>
  /**
   * Specialized version of `std::function<void(bool, double, const std::string&)>`.
   */
  using Func_void_bool_double_std__string = std::function<void(bool /* success */, double /* rssi */, const std::string& /* error */)>;
  /**
   * Wrapper class for a `std::function<void(bool / * success * /, double / * rssi * /, const std::string& / * error * /)>`, this can be used from Swift.
   */
  class Func_void_bool_double_std__string_Wrapper final {
  public:
    explicit Func_void_bool_double_std__string_Wrapper(std::function<void(bool /* success */, double /* rssi */, const std::string& /* error */)>&& func): _function(std::make_unique<std::function<void(bool /* success */, double /* rssi */, const std::string& /* error */)>>(std::move(func))) {}
    inline void call(bool success, double rssi, std::string error) const noexcept {
      _function->operator()(success, rssi, error);
    }
  private:
    std::unique_ptr<std::function<void(bool /* success */, double /* rssi */, const std::string& /* error */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_bool_double_std__string create_Func_void_bool_double_std__string(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_bool_double_std__string_Wrapper wrap_Func_void_bool_double_std__string(Func_void_bool_double_std__string value) noexcept {
    return Func_void_bool_double_std__string_Wrapper(std::move(value));
  }
  
  // pragma MARK: std::function<void(bool /* success */, const std::shared_ptr<ArrayBuffer>& /* data */, const std::string& /* error */)>
  /**
   * Specialized version of `std::function<void(bool, const std::shared_ptr<ArrayBuffer>&, const std::string&)>`.
   */
  using Func_void_bool_std__shared_ptr_ArrayBuffer__std__string = std::function<void(bool /* success */, const std::shared_ptr<ArrayBuffer>& /* data */, const std::string& /* error */)>;
  /**
   * Wrapper class for a `std::function<void(bool / * success * /, const std::shared_ptr<ArrayBuffer>& / * data * /, const std::string& / * error * /)>`, this can be used from Swift.
   */
  class Func_void_bool_std__shared_ptr_ArrayBuffer__std__string_Wrapper final {
  public:
    explicit Func_void_bool_std__shared_ptr_ArrayBuffer__std__string_Wrapper(std::function<void(bool /* success */, const std::shared_ptr<ArrayBuffer>& /* data */, const std::string& /* error */)>&& func): _function(std::make_unique<std::function<void(bool /* success */, const std::shared_ptr<ArrayBuffer>& /* data */, const std::string& /* error */)>>(std::move(func))) {}
    inline void call(bool success, ArrayBufferHolder data, std::string error) const noexcept {
      _function->operator()(success, data.getArrayBuffer(), error);
    }
  private:
    std::unique_ptr<std::function<void(bool /* success */, const std::shared_ptr<ArrayBuffer>& /* data */, const std::string& /* error */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_bool_std__shared_ptr_ArrayBuffer__std__string create_Func_void_bool_std__shared_ptr_ArrayBuffer__std__string(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_bool_std__shared_ptr_ArrayBuffer__std__string_Wrapper wrap_Func_void_bool_std__shared_ptr_ArrayBuffer__std__string(Func_void_bool_std__shared_ptr_ArrayBuffer__std__string value) noexcept {
    return Func_void_bool_std__shared_ptr_ArrayBuffer__std__string_Wrapper(std::move(value));
  }
  
  // pragma MARK: std::function<void(const std::string& /* characteristicId */, const std::shared_ptr<ArrayBuffer>& /* data */)>
  /**
   * Specialized version of `std::function<void(const std::string&, const std::shared_ptr<ArrayBuffer>&)>`.
   */
  using Func_void_std__string_std__shared_ptr_ArrayBuffer_ = std::function<void(const std::string& /* characteristicId */, const std::shared_ptr<ArrayBuffer>& /* data */)>;
  /**
   * Wrapper class for a `std::function<void(const std::string& / * characteristicId * /, const std::shared_ptr<ArrayBuffer>& / * data * /)>`, this can be used from Swift.
   */
  class Func_void_std__string_std__shared_ptr_ArrayBuffer__Wrapper final {
  public:
    explicit Func_void_std__string_std__shared_ptr_ArrayBuffer__Wrapper(std::function<void(const std::string& /* characteristicId */, const std::shared_ptr<ArrayBuffer>& /* data */)>&& func): _function(std::make_unique<std::function<void(const std::string& /* characteristicId */, const std::shared_ptr<ArrayBuffer>& /* data */)>>(std::move(func))) {}
    inline void call(std::string characteristicId, ArrayBufferHolder data) const noexcept {
      _function->operator()(characteristicId, data.getArrayBuffer());
    }
  private:
    std::unique_ptr<std::function<void(const std::string& /* characteristicId */, const std::shared_ptr<ArrayBuffer>& /* data */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_std__string_std__shared_ptr_ArrayBuffer_ create_Func_void_std__string_std__shared_ptr_ArrayBuffer_(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_std__string_std__shared_ptr_ArrayBuffer__Wrapper wrap_Func_void_std__string_std__shared_ptr_ArrayBuffer_(Func_void_std__string_std__shared_ptr_ArrayBuffer_ value) noexcept {
    return Func_void_std__string_std__shared_ptr_ArrayBuffer__Wrapper(std::move(value));
  }
  
  // pragma MARK: std::function<void(BLEState /* state */)>
  /**
   * Specialized version of `std::function<void(BLEState)>`.
   */
  using Func_void_BLEState = std::function<void(BLEState /* state */)>;
  /**
   * Wrapper class for a `std::function<void(BLEState / * state * /)>`, this can be used from Swift.
   */
  class Func_void_BLEState_Wrapper final {
  public:
    explicit Func_void_BLEState_Wrapper(std::function<void(BLEState /* state */)>&& func): _function(std::make_unique<std::function<void(BLEState /* state */)>>(std::move(func))) {}
    inline void call(int state) const noexcept {
      _function->operator()(static_cast<BLEState>(state));
    }
  private:
    std::unique_ptr<std::function<void(BLEState /* state */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_BLEState create_Func_void_BLEState(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_BLEState_Wrapper wrap_Func_void_BLEState(Func_void_BLEState value) noexcept {
    return Func_void_BLEState_Wrapper(std::move(value));
  }
  
  // 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::shared_ptr<HybridNativeBleNitroSpec>
  /**
   * Specialized version of `std::shared_ptr<HybridNativeBleNitroSpec>`.
   */
  using std__shared_ptr_HybridNativeBleNitroSpec_ = std::shared_ptr<HybridNativeBleNitroSpec>;
  std::shared_ptr<HybridNativeBleNitroSpec> create_std__shared_ptr_HybridNativeBleNitroSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_HybridNativeBleNitroSpec_(std__shared_ptr_HybridNativeBleNitroSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<HybridNativeBleNitroSpec>
  using std__weak_ptr_HybridNativeBleNitroSpec_ = std::weak_ptr<HybridNativeBleNitroSpec>;
  inline std__weak_ptr_HybridNativeBleNitroSpec_ weakify_std__shared_ptr_HybridNativeBleNitroSpec_(const std::shared_ptr<HybridNativeBleNitroSpec>& strong) noexcept { return strong; }
  
  // pragma MARK: Result<void>
  using Result_void_ = Result<void>;
  inline Result_void_ create_Result_void_() noexcept {
    return Result<void>::withValue();
  }
  inline Result_void_ create_Result_void_(const std::exception_ptr& error) noexcept {
    return Result<void>::withError(error);
  }
  
  // pragma MARK: Result<bool>
  using Result_bool_ = Result<bool>;
  inline Result_bool_ create_Result_bool_(bool value) noexcept {
    return Result<bool>::withValue(std::move(value));
  }
  inline Result_bool_ create_Result_bool_(const std::exception_ptr& error) noexcept {
    return Result<bool>::withError(error);
  }
  
  // pragma MARK: Result<std::vector<BLEDevice>>
  using Result_std__vector_BLEDevice__ = Result<std::vector<BLEDevice>>;
  inline Result_std__vector_BLEDevice__ create_Result_std__vector_BLEDevice__(const std::vector<BLEDevice>& value) noexcept {
    return Result<std::vector<BLEDevice>>::withValue(value);
  }
  inline Result_std__vector_BLEDevice__ create_Result_std__vector_BLEDevice__(const std::exception_ptr& error) noexcept {
    return Result<std::vector<BLEDevice>>::withError(error);
  }
  
  // pragma MARK: Result<double>
  using Result_double_ = Result<double>;
  inline Result_double_ create_Result_double_(double value) noexcept {
    return Result<double>::withValue(std::move(value));
  }
  inline Result_double_ create_Result_double_(const std::exception_ptr& error) noexcept {
    return Result<double>::withError(error);
  }
  
  // pragma MARK: Result<std::vector<std::string>>
  using Result_std__vector_std__string__ = Result<std::vector<std::string>>;
  inline Result_std__vector_std__string__ create_Result_std__vector_std__string__(const std::vector<std::string>& value) noexcept {
    return Result<std::vector<std::string>>::withValue(value);
  }
  inline Result_std__vector_std__string__ create_Result_std__vector_std__string__(const std::exception_ptr& error) noexcept {
    return Result<std::vector<std::string>>::withError(error);
  }
  
  // pragma MARK: Result<BLEState>
  using Result_BLEState_ = Result<BLEState>;
  inline Result_BLEState_ create_Result_BLEState_(BLEState value) noexcept {
    return Result<BLEState>::withValue(std::move(value));
  }
  inline Result_BLEState_ create_Result_BLEState_(const std::exception_ptr& error) noexcept {
    return Result<BLEState>::withError(error);
  }
  
  // pragma MARK: Result<OperationResult>
  using Result_OperationResult_ = Result<OperationResult>;
  inline Result_OperationResult_ create_Result_OperationResult_(const OperationResult& value) noexcept {
    return Result<OperationResult>::withValue(value);
  }
  inline Result_OperationResult_ create_Result_OperationResult_(const std::exception_ptr& error) noexcept {
    return Result<OperationResult>::withError(error);
  }
  
  // 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: std::optional<std::function<void(const std::vector<BLEDevice>& /* peripherals */)>>
  /**
   * Specialized version of `std::optional<std::function<void(const std::vector<BLEDevice>& / * peripherals * /)>>`.
   */
  using std__optional_std__function_void_const_std__vector_BLEDevice______peripherals______ = std::optional<std::function<void(const std::vector<BLEDevice>& /* peripherals */)>>;
  inline std::optional<std::function<void(const std::vector<BLEDevice>& /* peripherals */)>> create_std__optional_std__function_void_const_std__vector_BLEDevice______peripherals______(const std::function<void(const std::vector<BLEDevice>& /* peripherals */)>& value) noexcept {
    return std::optional<std::function<void(const std::vector<BLEDevice>& /* peripherals */)>>(value);
  }
  inline bool has_value_std__optional_std__function_void_const_std__vector_BLEDevice______peripherals______(const std::optional<std::function<void(const std::vector<BLEDevice>& /* peripherals */)>>& optional) noexcept {
    return optional.has_value();
  }
  inline std::function<void(const std::vector<BLEDevice>& /* peripherals */)> get_std__optional_std__function_void_const_std__vector_BLEDevice______peripherals______(const std::optional<std::function<void(const std::vector<BLEDevice>& /* peripherals */)>>& optional) noexcept {
    return optional.value();
  }
  
  // pragma MARK: std::shared_ptr<HybridNativeBleNitroFactorySpec>
  /**
   * Specialized version of `std::shared_ptr<HybridNativeBleNitroFactorySpec>`.
   */
  using std__shared_ptr_HybridNativeBleNitroFactorySpec_ = std::shared_ptr<HybridNativeBleNitroFactorySpec>;
  std::shared_ptr<HybridNativeBleNitroFactorySpec> create_std__shared_ptr_HybridNativeBleNitroFactorySpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_HybridNativeBleNitroFactorySpec_(std__shared_ptr_HybridNativeBleNitroFactorySpec_ cppType);
  
  // pragma MARK: std::weak_ptr<HybridNativeBleNitroFactorySpec>
  using std__weak_ptr_HybridNativeBleNitroFactorySpec_ = std::weak_ptr<HybridNativeBleNitroFactorySpec>;
  inline std__weak_ptr_HybridNativeBleNitroFactorySpec_ weakify_std__shared_ptr_HybridNativeBleNitroFactorySpec_(const std::shared_ptr<HybridNativeBleNitroFactorySpec>& strong) noexcept { return strong; }
  
  // pragma MARK: Result<std::shared_ptr<HybridNativeBleNitroSpec>>
  using Result_std__shared_ptr_HybridNativeBleNitroSpec__ = Result<std::shared_ptr<HybridNativeBleNitroSpec>>;
  inline Result_std__shared_ptr_HybridNativeBleNitroSpec__ create_Result_std__shared_ptr_HybridNativeBleNitroSpec__(const std::shared_ptr<HybridNativeBleNitroSpec>& value) noexcept {
    return Result<std::shared_ptr<HybridNativeBleNitroSpec>>::withValue(value);
  }
  inline Result_std__shared_ptr_HybridNativeBleNitroSpec__ create_Result_std__shared_ptr_HybridNativeBleNitroSpec__(const std::exception_ptr& error) noexcept {
    return Result<std::shared_ptr<HybridNativeBleNitroSpec>>::withError(error);
  }

} // namespace margelo::nitro::co::zyke::ble::bridge::swift
