///
/// VisionCameraBarcodeScanner-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 `BarcodeScannerOutputResolution` to properly resolve imports.
namespace margelo::nitro::camera::barcodescanner { enum class BarcodeScannerOutputResolution; }
// Forward declaration of `HybridBarcodeScannerFactorySpec` to properly resolve imports.
namespace margelo::nitro::camera::barcodescanner { class HybridBarcodeScannerFactorySpec; }
// Forward declaration of `HybridBarcodeScannerSpec` to properly resolve imports.
namespace margelo::nitro::camera::barcodescanner { class HybridBarcodeScannerSpec; }
// Forward declaration of `HybridBarcodeSpec` to properly resolve imports.
namespace margelo::nitro::camera::barcodescanner { class HybridBarcodeSpec; }
// Forward declaration of `HybridCameraOutputSpec` to properly resolve imports.
namespace margelo::nitro::camera { class HybridCameraOutputSpec; }
// Forward declaration of `HybridFrameSpec` to properly resolve imports.
namespace margelo::nitro::camera { class HybridFrameSpec; }
// Forward declaration of `Point` to properly resolve imports.
namespace margelo::nitro::camera::barcodescanner { struct Point; }
// Forward declaration of `TargetBarcodeFormat` to properly resolve imports.
namespace margelo::nitro::camera::barcodescanner { enum class TargetBarcodeFormat; }

// Forward declarations of Swift defined types
// Forward declaration of `HybridBarcodeScannerFactorySpec_cxx` to properly resolve imports.
namespace VisionCameraBarcodeScanner { class HybridBarcodeScannerFactorySpec_cxx; }
// Forward declaration of `HybridBarcodeScannerSpec_cxx` to properly resolve imports.
namespace VisionCameraBarcodeScanner { class HybridBarcodeScannerSpec_cxx; }
// Forward declaration of `HybridBarcodeSpec_cxx` to properly resolve imports.
namespace VisionCameraBarcodeScanner { class HybridBarcodeSpec_cxx; }
// Forward declaration of `HybridCameraOutputSpec_cxx` to properly resolve imports.
namespace VisionCamera { class HybridCameraOutputSpec_cxx; }
// Forward declaration of `HybridFrameSpec_cxx` to properly resolve imports.
namespace VisionCamera { class HybridFrameSpec_cxx; }

