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

#pragma once

#include <lib/fidl/llcpp/array.h>
#include <lib/fidl/llcpp/envelope.h>
#include <lib/fidl/llcpp/message.h>
#include <lib/fidl/llcpp/message_storage.h>
#include <lib/fidl/llcpp/object_view.h>
#include <lib/fidl/llcpp/string_view.h>
#include <lib/fidl/llcpp/traits.h>
#include <lib/fidl/llcpp/wire_types.h>
#include <lib/stdcompat/optional.h>

#include <cinttypes>
#ifdef __Fuchsia__
#include <lib/fidl_driver/cpp/wire_types.h>
#include <lib/zx/channel.h>
#include <lib/zx/event.h>

#endif  // __Fuchsia__

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

namespace test_driverhandle {

namespace wire {
struct HandlesInProtocolSendHandlesRequest;

struct ServerEndWrapper;

struct ClientEndWrapper;

class T;

#ifdef __Fuchsia__

extern "C" const fidl_type_t test_driverhandle_ServerEndWrapperTable;

struct ServerEndWrapper {
  ::fdf::ServerEnd<::test_driverhandle::DriverProtocol> value = {};

  void _CloseHandles();
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

extern "C" const fidl_type_t test_driverhandle_ClientEndWrapperTable;

struct ClientEndWrapper {
  ::fdf::ClientEnd<::test_driverhandle::DriverProtocol> value = {};

  void _CloseHandles();
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

}  // namespace wire
}  // namespace test_driverhandle
template <>
class ::fidl::WireTableBuilder<::test_driverhandle::wire::T>;
template <>
class ::fidl::WireTableExternalBuilder<::test_driverhandle::wire::T>;

template <>
struct ::fidl::WireTableFrame<::test_driverhandle::wire::T> final {
 public:
  WireTableFrame() = default;
  // In its intended usage, WireTableFrame will be referenced by an ObjectView.
  // If the ObjectView is assigned before a move or copy, then it will reference
  // the old invalid object. Because this is unsafe, copies are disallowed and
  // moves are only allowed by friend classes that operate safely.
  WireTableFrame(const WireTableFrame&) = delete;
  WireTableFrame& operator=(const WireTableFrame&) = delete;

 private:
  WireTableFrame(WireTableFrame&&) noexcept = default;
  WireTableFrame& operator=(WireTableFrame&&) noexcept = default;

  bool HasUnknownData() const;
  ::fidl::Envelope<::zx::event> zircon_handle_;
  ::fidl::Envelope<::fdf::ClientEnd<::test_driverhandle::DriverProtocol>> fdf_handle_;

  friend class ::test_driverhandle::wire::T;
  friend ::fidl::internal::WireTableBaseBuilder<::test_driverhandle::wire::T, ::fidl::WireTableBuilder<::test_driverhandle::wire::T>>;
  friend ::fidl::internal::WireTableBaseBuilder<::test_driverhandle::wire::T, ::fidl::WireTableExternalBuilder<::test_driverhandle::wire::T>>;
};

namespace test_driverhandle {
namespace wire {
extern "C" const fidl_type_t test_driverhandle_TTable;

class T {
 public:
  T() = default;
  T(const T& other)
  noexcept = default;
  T& operator=(const T& other) noexcept = default;
  T(T&& other)
  noexcept = default;
  T& operator=(T&& other) noexcept = default;

  ~T() = default;

  // Returns whether no field is set.
  bool IsEmpty() const { return max_ordinal_ == 0; }

  // Returns whether the table references unknown fields.
  bool HasUnknownData() const;
  void _CloseHandles();

  // Return a builder that by defaults allocates of an arena.
  static ::fidl::WireTableBuilder<::test_driverhandle::wire::T> Builder(::fidl::AnyArena& arena);

  // Return a builder that relies on explicitly allocating |fidl::ObjectView|s.
  static ::fidl::WireTableExternalBuilder<::test_driverhandle::wire::T> ExternalBuilder(::fidl::ObjectView<::fidl::WireTableFrame<::test_driverhandle::wire::T>> frame);

