// 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__

#endif  // __Fuchsia__

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

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

namespace test_vectors {

namespace wire {

struct ExampleUseOfVectors;

struct ExampleUseOfVectors {
  ::fidl::VectorView<uint8_t> vector_of_uint8 = {};

  ::fidl::VectorView<::fidl::VectorView<bool>> vector_of_vector_of_bool = {};
};

}  // namespace wire
}  // namespace test_vectors
namespace fidl {

template <>
struct TypeTraits<::test_vectors::wire::ExampleUseOfVectors> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 32;
  [[maybe_unused]]
  static constexpr uint32_t kMaxOutOfLine = 4294967295;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::test_vectors::wire::ExampleUseOfVectors> : public std::true_type {};
template <>
struct IsWire<::test_vectors::wire::ExampleUseOfVectors> : public std::true_type {};
template <>
struct IsStruct<::test_vectors::wire::ExampleUseOfVectors> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_vectors::wire::ExampleUseOfVectors>);
static_assert(offsetof(::test_vectors::wire::ExampleUseOfVectors, vector_of_uint8) == 0);
static_assert(offsetof(::test_vectors::wire::ExampleUseOfVectors, vector_of_vector_of_bool) == 16);
static_assert(sizeof(::test_vectors::wire::ExampleUseOfVectors) == TypeTraits<::test_vectors::wire::ExampleUseOfVectors>::kPrimarySize);

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_vectors::wire::ExampleUseOfVectors, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 32;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::WireStructMemberCodingInfo<::fidl::VectorView<uint8_t>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintEmpty, false>, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<::fidl::VectorView<::fidl::VectorView<bool>>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintEmpty, false>, false>, IsRecursive>());
  static constexpr bool kHasPadding = false;
  using Base = WireStructCodingTraitsBase<::test_vectors::wire::ExampleUseOfVectors, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>;
  static constexpr bool kIsMemcpyCompatible = Base::kIsMemcpyCompatible;

  static void Encode(
      internal::WireEncoder* encoder, ::test_vectors::wire::ExampleUseOfVectors* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (kIsMemcpyCompatible) {
      memcpy(position.As<void>(), value, sizeof(::test_vectors::wire::ExampleUseOfVectors));
    } else {
      internal::WireCodingTraits<::fidl::VectorView<uint8_t>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintEmpty, false>, IsRecursive>::Encode(encoder, &value->vector_of_uint8, position + 0, recursion_depth);
      internal::WireCodingTraits<::fidl::VectorView<::fidl::VectorView<bool>>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintEmpty, false>, false>, IsRecursive>::Encode(encoder, &value->vector_of_vector_of_bool, position + 16, 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<::fidl::VectorView<uint8_t>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintEmpty, false>, IsRecursive>::Decode(
          decoder, position + 0, recursion_depth);
      internal::WireCodingTraits<::fidl::VectorView<::fidl::VectorView<bool>>, fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintVector<fidl::internal::WireCodingConstraintEmpty, false>, false>, IsRecursive>::Decode(
          decoder, position + 16, recursion_depth);
    }
  }
};

#pragma clang diagnostic pop

}  // namespace fidl
