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

namespace test_structdefaultvalueenumlibraryreference {
namespace wire {
struct Foo;

extern "C" const fidl_type_t
    test_structdefaultvalueenumlibraryreference_FooTable;

struct Foo {
  ::test_dependent::wire::MyEnum field = {};
};

}  // namespace wire
}  // namespace test_structdefaultvalueenumlibraryreference
namespace fidl {

template <>
struct TypeTraits<::test_structdefaultvalueenumlibraryreference::wire::Foo> {
  static constexpr const fidl_type_t* kType =
      &::test_structdefaultvalueenumlibraryreference::wire::
          test_structdefaultvalueenumlibraryreference_FooTable;
  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_structdefaultvalueenumlibraryreference::wire::Foo>
    : public std::true_type {};
template <>
struct IsStruct<::test_structdefaultvalueenumlibraryreference::wire::Foo>
    : public std::true_type {};
static_assert(std::is_standard_layout_v<
              ::test_structdefaultvalueenumlibraryreference::wire::Foo>);
static_assert(offsetof(::test_structdefaultvalueenumlibraryreference::wire::Foo,
                       field) == 0);
static_assert(
    sizeof(::test_structdefaultvalueenumlibraryreference::wire::Foo) ==
    TypeTraits<::test_structdefaultvalueenumlibraryreference::wire::Foo>::
        kPrimarySize);

}  // namespace fidl