  const ::zx::event& zircon_handle() const {
    ZX_ASSERT(has_zircon_handle());
    return frame_ptr_->zircon_handle_.get_data();
  }
  ::zx::event& zircon_handle() {
    ZX_ASSERT(has_zircon_handle());
    return frame_ptr_->zircon_handle_.get_data();
  }
  bool has_zircon_handle() const {
    return max_ordinal_ >= 1 && frame_ptr_->zircon_handle_.has_data();
  }

  const ::fdf::ClientEnd<::test_driverhandle::DriverProtocol>& fdf_handle() const {
    ZX_ASSERT(has_fdf_handle());
    return frame_ptr_->fdf_handle_.get_data();
  }
  ::fdf::ClientEnd<::test_driverhandle::DriverProtocol>& fdf_handle() {
    ZX_ASSERT(has_fdf_handle());
    return frame_ptr_->fdf_handle_.get_data();
  }
  bool has_fdf_handle() const {
    return max_ordinal_ >= 2 && frame_ptr_->fdf_handle_.has_data();
  }
#if defined(FIDL_WIRE_ALLOW_DEPRECATED_MUTABLE_TABLES) || false
 public:
#else   // !defined(FIDL_WIRE_ALLOW_DEPRECATED_MUTABLE_TABLES)
 private:
#endif  // FIDL_WIRE_ALLOW_DEPRECATED_MUTABLE_TABLES

  T& set_zircon_handle(::zx::event elem) {
    ZX_DEBUG_ASSERT(frame_ptr_ != nullptr);
    frame_ptr_->zircon_handle_.set_data(std::move(elem));
    max_ordinal_ = std::max(max_ordinal_, static_cast<uint64_t>(1));
    return *this;
  }

  T& clear_zircon_handle() {
    ZX_DEBUG_ASSERT(frame_ptr_ != nullptr);
    frame_ptr_->zircon_handle_.clear_data();
    return *this;
  }
  T& set_fdf_handle(::fdf::ClientEnd<::test_driverhandle::DriverProtocol> elem) {
    ZX_DEBUG_ASSERT(frame_ptr_ != nullptr);
    frame_ptr_->fdf_handle_.set_data(std::move(elem));
    max_ordinal_ = std::max(max_ordinal_, static_cast<uint64_t>(2));
    return *this;
  }

  T& clear_fdf_handle() {
    ZX_DEBUG_ASSERT(frame_ptr_ != nullptr);
    frame_ptr_->fdf_handle_.clear_data();
    return *this;
  }

  explicit T(::fidl::AnyArena& allocator)
      : frame_ptr_(::fidl::ObjectView<::fidl::WireTableFrame<::test_driverhandle::wire::T>>(allocator)) {}
  // This constructor allows a user controlled allocation (not using a Arena).
  // It should only be used when performance is key.
  // As soon as the frame is given to the table, it must not be used directly or for another table.
  explicit T(::fidl::ObjectView<::fidl::WireTableFrame<::test_driverhandle::wire::T>>&& frame)
      : frame_ptr_(std::move(frame)) {}

  void Allocate(::fidl::AnyArena& allocator) {
    max_ordinal_ = 0;
    frame_ptr_ = ::fidl::ObjectView<::fidl::WireTableFrame<::test_driverhandle::wire::T>>(allocator);
  }
  void Init(::fidl::ObjectView<::fidl::WireTableFrame<::test_driverhandle::wire::T>>&& frame_ptr) {
    max_ordinal_ = 0;
    frame_ptr_ = std::move(frame_ptr);
  }

 private:
  friend ::fidl::internal::WireTableBaseBuilder<::test_driverhandle::wire::T, ::fidl::WireTableBuilder<::test_driverhandle::wire::T>>;
  friend ::fidl::internal::WireTableBaseBuilder<::test_driverhandle::wire::T, ::fidl::WireTableExternalBuilder<::test_driverhandle::wire::T>>;

