///
/// MailEngine-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 `HybridMailAccountSpec` to properly resolve imports.
namespace margelo::nitro::mailengine { class HybridMailAccountSpec; }
// Forward declaration of `HybridMailEngineSpec` to properly resolve imports.
namespace margelo::nitro::mailengine { class HybridMailEngineSpec; }
// Forward declaration of `HybridMailMailboxSpec` to properly resolve imports.
namespace margelo::nitro::mailengine { class HybridMailMailboxSpec; }
// Forward declaration of `MailAddressStruct` to properly resolve imports.
namespace margelo::nitro::mailengine { struct MailAddressStruct; }
// Forward declaration of `MailAttachmentStruct` to properly resolve imports.
namespace margelo::nitro::mailengine { struct MailAttachmentStruct; }
// Forward declaration of `MailErrorStruct` to properly resolve imports.
namespace margelo::nitro::mailengine { struct MailErrorStruct; }
// Forward declaration of `MailHeaderStruct` to properly resolve imports.
namespace margelo::nitro::mailengine { struct MailHeaderStruct; }
// Forward declaration of `MailMailboxInfo` to properly resolve imports.
namespace margelo::nitro::mailengine { struct MailMailboxInfo; }
// Forward declaration of `MailMessageStruct` to properly resolve imports.
namespace margelo::nitro::mailengine { struct MailMessageStruct; }
// Forward declaration of `MailNewMailEvent` to properly resolve imports.
namespace margelo::nitro::mailengine { struct MailNewMailEvent; }
// Forward declaration of `MailOutgoingAttachment` to properly resolve imports.
namespace margelo::nitro::mailengine { struct MailOutgoingAttachment; }
// Forward declaration of `MailSecurity` to properly resolve imports.
namespace margelo::nitro::mailengine { enum class MailSecurity; }
// Forward declaration of `MailServerConfig` to properly resolve imports.
namespace margelo::nitro::mailengine { struct MailServerConfig; }

// Forward declarations of Swift defined types
// Forward declaration of `HybridMailAccountSpec_cxx` to properly resolve imports.
namespace MailEngine { class HybridMailAccountSpec_cxx; }
// Forward declaration of `HybridMailEngineSpec_cxx` to properly resolve imports.
namespace MailEngine { class HybridMailEngineSpec_cxx; }
// Forward declaration of `HybridMailMailboxSpec_cxx` to properly resolve imports.
namespace MailEngine { class HybridMailMailboxSpec_cxx; }

