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

#pragma once

#include <fidl/test.driverhandle/cpp/common_types.h>
#include <fidl/test.driverhandle/cpp/markers.h>
#include <lib/fidl/cpp/natural_coding_traits.h>
#include <lib/fidl/cpp/natural_types.h>

#include <cinttypes>
#include <string>

#ifdef __Fuchsia__

#include <lib/fidl_driver/cpp/natural_types.h>
#include <lib/zx/channel.h>
#include <lib/zx/event.h>

#endif  // __Fuchsia__

namespace test_driverhandle {

class HandlesInProtocolSendHandlesRequest;

class ServerEndWrapper;

class ClientEndWrapper;

class T;

#ifdef __Fuchsia__

extern "C" const fidl_type_t test_driverhandle_TTable;

class T {
 private:
  struct Storage_;

 public:
  T(Storage_ storage)
  noexcept : storage_(std::move(storage)) {}
  T()
  noexcept = default;
  T(T&&)
  noexcept = default;
  T& operator=(T&&) noexcept = default;

  bool IsEmpty() const {
    return !(storage_.zircon_handle.has_value() || storage_.fdf_handle.has_value());
  }

  const std::optional<::zx::event>& zircon_handle() const { return storage_.zircon_handle; }
  ::std::optional<::zx::event>& zircon_handle() { return storage_.zircon_handle; }

  const std::optional<::fdf::ClientEnd<::test_driverhandle::DriverProtocol>>& fdf_handle() const { return storage_.fdf_handle; }
  ::std::optional<::fdf::ClientEnd<::test_driverhandle::DriverProtocol>>& fdf_handle() { return storage_.fdf_handle; }

  T(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : T(Storage_{}) {}

 private:
  struct Storage_ final {
    ::std::optional<::zx::event> zircon_handle{};
    ::std::optional<::fdf::ClientEnd<::test_driverhandle::DriverProtocol>> fdf_handle{};
  };

  // TODO(https://fxbug.dev/91252): Box the storage.
  Storage_ storage_;
  friend struct ::fidl::internal::NaturalTableCodingTraits<::test_driverhandle::T>;
  friend struct ::fidl::internal::MemberVisitor<::test_driverhandle::T>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalTableMember<Storage_, ::zx::event, fidl::internal::NaturalCodingConstraintHandle<ZX_OBJ_TYPE_EVENT, 0x80000000, false>>{
                                                       1, &Storage_::zircon_handle},
                                                   ::fidl::internal::NaturalTableMember<Storage_, ::fdf::ClientEnd<::test_driverhandle::DriverProtocol>, fidl::internal::NaturalCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>>{2, &Storage_::fdf_handle});
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

extern "C" const fidl_type_t test_driverhandle_HandlesInProtocolSendHandlesRequestTable;

class HandlesInProtocolSendHandlesRequest {
 private:
  struct Storage_;

 public:
  HandlesInProtocolSendHandlesRequest(Storage_ storage) noexcept : storage_(std::move(storage)) {}
  HandlesInProtocolSendHandlesRequest(::test_driverhandle::T t) noexcept
      : storage_({.t = std::move(t)}) {}

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdefaulted-function-deleted"
  // Default constructs a |HandlesInProtocolSendHandlesRequest| only if all of its members are default constructible.
  HandlesInProtocolSendHandlesRequest() = default;
#pragma clang diagnostic pop

  HandlesInProtocolSendHandlesRequest(HandlesInProtocolSendHandlesRequest&&) noexcept = default;
  HandlesInProtocolSendHandlesRequest& operator=(HandlesInProtocolSendHandlesRequest&&) noexcept = default;

  const ::test_driverhandle::T&
  t() const {
    return storage_.t;
  }

  ::test_driverhandle::T& t() {
    return storage_.t;
  }

  HandlesInProtocolSendHandlesRequest(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : HandlesInProtocolSendHandlesRequest(Storage_{
                                                                                                        .t = ::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{},
                                                                                                    }) {}

 private:
  struct Storage_ final {
    ::test_driverhandle::T t;
  };

  Storage_ storage_;

  friend struct ::fidl::internal::NaturalStructCodingTraits<::test_driverhandle::HandlesInProtocolSendHandlesRequest, 16>;
  friend struct ::fidl::internal::MemberVisitor<::test_driverhandle::HandlesInProtocolSendHandlesRequest>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalStructMember<Storage_, ::test_driverhandle::T, fidl::internal::NaturalCodingConstraintEmpty>{
      &Storage_::t, 0});
  static constexpr auto kPadding = std::make_tuple();
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

extern "C" const fidl_type_t test_driverhandle_ServerEndWrapperTable;

class ServerEndWrapper {
 private:
  struct Storage_;

 public:
  ServerEndWrapper(Storage_ storage) noexcept : storage_(std::move(storage)) {}
  ServerEndWrapper(::fdf::ServerEnd<::test_driverhandle::DriverProtocol> value) noexcept
      : storage_({.value = std::move(value)}) {}

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdefaulted-function-deleted"
  // Default constructs a |ServerEndWrapper| only if all of its members are default constructible.
  ServerEndWrapper() = default;
#pragma clang diagnostic pop

