///
/// NitroNetworkInfo-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 `ConnectionType` to properly resolve imports.
namespace margelo::nitro::nitronetworkinfo { enum class ConnectionType; }
// Forward declaration of `HybridNitroNetworkInfoSpec` to properly resolve imports.
namespace margelo::nitro::nitronetworkinfo { class HybridNitroNetworkInfoSpec; }
// Forward declaration of `NitroNetworkStatusInfo` to properly resolve imports.
namespace margelo::nitro::nitronetworkinfo { struct NitroNetworkStatusInfo; }

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

// Include C++ defined types
#include "ConnectionType.hpp"
#include "HybridNitroNetworkInfoSpec.hpp"
#include "NitroNetworkStatusInfo.hpp"
#include <NitroModules/Result.hpp>
#include <exception>
#include <functional>
#include <memory>

/**
 * 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::nitronetworkinfo::bridge::swift {

  // 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 NitroNetworkStatusInfo& /* networkInfo */)>
  /**
   * Specialized version of `std::function<void(const NitroNetworkStatusInfo&)>`.
   */
  using Func_void_NitroNetworkStatusInfo = std::function<void(const NitroNetworkStatusInfo& /* networkInfo */)>;
  /**
   * Wrapper class for a `std::function<void(const NitroNetworkStatusInfo& / * networkInfo * /)>`, this can be used from Swift.
   */
  class Func_void_NitroNetworkStatusInfo_Wrapper final {
  public:
    explicit Func_void_NitroNetworkStatusInfo_Wrapper(std::function<void(const NitroNetworkStatusInfo& /* networkInfo */)>&& func): _function(std::make_unique<std::function<void(const NitroNetworkStatusInfo& /* networkInfo */)>>(std::move(func))) {}
    inline void call(NitroNetworkStatusInfo networkInfo) const noexcept {
      _function->operator()(networkInfo);
    }
  private:
    std::unique_ptr<std::function<void(const NitroNetworkStatusInfo& /* networkInfo */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_NitroNetworkStatusInfo create_Func_void_NitroNetworkStatusInfo(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_NitroNetworkStatusInfo_Wrapper wrap_Func_void_NitroNetworkStatusInfo(Func_void_NitroNetworkStatusInfo value) noexcept {
    return Func_void_NitroNetworkStatusInfo_Wrapper(std::move(value));
  }
  
  // pragma MARK: std::shared_ptr<HybridNitroNetworkInfoSpec>
  /**
   * Specialized version of `std::shared_ptr<HybridNitroNetworkInfoSpec>`.
   */
  using std__shared_ptr_HybridNitroNetworkInfoSpec_ = std::shared_ptr<HybridNitroNetworkInfoSpec>;
  std::shared_ptr<HybridNitroNetworkInfoSpec> create_std__shared_ptr_HybridNitroNetworkInfoSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_HybridNitroNetworkInfoSpec_(std__shared_ptr_HybridNitroNetworkInfoSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<HybridNitroNetworkInfoSpec>
  using std__weak_ptr_HybridNitroNetworkInfoSpec_ = std::weak_ptr<HybridNitroNetworkInfoSpec>;
  inline std__weak_ptr_HybridNitroNetworkInfoSpec_ weakify_std__shared_ptr_HybridNitroNetworkInfoSpec_(const std::shared_ptr<HybridNitroNetworkInfoSpec>& strong) noexcept { return strong; }
  
  // pragma MARK: Result<std::function<void()>>
  using Result_std__function_void____ = Result<std::function<void()>>;
  inline Result_std__function_void____ create_Result_std__function_void____(const std::function<void()>& value) noexcept {
    return Result<std::function<void()>>::withValue(value);
  }
  inline Result_std__function_void____ create_Result_std__function_void____(const std::exception_ptr& error) noexcept {
    return Result<std::function<void()>>::withError(error);
  }

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