// Include C++ defined types
#include "HybridMailAccountSpec.hpp"
#include "HybridMailEngineSpec.hpp"
#include "HybridMailMailboxSpec.hpp"
#include "MailAddressStruct.hpp"
#include "MailAttachmentStruct.hpp"
#include "MailErrorStruct.hpp"
#include "MailHeaderStruct.hpp"
#include "MailMailboxInfo.hpp"
#include "MailMessageStruct.hpp"
#include "MailNewMailEvent.hpp"
#include "MailOutgoingAttachment.hpp"
#include "MailSecurity.hpp"
#include "MailServerConfig.hpp"
#include <NitroModules/ArrayBuffer.hpp>
#include <NitroModules/ArrayBufferHolder.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::mailengine::bridge::swift {

  // 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<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::vector<MailMailboxInfo>
  /**
   * Specialized version of `std::vector<MailMailboxInfo>`.
   */
  using std__vector_MailMailboxInfo_ = std::vector<MailMailboxInfo>;
  inline std::vector<MailMailboxInfo> create_std__vector_MailMailboxInfo_(size_t size) noexcept {
    std::vector<MailMailboxInfo> vector;
    vector.reserve(size);
    return vector;
  }
  
  // pragma MARK: std::shared_ptr<Promise<std::vector<MailMailboxInfo>>>
  /**
   * Specialized version of `std::shared_ptr<Promise<std::vector<MailMailboxInfo>>>`.
   */
  using std__shared_ptr_Promise_std__vector_MailMailboxInfo___ = std::shared_ptr<Promise<std::vector<MailMailboxInfo>>>;
  inline std::shared_ptr<Promise<std::vector<MailMailboxInfo>>> create_std__shared_ptr_Promise_std__vector_MailMailboxInfo___() noexcept {
    return Promise<std::vector<MailMailboxInfo>>::create();
  }
  inline PromiseHolder<std::vector<MailMailboxInfo>> wrap_std__shared_ptr_Promise_std__vector_MailMailboxInfo___(std::shared_ptr<Promise<std::vector<MailMailboxInfo>>> promise) noexcept {
    return PromiseHolder<std::vector<MailMailboxInfo>>(std::move(promise));
  }
  
  // pragma MARK: std::function<void(const std::vector<MailMailboxInfo>& /* result */)>
  /**
   * Specialized version of `std::function<void(const std::vector<MailMailboxInfo>&)>`.
   */
  using Func_void_std__vector_MailMailboxInfo_ = std::function<void(const std::vector<MailMailboxInfo>& /* result */)>;
  /**
   * Wrapper class for a `std::function<void(const std::vector<MailMailboxInfo>& / * result * /)>`, this can be used from Swift.
   */
  class Func_void_std__vector_MailMailboxInfo__Wrapper final {
  public:
    explicit Func_void_std__vector_MailMailboxInfo__Wrapper(std::function<void(const std::vector<MailMailboxInfo>& /* result */)>&& func): _function(std::make_unique<std::function<void(const std::vector<MailMailboxInfo>& /* result */)>>(std::move(func))) {}
    inline void call(std::vector<MailMailboxInfo> result) const noexcept {
      _function->operator()(result);
    }
  private:
    std::unique_ptr<std::function<void(const std::vector<MailMailboxInfo>& /* result */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_std__vector_MailMailboxInfo_ create_Func_void_std__vector_MailMailboxInfo_(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_std__vector_MailMailboxInfo__Wrapper wrap_Func_void_std__vector_MailMailboxInfo_(Func_void_std__vector_MailMailboxInfo_ value) noexcept {
    return Func_void_std__vector_MailMailboxInfo__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<HybridMailMailboxSpec>
  /**
   * Specialized version of `std::shared_ptr<HybridMailMailboxSpec>`.
   */
  using std__shared_ptr_HybridMailMailboxSpec_ = std::shared_ptr<HybridMailMailboxSpec>;
  std::shared_ptr<HybridMailMailboxSpec> create_std__shared_ptr_HybridMailMailboxSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_HybridMailMailboxSpec_(std__shared_ptr_HybridMailMailboxSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<HybridMailMailboxSpec>
  using std__weak_ptr_HybridMailMailboxSpec_ = std::weak_ptr<HybridMailMailboxSpec>;
  inline std__weak_ptr_HybridMailMailboxSpec_ weakify_std__shared_ptr_HybridMailMailboxSpec_(const std::shared_ptr<HybridMailMailboxSpec>& strong) noexcept { return strong; }
  
  // pragma MARK: std::shared_ptr<Promise<std::shared_ptr<HybridMailMailboxSpec>>>
  /**
   * Specialized version of `std::shared_ptr<Promise<std::shared_ptr<HybridMailMailboxSpec>>>`.
   */
  using std__shared_ptr_Promise_std__shared_ptr_HybridMailMailboxSpec___ = std::shared_ptr<Promise<std::shared_ptr<HybridMailMailboxSpec>>>;
  inline std::shared_ptr<Promise<std::shared_ptr<HybridMailMailboxSpec>>> create_std__shared_ptr_Promise_std__shared_ptr_HybridMailMailboxSpec___() noexcept {
    return Promise<std::shared_ptr<HybridMailMailboxSpec>>::create();
  }
  inline PromiseHolder<std::shared_ptr<HybridMailMailboxSpec>> wrap_std__shared_ptr_Promise_std__shared_ptr_HybridMailMailboxSpec___(std::shared_ptr<Promise<std::shared_ptr<HybridMailMailboxSpec>>> promise) noexcept {
    return PromiseHolder<std::shared_ptr<HybridMailMailboxSpec>>(std::move(promise));
  }
  
  // pragma MARK: std::function<void(const std::shared_ptr<HybridMailMailboxSpec>& /* result */)>
  /**
   * Specialized version of `std::function<void(const std::shared_ptr<HybridMailMailboxSpec>&)>`.
   */
  using Func_void_std__shared_ptr_HybridMailMailboxSpec_ = std::function<void(const std::shared_ptr<HybridMailMailboxSpec>& /* result */)>;
  /**
   * Wrapper class for a `std::function<void(const std::shared_ptr<HybridMailMailboxSpec>& / * result * /)>`, this can be used from Swift.
   */
  class Func_void_std__shared_ptr_HybridMailMailboxSpec__Wrapper final {
  public:
    explicit Func_void_std__shared_ptr_HybridMailMailboxSpec__Wrapper(std::function<void(const std::shared_ptr<HybridMailMailboxSpec>& /* result */)>&& func): _function(std::make_unique<std::function<void(const std::shared_ptr<HybridMailMailboxSpec>& /* result */)>>(std::move(func))) {}
    inline void call(std::shared_ptr<HybridMailMailboxSpec> result) const noexcept {
      _function->operator()(result);
    }
  private:
    std::unique_ptr<std::function<void(const std::shared_ptr<HybridMailMailboxSpec>& /* result */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_std__shared_ptr_HybridMailMailboxSpec_ create_Func_void_std__shared_ptr_HybridMailMailboxSpec_(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_std__shared_ptr_HybridMailMailboxSpec__Wrapper wrap_Func_void_std__shared_ptr_HybridMailMailboxSpec_(Func_void_std__shared_ptr_HybridMailMailboxSpec_ value) noexcept {
    return Func_void_std__shared_ptr_HybridMailMailboxSpec__Wrapper(std::move(value));
  }
  
  // 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__() noexcept {
    return Promise<void>::create();
  }
  inline PromiseHolder<void> wrap_std__shared_ptr_Promise_void__(std::shared_ptr<Promise<void>> promise) noexcept {
    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_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::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<MailAddressStruct>
  /**
   * Specialized version of `std::optional<MailAddressStruct>`.
   */
  using std__optional_MailAddressStruct_ = std::optional<MailAddressStruct>;
  inline std::optional<MailAddressStruct> create_std__optional_MailAddressStruct_(const MailAddressStruct& value) noexcept {
    return std::optional<MailAddressStruct>(value);
  }
  inline bool has_value_std__optional_MailAddressStruct_(const std::optional<MailAddressStruct>& optional) noexcept {
    return optional.has_value();
  }
  inline MailAddressStruct get_std__optional_MailAddressStruct_(const std::optional<MailAddressStruct>& optional) noexcept {
    return optional.value();
  }
  
  // pragma MARK: std::vector<MailAddressStruct>
  /**
   * Specialized version of `std::vector<MailAddressStruct>`.
   */
  using std__vector_MailAddressStruct_ = std::vector<MailAddressStruct>;
  inline std::vector<MailAddressStruct> create_std__vector_MailAddressStruct_(size_t size) noexcept {
    std::vector<MailAddressStruct> vector;
    vector.reserve(size);
    return vector;
  }
  
  // pragma MARK: std::optional<std::vector<MailAddressStruct>>
  /**
   * Specialized version of `std::optional<std::vector<MailAddressStruct>>`.
   */
  using std__optional_std__vector_MailAddressStruct__ = std::optional<std::vector<MailAddressStruct>>;
  inline std::optional<std::vector<MailAddressStruct>> create_std__optional_std__vector_MailAddressStruct__(const std::vector<MailAddressStruct>& value) noexcept {
    return std::optional<std::vector<MailAddressStruct>>(value);
  }
  inline bool has_value_std__optional_std__vector_MailAddressStruct__(const std::optional<std::vector<MailAddressStruct>>& optional) noexcept {
    return optional.has_value();
  }
  inline std::vector<MailAddressStruct> get_std__optional_std__vector_MailAddressStruct__(const std::optional<std::vector<MailAddressStruct>>& 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::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::vector<MailOutgoingAttachment>
  /**
   * Specialized version of `std::vector<MailOutgoingAttachment>`.
   */
  using std__vector_MailOutgoingAttachment_ = std::vector<MailOutgoingAttachment>;
  inline std::vector<MailOutgoingAttachment> create_std__vector_MailOutgoingAttachment_(size_t size) noexcept {
    std::vector<MailOutgoingAttachment> vector;
    vector.reserve(size);
    return vector;
  }
  
  // pragma MARK: std::optional<std::vector<MailOutgoingAttachment>>
  /**
   * Specialized version of `std::optional<std::vector<MailOutgoingAttachment>>`.
   */
  using std__optional_std__vector_MailOutgoingAttachment__ = std::optional<std::vector<MailOutgoingAttachment>>;
  inline std::optional<std::vector<MailOutgoingAttachment>> create_std__optional_std__vector_MailOutgoingAttachment__(const std::vector<MailOutgoingAttachment>& value) noexcept {
    return std::optional<std::vector<MailOutgoingAttachment>>(value);
  }
  inline bool has_value_std__optional_std__vector_MailOutgoingAttachment__(const std::optional<std::vector<MailOutgoingAttachment>>& optional) noexcept {
    return optional.has_value();
  }
  inline std::vector<MailOutgoingAttachment> get_std__optional_std__vector_MailOutgoingAttachment__(const std::optional<std::vector<MailOutgoingAttachment>>& optional) noexcept {
    return optional.value();
  }
  
  // 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.value();
  }
  
  // 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.value();
  }
  
  // pragma MARK: std::shared_ptr<HybridMailAccountSpec>
  /**
   * Specialized version of `std::shared_ptr<HybridMailAccountSpec>`.
   */
  using std__shared_ptr_HybridMailAccountSpec_ = std::shared_ptr<HybridMailAccountSpec>;
  std::shared_ptr<HybridMailAccountSpec> create_std__shared_ptr_HybridMailAccountSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_HybridMailAccountSpec_(std__shared_ptr_HybridMailAccountSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<HybridMailAccountSpec>
  using std__weak_ptr_HybridMailAccountSpec_ = std::weak_ptr<HybridMailAccountSpec>;
  inline std__weak_ptr_HybridMailAccountSpec_ weakify_std__shared_ptr_HybridMailAccountSpec_(const std::shared_ptr<HybridMailAccountSpec>& strong) noexcept { return strong; }
  
  // pragma MARK: Result<std::shared_ptr<Promise<std::vector<MailMailboxInfo>>>>
  using Result_std__shared_ptr_Promise_std__vector_MailMailboxInfo____ = Result<std::shared_ptr<Promise<std::vector<MailMailboxInfo>>>>;
  inline Result_std__shared_ptr_Promise_std__vector_MailMailboxInfo____ create_Result_std__shared_ptr_Promise_std__vector_MailMailboxInfo____(const std::shared_ptr<Promise<std::vector<MailMailboxInfo>>>& value) noexcept {
    return Result<std::shared_ptr<Promise<std::vector<MailMailboxInfo>>>>::withValue(value);
  }
  inline Result_std__shared_ptr_Promise_std__vector_MailMailboxInfo____ create_Result_std__shared_ptr_Promise_std__vector_MailMailboxInfo____(const std::exception_ptr& error) noexcept {
    return Result<std::shared_ptr<Promise<std::vector<MailMailboxInfo>>>>::withError(error);
  }
  
  // pragma MARK: Result<std::shared_ptr<Promise<std::shared_ptr<HybridMailMailboxSpec>>>>
  using Result_std__shared_ptr_Promise_std__shared_ptr_HybridMailMailboxSpec____ = Result<std::shared_ptr<Promise<std::shared_ptr<HybridMailMailboxSpec>>>>;
  inline Result_std__shared_ptr_Promise_std__shared_ptr_HybridMailMailboxSpec____ create_Result_std__shared_ptr_Promise_std__shared_ptr_HybridMailMailboxSpec____(const std::shared_ptr<Promise<std::shared_ptr<HybridMailMailboxSpec>>>& value) noexcept {
    return Result<std::shared_ptr<Promise<std::shared_ptr<HybridMailMailboxSpec>>>>::withValue(value);
  }
  inline Result_std__shared_ptr_Promise_std__shared_ptr_HybridMailMailboxSpec____ create_Result_std__shared_ptr_Promise_std__shared_ptr_HybridMailMailboxSpec____(const std::exception_ptr& error) noexcept {
    return Result<std::shared_ptr<Promise<std::shared_ptr<HybridMailMailboxSpec>>>>::withError(error);
  }
  
  // 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) noexcept {
    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) noexcept {
    return Result<std::shared_ptr<Promise<void>>>::withError(error);
  }
  
  // pragma MARK: std::shared_ptr<Promise<std::shared_ptr<HybridMailAccountSpec>>>
  /**
   * Specialized version of `std::shared_ptr<Promise<std::shared_ptr<HybridMailAccountSpec>>>`.
   */
  using std__shared_ptr_Promise_std__shared_ptr_HybridMailAccountSpec___ = std::shared_ptr<Promise<std::shared_ptr<HybridMailAccountSpec>>>;
  inline std::shared_ptr<Promise<std::shared_ptr<HybridMailAccountSpec>>> create_std__shared_ptr_Promise_std__shared_ptr_HybridMailAccountSpec___() noexcept {
    return Promise<std::shared_ptr<HybridMailAccountSpec>>::create();
  }
  inline PromiseHolder<std::shared_ptr<HybridMailAccountSpec>> wrap_std__shared_ptr_Promise_std__shared_ptr_HybridMailAccountSpec___(std::shared_ptr<Promise<std::shared_ptr<HybridMailAccountSpec>>> promise) noexcept {
    return PromiseHolder<std::shared_ptr<HybridMailAccountSpec>>(std::move(promise));
  }
  
  // pragma MARK: std::function<void(const std::shared_ptr<HybridMailAccountSpec>& /* result */)>
  /**
   * Specialized version of `std::function<void(const std::shared_ptr<HybridMailAccountSpec>&)>`.
   */
  using Func_void_std__shared_ptr_HybridMailAccountSpec_ = std::function<void(const std::shared_ptr<HybridMailAccountSpec>& /* result */)>;
  /**
   * Wrapper class for a `std::function<void(const std::shared_ptr<HybridMailAccountSpec>& / * result * /)>`, this can be used from Swift.
   */
  class Func_void_std__shared_ptr_HybridMailAccountSpec__Wrapper final {
  public:
    explicit Func_void_std__shared_ptr_HybridMailAccountSpec__Wrapper(std::function<void(const std::shared_ptr<HybridMailAccountSpec>& /* result */)>&& func): _function(std::make_unique<std::function<void(const std::shared_ptr<HybridMailAccountSpec>& /* result */)>>(std::move(func))) {}
    inline void call(std::shared_ptr<HybridMailAccountSpec> result) const noexcept {
      _function->operator()(result);
    }
  private:
    std::unique_ptr<std::function<void(const std::shared_ptr<HybridMailAccountSpec>& /* result */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_std__shared_ptr_HybridMailAccountSpec_ create_Func_void_std__shared_ptr_HybridMailAccountSpec_(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_std__shared_ptr_HybridMailAccountSpec__Wrapper wrap_Func_void_std__shared_ptr_HybridMailAccountSpec_(Func_void_std__shared_ptr_HybridMailAccountSpec_ value) noexcept {
    return Func_void_std__shared_ptr_HybridMailAccountSpec__Wrapper(std::move(value));
  }
  
  // pragma MARK: std::optional<MailServerConfig>
  /**
   * Specialized version of `std::optional<MailServerConfig>`.
   */
  using std__optional_MailServerConfig_ = std::optional<MailServerConfig>;
  inline std::optional<MailServerConfig> create_std__optional_MailServerConfig_(const MailServerConfig& value) noexcept {
    return std::optional<MailServerConfig>(value);
  }
  inline bool has_value_std__optional_MailServerConfig_(const std::optional<MailServerConfig>& optional) noexcept {
    return optional.has_value();
  }
  inline MailServerConfig get_std__optional_MailServerConfig_(const std::optional<MailServerConfig>& optional) noexcept {
    return optional.value();
  }
  
  // pragma MARK: std::shared_ptr<HybridMailEngineSpec>
  /**
   * Specialized version of `std::shared_ptr<HybridMailEngineSpec>`.
   */
  using std__shared_ptr_HybridMailEngineSpec_ = std::shared_ptr<HybridMailEngineSpec>;
  std::shared_ptr<HybridMailEngineSpec> create_std__shared_ptr_HybridMailEngineSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
  void* NON_NULL get_std__shared_ptr_HybridMailEngineSpec_(std__shared_ptr_HybridMailEngineSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<HybridMailEngineSpec>
  using std__weak_ptr_HybridMailEngineSpec_ = std::weak_ptr<HybridMailEngineSpec>;
  inline std__weak_ptr_HybridMailEngineSpec_ weakify_std__shared_ptr_HybridMailEngineSpec_(const std::shared_ptr<HybridMailEngineSpec>& strong) noexcept { return strong; }
  
  // pragma MARK: Result<std::shared_ptr<Promise<std::shared_ptr<HybridMailAccountSpec>>>>
  using Result_std__shared_ptr_Promise_std__shared_ptr_HybridMailAccountSpec____ = Result<std::shared_ptr<Promise<std::shared_ptr<HybridMailAccountSpec>>>>;
  inline Result_std__shared_ptr_Promise_std__shared_ptr_HybridMailAccountSpec____ create_Result_std__shared_ptr_Promise_std__shared_ptr_HybridMailAccountSpec____(const std::shared_ptr<Promise<std::shared_ptr<HybridMailAccountSpec>>>& value) noexcept {
    return Result<std::shared_ptr<Promise<std::shared_ptr<HybridMailAccountSpec>>>>::withValue(value);
  }
  inline Result_std__shared_ptr_Promise_std__shared_ptr_HybridMailAccountSpec____ create_Result_std__shared_ptr_Promise_std__shared_ptr_HybridMailAccountSpec____(const std::exception_ptr& error) noexcept {
    return Result<std::shared_ptr<Promise<std::shared_ptr<HybridMailAccountSpec>>>>::withError(error);
  }
  
  // pragma MARK: std::vector<MailHeaderStruct>
  /**
   * Specialized version of `std::vector<MailHeaderStruct>`.
   */
  using std__vector_MailHeaderStruct_ = std::vector<MailHeaderStruct>;
  inline std::vector<MailHeaderStruct> create_std__vector_MailHeaderStruct_(size_t size) noexcept {
    std::vector<MailHeaderStruct> vector;
    vector.reserve(size);
    return vector;
  }
  
  // pragma MARK: std::shared_ptr<Promise<std::vector<MailHeaderStruct>>>
  /**
   * Specialized version of `std::shared_ptr<Promise<std::vector<MailHeaderStruct>>>`.
   */
  using std__shared_ptr_Promise_std__vector_MailHeaderStruct___ = std::shared_ptr<Promise<std::vector<MailHeaderStruct>>>;
  inline std::shared_ptr<Promise<std::vector<MailHeaderStruct>>> create_std__shared_ptr_Promise_std__vector_MailHeaderStruct___() noexcept {
    return Promise<std::vector<MailHeaderStruct>>::create();
  }
  inline PromiseHolder<std::vector<MailHeaderStruct>> wrap_std__shared_ptr_Promise_std__vector_MailHeaderStruct___(std::shared_ptr<Promise<std::vector<MailHeaderStruct>>> promise) noexcept {
    return PromiseHolder<std::vector<MailHeaderStruct>>(std::move(promise));
  }
  
  // pragma MARK: std::function<void(const std::vector<MailHeaderStruct>& /* result */)>
  /**
   * Specialized version of `std::function<void(const std::vector<MailHeaderStruct>&)>`.
   */
  using Func_void_std__vector_MailHeaderStruct_ = std::function<void(const std::vector<MailHeaderStruct>& /* result */)>;
  /**
   * Wrapper class for a `std::function<void(const std::vector<MailHeaderStruct>& / * result * /)>`, this can be used from Swift.
   */
  class Func_void_std__vector_MailHeaderStruct__Wrapper final {
  public:
    explicit Func_void_std__vector_MailHeaderStruct__Wrapper(std::function<void(const std::vector<MailHeaderStruct>& /* result */)>&& func): _function(std::make_unique<std::function<void(const std::vector<MailHeaderStruct>& /* result */)>>(std::move(func))) {}
    inline void call(std::vector<MailHeaderStruct> result) const noexcept {
      _function->operator()(result);
    }
  private:
    std::unique_ptr<std::function<void(const std::vector<MailHeaderStruct>& /* result */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_std__vector_MailHeaderStruct_ create_Func_void_std__vector_MailHeaderStruct_(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_std__vector_MailHeaderStruct__Wrapper wrap_Func_void_std__vector_MailHeaderStruct_(Func_void_std__vector_MailHeaderStruct_ value) noexcept {
    return Func_void_std__vector_MailHeaderStruct__Wrapper(std::move(value));
  }
  
  // pragma MARK: std::vector<MailAttachmentStruct>
  /**
   * Specialized version of `std::vector<MailAttachmentStruct>`.
   */
  using std__vector_MailAttachmentStruct_ = std::vector<MailAttachmentStruct>;
  inline std::vector<MailAttachmentStruct> create_std__vector_MailAttachmentStruct_(size_t size) noexcept {
    std::vector<MailAttachmentStruct> vector;
    vector.reserve(size);
    return vector;
  }
  
  // pragma MARK: std::shared_ptr<Promise<MailMessageStruct>>
  /**
   * Specialized version of `std::shared_ptr<Promise<MailMessageStruct>>`.
   */
  using std__shared_ptr_Promise_MailMessageStruct__ = std::shared_ptr<Promise<MailMessageStruct>>;
  inline std::shared_ptr<Promise<MailMessageStruct>> create_std__shared_ptr_Promise_MailMessageStruct__() noexcept {
    return Promise<MailMessageStruct>::create();
  }
  inline PromiseHolder<MailMessageStruct> wrap_std__shared_ptr_Promise_MailMessageStruct__(std::shared_ptr<Promise<MailMessageStruct>> promise) noexcept {
    return PromiseHolder<MailMessageStruct>(std::move(promise));
  }
  
  // pragma MARK: std::function<void(const MailMessageStruct& /* result */)>
  /**
   * Specialized version of `std::function<void(const MailMessageStruct&)>`.
   */
  using Func_void_MailMessageStruct = std::function<void(const MailMessageStruct& /* result */)>;
  /**
   * Wrapper class for a `std::function<void(const MailMessageStruct& / * result * /)>`, this can be used from Swift.
   */
  class Func_void_MailMessageStruct_Wrapper final {
  public:
    explicit Func_void_MailMessageStruct_Wrapper(std::function<void(const MailMessageStruct& /* result */)>&& func): _function(std::make_unique<std::function<void(const MailMessageStruct& /* result */)>>(std::move(func))) {}
    inline void call(MailMessageStruct result) const noexcept {
      _function->operator()(result);
    }
  private:
    std::unique_ptr<std::function<void(const MailMessageStruct& /* result */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_MailMessageStruct create_Func_void_MailMessageStruct(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_MailMessageStruct_Wrapper wrap_Func_void_MailMessageStruct(Func_void_MailMessageStruct value) noexcept {
    return Func_void_MailMessageStruct_Wrapper(std::move(value));
  }
  
  // pragma MARK: std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>>
  /**
   * Specialized version of `std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>>`.
   */
  using std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer___ = std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>>;
  inline std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> create_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer___() noexcept {
    return Promise<std::shared_ptr<ArrayBuffer>>::create();
  }
  inline PromiseHolder<std::shared_ptr<ArrayBuffer>> wrap_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer___(std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> promise) noexcept {
    return PromiseHolder<std::shared_ptr<ArrayBuffer>>(std::move(promise));
  }
  
  // pragma MARK: std::function<void(const std::shared_ptr<ArrayBuffer>& /* result */)>
  /**
   * Specialized version of `std::function<void(const std::shared_ptr<ArrayBuffer>&)>`.
   */
  using Func_void_std__shared_ptr_ArrayBuffer_ = std::function<void(const std::shared_ptr<ArrayBuffer>& /* result */)>;
  /**
   * Wrapper class for a `std::function<void(const std::shared_ptr<ArrayBuffer>& / * result * /)>`, this can be used from Swift.
   */
  class Func_void_std__shared_ptr_ArrayBuffer__Wrapper final {
  public:
    explicit Func_void_std__shared_ptr_ArrayBuffer__Wrapper(std::function<void(const std::shared_ptr<ArrayBuffer>& /* result */)>&& func): _function(std::make_unique<std::function<void(const std::shared_ptr<ArrayBuffer>& /* result */)>>(std::move(func))) {}
    inline void call(ArrayBufferHolder result) const noexcept {
      _function->operator()(result.getArrayBuffer());
    }
  private:
    std::unique_ptr<std::function<void(const std::shared_ptr<ArrayBuffer>& /* result */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_std__shared_ptr_ArrayBuffer_ create_Func_void_std__shared_ptr_ArrayBuffer_(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_std__shared_ptr_ArrayBuffer__Wrapper wrap_Func_void_std__shared_ptr_ArrayBuffer_(Func_void_std__shared_ptr_ArrayBuffer_ value) noexcept {
    return Func_void_std__shared_ptr_ArrayBuffer__Wrapper(std::move(value));
  }
  
  // pragma MARK: std::vector<double>
  /**
   * Specialized version of `std::vector<double>`.
   */
  using std__vector_double_ = std::vector<double>;
  inline std::vector<double> create_std__vector_double_(size_t size) noexcept {
    std::vector<double> vector;
    vector.reserve(size);
    return vector;
  }
  
  // pragma MARK: std::shared_ptr<Promise<std::vector<double>>>
  /**
   * Specialized version of `std::shared_ptr<Promise<std::vector<double>>>`.
   */
  using std__shared_ptr_Promise_std__vector_double___ = std::shared_ptr<Promise<std::vector<double>>>;
  inline std::shared_ptr<Promise<std::vector<double>>> create_std__shared_ptr_Promise_std__vector_double___() noexcept {
    return Promise<std::vector<double>>::create();
  }
  inline PromiseHolder<std::vector<double>> wrap_std__shared_ptr_Promise_std__vector_double___(std::shared_ptr<Promise<std::vector<double>>> promise) noexcept {
    return PromiseHolder<std::vector<double>>(std::move(promise));
  }
  
  // pragma MARK: std::function<void(const std::vector<double>& /* result */)>
  /**
   * Specialized version of `std::function<void(const std::vector<double>&)>`.
   */
  using Func_void_std__vector_double_ = std::function<void(const std::vector<double>& /* result */)>;
  /**
   * Wrapper class for a `std::function<void(const std::vector<double>& / * result * /)>`, this can be used from Swift.
   */
  class Func_void_std__vector_double__Wrapper final {
  public:
    explicit Func_void_std__vector_double__Wrapper(std::function<void(const std::vector<double>& /* result */)>&& func): _function(std::make_unique<std::function<void(const std::vector<double>& /* result */)>>(std::move(func))) {}
    inline void call(std::vector<double> result) const noexcept {
      _function->operator()(result);
    }
  private:
    std::unique_ptr<std::function<void(const std::vector<double>& /* result */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_std__vector_double_ create_Func_void_std__vector_double_(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_std__vector_double__Wrapper wrap_Func_void_std__vector_double_(Func_void_std__vector_double_ value) noexcept {
    return Func_void_std__vector_double__Wrapper(std::move(value));
  }
  
  // pragma MARK: std::function<void(const MailNewMailEvent& /* event */)>
  /**
   * Specialized version of `std::function<void(const MailNewMailEvent&)>`.
   */
  using Func_void_MailNewMailEvent = std::function<void(const MailNewMailEvent& /* event */)>;
  /**
   * Wrapper class for a `std::function<void(const MailNewMailEvent& / * event * /)>`, this can be used from Swift.
   */
  class Func_void_MailNewMailEvent_Wrapper final {
  public:
    explicit Func_void_MailNewMailEvent_Wrapper(std::function<void(const MailNewMailEvent& /* event */)>&& func): _function(std::make_unique<std::function<void(const MailNewMailEvent& /* event */)>>(std::move(func))) {}
    inline void call(MailNewMailEvent event) const noexcept {
      _function->operator()(event);
    }
  private:
    std::unique_ptr<std::function<void(const MailNewMailEvent& /* event */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_MailNewMailEvent create_Func_void_MailNewMailEvent(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_MailNewMailEvent_Wrapper wrap_Func_void_MailNewMailEvent(Func_void_MailNewMailEvent value) noexcept {
    return Func_void_MailNewMailEvent_Wrapper(std::move(value));
  }
  
  // pragma MARK: std::function<void(const MailErrorStruct& /* error */)>
  /**
   * Specialized version of `std::function<void(const MailErrorStruct&)>`.
   */
  using Func_void_MailErrorStruct = std::function<void(const MailErrorStruct& /* error */)>;
  /**
   * Wrapper class for a `std::function<void(const MailErrorStruct& / * error * /)>`, this can be used from Swift.
   */
  class Func_void_MailErrorStruct_Wrapper final {
  public:
    explicit Func_void_MailErrorStruct_Wrapper(std::function<void(const MailErrorStruct& /* error */)>&& func): _function(std::make_unique<std::function<void(const MailErrorStruct& /* error */)>>(std::move(func))) {}
    inline void call(MailErrorStruct error) const noexcept {
      _function->operator()(error);
    }
  private:
    std::unique_ptr<std::function<void(const MailErrorStruct& /* error */)>> _function;
  } SWIFT_NONCOPYABLE;
  Func_void_MailErrorStruct create_Func_void_MailErrorStruct(void* NON_NULL swiftClosureWrapper) noexcept;
  inline Func_void_MailErrorStruct_Wrapper wrap_Func_void_MailErrorStruct(Func_void_MailErrorStruct value) noexcept {
    return Func_void_MailErrorStruct_Wrapper(std::move(value));
  }
  
  // pragma MARK: Result<std::shared_ptr<Promise<std::vector<MailHeaderStruct>>>>
  using Result_std__shared_ptr_Promise_std__vector_MailHeaderStruct____ = Result<std::shared_ptr<Promise<std::vector<MailHeaderStruct>>>>;
  inline Result_std__shared_ptr_Promise_std__vector_MailHeaderStruct____ create_Result_std__shared_ptr_Promise_std__vector_MailHeaderStruct____(const std::shared_ptr<Promise<std::vector<MailHeaderStruct>>>& value) noexcept {
    return Result<std::shared_ptr<Promise<std::vector<MailHeaderStruct>>>>::withValue(value);
  }
  inline Result_std__shared_ptr_Promise_std__vector_MailHeaderStruct____ create_Result_std__shared_ptr_Promise_std__vector_MailHeaderStruct____(const std::exception_ptr& error) noexcept {
    return Result<std::shared_ptr<Promise<std::vector<MailHeaderStruct>>>>::withError(error);
  }
  
  // pragma MARK: Result<std::shared_ptr<Promise<MailMessageStruct>>>
  using Result_std__shared_ptr_Promise_MailMessageStruct___ = Result<std::shared_ptr<Promise<MailMessageStruct>>>;
  inline Result_std__shared_ptr_Promise_MailMessageStruct___ create_Result_std__shared_ptr_Promise_MailMessageStruct___(const std::shared_ptr<Promise<MailMessageStruct>>& value) noexcept {
    return Result<std::shared_ptr<Promise<MailMessageStruct>>>::withValue(value);
  }
  inline Result_std__shared_ptr_Promise_MailMessageStruct___ create_Result_std__shared_ptr_Promise_MailMessageStruct___(const std::exception_ptr& error) noexcept {
    return Result<std::shared_ptr<Promise<MailMessageStruct>>>::withError(error);
  }
  
  // pragma MARK: Result<std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>>>
  using Result_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer____ = Result<std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>>>;
  inline Result_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer____ create_Result_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer____(const std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>>& value) noexcept {
    return Result<std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>>>::withValue(value);
  }
  inline Result_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer____ create_Result_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer____(const std::exception_ptr& error) noexcept {
    return Result<std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>>>::withError(error);
  }
  
  // pragma MARK: Result<std::shared_ptr<Promise<std::vector<double>>>>
  using Result_std__shared_ptr_Promise_std__vector_double____ = Result<std::shared_ptr<Promise<std::vector<double>>>>;
  inline Result_std__shared_ptr_Promise_std__vector_double____ create_Result_std__shared_ptr_Promise_std__vector_double____(const std::shared_ptr<Promise<std::vector<double>>>& value) noexcept {
    return Result<std::shared_ptr<Promise<std::vector<double>>>>::withValue(value);
  }
  inline Result_std__shared_ptr_Promise_std__vector_double____ create_Result_std__shared_ptr_Promise_std__vector_double____(const std::exception_ptr& error) noexcept {
    return Result<std::shared_ptr<Promise<std::vector<double>>>>::withError(error);
  }

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