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

#include <fidl/test/placementofattributes/llcpp/fidl.h>

#include <memory>

auto ::fidl_test_placementofattributes::wire::ExampleXUnion::which() const
    -> ::fidl_test_placementofattributes::wire::ExampleXUnion::Tag {
  ZX_ASSERT(!has_invalid_tag());
  switch (ordinal_) {
    case ::fidl_test_placementofattributes::wire::ExampleXUnion::Ordinal::
        kVariant:
      return static_cast<
          ::fidl_test_placementofattributes::wire::ExampleXUnion::Tag>(
          ordinal_);
    default:
      return ::fidl_test_placementofattributes::wire::ExampleXUnion::Tag::
          kUnknown;
  }
}

void ::fidl_test_placementofattributes::wire::ExampleXUnion::
    SizeAndOffsetAssertionHelper() {
  static_assert(sizeof(ExampleXUnion) == sizeof(fidl_xunion_t));
  static_assert(offsetof(ExampleXUnion, ordinal_) ==
                offsetof(fidl_xunion_t, tag));
  static_assert(offsetof(ExampleXUnion, envelope_) ==
                offsetof(fidl_xunion_t, envelope));
}

void ::fidl_test_placementofattributes::wire::ExampleUnion::
    SizeAndOffsetAssertionHelper() {
  static_assert(sizeof(ExampleUnion) == sizeof(fidl_xunion_t));
  static_assert(offsetof(ExampleUnion, ordinal_) ==
                offsetof(fidl_xunion_t, tag));
  static_assert(offsetof(ExampleUnion, envelope_) ==
                offsetof(fidl_xunion_t, envelope));
}

