// WARNING: This file is machine generated by fidlgen.

#pragma once

#include <zx/cpp/fidl.h>

#include "lib/fidl/cpp/internal/header.h"

//
// Domain objects declarations (i.e. "natural types" in unified bindings).
//
namespace fidl {
namespace test {
namespace handles {

enum class obj_type : uint32_t {

  NONE = 0u,

  PROCESS = 1u,

  THREAD = 2u,

  VMO = 3u,

  CHANNEL = 4u,

  EVENT = 5u,

  PORT = 6u,

  INTERRUPT = 9u,

  PCI_DEVICE = 11u,

  LOG = 12u,

  SOCKET = 14u,

  RESOURCE = 15u,

  EVENTPAIR = 16u,

  JOB = 17u,

  VMAR = 18u,

  FIFO = 19u,

  GUEST = 20u,

  VCPU = 21u,

  TIMER = 22u,

  IOMMU = 23u,

  BTI = 24u,

  PROFILE = 25u,

  PMT = 26u,

  SUSPEND_TOKEN = 27u,

  PAGER = 28u,

  EXCEPTION = 29u,

  CLOCK = 30u,

  STREAM = 31u,

  MSI_ALLOCATION = 32u,

  MSI_INTERRUPT = 33u,
};

inline zx_status_t Clone(::fidl::test::handles::obj_type value,
                         ::fidl::test::handles::obj_type* result) {
  *result = value;
  return ZX_OK;
}

class Handles;

#ifdef __Fuchsia__

class SomeProtocol;
using SomeProtocolHandle = ::fidl::InterfaceHandle<SomeProtocol>;
#endif  // __Fuchsia__

#ifdef __Fuchsia__

class Handles final {
 public:
  static const fidl_type_t* FidlType;

  ::zx::handle plain_handle{};

  ::zx::bti bti_handle{};

  ::zx::channel channel_handle{};

  ::zx::clock clock_handle{};

  ::zx::debuglog debuglog_handle{};

  ::zx::event event_handle{};

  ::zx::eventpair eventpair_handle{};

  ::zx::exception exception_handle{};

  ::zx::fifo fifo_handle{};

  ::zx::guest guest_handle{};

  ::zx::interrupt interrupt_handle{};

  ::zx::iommu iommu_handle{};

  ::zx::job job_handle{};

  ::zx::pager pager_handle{};

  ::zx::pcidevice pcidevice_handle{};

  ::zx::pmt pmt_handle{};

  ::zx::port port_handle{};

  ::zx::process process_handle{};

  ::zx::profile profile_handle{};

  ::zx::resource resource_handle{};

  ::zx::socket socket_handle{};

  ::zx::suspendtoken suspendtoken_handle{};

  ::zx::thread thread_handle{};

  ::zx::timer timer_handle{};

  ::zx::vcpu vcpu_handle{};

  ::zx::vmar vmar_handle{};

  ::zx::vmo vmo_handle{};

  ::zx::vmo rights_handle{};

  ::zx::handle aliased_plain_handle_field{};

  ::zx::vmo aliased_subtype_handle_field{};

  ::zx::vmo aliased_rights_handle_field{};

  ::fidl::InterfaceHandle<::fidl::test::handles::SomeProtocol> some_protocol{};

  ::fidl::InterfaceRequest<::fidl::test::handles::SomeProtocol>
      request_some_protocol{};

  static inline ::std::unique_ptr<Handles> New() {
    return ::std::make_unique<Handles>();
  }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info =
                  cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Handles* value, size_t _offset);
  zx_status_t Clone(Handles* result) const;
};

inline zx_status_t Clone(const ::fidl::test::handles::Handles& _value,
                         ::fidl::test::handles::Handles* _result) {
  return _value.Clone(_result);
}

using HandlesPtr = ::std::unique_ptr<Handles>;
#endif  // __Fuchsia__

#ifdef __Fuchsia__

class SomeProtocol_RequestEncoder {
 public:
};

class SomeProtocol_ResponseEncoder {
 public:
};
#endif  // __Fuchsia__

}  // namespace handles
}  // namespace test
template <>
struct CodingTraits<::fidl::test::handles::obj_type> {
  static constexpr size_t inline_size_old =
      sizeof(::fidl::test::handles::obj_type);
  static constexpr size_t inline_size_v1_no_ee =
      sizeof(::fidl::test::handles::obj_type);
  static void Encode(
      Encoder* encoder, ::fidl::test::handles::obj_type* value, size_t offset,
      cpp17::optional<::fidl::HandleInformation> maybe_handle_info) {
    ZX_DEBUG_ASSERT(!maybe_handle_info);
    uint32_t underlying = static_cast<uint32_t>(*value);
    ::fidl::Encode(encoder, &underlying, offset);
  }
  static void Decode(Decoder* decoder, ::fidl::test::handles::obj_type* value,
                     size_t offset) {
    uint32_t underlying = {};
    ::fidl::Decode(decoder, &underlying, offset);
    *value = static_cast<::fidl::test::handles::obj_type>(underlying);
  }
};