  uint64_t max_ordinal_ = 0;
  ::fidl::ObjectView<::fidl::WireTableFrame<::test_driverhandle::wire::T>> frame_ptr_;
};
}  // namespace wire
}  // namespace test_driverhandle
template <typename BuilderImpl>
class ::fidl::internal::WireTableBaseBuilder<::test_driverhandle::wire::T, BuilderImpl> {
 public:
  // Build and return the table. The builder should not be used after this.
  ::test_driverhandle::wire::T Build() {
    ZX_DEBUG_ASSERT(table_.frame_ptr_ != nullptr);
    ::test_driverhandle::wire::T t = std::move(table_);
    // Poison this builder to prevent accidental reuse.
    table_.frame_ptr_ = nullptr;
    return t;
  }

  BuilderImpl& zircon_handle(::zx::event elem) {
    ZX_DEBUG_ASSERT(table_.frame_ptr_ != nullptr);
    table_.frame_ptr_->zircon_handle_.set_data(std::move(elem));
    table_.max_ordinal_ = std::max(table_.max_ordinal_, static_cast<uint64_t>(1));
    return *static_cast<BuilderImpl*>(this);
  }

  BuilderImpl& fdf_handle(::fdf::ClientEnd<::test_driverhandle::DriverProtocol> elem) {
    ZX_DEBUG_ASSERT(table_.frame_ptr_ != nullptr);
    table_.frame_ptr_->fdf_handle_.set_data(std::move(elem));
    table_.max_ordinal_ = std::max(table_.max_ordinal_, static_cast<uint64_t>(2));
    return *static_cast<BuilderImpl*>(this);
  }

 protected:
  WireTableBaseBuilder(::fidl::ObjectView<::fidl::WireTableFrame<::test_driverhandle::wire::T>>&& frame)
      : table_(std::move(frame)) {}

 private:
  ::test_driverhandle::wire::T table_;
};

template <>
class ::fidl::WireTableBuilder<::test_driverhandle::wire::T> final : public ::fidl::internal::WireTableBaseBuilder<::test_driverhandle::wire::T, ::fidl::WireTableBuilder<::test_driverhandle::wire::T>> {
  using Base = ::fidl::internal::WireTableBaseBuilder<::test_driverhandle::wire::T, ::fidl::WireTableBuilder<::test_driverhandle::wire::T>>;

 public:
 private:
  friend class ::test_driverhandle::wire::T;
  WireTableBuilder(::fidl::AnyArena& arena)
      : Base(::fidl::ObjectView<::fidl::WireTableFrame<::test_driverhandle::wire::T>>(arena)),
        arena_(arena) {}

  [[maybe_unused]] std::reference_wrapper<::fidl::AnyArena> arena_;
};

template <>
class ::fidl::WireTableExternalBuilder<::test_driverhandle::wire::T> final : public ::fidl::internal::WireTableBaseBuilder<::test_driverhandle::wire::T, ::fidl::WireTableExternalBuilder<::test_driverhandle::wire::T>> {
  using Base = ::fidl::internal::WireTableBaseBuilder<::test_driverhandle::wire::T, ::fidl::WireTableExternalBuilder<::test_driverhandle::wire::T>>;

