///
/// RustCNet-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 `HttpParsedMessage` to properly resolve imports.
namespace margelo::nitro::net { struct HttpParsedMessage; }
// Forward declaration of `HybridHttpParserSpec` to properly resolve imports.
namespace margelo::nitro::net { class HybridHttpParserSpec; }
// Forward declaration of `HybridNetDriverSpec` to properly resolve imports.
namespace margelo::nitro::net { class HybridNetDriverSpec; }
// Forward declaration of `HybridNetServerDriverSpec` to properly resolve imports.
namespace margelo::nitro::net { class HybridNetServerDriverSpec; }
// Forward declaration of `HybridNetSocketDriverSpec` to properly resolve imports.
namespace margelo::nitro::net { class HybridNetSocketDriverSpec; }

// Forward declarations of Swift defined types
// Forward declaration of `HybridHttpParserSpec_cxx` to properly resolve imports.
namespace RustCNet { class HybridHttpParserSpec_cxx; }
// Forward declaration of `HybridNetDriverSpec_cxx` to properly resolve imports.
namespace RustCNet { class HybridNetDriverSpec_cxx; }
// Forward declaration of `HybridNetServerDriverSpec_cxx` to properly resolve imports.
namespace RustCNet { class HybridNetServerDriverSpec_cxx; }
// Forward declaration of `HybridNetSocketDriverSpec_cxx` to properly resolve imports.
namespace RustCNet { class HybridNetSocketDriverSpec_cxx; }

// Include C++ defined types
#include "HttpParsedMessage.hpp"
#include "HybridHttpParserSpec.hpp"
#include "HybridNetDriverSpec.hpp"
#include "HybridNetServerDriverSpec.hpp"
#include "HybridNetSocketDriverSpec.hpp"
#include <NitroModules/ArrayBuffer.hpp>
#include <NitroModules/ArrayBufferHolder.hpp>
#include <NitroModules/Result.hpp>
#include <exception>
#include <functional>
#include <memory>
#include <optional>
#include <string>