inline zx_status_t Clone(::fidl::test::handles::obj_type value,
                         ::fidl::test::handles::obj_type* result) {
  return ::fidl::test::handles::Clone(value, result);
}
template <>
struct Equality<::fidl::test::handles::obj_type> {
  bool operator()(const ::fidl::test::handles::obj_type& _lhs,
                  const ::fidl::test::handles::obj_type& _rhs) const {
    return _lhs == _rhs;
  }
};

#ifdef __Fuchsia__

template <>
struct CodingTraits<::fidl::test::handles::Handles>
    : public EncodableCodingTraits<::fidl::test::handles::Handles, 132> {};

template <>
struct IsMemcpyCompatible<::fidl::test::handles::Handles>
    : public internal::BoolConstant<
          !HasPadding<::fidl::test::handles::Handles>::value &&
          IsMemcpyCompatible<::fidl::InterfaceHandle<
              ::fidl::test::handles::SomeProtocol>>::value &&
          IsMemcpyCompatible<::fidl::InterfaceRequest<
              ::fidl::test::handles::SomeProtocol>>::value &&
          IsMemcpyCompatible<::zx::bti>::value &&
          IsMemcpyCompatible<::zx::channel>::value &&
          IsMemcpyCompatible<::zx::clock>::value &&
          IsMemcpyCompatible<::zx::debuglog>::value &&
          IsMemcpyCompatible<::zx::event>::value &&
          IsMemcpyCompatible<::zx::eventpair>::value &&
          IsMemcpyCompatible<::zx::exception>::value &&
          IsMemcpyCompatible<::zx::fifo>::value &&
          IsMemcpyCompatible<::zx::guest>::value &&
          IsMemcpyCompatible<::zx::handle>::value &&
          IsMemcpyCompatible<::zx::interrupt>::value &&
          IsMemcpyCompatible<::zx::iommu>::value &&
          IsMemcpyCompatible<::zx::job>::value &&
          IsMemcpyCompatible<::zx::pager>::value &&
          IsMemcpyCompatible<::zx::pcidevice>::value &&
          IsMemcpyCompatible<::zx::pmt>::value &&
          IsMemcpyCompatible<::zx::port>::value &&
          IsMemcpyCompatible<::zx::process>::value &&
          IsMemcpyCompatible<::zx::profile>::value &&
          IsMemcpyCompatible<::zx::resource>::value &&
          IsMemcpyCompatible<::zx::socket>::value &&
          IsMemcpyCompatible<::zx::suspendtoken>::value &&
          IsMemcpyCompatible<::zx::thread>::value &&
          IsMemcpyCompatible<::zx::timer>::value &&
          IsMemcpyCompatible<::zx::vcpu>::value &&
          IsMemcpyCompatible<::zx::vmar>::value &&
          IsMemcpyCompatible<::zx::vmo>::value> {};

inline zx_status_t Clone(const ::fidl::test::handles::Handles& value,
                         ::fidl::test::handles::Handles* result) {
  return ::fidl::test::handles::Clone(value, result);
}

template <>
struct Equality<::fidl::test::handles::Handles> {
  bool operator()(const ::fidl::test::handles::Handles& _lhs,
                  const ::fidl::test::handles::Handles& _rhs) const {
    if (!::fidl::Equals(_lhs.plain_handle, _rhs.plain_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.bti_handle, _rhs.bti_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.channel_handle, _rhs.channel_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.clock_handle, _rhs.clock_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.debuglog_handle, _rhs.debuglog_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.event_handle, _rhs.event_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.eventpair_handle, _rhs.eventpair_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.exception_handle, _rhs.exception_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.fifo_handle, _rhs.fifo_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.guest_handle, _rhs.guest_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.interrupt_handle, _rhs.interrupt_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.iommu_handle, _rhs.iommu_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.job_handle, _rhs.job_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.pager_handle, _rhs.pager_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.pcidevice_handle, _rhs.pcidevice_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.pmt_handle, _rhs.pmt_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.port_handle, _rhs.port_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.process_handle, _rhs.process_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.profile_handle, _rhs.profile_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.resource_handle, _rhs.resource_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.socket_handle, _rhs.socket_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.suspendtoken_handle, _rhs.suspendtoken_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.thread_handle, _rhs.thread_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.timer_handle, _rhs.timer_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.vcpu_handle, _rhs.vcpu_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.vmar_handle, _rhs.vmar_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.vmo_handle, _rhs.vmo_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.rights_handle, _rhs.rights_handle)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.aliased_plain_handle_field,
                        _rhs.aliased_plain_handle_field)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.aliased_subtype_handle_field,
                        _rhs.aliased_subtype_handle_field)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.aliased_rights_handle_field,
                        _rhs.aliased_rights_handle_field)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.some_protocol, _rhs.some_protocol)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.request_some_protocol,
                        _rhs.request_some_protocol)) {
      return false;
    }
    return true;
  }
};
#endif  // __Fuchsia__