 private:
  friend class ::test_driverhandle::wire::T;
  using Base::Base;
  WireTableExternalBuilder(::fidl::WireTableFrame<::test_driverhandle::wire::T>* frame)
      : Base(::fidl::ObjectView<::fidl::WireTableFrame<::test_driverhandle::wire::T>>::FromExternal(frame)) {}
};
namespace test_driverhandle {
namespace wire {
inline ::fidl::WireTableBuilder<::test_driverhandle::wire::T> T::Builder(::fidl::AnyArena& arena) {
  return ::fidl::WireTableBuilder<::test_driverhandle::wire::T>(arena);
}
inline ::fidl::WireTableExternalBuilder<::test_driverhandle::wire::T> T::ExternalBuilder(::fidl::ObjectView<::fidl::WireTableFrame<::test_driverhandle::wire::T>> frame) {
  return ::fidl::WireTableExternalBuilder<::test_driverhandle::wire::T>(std::move(frame));
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

extern "C" const fidl_type_t test_driverhandle_HandlesInProtocolSendHandlesRequestTable;

struct HandlesInProtocolSendHandlesRequest {
  using T = test_driverhandle::wire::T;

  ::test_driverhandle::wire::T t = {};

  void _CloseHandles();
};
#endif  // __Fuchsia__

}  // namespace wire
}  // namespace test_driverhandle
namespace fidl {

#ifdef __Fuchsia__
template <>
struct IsResource<::test_driverhandle::wire::HandlesInProtocolSendHandlesRequest> : public std::true_type {};

// TODO(fxbug.dev/95833) Remove this.
template <>
struct DeprecatedCTypeTraits<::test_driverhandle::wire::HandlesInProtocolSendHandlesRequest> {
  static constexpr const fidl_type_t* kType = &::test_driverhandle::wire::test_driverhandle_HandlesInProtocolSendHandlesRequestTable;
};

template <>
struct TypeTraits<::test_driverhandle::wire::HandlesInProtocolSendHandlesRequest> {
  static constexpr uint32_t kMaxNumHandles = 2;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  [[maybe_unused]] static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr uint32_t kMaxOutOfLineV1 = 48;
  static constexpr bool kHasEnvelope = true;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::test_driverhandle::wire::HandlesInProtocolSendHandlesRequest> : public std::true_type {};
template <>
struct IsStruct<::test_driverhandle::wire::HandlesInProtocolSendHandlesRequest> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_driverhandle::wire::HandlesInProtocolSendHandlesRequest>);
static_assert(offsetof(::test_driverhandle::wire::HandlesInProtocolSendHandlesRequest, t) == 0);
static_assert(sizeof(::test_driverhandle::wire::HandlesInProtocolSendHandlesRequest) == TypeTraits<::test_driverhandle::wire::HandlesInProtocolSendHandlesRequest>::kPrimarySize);

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_driverhandle::wire::HandlesInProtocolSendHandlesRequest, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t inline_size = 16;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::WireStructMemberCodingInfo<::test_driverhandle::wire::T, fidl::internal::WireCodingConstraintEmpty, IsRecursive>());
  static constexpr bool kHasPadding = false;
  using Base = WireStructCodingTraitsBase<::test_driverhandle::wire::HandlesInProtocolSendHandlesRequest, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>;
  static constexpr bool is_memcpy_compatible = Base::is_memcpy_compatible;

  static void Encode(
      internal::WireEncoder* encoder, ::test_driverhandle::wire::HandlesInProtocolSendHandlesRequest* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (is_memcpy_compatible) {
      memcpy(position.As<void>(), value, sizeof(::test_driverhandle::wire::HandlesInProtocolSendHandlesRequest));
    } else {
      internal::WireCodingTraits<::test_driverhandle::wire::T, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(encoder, &value->t, position + 0, recursion_depth);
    }
  }
  static void Decode(
      internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (!Base::are_members_memcpy_compatible) {
      internal::WireCodingTraits<::test_driverhandle::wire::T, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
          decoder, position + 0, recursion_depth);
    }
  }
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsResource<::test_driverhandle::wire::ServerEndWrapper> : public std::true_type {};

// TODO(fxbug.dev/95833) Remove this.
template <>
struct DeprecatedCTypeTraits<::test_driverhandle::wire::ServerEndWrapper> {
  static constexpr const fidl_type_t* kType = &::test_driverhandle::wire::test_driverhandle_ServerEndWrapperTable;
};

template <>
struct TypeTraits<::test_driverhandle::wire::ServerEndWrapper> {
  static constexpr uint32_t kMaxNumHandles = 1;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = 4;
  static constexpr uint32_t kPrimarySizeV1 = 4;
  [[maybe_unused]] static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasEnvelope = false;
  static constexpr bool kHasPointer = false;
};

template <>
struct IsFidlType<::test_driverhandle::wire::ServerEndWrapper> : public std::true_type {};
template <>
struct IsStruct<::test_driverhandle::wire::ServerEndWrapper> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_driverhandle::wire::ServerEndWrapper>);
static_assert(offsetof(::test_driverhandle::wire::ServerEndWrapper, value) == 0);
static_assert(sizeof(::test_driverhandle::wire::ServerEndWrapper) == TypeTraits<::test_driverhandle::wire::ServerEndWrapper>::kPrimarySize);

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_driverhandle::wire::ServerEndWrapper, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t inline_size = 4;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::WireStructMemberCodingInfo<::fdf::ServerEnd<::test_driverhandle::DriverProtocol>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>());
  static constexpr bool kHasPadding = false;
  using Base = WireStructCodingTraitsBase<::test_driverhandle::wire::ServerEndWrapper, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>;
  static constexpr bool is_memcpy_compatible = Base::is_memcpy_compatible;

  static void Encode(
      internal::WireEncoder* encoder, ::test_driverhandle::wire::ServerEndWrapper* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (is_memcpy_compatible) {
      memcpy(position.As<void>(), value, sizeof(::test_driverhandle::wire::ServerEndWrapper));
    } else {
      internal::WireCodingTraits<::fdf::ServerEnd<::test_driverhandle::DriverProtocol>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>::Encode(encoder, &value->value, position + 0, recursion_depth);
    }
  }
  static void Decode(
      internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (!Base::are_members_memcpy_compatible) {
      internal::WireCodingTraits<::fdf::ServerEnd<::test_driverhandle::DriverProtocol>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>::Decode(
          decoder, position + 0, recursion_depth);
    }
  }
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsResource<::test_driverhandle::wire::ClientEndWrapper> : public std::true_type {};