// Include C++ defined types
#include "BarcodeScannerOutputResolution.hpp"
#include "HybridBarcodeScannerFactorySpec.hpp"
#include "HybridBarcodeScannerSpec.hpp"
#include "HybridBarcodeSpec.hpp"
#include "Point.hpp"
#include "TargetBarcodeFormat.hpp"
#include <NitroModules/ArrayBuffer.hpp>
#include <NitroModules/ArrayBufferHolder.hpp>
#include <NitroModules/Promise.hpp>
#include <NitroModules/PromiseHolder.hpp>
#include <NitroModules/Result.hpp>
#include <VisionCamera/HybridCameraOutputSpec.hpp>
#include <VisionCamera/HybridFrameSpec.hpp>
#include <exception>
#include <functional>
#include <memory>
#include <optional>
#include <string>
#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::camera::barcodescanner::bridge::swift {

  // pragma MARK: std::vector<Point>
  /**
   * Specialized version of `std::vector<Point>`.
   */
  using std__vector_Point_ = std::vector<Point>;
  inline std::vector<Point> create_std__vector_Point_(size_t size) noexcept {
    std::vector<Point> vector;
    vector.reserve(size);
    return vector;
  }
  
  // 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::optional<std::shared_ptr<ArrayBuffer>>
  /**
   * Specialized version of `std::optional<std::shared_ptr<ArrayBuffer>>`.
   */
  using std__optional_std__shared_ptr_ArrayBuffer__ = std::optional<std::shared_ptr<ArrayBuffer>>;
  inline std::optional<std::shared_ptr<ArrayBuffer>> create_std__optional_std__shared_ptr_ArrayBuffer__(const std::shared_ptr<ArrayBuffer>& value) noexcept {
    return std::optional<std::shared_ptr<ArrayBuffer>>(value);
  }
  inline bool has_value_std__optional_std__shared_ptr_ArrayBuffer__(const std::optional<std::shared_ptr<ArrayBuffer>>& optional) noexcept {
    return optional.has_value();
  }
  inline std::shared_ptr<ArrayBuffer> get_std__optional_std__shared_ptr_ArrayBuffer__(const std::optional<std::shared_ptr<ArrayBuffer>>& optional) noexcept {
    return optional.value();
  }
  
  // pragma MARK: std::shared_ptr<HybridBarcodeSpec>
  /**
   * Specialized version of `std::shared_ptr<HybridBarcodeSpec>`.
   */
  using std__shared_ptr_HybridBarcodeSpec_ = std::shared_ptr<HybridBarcodeSpec>;
  std::shared_ptr<HybridBarcodeSpec> create_std__shared_ptr_HybridBarcodeSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_HybridBarcodeSpec_(std__shared_ptr_HybridBarcodeSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<HybridBarcodeSpec>
  using std__weak_ptr_HybridBarcodeSpec_ = std::weak_ptr<HybridBarcodeSpec>;
  inline std__weak_ptr_HybridBarcodeSpec_ weakify_std__shared_ptr_HybridBarcodeSpec_(const std::shared_ptr<HybridBarcodeSpec>& strong) noexcept { return strong; }
  
  // pragma MARK: std::vector<std::shared_ptr<HybridBarcodeSpec>>
  /**
   * Specialized version of `std::vector<std::shared_ptr<HybridBarcodeSpec>>`.
   */
  using std__vector_std__shared_ptr_HybridBarcodeSpec__ = std::vector<std::shared_ptr<HybridBarcodeSpec>>;
  inline std::vector<std::shared_ptr<HybridBarcodeSpec>> create_std__vector_std__shared_ptr_HybridBarcodeSpec__(size_t size) noexcept {
    std::vector<std::shared_ptr<HybridBarcodeSpec>> vector;
    vector.reserve(size);
    return vector;
  }
  
  // pragma MARK: std::shared_ptr<margelo::nitro::camera::HybridFrameSpec>
  /**
   * Specialized version of `std::shared_ptr<margelo::nitro::camera::HybridFrameSpec>`.
   */
  using std__shared_ptr_margelo__nitro__camera__HybridFrameSpec_ = std::shared_ptr<margelo::nitro::camera::HybridFrameSpec>;
  std::shared_ptr<margelo::nitro::camera::HybridFrameSpec> create_std__shared_ptr_margelo__nitro__camera__HybridFrameSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_margelo__nitro__camera__HybridFrameSpec_(std__shared_ptr_margelo__nitro__camera__HybridFrameSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<margelo::nitro::camera::HybridFrameSpec>
  using std__weak_ptr_margelo__nitro__camera__HybridFrameSpec_ = std::weak_ptr<margelo::nitro::camera::HybridFrameSpec>;
  inline std__weak_ptr_margelo__nitro__camera__HybridFrameSpec_ weakify_std__shared_ptr_margelo__nitro__camera__HybridFrameSpec_(const std::shared_ptr<margelo::nitro::camera::HybridFrameSpec>& strong) noexcept { return strong; }
  
  // pragma MARK: std::shared_ptr<Promise<std::vector<std::shared_ptr<HybridBarcodeSpec>>>>
  /**
   * Specialized version of `std::shared_ptr<Promise<std::vector<std::shared_ptr<HybridBarcodeSpec>>>>`.
   */
  using std__shared_ptr_Promise_std__vector_std__shared_ptr_HybridBarcodeSpec____ = std::shared_ptr<Promise<std::vector<std::shared_ptr<HybridBarcodeSpec>>>>;
  inline std::shared_ptr<Promise<std::vector<std::shared_ptr<HybridBarcodeSpec>>>> create_std__shared_ptr_Promise_std__vector_std__shared_ptr_HybridBarcodeSpec____() noexcept {
    return Promise<std::vector<std::shared_ptr<HybridBarcodeSpec>>>::create();
  }
  inline PromiseHolder<std::vector<std::shared_ptr<HybridBarcodeSpec>>> wrap_std__shared_ptr_Promise_std__vector_std__shared_ptr_HybridBarcodeSpec____(std::shared_ptr<Promise<std::vector<std::shared_ptr<HybridBarcodeSpec>>>> promise) noexcept {
    return PromiseHolder<std::vector<std::shared_ptr<HybridBarcodeSpec>>>(std::move(promise));
  }
  
  // pragma MARK: std::function<void(const std::vector<std::shared_ptr<HybridBarcodeSpec>>& /* result */)>
  /**
   * Specialized version of `std::function<void(const std::vector<std::shared_ptr<HybridBarcodeSpec>>&)>`.
   */
  using Func_void_std__vector_std__shared_ptr_HybridBarcodeSpec__ = std::function<void(const std::vector<std::shared_ptr<HybridBarcodeSpec>>& /* result */)>;
  /**
   * Wrapper class for a `std::function<void(const std::vector<std::shared_ptr<HybridBarcodeSpec>>& / * result * /)>`, this can be used from Swift.
   */
  class Func_void_std__vector_std__shared_ptr_HybridBarcodeSpec___Wrapper final {
  public:
    explicit Func_void_std__vector_std__shared_ptr_HybridBarcodeSpec___Wrapper(std::function<void(const std::vector<std::shared_ptr<HybridBarcodeSpec>>& /* result */)>&& func): _function(std::make_unique<std::function<void(const std::vector<std::shared_ptr<HybridBarcodeSpec>>& /* result */)>>(std::move(func))) {}
    inline void call(std::vector<std::shared_ptr<HybridBarcodeSpec>> result) const noexcept {
      _function->operator()(result);
    }
  private:
    std::unique_ptr<std::function<void(const std::vector<std::shared_ptr<HybridBarcodeSpec>>& /* result */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_std__vector_std__shared_ptr_HybridBarcodeSpec__ create_Func_void_std__vector_std__shared_ptr_HybridBarcodeSpec__(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_std__vector_std__shared_ptr_HybridBarcodeSpec___Wrapper wrap_Func_void_std__vector_std__shared_ptr_HybridBarcodeSpec__(Func_void_std__vector_std__shared_ptr_HybridBarcodeSpec__ value) noexcept {
    return Func_void_std__vector_std__shared_ptr_HybridBarcodeSpec___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<HybridBarcodeScannerSpec>
  /**
   * Specialized version of `std::shared_ptr<HybridBarcodeScannerSpec>`.
   */
  using std__shared_ptr_HybridBarcodeScannerSpec_ = std::shared_ptr<HybridBarcodeScannerSpec>;
  std::shared_ptr<HybridBarcodeScannerSpec> create_std__shared_ptr_HybridBarcodeScannerSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_HybridBarcodeScannerSpec_(std__shared_ptr_HybridBarcodeScannerSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<HybridBarcodeScannerSpec>
  using std__weak_ptr_HybridBarcodeScannerSpec_ = std::weak_ptr<HybridBarcodeScannerSpec>;
  inline std__weak_ptr_HybridBarcodeScannerSpec_ weakify_std__shared_ptr_HybridBarcodeScannerSpec_(const std::shared_ptr<HybridBarcodeScannerSpec>& strong) noexcept { return strong; }
  
  // pragma MARK: Result<std::vector<std::shared_ptr<HybridBarcodeSpec>>>
  using Result_std__vector_std__shared_ptr_HybridBarcodeSpec___ = Result<std::vector<std::shared_ptr<HybridBarcodeSpec>>>;
  inline Result_std__vector_std__shared_ptr_HybridBarcodeSpec___ create_Result_std__vector_std__shared_ptr_HybridBarcodeSpec___(const std::vector<std::shared_ptr<HybridBarcodeSpec>>& value) noexcept {
    return Result<std::vector<std::shared_ptr<HybridBarcodeSpec>>>::withValue(value);
  }
  inline Result_std__vector_std__shared_ptr_HybridBarcodeSpec___ create_Result_std__vector_std__shared_ptr_HybridBarcodeSpec___(const std::exception_ptr& error) noexcept {
    return Result<std::vector<std::shared_ptr<HybridBarcodeSpec>>>::withError(error);
  }
  
  // pragma MARK: Result<std::shared_ptr<Promise<std::vector<std::shared_ptr<HybridBarcodeSpec>>>>>
  using Result_std__shared_ptr_Promise_std__vector_std__shared_ptr_HybridBarcodeSpec_____ = Result<std::shared_ptr<Promise<std::vector<std::shared_ptr<HybridBarcodeSpec>>>>>;
  inline Result_std__shared_ptr_Promise_std__vector_std__shared_ptr_HybridBarcodeSpec_____ create_Result_std__shared_ptr_Promise_std__vector_std__shared_ptr_HybridBarcodeSpec_____(const std::shared_ptr<Promise<std::vector<std::shared_ptr<HybridBarcodeSpec>>>>& value) noexcept {
    return Result<std::shared_ptr<Promise<std::vector<std::shared_ptr<HybridBarcodeSpec>>>>>::withValue(value);
  }
  inline Result_std__shared_ptr_Promise_std__vector_std__shared_ptr_HybridBarcodeSpec_____ create_Result_std__shared_ptr_Promise_std__vector_std__shared_ptr_HybridBarcodeSpec_____(const std::exception_ptr& error) noexcept {
    return Result<std::shared_ptr<Promise<std::vector<std::shared_ptr<HybridBarcodeSpec>>>>>::withError(error);
  }
  
  // pragma MARK: std::vector<TargetBarcodeFormat>
  /**
   * Specialized version of `std::vector<TargetBarcodeFormat>`.
   */
  using std__vector_TargetBarcodeFormat_ = std::vector<TargetBarcodeFormat>;
  inline std::vector<TargetBarcodeFormat> create_std__vector_TargetBarcodeFormat_(size_t size) noexcept {
    std::vector<TargetBarcodeFormat> vector;
    vector.reserve(size);
    return vector;
  }
  
  // pragma MARK: std::shared_ptr<margelo::nitro::camera::HybridCameraOutputSpec>
  /**
   * Specialized version of `std::shared_ptr<margelo::nitro::camera::HybridCameraOutputSpec>`.
   */
  using std__shared_ptr_margelo__nitro__camera__HybridCameraOutputSpec_ = std::shared_ptr<margelo::nitro::camera::HybridCameraOutputSpec>;
  std::shared_ptr<margelo::nitro::camera::HybridCameraOutputSpec> create_std__shared_ptr_margelo__nitro__camera__HybridCameraOutputSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_margelo__nitro__camera__HybridCameraOutputSpec_(std__shared_ptr_margelo__nitro__camera__HybridCameraOutputSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<margelo::nitro::camera::HybridCameraOutputSpec>
  using std__weak_ptr_margelo__nitro__camera__HybridCameraOutputSpec_ = std::weak_ptr<margelo::nitro::camera::HybridCameraOutputSpec>;
  inline std__weak_ptr_margelo__nitro__camera__HybridCameraOutputSpec_ weakify_std__shared_ptr_margelo__nitro__camera__HybridCameraOutputSpec_(const std::shared_ptr<margelo::nitro::camera::HybridCameraOutputSpec>& strong) noexcept { return strong; }
  
  // pragma MARK: std::optional<BarcodeScannerOutputResolution>
  /**
   * Specialized version of `std::optional<BarcodeScannerOutputResolution>`.
   */
  using std__optional_BarcodeScannerOutputResolution_ = std::optional<BarcodeScannerOutputResolution>;
  inline std::optional<BarcodeScannerOutputResolution> create_std__optional_BarcodeScannerOutputResolution_(const BarcodeScannerOutputResolution& value) noexcept {
    return std::optional<BarcodeScannerOutputResolution>(value);
  }
  inline bool has_value_std__optional_BarcodeScannerOutputResolution_(const std::optional<BarcodeScannerOutputResolution>& optional) noexcept {
    return optional.has_value();
  }
  inline BarcodeScannerOutputResolution get_std__optional_BarcodeScannerOutputResolution_(const std::optional<BarcodeScannerOutputResolution>& optional) noexcept {
    return optional.value();
  }
  
  // pragma MARK: std::shared_ptr<HybridBarcodeScannerFactorySpec>
  /**
   * Specialized version of `std::shared_ptr<HybridBarcodeScannerFactorySpec>`.
   */
  using std__shared_ptr_HybridBarcodeScannerFactorySpec_ = std::shared_ptr<HybridBarcodeScannerFactorySpec>;
  std::shared_ptr<HybridBarcodeScannerFactorySpec> create_std__shared_ptr_HybridBarcodeScannerFactorySpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_HybridBarcodeScannerFactorySpec_(std__shared_ptr_HybridBarcodeScannerFactorySpec_ cppType);
  
  // pragma MARK: std::weak_ptr<HybridBarcodeScannerFactorySpec>
  using std__weak_ptr_HybridBarcodeScannerFactorySpec_ = std::weak_ptr<HybridBarcodeScannerFactorySpec>;
  inline std__weak_ptr_HybridBarcodeScannerFactorySpec_ weakify_std__shared_ptr_HybridBarcodeScannerFactorySpec_(const std::shared_ptr<HybridBarcodeScannerFactorySpec>& strong) noexcept { return strong; }
  
  // pragma MARK: Result<std::shared_ptr<HybridBarcodeScannerSpec>>
  using Result_std__shared_ptr_HybridBarcodeScannerSpec__ = Result<std::shared_ptr<HybridBarcodeScannerSpec>>;
  inline Result_std__shared_ptr_HybridBarcodeScannerSpec__ create_Result_std__shared_ptr_HybridBarcodeScannerSpec__(const std::shared_ptr<HybridBarcodeScannerSpec>& value) noexcept {
    return Result<std::shared_ptr<HybridBarcodeScannerSpec>>::withValue(value);
  }
  inline Result_std__shared_ptr_HybridBarcodeScannerSpec__ create_Result_std__shared_ptr_HybridBarcodeScannerSpec__(const std::exception_ptr& error) noexcept {
    return Result<std::shared_ptr<HybridBarcodeScannerSpec>>::withError(error);
  }
  
  // pragma MARK: Result<std::shared_ptr<margelo::nitro::camera::HybridCameraOutputSpec>>
  using Result_std__shared_ptr_margelo__nitro__camera__HybridCameraOutputSpec__ = Result<std::shared_ptr<margelo::nitro::camera::HybridCameraOutputSpec>>;
  inline Result_std__shared_ptr_margelo__nitro__camera__HybridCameraOutputSpec__ create_Result_std__shared_ptr_margelo__nitro__camera__HybridCameraOutputSpec__(const std::shared_ptr<margelo::nitro::camera::HybridCameraOutputSpec>& value) noexcept {
    return Result<std::shared_ptr<margelo::nitro::camera::HybridCameraOutputSpec>>::withValue(value);
  }
  inline Result_std__shared_ptr_margelo__nitro__camera__HybridCameraOutputSpec__ create_Result_std__shared_ptr_margelo__nitro__camera__HybridCameraOutputSpec__(const std::exception_ptr& error) noexcept {
    return Result<std::shared_ptr<margelo::nitro::camera::HybridCameraOutputSpec>>::withError(error);
  }

} // namespace margelo::nitro::camera::barcodescanner::bridge::swift