//
// Proxies and stubs declarations
//
namespace test {
namespace handles {
#ifdef __Fuchsia__

using SomeProtocolPtr = ::fidl::InterfacePtr<SomeProtocol>;
class SomeProtocol_Proxy;
class SomeProtocol_Stub;
class SomeProtocol_EventSender;
class SomeProtocol_Sync;
using SomeProtocolSyncPtr = ::fidl::SynchronousInterfacePtr<SomeProtocol>;
class SomeProtocol_SyncProxy;

#endif  // __Fuchsia__

#ifdef __Fuchsia__

class SomeProtocol {
 public:
  using Proxy_ = ::fidl::test::handles::SomeProtocol_Proxy;
  using Stub_ = ::fidl::test::handles::SomeProtocol_Stub;
  using EventSender_ = ::fidl::test::handles::SomeProtocol_EventSender;
  using Sync_ = ::fidl::test::handles::SomeProtocol_Sync;
  virtual ~SomeProtocol();
};

class SomeProtocol_RequestDecoder {
 public:
  SomeProtocol_RequestDecoder() = default;
  virtual ~SomeProtocol_RequestDecoder() = default;
  static const fidl_type_t* GetType(uint64_t ordinal, bool* out_needs_response);
};

class SomeProtocol_ResponseDecoder {
 public:
  SomeProtocol_ResponseDecoder() = default;
  virtual ~SomeProtocol_ResponseDecoder() = default;
  static const fidl_type_t* GetType(uint64_t ordinal);
};

class SomeProtocol_EventSender {
 public:
  virtual ~SomeProtocol_EventSender();
};

class SomeProtocol_Sync {
 public:
  using Proxy_ = ::fidl::test::handles::SomeProtocol_SyncProxy;
  virtual ~SomeProtocol_Sync();
};

class SomeProtocol_Proxy final : public ::fidl::internal::Proxy,
                                 public SomeProtocol {
 public:
  explicit SomeProtocol_Proxy(::fidl::internal::ProxyController* controller);
  ~SomeProtocol_Proxy() override;

  zx_status_t Dispatch_(::fidl::HLCPPIncomingMessage message) override;

 private:
  SomeProtocol_Proxy(const ::fidl::test::handles::SomeProtocol_Proxy&) = delete;
  SomeProtocol_Proxy& operator=(
      const ::fidl::test::handles::SomeProtocol_Proxy&) = delete;

  ::fidl::internal::ProxyController* controller_;
};

class SomeProtocol_Stub final
    : public ::fidl::internal::Stub,
      public ::fidl::test::handles::SomeProtocol_EventSender {
 public:
  typedef class ::fidl::test::handles::SomeProtocol SomeProtocol_clazz;
  explicit SomeProtocol_Stub(
      ::fidl::test::handles::SomeProtocol_Stub::SomeProtocol_clazz* impl);
  ~SomeProtocol_Stub() override;

  zx_status_t Dispatch_(::fidl::HLCPPIncomingMessage message,
                        ::fidl::internal::PendingResponse response) override;

 private:
  ::fidl::test::handles::SomeProtocol_Stub::SomeProtocol_clazz* impl_;
};

class SomeProtocol_SyncProxy : public ::fidl::test::handles::SomeProtocol_Sync {
 public:
  explicit SomeProtocol_SyncProxy(::zx::channel channel);
  ~SomeProtocol_SyncProxy() override;

 private:
  ::fidl::internal::SynchronousProxy proxy_;
  friend class ::fidl::SynchronousInterfacePtr<SomeProtocol>;
};
#endif  // __Fuchsia__

}  // namespace handles
}  // namespace test
}  // namespace fidl
