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

namespace test_importedconstvalues {
namespace wire {
struct MyStruct;

extern "C" const fidl_type_t test_importedconstvalues_MyStructTable;

struct MyStruct {
  uint8_t __reserved = {};
};

constexpr ::test_dependent::wire::MyEnum kEnumMember =
    ::test_dependent::wire::MyEnum::kMember;

constexpr ::test_dependent::wire::MyBits kBitsMember =
    ::test_dependent::wire::MyBits::kMember;

}  // namespace wire
}  // namespace test_importedconstvalues
namespace fidl {

template <>
struct TypeTraits<::test_importedconstvalues::wire::MyStruct> {
  static constexpr const fidl_type_t* kType =
      &::test_importedconstvalues::wire::test_importedconstvalues_MyStructTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 1;
  static constexpr uint32_t kPrimarySizeV1 = 1;
  [[maybe_unused]] static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasPointer = false;
};

template <>
struct IsFidlType<::test_importedconstvalues::wire::MyStruct>
    : public std::true_type {};
template <>
struct IsStruct<::test_importedconstvalues::wire::MyStruct>
    : public std::true_type {};
static_assert(
    std::is_standard_layout_v<::test_importedconstvalues::wire::MyStruct>);
static_assert(offsetof(::test_importedconstvalues::wire::MyStruct,
                       __reserved) == 0);
static_assert(
    sizeof(::test_importedconstvalues::wire::MyStruct) ==
    TypeTraits<::test_importedconstvalues::wire::MyStruct>::kPrimarySize);

}  // namespace fidl
