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

#pragma once

#include <fidl/test.union/cpp/markers.h>
#include <fidl/test.union/cpp/wire_types.h>
#include <lib/fidl/llcpp/wire_messaging.h>

#ifdef __Fuchsia__

#include <lib/fidl/llcpp/client.h>
#include <lib/fidl/llcpp/connect_service.h>
#include <lib/fidl/llcpp/server.h>
#include <lib/fidl/llcpp/service_handler_interface.h>
#include <lib/fidl/llcpp/sync_call.h>

#endif  // __Fuchsia__

namespace test_union {
class TestProtocol;

__LOCAL extern "C" const fidl_type_t
    test_union_TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedTopResponseTable;

__LOCAL extern "C" const fidl_type_t
    test_union_TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponseTable;
}  // namespace test_union
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>
    final {
  static constexpr uint64_t value = 582913180652179677lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>
    final {
  static constexpr uint64_t value = 7698084639218919941lu;
};

namespace test_union {}  // namespace test_union
#ifdef __Fuchsia__

template <>
struct ::fidl::internal::ProtocolDetails<::test_union::TestProtocol> {};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireServerDispatcher<::test_union::TestProtocol>
    final {
  WireServerDispatcher() = delete;
  static ::fidl::DispatchResult TryDispatch(
      ::fidl::WireServer<::test_union::TestProtocol>* impl,
      ::fidl::IncomingMessage& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);
  static void Dispatch(::fidl::WireServer<::test_union::TestProtocol>* impl,
                       ::fidl::IncomingMessage&& msg,
                       internal::IncomingTransportContext transport_context,
                       ::fidl::Transaction* txn);

 private:
  static const ::fidl::internal::MethodEntry entries_[];
  static const ::fidl::internal::MethodEntry* entries_end_;
};
#endif  // __Fuchsia__

template <>
struct ::fidl::WireRequest<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>
    final {
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>
    final
    : public ::test_union::wire::
          TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedTopResponse {
  explicit WireResponse(
      ::test_union::wire::
          TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedTopResponse
              base)
      : ::test_union::wire::
            TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedTopResponse(
                std::move(base)) {}
  explicit WireResponse(::test_union::wire::StrictBoundedXUnion xu)
      : ::test_union::wire::
            TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedTopResponse{
                .xu = std::move(xu)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>
      body;
  explicit TransactionalResponse(::test_union::wire::StrictBoundedXUnion xu)
      : body(::fidl::WireResponse<
             ::test_union::TestProtocol::
                 StrictXUnionHenceResponseMayBeStackAllocated>(xu)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>
    final {
  WireRequest() = default;
  using ResponseType =
      ::fidl::WireResponse<::test_union::TestProtocol::
                               FlexibleXUnionHenceResponseMustBeHeapAllocated>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>
    final
    : public ::test_union::wire::
          TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse {
  explicit WireResponse(
      ::test_union::wire::
          TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse
              base)
      : ::test_union::wire::
            TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse(
                std::move(base)) {}
  explicit WireResponse(::test_union::wire::OlderSimpleUnion xu)
      : ::test_union::wire::
            TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponse{
                .xu = std::move(xu)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<::test_union::TestProtocol::
                           FlexibleXUnionHenceResponseMustBeHeapAllocated>
      body;
  explicit TransactionalResponse(::test_union::wire::OlderSimpleUnion xu)
      : body(::fidl::WireResponse<
             ::test_union::TestProtocol::
                 FlexibleXUnionHenceResponseMustBeHeapAllocated>(xu)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_union::TestProtocol::
          StrictXUnionHenceResponseMayBeStackAllocated>>;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_union::TestProtocol::
                  StrictXUnionHenceResponseMayBeStackAllocated>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_union::TestProtocol::
                  StrictXUnionHenceResponseMayBeStackAllocated>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_union::TestProtocol::
        FlexibleXUnionHenceResponseMustBeHeapAllocated> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated>>;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_union::TestProtocol::
                  FlexibleXUnionHenceResponseMustBeHeapAllocated>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_union::TestProtocol::
                  FlexibleXUnionHenceResponseMustBeHeapAllocated>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

namespace fidl {

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>> {
  static constexpr const fidl_type_t* kType = nullptr;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(0 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(0 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_union::TestProtocol::
               StrictXUnionHenceResponseMayBeStackAllocated>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_union::TestProtocol::
            StrictXUnionHenceResponseMayBeStackAllocated>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_union::TestProtocol::
                               StrictXUnionHenceResponseMayBeStackAllocated>,
                       header) == 0);

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>> {
  static constexpr const fidl_type_t* kType = nullptr;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 0;
  static constexpr uint32_t kPrimarySizeV1 = 0;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>> {
  static constexpr const fidl_type_t* kType =
      &::test_union::
          test_union_TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 32;
  static constexpr uint32_t kMaxOutOfLineV1 = 32;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_union::TestProtocol::
               StrictXUnionHenceResponseMayBeStackAllocated>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_union::TestProtocol::
            StrictXUnionHenceResponseMayBeStackAllocated>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_union::TestProtocol::
                               StrictXUnionHenceResponseMayBeStackAllocated>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_union::TestProtocol::
                               StrictXUnionHenceResponseMayBeStackAllocated>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>> {
  static constexpr const fidl_type_t* kType =
      &::test_union::
          test_union_TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 32;
  static constexpr uint32_t kMaxOutOfLineV1 = 32;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_union::TestProtocol::
               StrictXUnionHenceResponseMayBeStackAllocated>) ==
    TypeTraits<::fidl::WireResponse<
        ::test_union::TestProtocol::
            StrictXUnionHenceResponseMayBeStackAllocated>>::kPrimarySize);
static_assert(
    offsetof(
        ::fidl::WireResponse<::test_union::TestProtocol::
                                 StrictXUnionHenceResponseMayBeStackAllocated>,
        xu) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_union::TestProtocol::
        FlexibleXUnionHenceResponseMustBeHeapAllocated>> {
  static constexpr const fidl_type_t* kType = nullptr;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(0 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(0 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_union::TestProtocol::
               FlexibleXUnionHenceResponseMustBeHeapAllocated>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_union::TestProtocol::
            FlexibleXUnionHenceResponseMustBeHeapAllocated>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_union::TestProtocol::
                               FlexibleXUnionHenceResponseMustBeHeapAllocated>,
                       header) == 0);

template <>
struct TypeTraits<
    ::fidl::WireRequest<::test_union::TestProtocol::
                            FlexibleXUnionHenceResponseMustBeHeapAllocated>> {
  static constexpr const fidl_type_t* kType = nullptr;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 0;
  static constexpr uint32_t kPrimarySizeV1 = 0;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_union::TestProtocol::
        FlexibleXUnionHenceResponseMustBeHeapAllocated>> {
  static constexpr const fidl_type_t* kType =
      &::test_union::
          test_union_TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_union::TestProtocol::
               FlexibleXUnionHenceResponseMustBeHeapAllocated>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_union::TestProtocol::
            FlexibleXUnionHenceResponseMustBeHeapAllocated>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_union::TestProtocol::
                               FlexibleXUnionHenceResponseMustBeHeapAllocated>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_union::TestProtocol::
                               FlexibleXUnionHenceResponseMustBeHeapAllocated>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireResponse<::test_union::TestProtocol::
                             FlexibleXUnionHenceResponseMustBeHeapAllocated>> {
  static constexpr const fidl_type_t* kType =
      &::test_union::
          test_union_TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = true;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_union::TestProtocol::
               FlexibleXUnionHenceResponseMustBeHeapAllocated>) ==
    TypeTraits<::fidl::WireResponse<
        ::test_union::TestProtocol::
            FlexibleXUnionHenceResponseMustBeHeapAllocated>>::kPrimarySize);
static_assert(offsetof(::fidl::WireResponse<
                           ::test_union::TestProtocol::
                               FlexibleXUnionHenceResponseMustBeHeapAllocated>,
                       xu) == 0);

}  // namespace fidl
namespace test_union {
#ifdef __Fuchsia__
}  // namespace test_union
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>
    final : public ::fidl::Status {
 public:
  WireResult(::fidl::UnownedClientEnd<::test_union::TestProtocol> client,
             ::fidl::internal::TransactionalRequest<
                 ::test_union::TestProtocol::
                     StrictXUnionHenceResponseMayBeStackAllocated>* request);
  WireResult(::fidl::UnownedClientEnd<::test_union::TestProtocol> client,
             ::fidl::internal::TransactionalRequest<
                 ::test_union::TestProtocol::
                     StrictXUnionHenceResponseMayBeStackAllocated>* request,
             zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_union::TestProtocol::
            StrictXUnionHenceResponseMayBeStackAllocated>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_union::TestProtocol::
            StrictXUnionHenceResponseMayBeStackAllocated>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_union::TestProtocol::
            StrictXUnionHenceResponseMayBeStackAllocated>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_union::TestProtocol::
            StrictXUnionHenceResponseMayBeStackAllocated>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<72> bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_union::TestProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_union::TestProtocol::
              StrictXUnionHenceResponseMayBeStackAllocated>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_union::TestProtocol::
              StrictXUnionHenceResponseMayBeStackAllocated>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {}
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_union::TestProtocol::
              StrictXUnionHenceResponseMayBeStackAllocated>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_union::TestProtocol::
                     StrictXUnionHenceResponseMayBeStackAllocated>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_union::TestProtocol::
                     StrictXUnionHenceResponseMayBeStackAllocated>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_union::TestProtocol::
                     StrictXUnionHenceResponseMayBeStackAllocated>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_union::TestProtocol::
                     StrictXUnionHenceResponseMayBeStackAllocated>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>
    final : public ::fidl::Status {
 public:
  WireResult(::fidl::UnownedClientEnd<::test_union::TestProtocol> client,
             ::fidl::internal::TransactionalRequest<
                 ::test_union::TestProtocol::
                     FlexibleXUnionHenceResponseMustBeHeapAllocated>* request);
  WireResult(::fidl::UnownedClientEnd<::test_union::TestProtocol> client,
             ::fidl::internal::TransactionalRequest<
                 ::test_union::TestProtocol::
                     FlexibleXUnionHenceResponseMustBeHeapAllocated>* request,
             zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<::test_union::TestProtocol::
                           FlexibleXUnionHenceResponseMustBeHeapAllocated>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_union::TestProtocol::
            FlexibleXUnionHenceResponseMustBeHeapAllocated>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_union::TestProtocol::
            FlexibleXUnionHenceResponseMustBeHeapAllocated>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_union::TestProtocol::
                           FlexibleXUnionHenceResponseMustBeHeapAllocated>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_union::TestProtocol::
            FlexibleXUnionHenceResponseMustBeHeapAllocated>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_union::TestProtocol::
            FlexibleXUnionHenceResponseMustBeHeapAllocated>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_union::TestProtocol::
                           FlexibleXUnionHenceResponseMustBeHeapAllocated>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_union::TestProtocol::
                           FlexibleXUnionHenceResponseMustBeHeapAllocated>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_union::TestProtocol::
                           FlexibleXUnionHenceResponseMustBeHeapAllocated>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_union::TestProtocol::
                           FlexibleXUnionHenceResponseMustBeHeapAllocated>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::BoxedMessageBuffer<ZX_CHANNEL_MAX_MSG_BYTES> bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_union::TestProtocol> client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_union::TestProtocol::
              FlexibleXUnionHenceResponseMustBeHeapAllocated>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_union::TestProtocol::
              FlexibleXUnionHenceResponseMustBeHeapAllocated>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {}
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_union::TestProtocol::
              FlexibleXUnionHenceResponseMustBeHeapAllocated>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<::test_union::TestProtocol::
                           FlexibleXUnionHenceResponseMustBeHeapAllocated>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_union::TestProtocol::
                     FlexibleXUnionHenceResponseMustBeHeapAllocated>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_union::TestProtocol::
                     FlexibleXUnionHenceResponseMustBeHeapAllocated>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_union::TestProtocol::
                           FlexibleXUnionHenceResponseMustBeHeapAllocated>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_union::TestProtocol::
                     FlexibleXUnionHenceResponseMustBeHeapAllocated>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_union::TestProtocol::
                     FlexibleXUnionHenceResponseMustBeHeapAllocated>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_union::TestProtocol::
                           FlexibleXUnionHenceResponseMustBeHeapAllocated>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_union::TestProtocol::
                           FlexibleXUnionHenceResponseMustBeHeapAllocated>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_union::TestProtocol::
                           FlexibleXUnionHenceResponseMustBeHeapAllocated>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_union::TestProtocol::
                           FlexibleXUnionHenceResponseMustBeHeapAllocated>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
};
template <>
class ::fidl::internal::WireEventHandlerInterface<::test_union::TestProtocol> {
 public:
  WireEventHandlerInterface() = default;
  virtual ~WireEventHandlerInterface() = default;
};

template <>
class ::fidl::WireAsyncEventHandler<::test_union::TestProtocol>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_union::TestProtocol>,
      public ::fidl::internal::AsyncEventHandler {
 public:
  WireAsyncEventHandler() = default;
};

template <>
class ::fidl::WireSyncEventHandler<::test_union::TestProtocol>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_union::TestProtocol> {
 public:
  WireSyncEventHandler() = default;

  // Handle all possible events defined in this protocol.
  // Blocks to consume exactly one message from the channel, then call the
  // corresponding virtual method.
  ::fidl::Status HandleOneEvent(
      ::fidl::UnownedClientEnd<::test_union::TestProtocol> client_end);

 private:
  [[maybe_unused]] bool got_transitional_ = false;
};

template <>
class ::fidl::internal::WireEventDispatcher<::test_union::TestProtocol> final
    : public ::fidl::internal::IncomingEventDispatcher<
          ::fidl::WireAsyncEventHandler<::test_union::TestProtocol>> {
 public:
  explicit WireEventDispatcher(
      ::fidl::WireAsyncEventHandler<::test_union::TestProtocol>* event_handler)
      : IncomingEventDispatcher(event_handler) {}

 private:
  std::optional<::fidl::UnbindInfo> DispatchEvent(
      ::fidl::IncomingMessage& msg,
      ::fidl::internal::IncomingTransportContext transport_context) override;
};

// Methods to make a sync FIDL call directly on an unowned handle or a
// const reference to a |fidl::ClientEnd<::test_union::TestProtocol>|,
// avoiding setting up a client.
template <>
class ::fidl::internal::WireSyncClientImpl<::test_union::TestProtocol> final
    : public ::fidl::internal::SyncEndpointManagedVeneer<
          ::fidl::internal::WireSyncClientImpl<::test_union::TestProtocol>> {
 public:
  // Allocates 80 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>
  StrictXUnionHenceResponseMayBeStackAllocated() {
    ::fidl::internal::TransactionalRequest<
        ::test_union::TestProtocol::
            StrictXUnionHenceResponseMayBeStackAllocated>
        _request{};
    return ::fidl::WireResult<::test_union::TestProtocol::
                                  StrictXUnionHenceResponseMayBeStackAllocated>(
        _client_end(), &_request);
  }

  // Allocates 16 bytes of request buffer on the stack. Response is
  // heap-allocated.
  ::fidl::WireResult<::test_union::TestProtocol::
                         FlexibleXUnionHenceResponseMustBeHeapAllocated>
  FlexibleXUnionHenceResponseMustBeHeapAllocated() {
    ::fidl::internal::TransactionalRequest<
        ::test_union::TestProtocol::
            FlexibleXUnionHenceResponseMustBeHeapAllocated>
        _request{};
    return ::fidl::WireResult<
        ::test_union::TestProtocol::
            FlexibleXUnionHenceResponseMustBeHeapAllocated>(_client_end(),
                                                            &_request);
  }

 private:
  ::fidl::UnownedClientEnd<::test_union::TestProtocol> _client_end() const {
    return ::fidl::UnownedClientEnd<::test_union::TestProtocol>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireSyncBufferClientImpl<::test_union::TestProtocol>
    final : public ::fidl::internal::SyncEndpointBufferVeneer<
                ::fidl::internal::WireSyncBufferClientImpl<
                    ::test_union::TestProtocol>> {
 public:
  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>
  StrictXUnionHenceResponseMayBeStackAllocated() {
    ::fidl::internal::TransactionalRequest<
        ::test_union::TestProtocol::
            StrictXUnionHenceResponseMayBeStackAllocated>
        _request{};
    return ::fidl::WireUnownedResult<
        ::test_union::TestProtocol::
            StrictXUnionHenceResponseMayBeStackAllocated>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_union::TestProtocol::
                                FlexibleXUnionHenceResponseMustBeHeapAllocated>
  FlexibleXUnionHenceResponseMustBeHeapAllocated() {
    ::fidl::internal::TransactionalRequest<
        ::test_union::TestProtocol::
            FlexibleXUnionHenceResponseMustBeHeapAllocated>
        _request{};
    return ::fidl::WireUnownedResult<
        ::test_union::TestProtocol::
            FlexibleXUnionHenceResponseMustBeHeapAllocated>(
        _client_end(), _allocator(), &_request);
  }

 private:
  ::fidl::UnownedClientEnd<::test_union::TestProtocol> _client_end() const {
    return ::fidl::UnownedClientEnd<::test_union::TestProtocol>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>
    : public ::fidl::internal::CompleterImplBase<
          ::test_union::TestProtocol::
              StrictXUnionHenceResponseMayBeStackAllocated> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::test_union::wire::StrictBoundedXUnion xu);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::test_union::wire::StrictBoundedXUnion xu);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_union::TestProtocol::
              StrictXUnionHenceResponseMayBeStackAllocated> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>
    : public ::fidl::internal::CompleterImplBase<
          ::test_union::TestProtocol::
              FlexibleXUnionHenceResponseMustBeHeapAllocated> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::test_union::wire::OlderSimpleUnion xu);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::test_union::wire::OlderSimpleUnion xu);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_union::TestProtocol::FlexibleXUnionHenceResponseMustBeHeapAllocated>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_union::TestProtocol::
              FlexibleXUnionHenceResponseMustBeHeapAllocated> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

// Pure-virtual interface to be implemented by a server.
// This interface uses typed channels (i.e. |fidl::ClientEnd<SomeProtocol>|
// and |fidl::ServerEnd<SomeProtocol>|).
template <>
class ::fidl::WireServer<::test_union::TestProtocol>
    : public ::fidl::internal::IncomingMessageDispatcher {
 public:
  WireServer() = default;
  virtual ~WireServer() = default;

  // The FIDL protocol type that is implemented by this server.
  using _EnclosingProtocol = ::test_union::TestProtocol;

  using StrictXUnionHenceResponseMayBeStackAllocatedCompleter =
      ::fidl::internal::WireCompleter<
          ::test_union::TestProtocol::
              StrictXUnionHenceResponseMayBeStackAllocated>;
  using StrictXUnionHenceResponseMayBeStackAllocatedRequestView =
      ::fidl::internal::WireRequestView<
          ::test_union::TestProtocol::
              StrictXUnionHenceResponseMayBeStackAllocated>;

  virtual void StrictXUnionHenceResponseMayBeStackAllocated(
      StrictXUnionHenceResponseMayBeStackAllocatedRequestView request,
      StrictXUnionHenceResponseMayBeStackAllocatedCompleter::Sync&
          completer) = 0;

  using FlexibleXUnionHenceResponseMustBeHeapAllocatedCompleter =
      ::fidl::internal::WireCompleter<
          ::test_union::TestProtocol::
              FlexibleXUnionHenceResponseMustBeHeapAllocated>;
  using FlexibleXUnionHenceResponseMustBeHeapAllocatedRequestView =
      ::fidl::internal::WireRequestView<
          ::test_union::TestProtocol::
              FlexibleXUnionHenceResponseMustBeHeapAllocated>;

  virtual void FlexibleXUnionHenceResponseMustBeHeapAllocated(
      FlexibleXUnionHenceResponseMustBeHeapAllocatedRequestView request,
      FlexibleXUnionHenceResponseMustBeHeapAllocatedCompleter::Sync&
          completer) = 0;

 private:
  void dispatch_message(
      ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
      ::fidl::internal::IncomingTransportContext transport_context) final;
};
namespace test_union {
#endif  // __Fuchsia__

}  // namespace test_union
namespace fidl {

#ifdef __Fuchsia__
}  // namespace fidl
template <>
class ::fidl::internal::WireWeakOnewayClientImpl<::test_union::TestProtocol>
    : public ::fidl::internal::ClientImplBase {
 public:
  using ClientImplBase::ClientImplBase;
};

template <>
class ::fidl::internal::WireWeakAsyncClientImpl<::test_union::TestProtocol>
    final : public ::fidl::internal::WireWeakOnewayClientImpl<
                ::test_union::TestProtocol> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
  // Allocates 16 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>
  StrictXUnionHenceResponseMayBeStackAllocated();
  // Allocates 16 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated>
  FlexibleXUnionHenceResponseMustBeHeapAllocated();
};

template <>
class ::fidl::internal::WireWeakOnewayBufferClientImpl<
    ::test_union::TestProtocol>
    : public ::fidl::internal::BufferClientImplBase {
 public:
  using BufferClientImplBase::BufferClientImplBase;
};

template <>
class ::fidl::internal::WireWeakAsyncBufferClientImpl<
    ::test_union::TestProtocol>
    final : public ::fidl::internal::WireWeakOnewayBufferClientImpl<
                ::test_union::TestProtocol> {
 public:
  using WireWeakOnewayBufferClientImpl::WireWeakOnewayBufferClientImpl;

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>
  StrictXUnionHenceResponseMayBeStackAllocated();

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_union::TestProtocol::
          FlexibleXUnionHenceResponseMustBeHeapAllocated>
  FlexibleXUnionHenceResponseMustBeHeapAllocated();
};
template <>
class ::fidl::internal::WireWeakSyncClientImpl<::test_union::TestProtocol> final
    : public ::fidl::internal::WireWeakOnewayClientImpl<
          ::test_union::TestProtocol> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;

  // Allocates 80 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_union::TestProtocol::StrictXUnionHenceResponseMayBeStackAllocated>
  StrictXUnionHenceResponseMayBeStackAllocated();

  // Allocates 16 bytes of request buffer on the stack. Response is
  // heap-allocated.
  ::fidl::WireResult<::test_union::TestProtocol::
                         FlexibleXUnionHenceResponseMustBeHeapAllocated>
  FlexibleXUnionHenceResponseMustBeHeapAllocated();
};
namespace fidl {
#endif  // __Fuchsia__

}  // namespace fidl
#ifdef __Fuchsia__
template <>
class ::fidl::internal::WireWeakEventSender<::test_union::TestProtocol>
    : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;
};

template <>
class ::fidl::internal::WireWeakBufferEventSender<::test_union::TestProtocol>
    : public ::fidl::internal::WeakBufferEventSenderBase {
 public:
  using WeakBufferEventSenderBase::WeakBufferEventSenderBase;
};

template <>
class ::fidl::internal::WireEventSender<::test_union::TestProtocol>
    : public ::fidl::internal::SyncEndpointManagedVeneer<
          ::fidl::internal::WireEventSender<::test_union::TestProtocol>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;
};

template <>
class ::fidl::internal::WireBufferEventSender<::test_union::TestProtocol>
    : public ::fidl::internal::SyncEndpointBufferVeneer<
          ::fidl::internal::WireBufferEventSender<::test_union::TestProtocol>> {
 public:
  using SyncEndpointBufferVeneer::SyncEndpointBufferVeneer;
};
#endif  // __Fuchsia__