// TODO(fxbug.dev/95833) Remove this.
template <>
struct DeprecatedCTypeTraits<::test_driverhandle::wire::ClientEndWrapper> {
  static constexpr const fidl_type_t* kType = &::test_driverhandle::wire::test_driverhandle_ClientEndWrapperTable;
};

template <>
struct TypeTraits<::test_driverhandle::wire::ClientEndWrapper> {
  static constexpr uint32_t kMaxNumHandles = 1;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = 4;
  static constexpr uint32_t kPrimarySizeV1 = 4;
  [[maybe_unused]] static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasEnvelope = false;
  static constexpr bool kHasPointer = false;
};

template <>
struct IsFidlType<::test_driverhandle::wire::ClientEndWrapper> : public std::true_type {};
template <>
struct IsStruct<::test_driverhandle::wire::ClientEndWrapper> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_driverhandle::wire::ClientEndWrapper>);
static_assert(offsetof(::test_driverhandle::wire::ClientEndWrapper, value) == 0);
static_assert(sizeof(::test_driverhandle::wire::ClientEndWrapper) == TypeTraits<::test_driverhandle::wire::ClientEndWrapper>::kPrimarySize);

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_driverhandle::wire::ClientEndWrapper, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t inline_size = 4;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::WireStructMemberCodingInfo<::fdf::ClientEnd<::test_driverhandle::DriverProtocol>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>());
  static constexpr bool kHasPadding = false;
  using Base = WireStructCodingTraitsBase<::test_driverhandle::wire::ClientEndWrapper, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>;
  static constexpr bool is_memcpy_compatible = Base::is_memcpy_compatible;

  static void Encode(
      internal::WireEncoder* encoder, ::test_driverhandle::wire::ClientEndWrapper* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (is_memcpy_compatible) {
      memcpy(position.As<void>(), value, sizeof(::test_driverhandle::wire::ClientEndWrapper));
    } else {
      internal::WireCodingTraits<::fdf::ClientEnd<::test_driverhandle::DriverProtocol>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>::Encode(encoder, &value->value, position + 0, recursion_depth);
    }
  }
  static void Decode(
      internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (!Base::are_members_memcpy_compatible) {
      internal::WireCodingTraits<::fdf::ClientEnd<::test_driverhandle::DriverProtocol>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>::Decode(
          decoder, position + 0, recursion_depth);
    }
  }
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
struct IsResource<::test_driverhandle::wire::T> : public std::true_type {};

