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

#pragma once

// Forward declarations of C++ defined types
// Forward declaration of `HybridNitroShareIntentSpec` to properly resolve imports.
namespace margelo::nitro::nitroshareintent { class HybridNitroShareIntentSpec; }
// Forward declaration of `SharePayload` to properly resolve imports.
namespace margelo::nitro::nitroshareintent { struct SharePayload; }
// Forward declaration of `ShareType` to properly resolve imports.
namespace margelo::nitro::nitroshareintent { enum class ShareType; }

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

// Include C++ defined types
#include "HybridNitroShareIntentSpec.hpp"
#include "SharePayload.hpp"
#include "ShareType.hpp"
#include <NitroModules/Promise.hpp>
#include <NitroModules/PromiseHolder.hpp>
#include <NitroModules/Result.hpp>
#include <exception>
#include <functional>
#include <memory>
#include <optional>
#include <string>
#include <unordered_map>
#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::nitroshareintent::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;
  }
  
  // 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::optional<std::vector<std::string>>
  /**
   * Specialized version of `std::optional<std::vector<std::string>>`.
   */
  using std__optional_std__vector_std__string__ = std::optional<std::vector<std::string>>;
  inline std::optional<std::vector<std::string>> create_std__optional_std__vector_std__string__(const std::vector<std::string>& value) noexcept {
    return std::optional<std::vector<std::string>>(value);
  }
  inline bool has_value_std__optional_std__vector_std__string__(const std::optional<std::vector<std::string>>& optional) noexcept {
    return optional.has_value();
  }
  inline std::vector<std::string> get_std__optional_std__vector_std__string__(const std::optional<std::vector<std::string>>& optional) noexcept {
    return *optional;
  }
  
  // pragma MARK: std::unordered_map<std::string, std::string>
  /**
   * Specialized version of `std::unordered_map<std::string, std::string>`.
   */
  using std__unordered_map_std__string__std__string_ = std::unordered_map<std::string, std::string>;
  inline std::unordered_map<std::string, std::string> create_std__unordered_map_std__string__std__string_(size_t size) noexcept {
    std::unordered_map<std::string, std::string> map;
    map.reserve(size);
    return map;
  }
  inline std::vector<std::string> get_std__unordered_map_std__string__std__string__keys(const std__unordered_map_std__string__std__string_& map) noexcept {
    std::vector<std::string> keys;
    keys.reserve(map.size());
    for (const auto& entry : map) {
      keys.push_back(entry.first);
    }
    return keys;
  }
  inline std::string get_std__unordered_map_std__string__std__string__value(const std__unordered_map_std__string__std__string_& map, const std::string& key) noexcept {
    return map.find(key)->second;
  }
  inline void emplace_std__unordered_map_std__string__std__string_(std__unordered_map_std__string__std__string_& map, const std::string& key, const std::string& value) noexcept {
    map.emplace(key, value);
  }
  
  // pragma MARK: std::optional<std::unordered_map<std::string, std::string>>
  /**
   * Specialized version of `std::optional<std::unordered_map<std::string, std::string>>`.
   */
  using std__optional_std__unordered_map_std__string__std__string__ = std::optional<std::unordered_map<std::string, std::string>>;
  inline std::optional<std::unordered_map<std::string, std::string>> create_std__optional_std__unordered_map_std__string__std__string__(const std::unordered_map<std::string, std::string>& value) noexcept {
    return std::optional<std::unordered_map<std::string, std::string>>(value);
  }
  inline bool has_value_std__optional_std__unordered_map_std__string__std__string__(const std::optional<std::unordered_map<std::string, std::string>>& optional) noexcept {
    return optional.has_value();
  }
  inline std::unordered_map<std::string, std::string> get_std__optional_std__unordered_map_std__string__std__string__(const std::optional<std::unordered_map<std::string, std::string>>& optional) noexcept {
    return *optional;
  }
  
  // pragma MARK: std::optional<SharePayload>
  /**
   * Specialized version of `std::optional<SharePayload>`.
   */
  using std__optional_SharePayload_ = std::optional<SharePayload>;
  inline std::optional<SharePayload> create_std__optional_SharePayload_(const SharePayload& value) noexcept {
    return std::optional<SharePayload>(value);
  }
  inline bool has_value_std__optional_SharePayload_(const std::optional<SharePayload>& optional) noexcept {
    return optional.has_value();
  }
  inline SharePayload get_std__optional_SharePayload_(const std::optional<SharePayload>& optional) noexcept {
    return *optional;
  }
  
  // pragma MARK: std::shared_ptr<Promise<std::optional<SharePayload>>>
  /**
   * Specialized version of `std::shared_ptr<Promise<std::optional<SharePayload>>>`.
   */
  using std__shared_ptr_Promise_std__optional_SharePayload___ = std::shared_ptr<Promise<std::optional<SharePayload>>>;
  inline std::shared_ptr<Promise<std::optional<SharePayload>>> create_std__shared_ptr_Promise_std__optional_SharePayload___() noexcept {
    return Promise<std::optional<SharePayload>>::create();
  }
  inline PromiseHolder<std::optional<SharePayload>> wrap_std__shared_ptr_Promise_std__optional_SharePayload___(std::shared_ptr<Promise<std::optional<SharePayload>>> promise) noexcept {
    return PromiseHolder<std::optional<SharePayload>>(std::move(promise));
  }
  
  // pragma MARK: std::function<void(const std::optional<SharePayload>& /* result */)>
  /**
   * Specialized version of `std::function<void(const std::optional<SharePayload>&)>`.
   */
  using Func_void_std__optional_SharePayload_ = std::function<void(const std::optional<SharePayload>& /* result */)>;
  /**
   * Wrapper class for a `std::function<void(const std::optional<SharePayload>& / * result * /)>`, this can be used from Swift.
   */
  class Func_void_std__optional_SharePayload__Wrapper final {
  public:
    explicit Func_void_std__optional_SharePayload__Wrapper(std::function<void(const std::optional<SharePayload>& /* result */)>&& func): _function(std::make_unique<std::function<void(const std::optional<SharePayload>& /* result */)>>(std::move(func))) {}
    inline void call(std::optional<SharePayload> result) const noexcept {
      _function->operator()(result);
    }
  private:
    std::unique_ptr<std::function<void(const std::optional<SharePayload>& /* result */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_std__optional_SharePayload_ create_Func_void_std__optional_SharePayload_(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_std__optional_SharePayload__Wrapper wrap_Func_void_std__optional_SharePayload_(Func_void_std__optional_SharePayload_ value) noexcept {
    return Func_void_std__optional_SharePayload__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(const SharePayload& /* payload */)>
  /**
   * Specialized version of `std::function<void(const SharePayload&)>`.
   */
  using Func_void_SharePayload = std::function<void(const SharePayload& /* payload */)>;
  /**
   * Wrapper class for a `std::function<void(const SharePayload& / * payload * /)>`, this can be used from Swift.
   */
  class Func_void_SharePayload_Wrapper final {
  public:
    explicit Func_void_SharePayload_Wrapper(std::function<void(const SharePayload& /* payload */)>&& func): _function(std::make_unique<std::function<void(const SharePayload& /* payload */)>>(std::move(func))) {}
    inline void call(SharePayload payload) const noexcept {
      _function->operator()(payload);
    }
  private:
    std::unique_ptr<std::function<void(const SharePayload& /* payload */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_SharePayload create_Func_void_SharePayload(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_SharePayload_Wrapper wrap_Func_void_SharePayload(Func_void_SharePayload value) noexcept {
    return Func_void_SharePayload_Wrapper(std::move(value));
  }
  
  // pragma MARK: std::function<void(const std::string& /* message */)>
  /**
   * Specialized version of `std::function<void(const std::string&)>`.
   */
  using Func_void_std__string = std::function<void(const std::string& /* message */)>;
  /**
   * Wrapper class for a `std::function<void(const std::string& / * message * /)>`, this can be used from Swift.
   */
  class Func_void_std__string_Wrapper final {
  public:
    explicit Func_void_std__string_Wrapper(std::function<void(const std::string& /* message */)>&& func): _function(std::make_unique<std::function<void(const std::string& /* message */)>>(std::move(func))) {}
    inline void call(std::string message) const noexcept {
      _function->operator()(message);
    }
  private:
    std::unique_ptr<std::function<void(const std::string& /* message */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_std__string create_Func_void_std__string(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_std__string_Wrapper wrap_Func_void_std__string(Func_void_std__string value) noexcept {
    return Func_void_std__string_Wrapper(std::move(value));
  }
  
  // pragma MARK: std::shared_ptr<HybridNitroShareIntentSpec>
  /**
   * Specialized version of `std::shared_ptr<HybridNitroShareIntentSpec>`.
   */
  using std__shared_ptr_HybridNitroShareIntentSpec_ = std::shared_ptr<HybridNitroShareIntentSpec>;
  std::shared_ptr<HybridNitroShareIntentSpec> create_std__shared_ptr_HybridNitroShareIntentSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_HybridNitroShareIntentSpec_(std__shared_ptr_HybridNitroShareIntentSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<HybridNitroShareIntentSpec>
  using std__weak_ptr_HybridNitroShareIntentSpec_ = std::weak_ptr<HybridNitroShareIntentSpec>;
  inline std__weak_ptr_HybridNitroShareIntentSpec_ weakify_std__shared_ptr_HybridNitroShareIntentSpec_(const std::shared_ptr<HybridNitroShareIntentSpec>& strong) noexcept { return strong; }
  
  // pragma MARK: Result<std::shared_ptr<Promise<std::optional<SharePayload>>>>
  using Result_std__shared_ptr_Promise_std__optional_SharePayload____ = Result<std::shared_ptr<Promise<std::optional<SharePayload>>>>;
  inline Result_std__shared_ptr_Promise_std__optional_SharePayload____ create_Result_std__shared_ptr_Promise_std__optional_SharePayload____(const std::shared_ptr<Promise<std::optional<SharePayload>>>& value) noexcept {
    return Result<std::shared_ptr<Promise<std::optional<SharePayload>>>>::withValue(value);
  }
  inline Result_std__shared_ptr_Promise_std__optional_SharePayload____ create_Result_std__shared_ptr_Promise_std__optional_SharePayload____(const std::exception_ptr& error) noexcept {
    return Result<std::shared_ptr<Promise<std::optional<SharePayload>>>>::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<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);
  }

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