  ServerEndWrapper(ServerEndWrapper&&) noexcept = default;
  ServerEndWrapper& operator=(ServerEndWrapper&&) noexcept = default;

  const ::fdf::ServerEnd<::test_driverhandle::DriverProtocol>&
  value() const {
    return storage_.value;
  }

  ::fdf::ServerEnd<::test_driverhandle::DriverProtocol>& value() {
    return storage_.value;
  }

  ServerEndWrapper(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : ServerEndWrapper(Storage_{
                                                                                     .value = {},
                                                                                 }) {}

 private:
  struct Storage_ final {
    ::fdf::ServerEnd<::test_driverhandle::DriverProtocol> value;
  };

  Storage_ storage_;

  friend struct ::fidl::internal::NaturalStructCodingTraits<::test_driverhandle::ServerEndWrapper, 4>;
  friend struct ::fidl::internal::MemberVisitor<::test_driverhandle::ServerEndWrapper>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalStructMember<Storage_, ::fdf::ServerEnd<::test_driverhandle::DriverProtocol>, fidl::internal::NaturalCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>>{
      &Storage_::value, 0});
  static constexpr auto kPadding = std::make_tuple();
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

extern "C" const fidl_type_t test_driverhandle_ClientEndWrapperTable;

class ClientEndWrapper {
 private:
  struct Storage_;

 public:
  ClientEndWrapper(Storage_ storage) noexcept : storage_(std::move(storage)) {}
  ClientEndWrapper(::fdf::ClientEnd<::test_driverhandle::DriverProtocol> value) noexcept
      : storage_({.value = std::move(value)}) {}

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdefaulted-function-deleted"
  // Default constructs a |ClientEndWrapper| only if all of its members are default constructible.
  ClientEndWrapper() = default;
#pragma clang diagnostic pop

  ClientEndWrapper(ClientEndWrapper&&) noexcept = default;
  ClientEndWrapper& operator=(ClientEndWrapper&&) noexcept = default;

  const ::fdf::ClientEnd<::test_driverhandle::DriverProtocol>&
  value() const {
    return storage_.value;
  }

  ::fdf::ClientEnd<::test_driverhandle::DriverProtocol>& value() {
    return storage_.value;
  }

  ClientEndWrapper(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : ClientEndWrapper(Storage_{
                                                                                     .value = {},
                                                                                 }) {}

 private:
  struct Storage_ final {
    ::fdf::ClientEnd<::test_driverhandle::DriverProtocol> value;
  };

  Storage_ storage_;

  friend struct ::fidl::internal::NaturalStructCodingTraits<::test_driverhandle::ClientEndWrapper, 4>;
  friend struct ::fidl::internal::MemberVisitor<::test_driverhandle::ClientEndWrapper>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalStructMember<Storage_, ::fdf::ClientEnd<::test_driverhandle::DriverProtocol>, fidl::internal::NaturalCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>>{
      &Storage_::value, 0});
  static constexpr auto kPadding = std::make_tuple();
};

#endif  // __Fuchsia__

}  // namespace test_driverhandle
namespace fidl {

#ifdef __Fuchsia__

extern "C" const fidl_type_t test_driverhandle_HandlesInProtocolSendHandlesRequestTable;

template <>
struct IsResource<::test_driverhandle::HandlesInProtocolSendHandlesRequest> : public std::true_type {};
template <>
struct IsFidlType<::test_driverhandle::HandlesInProtocolSendHandlesRequest> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_driverhandle::HandlesInProtocolSendHandlesRequest, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalStructCodingTraits<::test_driverhandle::HandlesInProtocolSendHandlesRequest, 16> {};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

extern "C" const fidl_type_t test_driverhandle_ServerEndWrapperTable;

template <>
struct IsResource<::test_driverhandle::ServerEndWrapper> : public std::true_type {};
template <>
struct IsFidlType<::test_driverhandle::ServerEndWrapper> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_driverhandle::ServerEndWrapper, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalStructCodingTraits<::test_driverhandle::ServerEndWrapper, 4> {};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

extern "C" const fidl_type_t test_driverhandle_ClientEndWrapperTable;

template <>
struct IsResource<::test_driverhandle::ClientEndWrapper> : public std::true_type {};
template <>
struct IsFidlType<::test_driverhandle::ClientEndWrapper> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_driverhandle::ClientEndWrapper, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalStructCodingTraits<::test_driverhandle::ClientEndWrapper, 4> {};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

extern "C" const fidl_type_t test_driverhandle_TTable;

template <>
struct IsResource<::test_driverhandle::T> : public std::true_type {};
template <>
struct IsFidlType<::test_driverhandle::T> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_driverhandle::T, ::fidl::internal::NaturalCodingConstraintEmpty> : public ::fidl::internal::NaturalTableCodingTraits<::test_driverhandle::T> {};

#endif  // __Fuchsia__

}  // namespace fidl
