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

#pragma once

#include <lib/fidl/internal.h>
#include <lib/fidl/llcpp/array.h>
#include <lib/fidl/llcpp/buffer_allocator.h>
#include <lib/fidl/llcpp/buffer_then_heap_allocator.h>
#include <lib/fidl/llcpp/coding.h>
#include <lib/fidl/llcpp/envelope.h>
#include <lib/fidl/llcpp/errors.h>
#include <lib/fidl/llcpp/memory.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/tracking_ptr.h>
#include <lib/fidl/llcpp/traits.h>
#include <lib/fidl/llcpp/vector_view.h>
#include <lib/fit/function.h>
#include <lib/stdcompat/optional.h>

#include <algorithm>
#include <cstddef>
#include <variant>
#ifdef __Fuchsia__
#include <lib/fidl/llcpp/client.h>
#include <lib/fidl/llcpp/client_end.h>
#include <lib/fidl/llcpp/connect_service.h>
#include <lib/fidl/llcpp/result.h>
#include <lib/fidl/llcpp/server.h>
#include <lib/fidl/llcpp/server_end.h>
#include <lib/fidl/llcpp/service_handler_interface.h>
#include <lib/fidl/llcpp/sync_call.h>
#include <lib/fidl/llcpp/transaction.h>
#include <lib/fidl/txn_header.h>

#endif  // __Fuchsia__
#include <zircon/fidl.h>

namespace llcpp {
namespace fidl {
namespace test {
namespace enum_ {
namespace wire {

enum class MyStrictEnum : uint32_t {

  FOO = 1u,

  BAR = 2u,
};
}  // namespace wire
using MyStrictEnum = ::llcpp::fidl::test::enum_::wire::MyStrictEnum;

namespace wire {

class MyFlexibleEnumWithCustomUnknown final {
 public:
  constexpr MyFlexibleEnumWithCustomUnknown() : value_(0) {}
  constexpr explicit MyFlexibleEnumWithCustomUnknown(uint32_t value)
      : value_(value) {}
  constexpr MyFlexibleEnumWithCustomUnknown(
      const MyFlexibleEnumWithCustomUnknown& other) = default;
  constexpr operator uint32_t() const { return value_; }

  constexpr bool IsUnknown() const {
    switch (value_) {
      case 1u:

      case 2u:

        return false;
      default:
        return true;
    }
  }

  constexpr static MyFlexibleEnumWithCustomUnknown Unknown() {
    return MyFlexibleEnumWithCustomUnknown(0x3);
  }

  static const MyFlexibleEnumWithCustomUnknown FOO;

  static const MyFlexibleEnumWithCustomUnknown BAR;

  static const MyFlexibleEnumWithCustomUnknown CUSTOM_UNKNOWN;

 private:
  uint32_t value_;
};
constexpr const ::llcpp::fidl::test::enum_::wire::
    MyFlexibleEnumWithCustomUnknown MyFlexibleEnumWithCustomUnknown::FOO =
        ::llcpp::fidl::test::enum_::wire::MyFlexibleEnumWithCustomUnknown(1u);
constexpr const ::llcpp::fidl::test::enum_::wire::
    MyFlexibleEnumWithCustomUnknown MyFlexibleEnumWithCustomUnknown::BAR =
        ::llcpp::fidl::test::enum_::wire::MyFlexibleEnumWithCustomUnknown(2u);
constexpr const ::llcpp::fidl::test::enum_::wire::
    MyFlexibleEnumWithCustomUnknown
        MyFlexibleEnumWithCustomUnknown::CUSTOM_UNKNOWN =
            ::llcpp::fidl::test::enum_::wire::MyFlexibleEnumWithCustomUnknown(
                3u);
}  // namespace wire
using MyFlexibleEnumWithCustomUnknown =
    ::llcpp::fidl::test::enum_::wire::MyFlexibleEnumWithCustomUnknown;

namespace wire {

class MyFlexibleEnum final {
 public:
  constexpr MyFlexibleEnum() : value_(0) {}
  constexpr explicit MyFlexibleEnum(uint32_t value) : value_(value) {}
  constexpr MyFlexibleEnum(const MyFlexibleEnum& other) = default;
  constexpr operator uint32_t() const { return value_; }

  constexpr bool IsUnknown() const {
    switch (value_) {
      case 1u:

      case 2u:

        return false;
      default:
        return true;
    }
  }

  constexpr static MyFlexibleEnum Unknown() {
    return MyFlexibleEnum(0xffffffff);
  }

  static const MyFlexibleEnum FOO;

  static const MyFlexibleEnum BAR;

 private:
  uint32_t value_;
};
constexpr const ::llcpp::fidl::test::enum_::wire::MyFlexibleEnum
    MyFlexibleEnum::FOO = ::llcpp::fidl::test::enum_::wire::MyFlexibleEnum(1u);
constexpr const ::llcpp::fidl::test::enum_::wire::MyFlexibleEnum
    MyFlexibleEnum::BAR = ::llcpp::fidl::test::enum_::wire::MyFlexibleEnum(2u);
}  // namespace wire
using MyFlexibleEnum = ::llcpp::fidl::test::enum_::wire::MyFlexibleEnum;

}  // namespace enum_
}  // namespace test
}  // namespace fidl
}  // namespace llcpp
namespace fidl {

template <>
struct IsFidlType<::llcpp::fidl::test::enum_::wire::MyStrictEnum>
    : public std::true_type {};

template <>
struct IsFidlType<
    ::llcpp::fidl::test::enum_::wire::MyFlexibleEnumWithCustomUnknown>
    : public std::true_type {};

template <>
struct IsFidlType<::llcpp::fidl::test::enum_::wire::MyFlexibleEnum>
    : public std::true_type {};
}  // namespace fidl
namespace llcpp {
namespace fidl {
namespace test {
namespace enum_ {
namespace wire {}  // namespace wire
}  // namespace enum_
}  // namespace test
}  // namespace fidl
}  // namespace llcpp
