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

#pragma once

#include <lib/fidl/llcpp/array.h>
#include <lib/fidl/llcpp/coding.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/zx/channel.h>

#endif  // __Fuchsia__

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

namespace test_driveroneway {
namespace wire {
struct Payload;

struct OneWaySendRequest;

extern "C" const fidl_type_t test_driveroneway_PayloadTable;

struct Payload {
  uint32_t value = {};
};

extern "C" const fidl_type_t test_driveroneway_OneWaySendRequestTable;

struct OneWaySendRequest {
  ::test_driveroneway::wire::Payload payload = {};
};

}  // namespace wire
}  // namespace test_driveroneway
namespace fidl {

template <>
struct TypeTraits<::test_driveroneway::wire::Payload> {
  static constexpr const fidl_type_t* kType =
      &::test_driveroneway::wire::test_driveroneway_PayloadTable;
  static constexpr uint32_t kMaxNumHandles = 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 kHasPointer = false;
};

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

template <>
struct TypeTraits<::test_driveroneway::wire::OneWaySendRequest> {
  static constexpr const fidl_type_t* kType =
      &::test_driveroneway::wire::test_driveroneway_OneWaySendRequestTable;
  static constexpr uint32_t kMaxNumHandles = 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 kHasPointer = false;
};

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

}  // namespace fidl
