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

#pragma once

// Forward declarations of C++ defined types
// Forward declaration of `HybridTextToSpeechSpec` to properly resolve imports.
namespace margelo::nitro::nitrotexttospeech { class HybridTextToSpeechSpec; }
// Forward declaration of `TextToSpeechOptions` to properly resolve imports.
namespace margelo::nitro::nitrotexttospeech { struct TextToSpeechOptions; }
// Forward declaration of `TextToSpeechVoice` to properly resolve imports.
namespace margelo::nitro::nitrotexttospeech { struct TextToSpeechVoice; }

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

// Include C++ defined types
#include "HybridTextToSpeechSpec.hpp"
#include "TextToSpeechOptions.hpp"
#include "TextToSpeechVoice.hpp"
#include <NitroModules/Promise.hpp>
#include <NitroModules/PromiseHolder.hpp>
#include <NitroModules/Result.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::nitrotexttospeech::bridge::swift {

  // 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__() {
    return Promise<void>::create();
  }
  inline PromiseHolder<void> wrap_std__shared_ptr_Promise_void__(std::shared_ptr<Promise<void>> promise) {
    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_shared<std::function<void()>>(std::move(func))) {}
    inline void call() const {
      _function->operator()();
    }
  private:
    std::shared_ptr<std::function<void()>> _function;
  };
  Func_void create_Func_void(void* _Nonnull swiftClosureWrapper);
  inline Func_void_Wrapper wrap_Func_void(Func_void value) {
    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_shared<std::function<void(const std::exception_ptr& /* error */)>>(std::move(func))) {}
    inline void call(std::exception_ptr error) const {
      _function->operator()(error);
    }
  private:
    std::shared_ptr<std::function<void(const std::exception_ptr& /* error */)>> _function;
  };
  Func_void_std__exception_ptr create_Func_void_std__exception_ptr(void* _Nonnull swiftClosureWrapper);
  inline Func_void_std__exception_ptr_Wrapper wrap_Func_void_std__exception_ptr(Func_void_std__exception_ptr value) {
    return Func_void_std__exception_ptr_Wrapper(std::move(value));
  }
  
  // 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) {
    return std::optional<std::string>(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) {
    return std::optional<double>(value);
  }
  
  // pragma MARK: std::optional<TextToSpeechOptions>
  /**
   * Specialized version of `std::optional<TextToSpeechOptions>`.
   */
  using std__optional_TextToSpeechOptions_ = std::optional<TextToSpeechOptions>;
  inline std::optional<TextToSpeechOptions> create_std__optional_TextToSpeechOptions_(const TextToSpeechOptions& value) {
    return std::optional<TextToSpeechOptions>(value);
  }
  
  // pragma MARK: std::shared_ptr<Promise<bool>>
  /**
   * Specialized version of `std::shared_ptr<Promise<bool>>`.
   */
  using std__shared_ptr_Promise_bool__ = std::shared_ptr<Promise<bool>>;
  inline std::shared_ptr<Promise<bool>> create_std__shared_ptr_Promise_bool__() {
    return Promise<bool>::create();
  }
  inline PromiseHolder<bool> wrap_std__shared_ptr_Promise_bool__(std::shared_ptr<Promise<bool>> promise) {
    return PromiseHolder<bool>(std::move(promise));
  }
  
  // pragma MARK: std::function<void(bool /* result */)>
  /**
   * Specialized version of `std::function<void(bool)>`.
   */
  using Func_void_bool = std::function<void(bool /* result */)>;
  /**
   * Wrapper class for a `std::function<void(bool / * result * /)>`, this can be used from Swift.
   */
  class Func_void_bool_Wrapper final {
  public:
    explicit Func_void_bool_Wrapper(std::function<void(bool /* result */)>&& func): _function(std::make_shared<std::function<void(bool /* result */)>>(std::move(func))) {}
    inline void call(bool result) const {
      _function->operator()(result);
    }
  private:
    std::shared_ptr<std::function<void(bool /* result */)>> _function;
  };
  Func_void_bool create_Func_void_bool(void* _Nonnull swiftClosureWrapper);
  inline Func_void_bool_Wrapper wrap_Func_void_bool(Func_void_bool value) {
    return Func_void_bool_Wrapper(std::move(value));
  }
  
  // pragma MARK: std::vector<TextToSpeechVoice>
  /**
   * Specialized version of `std::vector<TextToSpeechVoice>`.
   */
  using std__vector_TextToSpeechVoice_ = std::vector<TextToSpeechVoice>;
  inline std::vector<TextToSpeechVoice> create_std__vector_TextToSpeechVoice_(size_t size) {
    std::vector<TextToSpeechVoice> vector;
    vector.reserve(size);
    return vector;
  }
  
  // pragma MARK: std::shared_ptr<Promise<std::vector<TextToSpeechVoice>>>
  /**
   * Specialized version of `std::shared_ptr<Promise<std::vector<TextToSpeechVoice>>>`.
   */
  using std__shared_ptr_Promise_std__vector_TextToSpeechVoice___ = std::shared_ptr<Promise<std::vector<TextToSpeechVoice>>>;
  inline std::shared_ptr<Promise<std::vector<TextToSpeechVoice>>> create_std__shared_ptr_Promise_std__vector_TextToSpeechVoice___() {
    return Promise<std::vector<TextToSpeechVoice>>::create();
  }
  inline PromiseHolder<std::vector<TextToSpeechVoice>> wrap_std__shared_ptr_Promise_std__vector_TextToSpeechVoice___(std::shared_ptr<Promise<std::vector<TextToSpeechVoice>>> promise) {
    return PromiseHolder<std::vector<TextToSpeechVoice>>(std::move(promise));
  }
  
  // pragma MARK: std::function<void(const std::vector<TextToSpeechVoice>& /* result */)>
  /**
   * Specialized version of `std::function<void(const std::vector<TextToSpeechVoice>&)>`.
   */
  using Func_void_std__vector_TextToSpeechVoice_ = std::function<void(const std::vector<TextToSpeechVoice>& /* result */)>;
  /**
   * Wrapper class for a `std::function<void(const std::vector<TextToSpeechVoice>& / * result * /)>`, this can be used from Swift.
   */
  class Func_void_std__vector_TextToSpeechVoice__Wrapper final {
  public:
    explicit Func_void_std__vector_TextToSpeechVoice__Wrapper(std::function<void(const std::vector<TextToSpeechVoice>& /* result */)>&& func): _function(std::make_shared<std::function<void(const std::vector<TextToSpeechVoice>& /* result */)>>(std::move(func))) {}
    inline void call(std::vector<TextToSpeechVoice> result) const {
      _function->operator()(result);
    }
  private:
    std::shared_ptr<std::function<void(const std::vector<TextToSpeechVoice>& /* result */)>> _function;
  };
  Func_void_std__vector_TextToSpeechVoice_ create_Func_void_std__vector_TextToSpeechVoice_(void* _Nonnull swiftClosureWrapper);
  inline Func_void_std__vector_TextToSpeechVoice__Wrapper wrap_Func_void_std__vector_TextToSpeechVoice_(Func_void_std__vector_TextToSpeechVoice_ value) {
    return Func_void_std__vector_TextToSpeechVoice__Wrapper(std::move(value));
  }
  
  // pragma MARK: std::function<void(const std::optional<std::string>& /* word */)>
  /**
   * Specialized version of `std::function<void(const std::optional<std::string>&)>`.
   */
  using Func_void_std__optional_std__string_ = std::function<void(const std::optional<std::string>& /* word */)>;
  /**
   * Wrapper class for a `std::function<void(const std::optional<std::string>& / * word * /)>`, this can be used from Swift.
   */
  class Func_void_std__optional_std__string__Wrapper final {
  public:
    explicit Func_void_std__optional_std__string__Wrapper(std::function<void(const std::optional<std::string>& /* word */)>&& func): _function(std::make_shared<std::function<void(const std::optional<std::string>& /* word */)>>(std::move(func))) {}
    inline void call(std::optional<std::string> word) const {
      _function->operator()(word);
    }
  private:
    std::shared_ptr<std::function<void(const std::optional<std::string>& /* word */)>> _function;
  };
  Func_void_std__optional_std__string_ create_Func_void_std__optional_std__string_(void* _Nonnull swiftClosureWrapper);
  inline Func_void_std__optional_std__string__Wrapper wrap_Func_void_std__optional_std__string_(Func_void_std__optional_std__string_ value) {
    return Func_void_std__optional_std__string__Wrapper(std::move(value));
  }
  
  // pragma MARK: std::shared_ptr<margelo::nitro::nitrotexttospeech::HybridTextToSpeechSpec>
  /**
   * Specialized version of `std::shared_ptr<margelo::nitro::nitrotexttospeech::HybridTextToSpeechSpec>`.
   */
  using std__shared_ptr_margelo__nitro__nitrotexttospeech__HybridTextToSpeechSpec_ = std::shared_ptr<margelo::nitro::nitrotexttospeech::HybridTextToSpeechSpec>;
  std::shared_ptr<margelo::nitro::nitrotexttospeech::HybridTextToSpeechSpec> create_std__shared_ptr_margelo__nitro__nitrotexttospeech__HybridTextToSpeechSpec_(void* _Nonnull swiftUnsafePointer);
  void* _Nonnull get_std__shared_ptr_margelo__nitro__nitrotexttospeech__HybridTextToSpeechSpec_(std__shared_ptr_margelo__nitro__nitrotexttospeech__HybridTextToSpeechSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<margelo::nitro::nitrotexttospeech::HybridTextToSpeechSpec>
  using std__weak_ptr_margelo__nitro__nitrotexttospeech__HybridTextToSpeechSpec_ = std::weak_ptr<margelo::nitro::nitrotexttospeech::HybridTextToSpeechSpec>;
  inline std__weak_ptr_margelo__nitro__nitrotexttospeech__HybridTextToSpeechSpec_ weakify_std__shared_ptr_margelo__nitro__nitrotexttospeech__HybridTextToSpeechSpec_(const std::shared_ptr<margelo::nitro::nitrotexttospeech::HybridTextToSpeechSpec>& strong) { return strong; }
  
  // 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) {
    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) {
    return Result<std::shared_ptr<Promise<void>>>::withError(error);
  }
  
  // pragma MARK: Result<std::shared_ptr<Promise<bool>>>
  using Result_std__shared_ptr_Promise_bool___ = Result<std::shared_ptr<Promise<bool>>>;
  inline Result_std__shared_ptr_Promise_bool___ create_Result_std__shared_ptr_Promise_bool___(const std::shared_ptr<Promise<bool>>& value) {
    return Result<std::shared_ptr<Promise<bool>>>::withValue(value);
  }
  inline Result_std__shared_ptr_Promise_bool___ create_Result_std__shared_ptr_Promise_bool___(const std::exception_ptr& error) {
    return Result<std::shared_ptr<Promise<bool>>>::withError(error);
  }
  
  // pragma MARK: Result<std::shared_ptr<Promise<std::vector<TextToSpeechVoice>>>>
  using Result_std__shared_ptr_Promise_std__vector_TextToSpeechVoice____ = Result<std::shared_ptr<Promise<std::vector<TextToSpeechVoice>>>>;
  inline Result_std__shared_ptr_Promise_std__vector_TextToSpeechVoice____ create_Result_std__shared_ptr_Promise_std__vector_TextToSpeechVoice____(const std::shared_ptr<Promise<std::vector<TextToSpeechVoice>>>& value) {
    return Result<std::shared_ptr<Promise<std::vector<TextToSpeechVoice>>>>::withValue(value);
  }
  inline Result_std__shared_ptr_Promise_std__vector_TextToSpeechVoice____ create_Result_std__shared_ptr_Promise_std__vector_TextToSpeechVoice____(const std::exception_ptr& error) {
    return Result<std::shared_ptr<Promise<std::vector<TextToSpeechVoice>>>>::withError(error);
  }
  
  // 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) {
    return Result<std::function<void()>>::withValue(value);
  }
  inline Result_std__function_void____ create_Result_std__function_void____(const std::exception_ptr& error) {
    return Result<std::function<void()>>::withError(error);
  }

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