///
/// HybridFaceSpecSwift.hpp
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © Marc Rousavy @ Margelo
///

#pragma once

#include "HybridFaceSpec.hpp"

// Forward declaration of `HybridFaceSpec_cxx` to properly resolve imports.
namespace VisionCameraFaceDetector { class HybridFaceSpec_cxx; }

// Forward declaration of `Landmarks` to properly resolve imports.
namespace margelo::nitro::camera::facedetector { struct Landmarks; }
// Forward declaration of `Point` to properly resolve imports.
namespace margelo::nitro::camera::facedetector { struct Point; }
// Forward declaration of `Contours` to properly resolve imports.
namespace margelo::nitro::camera::facedetector { struct Contours; }
// Forward declaration of `Bounds` to properly resolve imports.
namespace margelo::nitro::camera::facedetector { struct Bounds; }

#include "Landmarks.hpp"
#include <optional>
#include "Point.hpp"
#include "Contours.hpp"
#include <vector>
#include "Bounds.hpp"

#include "VisionCameraFaceDetector-Swift-Cxx-Umbrella.hpp"

namespace margelo::nitro::camera::facedetector {

  /**
   * The C++ part of HybridFaceSpec_cxx.swift.
   *
   * HybridFaceSpecSwift (C++) accesses HybridFaceSpec_cxx (Swift), and might
   * contain some additional bridging code for C++ <> Swift interop.
   *
   * Since this obviously introduces an overhead, I hope at some point in
   * the future, HybridFaceSpec_cxx can directly inherit from the C++ class HybridFaceSpec
   * to simplify the whole structure and memory management.
   */
  class HybridFaceSpecSwift: public virtual HybridFaceSpec {
  public:
    // Constructor from a Swift instance
    explicit HybridFaceSpecSwift(const VisionCameraFaceDetector::HybridFaceSpec_cxx& swiftPart):
      HybridObject(HybridFaceSpec::TAG),
      _swiftPart(swiftPart) { }

  public:
    // Get the Swift part
    inline VisionCameraFaceDetector::HybridFaceSpec_cxx& getSwiftPart() noexcept {
      return _swiftPart;
    }

  public:
    inline size_t getExternalMemorySize() noexcept override {
      return _swiftPart.getMemorySize();
    }
    bool equals(const std::shared_ptr<HybridObject>& other) override {
      if (auto otherCast = std::dynamic_pointer_cast<HybridFaceSpecSwift>(other)) {
        return _swiftPart.equals(otherCast->_swiftPart);
      }
      return false;
    }
    void dispose() noexcept override {
      _swiftPart.dispose();
    }
    std::string toString() override {
      return _swiftPart.toString();
    }

  public:
    // Properties
    inline std::optional<Landmarks> getLandmarks() noexcept override {
      auto __result = _swiftPart.getLandmarks();
      return __result;
    }
    inline std::optional<Contours> getContours() noexcept override {
      auto __result = _swiftPart.getContours();
      return __result;
    }
    inline Bounds getBounds() noexcept override {
      return _swiftPart.getBounds();
    }
    inline std::optional<double> getLeftEyeOpenProbability() noexcept override {
      auto __result = _swiftPart.getLeftEyeOpenProbability();
      return __result;
    }
    inline std::optional<double> getRightEyeOpenProbability() noexcept override {
      auto __result = _swiftPart.getRightEyeOpenProbability();
      return __result;
    }
    inline std::optional<double> getSmilingProbability() noexcept override {
      auto __result = _swiftPart.getSmilingProbability();
      return __result;
    }
    inline std::optional<double> getTrackingId() noexcept override {
      auto __result = _swiftPart.getTrackingId();
      return __result;
    }
    inline double getPitchAngle() noexcept override {
      return _swiftPart.getPitchAngle();
    }
    inline double getRollAngle() noexcept override {
      return _swiftPart.getRollAngle();
    }
    inline double getYawAngle() noexcept override {
      return _swiftPart.getYawAngle();
    }

  public:
    // Methods
    

  private:
    VisionCameraFaceDetector::HybridFaceSpec_cxx _swiftPart;
  };

} // namespace margelo::nitro::camera::facedetector
