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

#endif  // __Fuchsia__

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

namespace test_vectors {
namespace wire {
struct ExampleUseOfVectors;

extern "C" const fidl_type_t test_vectors_ExampleUseOfVectorsTable;

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 const fidl_type_t* kType =
      &::test_vectors::wire::test_vectors_ExampleUseOfVectorsTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 32;
  static constexpr uint32_t kPrimarySizeV1 = 32;
  [[maybe_unused]] static constexpr uint32_t kMaxOutOfLine = 4294967295;
  static constexpr uint32_t kMaxOutOfLineV1 = 4294967295;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::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);

}  // namespace fidl
