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

#pragma once

// Forward declarations of C++ defined types
// Forward declaration of `HybridAcousticConnectRNSpec` to properly resolve imports.
namespace margelo::nitro::acousticconnectrn { class HybridAcousticConnectRNSpec; }

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

// Include C++ defined types
#include "HybridAcousticConnectRNSpec.hpp"
#include <NitroModules/Result.hpp>
#include <exception>
#include <memory>
#include <optional>
#include <string>
#include <unordered_map>
#include <variant>

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

  // pragma MARK: std::variant<std::string, double, bool>
  /**
   * Wrapper struct for `std::variant<std::string, double, bool>`.
   * std::variant cannot be used in Swift because of a Swift bug.
   * Not even specializing it works. So we create a wrapper struct.
   */
  struct std__variant_std__string__double__bool_ {
    std::variant<std::string, double, bool> variant;
    std__variant_std__string__double__bool_(std::variant<std::string, double, bool> variant): variant(variant) { }
    operator std::variant<std::string, double, bool>() const {
      return variant;
    }
    inline size_t index() const {
      return variant.index();
    }
    inline std::string get_0() const {
      return std::get<0>(variant);
    }
    inline double get_1() const {
      return std::get<1>(variant);
    }
    inline bool get_2() const {
      return std::get<2>(variant);
    }
  };
  inline std__variant_std__string__double__bool_ create_std__variant_std__string__double__bool_(const std::string& value) {
    return std__variant_std__string__double__bool_(value);
  }
  inline std__variant_std__string__double__bool_ create_std__variant_std__string__double__bool_(double value) {
    return std__variant_std__string__double__bool_(value);
  }
  inline std__variant_std__string__double__bool_ create_std__variant_std__string__double__bool_(bool value) {
    return std__variant_std__string__double__bool_(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::unordered_map<std::string, std::variant<std::string, double, bool>>
  /**
   * Specialized version of `std::unordered_map<std::string, std::variant<std::string, double, bool>>`.
   */
  using std__unordered_map_std__string__std__variant_std__string__double__bool__ = std::unordered_map<std::string, std::variant<std::string, double, bool>>;
  inline std::unordered_map<std::string, std::variant<std::string, double, bool>> create_std__unordered_map_std__string__std__variant_std__string__double__bool__(size_t size) {
    std::unordered_map<std::string, std::variant<std::string, double, bool>> map;
    map.reserve(size);
    return map;
  }
  inline std::vector<std::string> get_std__unordered_map_std__string__std__variant_std__string__double__bool___keys(const std__unordered_map_std__string__std__variant_std__string__double__bool__& map) {
    std::vector<std::string> keys;
    keys.reserve(map.size());
    for (const auto& entry : map) {
      keys.push_back(entry.first);
    }
    return keys;
  }
  inline void emplace_std__unordered_map_std__string__std__variant_std__string__double__bool__(std__unordered_map_std__string__std__variant_std__string__double__bool__& map, const std::string& key, const std::variant<std::string, double, bool>& value) {
    map.emplace(key, value);
  }
  
  // pragma MARK: std::shared_ptr<margelo::nitro::acousticconnectrn::HybridAcousticConnectRNSpec>
  /**
   * Specialized version of `std::shared_ptr<margelo::nitro::acousticconnectrn::HybridAcousticConnectRNSpec>`.
   */
  using std__shared_ptr_margelo__nitro__acousticconnectrn__HybridAcousticConnectRNSpec_ = std::shared_ptr<margelo::nitro::acousticconnectrn::HybridAcousticConnectRNSpec>;
  std::shared_ptr<margelo::nitro::acousticconnectrn::HybridAcousticConnectRNSpec> create_std__shared_ptr_margelo__nitro__acousticconnectrn__HybridAcousticConnectRNSpec_(void* _Nonnull swiftUnsafePointer);
  void* _Nonnull get_std__shared_ptr_margelo__nitro__acousticconnectrn__HybridAcousticConnectRNSpec_(std__shared_ptr_margelo__nitro__acousticconnectrn__HybridAcousticConnectRNSpec_ cppType);
  
  // pragma MARK: std::weak_ptr<margelo::nitro::acousticconnectrn::HybridAcousticConnectRNSpec>
  using std__weak_ptr_margelo__nitro__acousticconnectrn__HybridAcousticConnectRNSpec_ = std::weak_ptr<margelo::nitro::acousticconnectrn::HybridAcousticConnectRNSpec>;
  inline std__weak_ptr_margelo__nitro__acousticconnectrn__HybridAcousticConnectRNSpec_ weakify_std__shared_ptr_margelo__nitro__acousticconnectrn__HybridAcousticConnectRNSpec_(const std::shared_ptr<margelo::nitro::acousticconnectrn::HybridAcousticConnectRNSpec>& strong) { return strong; }
  
  // pragma MARK: Result<bool>
  using Result_bool_ = Result<bool>;
  inline Result_bool_ create_Result_bool_(bool value) {
    return Result<bool>::withValue(std::move(value));
  }
  inline Result_bool_ create_Result_bool_(const std::exception_ptr& error) {
    return Result<bool>::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) {
    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) {
    return Result<std::optional<std::string>>::withError(error);
  }
  
  // pragma MARK: Result<double>
  using Result_double_ = Result<double>;
  inline Result_double_ create_Result_double_(double value) {
    return Result<double>::withValue(std::move(value));
  }
  inline Result_double_ create_Result_double_(const std::exception_ptr& error) {
    return Result<double>::withError(error);
  }

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