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

// fidl_experiment = output_index_json

#pragma once

#include <lib/fidl/cpp/wire/array.h>
#include <lib/fidl/cpp/wire/envelope.h>
#include <lib/fidl/cpp/wire/internal/framework_err.h>
#include <lib/fidl/cpp/wire/message.h>
#include <lib/fidl/cpp/wire/message_storage.h>
#include <lib/fidl/cpp/wire/object_view.h>
#include <lib/fidl/cpp/wire/string_view.h>
#include <lib/fidl/cpp/wire/traits.h>
#include <lib/fidl/cpp/wire/wire_types.h>
#include <lib/stdcompat/optional.h>

#include <cinttypes>
#ifdef __Fuchsia__
#include <lib/zx/channel.h>

#endif  // __Fuchsia__

#include <fidl/test.aliases/cpp/common_types.h>
#include <fidl/test.aliases/cpp/markers.h>
#include <fidl/test.someotherlibrary/cpp/wire_types.h>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"

namespace test_aliases {

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

struct ExampleOfUseOfAliases;

using U32 = uint32_t;

using VecOfStrings = ::fidl::VectorView<::fidl::StringView>;

using VecOfStringsAtMost5 = ::fidl::VectorView<::fidl::StringView>;

#ifdef __Fuchsia__

using Channel = ::zx::channel;

#endif  // __Fuchsia__

#ifdef __Fuchsia__

using AliasOfChannel = ::zx::channel;

#endif  // __Fuchsia__

using ReferenceMe = ::test_someotherlibrary::wire::ReferenceMe;

#ifdef __Fuchsia__

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_aliases
namespace fidl {

template <bool IsRecursive>
struct internal::WireCodingTraits<::test_aliases::wire::ObjType, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = sizeof(uint32_t);
  static constexpr bool kIsMemcpyCompatible = false;

  static void Encode(internal::WireEncoder* encoder, ::test_aliases::wire::ObjType* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    switch (*value) {
      case ::test_aliases::wire::ObjType::kNone:
      case ::test_aliases::wire::ObjType::kChannel:
        break;
      default:
        encoder->SetError(::fidl::internal::kCodingErrorUnknownEnumValue);
        return;
    }
    *position.As<::test_aliases::wire::ObjType>() = *value;
  }
  static void Decode(internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    [[maybe_unused]] ::test_aliases::wire::ObjType value = *position.As<::test_aliases::wire::ObjType>();
    switch (value) {
      case ::test_aliases::wire::ObjType::kNone:
      case ::test_aliases::wire::ObjType::kChannel:
        break;
      default:
        decoder->SetError(::fidl::internal::kCodingErrorUnknownEnumValue);
        return;
    }
  }
};

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

template <>
struct TypeTraits<::test_aliases::wire::ExampleOfUseOfAliases> {
  static constexpr uint32_t kMaxNumHandles = 3;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 88;
  [[maybe_unused]]
  static constexpr uint32_t kMaxOutOfLine = 4294967295;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
};

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

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_aliases::wire::ExampleOfUseOfAliases, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 88;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::WireStructMemberCodingInfo<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<::fidl::VectorView<::fidl::StringView>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintString<false>, false>, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<::fidl::VectorView<::fidl::StringView>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintString<false>, false, 9>, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<::fidl::VectorView<::fidl::StringView>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintString<false>, false, 5>, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<::fidl::VectorView<::test_someotherlibrary::wire::ReferenceMe>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintEmpty, false, 5>, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<::zx::channel, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, 0x80000000, false>, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<::zx::channel, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, 0x80000000, false>, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<::zx::channel, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, 0x80000000, true>, IsRecursive>());
  static constexpr bool kHasPadding = true;
  using Base = WireStructCodingTraitsBase<::test_aliases::wire::ExampleOfUseOfAliases, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>;
  static constexpr bool kIsMemcpyCompatible = Base::kIsMemcpyCompatible;

  static void Encode(
      internal::WireEncoder* encoder, ::test_aliases::wire::ExampleOfUseOfAliases* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (kIsMemcpyCompatible) {
      memcpy(position.As<void>(), value, sizeof(::test_aliases::wire::ExampleOfUseOfAliases));
    } else {
      internal::WireZeroPadding<uint64_t>(encoder, position + 0);
      internal::WireZeroPadding<uint64_t>(encoder, position + 80);
      internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(encoder, &value->field_of_u32, position + 0, recursion_depth);
      internal::WireCodingTraits<::fidl::VectorView<::fidl::StringView>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintString<false>, false>, IsRecursive>::Encode(encoder, &value->field_of_vec_of_strings, position + 8, recursion_depth);
      internal::WireCodingTraits<::fidl::VectorView<::fidl::StringView>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintString<false>, false, 9>, IsRecursive>::Encode(encoder, &value->field_of_vec_of_strings_at_most_nine, position + 24, recursion_depth);
      internal::WireCodingTraits<::fidl::VectorView<::fidl::StringView>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintString<false>, false, 5>, IsRecursive>::Encode(encoder, &value->field_of_vec_of_strings_at_most_5, position + 40, recursion_depth);
      internal::WireCodingTraits<::fidl::VectorView<::test_someotherlibrary::wire::ReferenceMe>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintEmpty, false, 5>, IsRecursive>::Encode(encoder, &value->field_of_vec_of_ref_me_at_most_5, position + 56, recursion_depth);
      internal::WireCodingTraits<::zx::channel, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, 0x80000000, false>, IsRecursive>::Encode(encoder, &value->field_of_channel, position + 72, recursion_depth);
      internal::WireCodingTraits<::zx::channel, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, 0x80000000, false>, IsRecursive>::Encode(encoder, &value->field_of_client_end, position + 76, recursion_depth);
      internal::WireCodingTraits<::zx::channel, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, 0x80000000, true>, IsRecursive>::Encode(encoder, &value->field_of_nullable_client_end, position + 80, 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<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
          decoder, position + 0, recursion_depth);
      internal::WireCodingTraits<::fidl::VectorView<::fidl::StringView>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintString<false>, false>, IsRecursive>::Decode(
          decoder, position + 8, recursion_depth);
      internal::WireCodingTraits<::fidl::VectorView<::fidl::StringView>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintString<false>, false, 9>, IsRecursive>::Decode(
          decoder, position + 24, recursion_depth);
      internal::WireCodingTraits<::fidl::VectorView<::fidl::StringView>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintString<false>, false, 5>, IsRecursive>::Decode(
          decoder, position + 40, recursion_depth);
      internal::WireCodingTraits<::fidl::VectorView<::test_someotherlibrary::wire::ReferenceMe>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintEmpty, false, 5>, IsRecursive>::Decode(
          decoder, position + 56, recursion_depth);
      internal::WireCodingTraits<::zx::channel, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, 0x80000000, false>, IsRecursive>::Decode(
          decoder, position + 72, recursion_depth);
      internal::WireCodingTraits<::zx::channel, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, 0x80000000, false>, IsRecursive>::Decode(
          decoder, position + 76, recursion_depth);
      internal::WireCodingTraits<::zx::channel, fidl::internal::WireCodingConstraintHandle<ZX_OBJ_TYPE_CHANNEL, 0x80000000, true>, IsRecursive>::Decode(
          decoder, position + 80, recursion_depth);
    }
    internal::WireCheckPadding<uint64_t>(decoder, position + 0, 0xffffffff00000000);
    internal::WireCheckPadding<uint64_t>(decoder, position + 80, 0xffffffff00000000);
  }
};

#endif  // __Fuchsia__

#pragma clang diagnostic pop

}  // namespace fidl
