// 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.someotherlibrary/cpp/wire_types.h>
#include <fidl/test.typealiases/cpp/common_types.h>
#include <fidl/test.typealiases/cpp/markers.h>

namespace test_typealiases {
namespace wire {
using ObjType = ::test_typealiases::ObjType;

struct ExampleOfUseOfAliases;

#ifdef __Fuchsia__

extern "C" const fidl_type_t test_typealiases_ExampleOfUseOfAliasesTable;

struct ExampleOfUseOfAliases {
  uint32_t field_of_u32 = {};

  ::fidl::VectorView<::fidl::StringView> field_of_vec_of_strings = {};

  ::fidl::VectorView<::fidl::StringView> field_of_vec_of_strings_at_most_nine =
      {};

  ::fidl::VectorView<::fidl::StringView> field_of_vec_of_strings_at_most_5 = {};

  ::fidl::VectorView<::test_someotherlibrary::wire::ReferenceMe>
      field_of_vec_of_ref_me_at_most_5 = {};

  ::zx::channel field_of_channel = {};

  ::zx::channel field_of_client_end = {};

  ::zx::channel field_of_nullable_client_end = {};

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

}  // namespace wire
}  // namespace test_typealiases
namespace fidl {

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

template <>
struct TypeTraits<::test_typealiases::wire::ExampleOfUseOfAliases> {
  static constexpr const fidl_type_t* kType =
      &::test_typealiases::wire::test_typealiases_ExampleOfUseOfAliasesTable;
  static constexpr uint32_t kMaxNumHandles = 3;
  static constexpr uint32_t kPrimarySize = 88;
  static constexpr uint32_t kPrimarySizeV1 = 88;
  [[maybe_unused]] static constexpr uint32_t kMaxOutOfLine = 4294967295;
  static constexpr uint32_t kMaxOutOfLineV1 = 4294967295;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::test_typealiases::wire::ExampleOfUseOfAliases>
    : public std::true_type {};
template <>
struct IsStruct<::test_typealiases::wire::ExampleOfUseOfAliases>
    : public std::true_type {};
static_assert(
    std::is_standard_layout_v<::test_typealiases::wire::ExampleOfUseOfAliases>);
static_assert(offsetof(::test_typealiases::wire::ExampleOfUseOfAliases,
                       field_of_u32) == 0);
static_assert(offsetof(::test_typealiases::wire::ExampleOfUseOfAliases,
                       field_of_vec_of_strings) == 8);
static_assert(offsetof(::test_typealiases::wire::ExampleOfUseOfAliases,
                       field_of_vec_of_strings_at_most_nine) == 24);
static_assert(offsetof(::test_typealiases::wire::ExampleOfUseOfAliases,
                       field_of_vec_of_strings_at_most_5) == 40);
static_assert(offsetof(::test_typealiases::wire::ExampleOfUseOfAliases,
                       field_of_vec_of_ref_me_at_most_5) == 56);
static_assert(offsetof(::test_typealiases::wire::ExampleOfUseOfAliases,
                       field_of_channel) == 72);
static_assert(offsetof(::test_typealiases::wire::ExampleOfUseOfAliases,
                       field_of_client_end) == 76);
static_assert(offsetof(::test_typealiases::wire::ExampleOfUseOfAliases,
                       field_of_nullable_client_end) == 80);
static_assert(
    sizeof(::test_typealiases::wire::ExampleOfUseOfAliases) ==
    TypeTraits<::test_typealiases::wire::ExampleOfUseOfAliases>::kPrimarySize);
#endif  // __Fuchsia__

}  // namespace fidl