/**
 * 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::net::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::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::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.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::function<void(double /* event */, const std::shared_ptr<ArrayBuffer>& /* data */)>
  /**
   * Specialized version of `std::function<void(double, const std::shared_ptr<ArrayBuffer>&)>`.
   */
  using Func_void_double_std__shared_ptr_ArrayBuffer_ = std::function<void(double /* event */, const std::shared_ptr<ArrayBuffer>& /* data */)>;
  /**
   * Wrapper class for a `std::function<void(double / * event * /, const std::shared_ptr<ArrayBuffer>& / * data * /)>`, this can be used from Swift.
   */
  class Func_void_double_std__shared_ptr_ArrayBuffer__Wrapper final {
  public:
    explicit Func_void_double_std__shared_ptr_ArrayBuffer__Wrapper(std::function<void(double /* event */, const std::shared_ptr<ArrayBuffer>& /* data */)>&& func): _function(std::make_unique<std::function<void(double /* event */, const std::shared_ptr<ArrayBuffer>& /* data */)>>(std::move(func))) {}
    inline void call(double event, ArrayBufferHolder data) const noexcept {
      _function->operator()(event, data.getArrayBuffer());
    }
  private:
    std::unique_ptr<std::function<void(double /* event */, const std::shared_ptr<ArrayBuffer>& /* data */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_double_std__shared_ptr_ArrayBuffer_ create_Func_void_double_std__shared_ptr_ArrayBuffer_(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_double_std__shared_ptr_ArrayBuffer__Wrapper wrap_Func_void_double_std__shared_ptr_ArrayBuffer_(Func_void_double_std__shared_ptr_ArrayBuffer_ value) noexcept {
    return Func_void_double_std__shared_ptr_ArrayBuffer__Wrapper(std::move(value));
  }
  
  // pragma MARK: std::shared_ptr<HybridNetSocketDriverSpec>
  /**
   * Specialized version of `std::shared_ptr<HybridNetSocketDriverSpec>`.
   */
  using std__shared_ptr_HybridNetSocketDriverSpec_ = std::shared_ptr<HybridNetSocketDriverSpec>;
  std::shared_ptr<HybridNetSocketDriverSpec> create_std__shared_ptr_HybridNetSocketDriverSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_HybridNetSocketDriverSpec_(std__shared_ptr_HybridNetSocketDriverSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<HybridNetSocketDriverSpec>
  using std__weak_ptr_HybridNetSocketDriverSpec_ = std::weak_ptr<HybridNetSocketDriverSpec>;
  inline std__weak_ptr_HybridNetSocketDriverSpec_ weakify_std__shared_ptr_HybridNetSocketDriverSpec_(const std::shared_ptr<HybridNetSocketDriverSpec>& 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<std::optional<std::string>>
  using Result_std__optional_std__string__ = Result<std::optional<std::string>>;
  inline Result_std__optional_std__string__ create_Result_std__optional_std__string__(const std::optional<std::string>& value) noexcept {
    return Result<std::optional<std::string>>::withValue(value);
  }
  inline Result_std__optional_std__string__ create_Result_std__optional_std__string__(const std::exception_ptr& error) noexcept {
    return Result<std::optional<std::string>>::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::optional<std::shared_ptr<ArrayBuffer>>>
  using Result_std__optional_std__shared_ptr_ArrayBuffer___ = Result<std::optional<std::shared_ptr<ArrayBuffer>>>;
  inline Result_std__optional_std__shared_ptr_ArrayBuffer___ create_Result_std__optional_std__shared_ptr_ArrayBuffer___(const std::optional<std::shared_ptr<ArrayBuffer>>& value) noexcept {
    return Result<std::optional<std::shared_ptr<ArrayBuffer>>>::withValue(value);
  }
  inline Result_std__optional_std__shared_ptr_ArrayBuffer___ create_Result_std__optional_std__shared_ptr_ArrayBuffer___(const std::exception_ptr& error) noexcept {
    return Result<std::optional<std::shared_ptr<ArrayBuffer>>>::withError(error);
  }
  
  // pragma MARK: Result<std::string>
  using Result_std__string_ = Result<std::string>;
  inline Result_std__string_ create_Result_std__string_(const std::string& value) noexcept {
    return Result<std::string>::withValue(value);
  }
  inline Result_std__string_ create_Result_std__string_(const std::exception_ptr& error) noexcept {
    return Result<std::string>::withError(error);
  }
  
  // pragma MARK: std::shared_ptr<HybridNetServerDriverSpec>
  /**
   * Specialized version of `std::shared_ptr<HybridNetServerDriverSpec>`.
   */
  using std__shared_ptr_HybridNetServerDriverSpec_ = std::shared_ptr<HybridNetServerDriverSpec>;
  std::shared_ptr<HybridNetServerDriverSpec> create_std__shared_ptr_HybridNetServerDriverSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_HybridNetServerDriverSpec_(std__shared_ptr_HybridNetServerDriverSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<HybridNetServerDriverSpec>
  using std__weak_ptr_HybridNetServerDriverSpec_ = std::weak_ptr<HybridNetServerDriverSpec>;
  inline std__weak_ptr_HybridNetServerDriverSpec_ weakify_std__shared_ptr_HybridNetServerDriverSpec_(const std::shared_ptr<HybridNetServerDriverSpec>& strong) noexcept { return strong; }
  
  // pragma MARK: std::shared_ptr<HybridHttpParserSpec>
  /**
   * Specialized version of `std::shared_ptr<HybridHttpParserSpec>`.
   */
  using std__shared_ptr_HybridHttpParserSpec_ = std::shared_ptr<HybridHttpParserSpec>;
  std::shared_ptr<HybridHttpParserSpec> create_std__shared_ptr_HybridHttpParserSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_HybridHttpParserSpec_(std__shared_ptr_HybridHttpParserSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<HybridHttpParserSpec>
  using std__weak_ptr_HybridHttpParserSpec_ = std::weak_ptr<HybridHttpParserSpec>;
  inline std__weak_ptr_HybridHttpParserSpec_ weakify_std__shared_ptr_HybridHttpParserSpec_(const std::shared_ptr<HybridHttpParserSpec>& strong) noexcept { return strong; }
  
  // pragma MARK: Result<HttpParsedMessage>
  using Result_HttpParsedMessage_ = Result<HttpParsedMessage>;
  inline Result_HttpParsedMessage_ create_Result_HttpParsedMessage_(const HttpParsedMessage& value) noexcept {
    return Result<HttpParsedMessage>::withValue(value);
  }
  inline Result_HttpParsedMessage_ create_Result_HttpParsedMessage_(const std::exception_ptr& error) noexcept {
    return Result<HttpParsedMessage>::withError(error);
  }
  
  // pragma MARK: std::shared_ptr<HybridNetDriverSpec>
  /**
   * Specialized version of `std::shared_ptr<HybridNetDriverSpec>`.
   */
  using std__shared_ptr_HybridNetDriverSpec_ = std::shared_ptr<HybridNetDriverSpec>;
  std::shared_ptr<HybridNetDriverSpec> create_std__shared_ptr_HybridNetDriverSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_HybridNetDriverSpec_(std__shared_ptr_HybridNetDriverSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<HybridNetDriverSpec>
  using std__weak_ptr_HybridNetDriverSpec_ = std::weak_ptr<HybridNetDriverSpec>;
  inline std__weak_ptr_HybridNetDriverSpec_ weakify_std__shared_ptr_HybridNetDriverSpec_(const std::shared_ptr<HybridNetDriverSpec>& strong) noexcept { return strong; }
  
  // pragma MARK: Result<std::shared_ptr<HybridNetSocketDriverSpec>>
  using Result_std__shared_ptr_HybridNetSocketDriverSpec__ = Result<std::shared_ptr<HybridNetSocketDriverSpec>>;
  inline Result_std__shared_ptr_HybridNetSocketDriverSpec__ create_Result_std__shared_ptr_HybridNetSocketDriverSpec__(const std::shared_ptr<HybridNetSocketDriverSpec>& value) noexcept {
    return Result<std::shared_ptr<HybridNetSocketDriverSpec>>::withValue(value);
  }
  inline Result_std__shared_ptr_HybridNetSocketDriverSpec__ create_Result_std__shared_ptr_HybridNetSocketDriverSpec__(const std::exception_ptr& error) noexcept {
    return Result<std::shared_ptr<HybridNetSocketDriverSpec>>::withError(error);
  }
  
  // pragma MARK: Result<std::shared_ptr<HybridNetServerDriverSpec>>
  using Result_std__shared_ptr_HybridNetServerDriverSpec__ = Result<std::shared_ptr<HybridNetServerDriverSpec>>;
  inline Result_std__shared_ptr_HybridNetServerDriverSpec__ create_Result_std__shared_ptr_HybridNetServerDriverSpec__(const std::shared_ptr<HybridNetServerDriverSpec>& value) noexcept {
    return Result<std::shared_ptr<HybridNetServerDriverSpec>>::withValue(value);
  }
  inline Result_std__shared_ptr_HybridNetServerDriverSpec__ create_Result_std__shared_ptr_HybridNetServerDriverSpec__(const std::exception_ptr& error) noexcept {
    return Result<std::shared_ptr<HybridNetServerDriverSpec>>::withError(error);
  }
  
  // pragma MARK: Result<std::shared_ptr<HybridHttpParserSpec>>
  using Result_std__shared_ptr_HybridHttpParserSpec__ = Result<std::shared_ptr<HybridHttpParserSpec>>;
  inline Result_std__shared_ptr_HybridHttpParserSpec__ create_Result_std__shared_ptr_HybridHttpParserSpec__(const std::shared_ptr<HybridHttpParserSpec>& value) noexcept {
    return Result<std::shared_ptr<HybridHttpParserSpec>>::withValue(value);
  }
  inline Result_std__shared_ptr_HybridHttpParserSpec__ create_Result_std__shared_ptr_HybridHttpParserSpec__(const std::exception_ptr& error) noexcept {
    return Result<std::shared_ptr<HybridHttpParserSpec>>::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);
  }

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