namespace fidl_test_placementofattributes {
[[maybe_unused]] constexpr uint64_t kExampleProtocol_Method_Ordinal =
    2341079615635566980lu;

extern "C" const fidl_type_t
    fidl_test_placementofattributes_ExampleProtocolMethodRequestTable;

extern "C" const fidl_type_t
    fidl_test_placementofattributes_ExampleProtocolMethodResponseTable;
#ifdef __Fuchsia__
}  // namespace fidl_test_placementofattributes
::fidl::WireResult<::fidl_test_placementofattributes::ExampleProtocol::Method>::
    WireResult(::fidl::UnownedClientEnd<
                   ::fidl_test_placementofattributes::ExampleProtocol>
                   _client,
               const ::exampleusing::wire::Empty& arg) {
  ::fidl::OwnedEncodedMessage<::fidl::WireRequest<
      ::fidl_test_placementofattributes::ExampleProtocol::Method>>
      _request(zx_txid_t(0), arg);
  _request.GetOutgoingMessage().Write(_client);
  status_ = _request.status();
  error_ = _request.error();
}
namespace fidl_test_placementofattributes {
#endif  // __Fuchsia__

#ifdef __Fuchsia__
}  // namespace fidl_test_placementofattributes
::fidl::WireUnownedResult<
    ::fidl_test_placementofattributes::ExampleProtocol::Method>::
    WireUnownedResult(::fidl::UnownedClientEnd<
                          ::fidl_test_placementofattributes::ExampleProtocol>
                          _client,
                      uint8_t* _request_bytes, uint32_t _request_byte_capacity,
                      const ::exampleusing::wire::Empty& arg) {
  ::fidl::UnownedEncodedMessage<::fidl::WireRequest<
      ::fidl_test_placementofattributes::ExampleProtocol::Method>>
      _request(_request_bytes, _request_byte_capacity, 0, arg);
  _request.GetOutgoingMessage().Write(_client);
  status_ = _request.status();
  error_ = _request.error();
}
namespace fidl_test_placementofattributes {
#endif  // __Fuchsia__

}  // namespace fidl_test_placementofattributes
#ifdef __Fuchsia__
::fidl::Result fidl::internal::
    WireClientImpl<::fidl_test_placementofattributes::ExampleProtocol>::Method(
        const ::exampleusing::wire::Empty& arg) {
  if (auto _channel = ::fidl::internal::ClientBase::GetChannel()) {
    auto _res = ::fidl::WireResult<
        ::fidl_test_placementofattributes::ExampleProtocol::Method>(
        ::fidl::UnownedClientEnd<
            ::fidl_test_placementofattributes::ExampleProtocol>(
            _channel->handle()),
        arg);
    return ::fidl::Result(_res.status(), _res.error());
  }
  return ::fidl::Result(ZX_ERR_CANCELED, ::fidl::kErrorChannelUnbound);
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__
::fidl::Result fidl::internal::
    WireClientImpl<::fidl_test_placementofattributes::ExampleProtocol>::Method(
        ::fidl::BufferSpan _request_buffer,
        const ::exampleusing::wire::Empty& arg) {
  if (auto _channel = ::fidl::internal::ClientBase::GetChannel()) {
    auto _res = ::fidl::WireUnownedResult<
        ::fidl_test_placementofattributes::ExampleProtocol::Method>(
        ::fidl::UnownedClientEnd<
            ::fidl_test_placementofattributes::ExampleProtocol>(
            _channel->handle()),
        _request_buffer.data, _request_buffer.capacity, arg);
    return ::fidl::Result(_res.status(), _res.error());
  }
  return ::fidl::Result(ZX_ERR_CANCELED, ::fidl::kErrorChannelUnbound);
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__
std::optional<::fidl::UnbindInfo> fidl::internal::WireClientImpl<
    ::fidl_test_placementofattributes::ExampleProtocol>::
    DispatchEvent(fidl_incoming_msg_t* msg) {
  FidlHandleInfoCloseMany(msg->handles, msg->num_handles);
  return ::fidl::UnbindInfo{::fidl::UnbindInfo::kUnexpectedMessage,
                            ZX_ERR_NOT_SUPPORTED};
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

::fidl::DispatchResult fidl::internal::WireServerDispatcher<
    ::fidl_test_placementofattributes::ExampleProtocol>::
    TryDispatch(::fidl::WireServer<
                    ::fidl_test_placementofattributes::ExampleProtocol>* impl,
                fidl_incoming_msg_t* msg, ::fidl::Transaction* txn) {
  static const ::fidl::internal::MethodEntry entries[] = {
      {
          ::fidl_test_placementofattributes::kExampleProtocol_Method_Ordinal,
          ::fidl::WireRequest<
              ::fidl_test_placementofattributes::ExampleProtocol::Method>::Type,
          [](void* interface, void* bytes, ::fidl::Transaction* txn) {
            ::fidl::WireServer<
                ::fidl_test_placementofattributes::ExampleProtocol>::
                MethodCompleter::Sync completer(txn);
            reinterpret_cast<::fidl::WireServer<
                ::fidl_test_placementofattributes::ExampleProtocol>*>(interface)
                ->Method(
                    reinterpret_cast<
                        ::fidl::WireRequest<::fidl_test_placementofattributes::
                                                ExampleProtocol::Method>*>(
                        bytes),
                    completer);
          },
      },
  };
  return ::fidl::internal::TryDispatch(
      impl, msg, txn, entries,
      entries + sizeof(entries) / sizeof(::fidl::internal::MethodEntry));
}

::fidl::DispatchResult fidl::internal::WireServerDispatcher<
    ::fidl_test_placementofattributes::ExampleProtocol>::
    Dispatch(::fidl::WireServer<
                 ::fidl_test_placementofattributes::ExampleProtocol>* impl,
             fidl_incoming_msg_t* msg, ::fidl::Transaction* txn) {
  ::fidl::DispatchResult dispatch_result = TryDispatch(impl, msg, txn);
  if (dispatch_result == ::fidl::DispatchResult::kNotFound) {
    FidlHandleInfoCloseMany(msg->handles, msg->num_handles);
    txn->InternalError(
        {::fidl::UnbindInfo::kUnexpectedMessage, ZX_ERR_NOT_SUPPORTED});
  }
  return dispatch_result;
}
::fidl::DispatchResult
fidl::WireServer<::fidl_test_placementofattributes::ExampleProtocol>::
    dispatch_message(fidl_incoming_msg_t* msg, ::fidl::Transaction* txn) {
  return ::fidl::internal::WireServerDispatcher<
      ::fidl_test_placementofattributes::ExampleProtocol>::Dispatch(this, msg,
                                                                    txn);
}

::fidl::DispatchResult fidl::internal::WireDispatcher<
    ::fidl_test_placementofattributes::ExampleProtocol>::
    TryDispatch(::fidl::WireInterface<
                    ::fidl_test_placementofattributes::ExampleProtocol>* impl,
                fidl_incoming_msg_t* msg, ::fidl::Transaction* txn) {
  static const ::fidl::internal::MethodEntry entries[] = {
      {
          ::fidl_test_placementofattributes::kExampleProtocol_Method_Ordinal,
          ::fidl::WireRequest<
              ::fidl_test_placementofattributes::ExampleProtocol::Method>::Type,
          [](void* interface, void* bytes, ::fidl::Transaction* txn) {
            auto message = reinterpret_cast<::fidl::WireRequest<
                ::fidl_test_placementofattributes::ExampleProtocol::Method>*>(
                bytes);
            ::fidl::WireServer<
                ::fidl_test_placementofattributes::ExampleProtocol>::
                MethodCompleter::Sync completer(txn);
            reinterpret_cast<::fidl::WireInterface<
                ::fidl_test_placementofattributes::ExampleProtocol>*>(interface)
                ->Method(std::move(message->arg), completer);
          },
      },
  };
  return ::fidl::internal::TryDispatch(
      impl, msg, txn, entries,
      entries + sizeof(entries) / sizeof(::fidl::internal::MethodEntry));
}

::fidl::DispatchResult fidl::internal::WireDispatcher<
    ::fidl_test_placementofattributes::ExampleProtocol>::
    Dispatch(::fidl::WireInterface<
                 ::fidl_test_placementofattributes::ExampleProtocol>* impl,
             fidl_incoming_msg_t* msg, ::fidl::Transaction* txn) {
  ::fidl::DispatchResult dispatch_result = TryDispatch(impl, msg, txn);
  if (dispatch_result == ::fidl::DispatchResult::kNotFound) {
    FidlHandleInfoCloseMany(msg->handles, msg->num_handles);
    txn->InternalError(
        {::fidl::UnbindInfo::kUnexpectedMessage, ZX_ERR_NOT_SUPPORTED});
  }
  return dispatch_result;
}
::fidl::DispatchResult
fidl::WireInterface<::fidl_test_placementofattributes::ExampleProtocol>::
    dispatch_message(fidl_incoming_msg_t* msg, ::fidl::Transaction* txn) {
  return ::fidl::internal::WireDispatcher<
      ::fidl_test_placementofattributes::ExampleProtocol>::Dispatch(this, msg,
                                                                    txn);
}
#endif  // __Fuchsia__

void ::fidl::WireRequest<::fidl_test_placementofattributes::ExampleProtocol::
                             Method>::_InitHeader(zx_txid_t _txid) {
  fidl_init_txn_header(
      &_hdr, _txid,
      ::fidl_test_placementofattributes::kExampleProtocol_Method_Ordinal);
}

#ifdef __Fuchsia__

#endif  // __Fuchsia__