template <>
struct TypeTraits<::test_driverhandle::wire::T> {
  static constexpr uint32_t kMaxNumHandles = 2;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 16;
  [[maybe_unused]] static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr uint32_t kMaxOutOfLineV1 = 48;
  static constexpr bool kHasEnvelope = true;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::test_driverhandle::wire::T> : public std::true_type {};
template <>
struct IsTable<::test_driverhandle::wire::T> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_driverhandle::wire::T>);

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_driverhandle::wire::T, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
    : ::fidl::internal::WireTableCodingTraitsBase<IsRecursive> {
  using Base = ::fidl::internal::WireTableCodingTraitsBase<IsRecursive>;
  static constexpr size_t inline_size = 16;
  static constexpr bool is_memcpy_compatible = false;

  static void Encode(internal::WireEncoder* encoder, ::test_driverhandle::wire::T* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    RecursionDepth<IsRecursive> inner_depth = recursion_depth.Add(encoder, 2);
    if (!inner_depth.IsValid()) {
      return;
    }

    ::fidl::internal::WirePosition vector_position;
    if (Base::PreworkResult::kEarlyExit ==
        Base::PrepareForBodyEncode(encoder, value, position, &vector_position)) {
      return;
    }

    fidl_vector_t* vec = reinterpret_cast<fidl_vector_t*>(value);
    fidl_envelope_v2_t* envelopes = static_cast<fidl_envelope_v2_t*>(vec->data);
    for (size_t i = 0; i < vec->count; i++) {
      size_t inline_size = 0;
      switch (i) {
        case 0:
          inline_size = ::fidl::internal::WireCodingTraits<::zx::event, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_EVENT, 0x80000000, false>, IsRecursive>::inline_size;
          break;
        case 1:
          inline_size = ::fidl::internal::WireCodingTraits<::fdf::ClientEnd<::test_driverhandle::DriverProtocol>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>::inline_size;
          break;
      }
      ::fidl::internal::EncodeFn<IsRecursive> encode_fn = nullptr;
      switch (i) {
        case 0:
          encode_fn = ::fidl::internal::MakeEncodeFn<::zx::event, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_EVENT, 0x80000000, false>, IsRecursive>();
          break;
        case 1:
          encode_fn = ::fidl::internal::MakeEncodeFn<::fdf::ClientEnd<::test_driverhandle::DriverProtocol>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>();
          break;
      }
      WirePosition envelope_position = vector_position + i * sizeof(fidl_envelope_v2_t);
      WireEncodeEnvelope(inline_size, encode_fn, encoder, &envelopes[i], envelope_position, inner_depth);
    }
  }
  static void Decode(internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    RecursionDepth<IsRecursive> inner_depth = recursion_depth.Add(decoder, 2);
    if (!inner_depth.IsValid()) {
      return;
    }

    ::fidl::internal::WirePosition vector_position;
    if (Base::PreworkResult::kEarlyExit == Base::DecodePrework(decoder, position, &vector_position)) {
      return;
    }

    fidl_vector_t* vec = position.As<fidl_vector_t>();
    for (size_t i = 0; i < vec->count; i++) {
      size_t inline_size = 0;
      switch (i) {
        case 0:
          inline_size = ::fidl::internal::WireCodingTraits<::zx::event, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_EVENT, 0x80000000, false>, IsRecursive>::inline_size;
          break;
        case 1:
          inline_size = ::fidl::internal::WireCodingTraits<::fdf::ClientEnd<::test_driverhandle::DriverProtocol>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>::inline_size;
          break;
      }
      DecodeFn<IsRecursive> decode_fn = nullptr;
      switch (i) {
        case 0:
          decode_fn = ::fidl::internal::MakeDecodeFn<::zx::event, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_EVENT, 0x80000000, false>, IsRecursive>();
          break;
        case 1:
          decode_fn = ::fidl::internal::MakeDecodeFn<::fdf::ClientEnd<::test_driverhandle::DriverProtocol>, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, ZX_DEFAULT_CHANNEL_RIGHTS, false>, IsRecursive>();
          break;
      }
      ::fidl::internal::WireDecodeOptionalEnvelope(inline_size, decode_fn, decoder, vector_position + i * sizeof(fidl_envelope_v2_t), inner_depth);
    }
  }
};
#endif  // __Fuchsia__

}  // namespace fidl
