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

// fidl_experiment = output_index_json

#pragma once

#include "lib/fidl/cpp/internal/header.h"

namespace test {
namespace enum_ {

//
// Domain objects declarations
//

enum class MyStrictEnum : uint32_t {

  FOO = 1u,

  BAR = 2u,
};

inline zx_status_t Clone(::test::enum_::MyStrictEnum value,
                         ::test::enum_::MyStrictEnum* result) {
  *result = value;
  return ZX_OK;
}

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

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

      case 2u:

        return false;
    }
    return true;
  }

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

  static const MyFlexibleEnum FOO;

  static const MyFlexibleEnum BAR;

 private:
  uint32_t value_;
};

#if !(__cplusplus < 201703)
constexpr const ::test::enum_::MyFlexibleEnum MyFlexibleEnum::FOO = ::test::enum_::MyFlexibleEnum(1u);
constexpr const ::test::enum_::MyFlexibleEnum MyFlexibleEnum::BAR = ::test::enum_::MyFlexibleEnum(2u);
#endif  // !(__cplusplus < 201703)

inline zx_status_t Clone(::test::enum_::MyFlexibleEnum value,
                         ::test::enum_::MyFlexibleEnum* result) {
  *result = value;
  return ZX_OK;
}

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

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

      case 2u:

        return false;
    }
    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_;
};

#if !(__cplusplus < 201703)
constexpr const ::test::enum_::MyFlexibleEnumWithCustomUnknown MyFlexibleEnumWithCustomUnknown::FOO = ::test::enum_::MyFlexibleEnumWithCustomUnknown(1u);
constexpr const ::test::enum_::MyFlexibleEnumWithCustomUnknown MyFlexibleEnumWithCustomUnknown::BAR = ::test::enum_::MyFlexibleEnumWithCustomUnknown(2u);
constexpr const ::test::enum_::MyFlexibleEnumWithCustomUnknown MyFlexibleEnumWithCustomUnknown::CUSTOM_UNKNOWN = ::test::enum_::MyFlexibleEnumWithCustomUnknown(3u);
#endif  // !(__cplusplus < 201703)

inline zx_status_t Clone(::test::enum_::MyFlexibleEnumWithCustomUnknown value,
                         ::test::enum_::MyFlexibleEnumWithCustomUnknown* result) {
  *result = value;
  return ZX_OK;
}

class MyEmptyFlexibleEnum final {
 public:
  constexpr MyEmptyFlexibleEnum() : value_(0) {}
  constexpr explicit MyEmptyFlexibleEnum(uint32_t value) : value_(value) {}
  constexpr operator uint32_t() const { return value_; }

  constexpr bool IsUnknown() const {
    return true;
  }

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

 private:
  uint32_t value_;
};

#if !(__cplusplus < 201703)
#endif  // !(__cplusplus < 201703)

inline zx_status_t Clone(::test::enum_::MyEmptyFlexibleEnum value,
                         ::test::enum_::MyEmptyFlexibleEnum* result) {
  *result = value;
  return ZX_OK;
}

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

template <>
struct CodingTraits<::test::enum_::MyStrictEnum> {
  static constexpr size_t kInlineSize = sizeof(::test::enum_::MyStrictEnum);
  static void Encode(Encoder* encoder, ::test::enum_::MyStrictEnum* value, size_t offset,
                     cpp17::optional<::fidl::HandleInformation> maybe_handle_info) {
    ZX_DEBUG_ASSERT(!maybe_handle_info);
    uint32_t underlying = static_cast<uint32_t>(*value);
    ::fidl::Encode(encoder, &underlying, offset);
  }
  static void Decode(Decoder* decoder, ::test::enum_::MyStrictEnum* value, size_t offset) {
    uint32_t underlying = {};
    ::fidl::Decode(decoder, &underlying, offset);
    *value = static_cast<::test::enum_::MyStrictEnum>(underlying);
  }
};

inline zx_status_t Clone(::test::enum_::MyStrictEnum value,
                         ::test::enum_::MyStrictEnum* result) {
  return ::test::enum_::Clone(value, result);
}
template <>
struct Equality<::test::enum_::MyStrictEnum> {
  bool operator()(const ::test::enum_::MyStrictEnum& _lhs, const ::test::enum_::MyStrictEnum& _rhs) const {
    return _lhs == _rhs;
  }
};

template <>
struct CodingTraits<::test::enum_::MyFlexibleEnum> {
  static constexpr size_t kInlineSize = sizeof(::test::enum_::MyFlexibleEnum);
  static void Encode(Encoder* encoder, ::test::enum_::MyFlexibleEnum* value, size_t offset,
                     cpp17::optional<::fidl::HandleInformation> maybe_handle_info) {
    ZX_DEBUG_ASSERT(!maybe_handle_info);
    uint32_t underlying = static_cast<uint32_t>(*value);
    ::fidl::Encode(encoder, &underlying, offset);
  }
  static void Decode(Decoder* decoder, ::test::enum_::MyFlexibleEnum* value, size_t offset) {
    uint32_t underlying = {};
    ::fidl::Decode(decoder, &underlying, offset);
    *value = static_cast<::test::enum_::MyFlexibleEnum>(underlying);
  }
};

inline zx_status_t Clone(::test::enum_::MyFlexibleEnum value,
                         ::test::enum_::MyFlexibleEnum* result) {
  return ::test::enum_::Clone(value, result);
}
template <>
struct Equality<::test::enum_::MyFlexibleEnum> {
  bool operator()(const ::test::enum_::MyFlexibleEnum& _lhs, const ::test::enum_::MyFlexibleEnum& _rhs) const {
    return _lhs == _rhs;
  }
};

template <>
struct CodingTraits<::test::enum_::MyFlexibleEnumWithCustomUnknown> {
  static constexpr size_t kInlineSize = sizeof(::test::enum_::MyFlexibleEnumWithCustomUnknown);
  static void Encode(Encoder* encoder, ::test::enum_::MyFlexibleEnumWithCustomUnknown* value, size_t offset,
                     cpp17::optional<::fidl::HandleInformation> maybe_handle_info) {
    ZX_DEBUG_ASSERT(!maybe_handle_info);
    uint32_t underlying = static_cast<uint32_t>(*value);
    ::fidl::Encode(encoder, &underlying, offset);
  }
  static void Decode(Decoder* decoder, ::test::enum_::MyFlexibleEnumWithCustomUnknown* value, size_t offset) {
    uint32_t underlying = {};
    ::fidl::Decode(decoder, &underlying, offset);
    *value = static_cast<::test::enum_::MyFlexibleEnumWithCustomUnknown>(underlying);
  }
};

inline zx_status_t Clone(::test::enum_::MyFlexibleEnumWithCustomUnknown value,
                         ::test::enum_::MyFlexibleEnumWithCustomUnknown* result) {
  return ::test::enum_::Clone(value, result);
}
template <>
struct Equality<::test::enum_::MyFlexibleEnumWithCustomUnknown> {
  bool operator()(const ::test::enum_::MyFlexibleEnumWithCustomUnknown& _lhs, const ::test::enum_::MyFlexibleEnumWithCustomUnknown& _rhs) const {
    return _lhs == _rhs;
  }
};

template <>
struct CodingTraits<::test::enum_::MyEmptyFlexibleEnum> {
  static constexpr size_t kInlineSize = sizeof(::test::enum_::MyEmptyFlexibleEnum);
  static void Encode(Encoder* encoder, ::test::enum_::MyEmptyFlexibleEnum* value, size_t offset,
                     cpp17::optional<::fidl::HandleInformation> maybe_handle_info) {
    ZX_DEBUG_ASSERT(!maybe_handle_info);
    uint32_t underlying = static_cast<uint32_t>(*value);
    ::fidl::Encode(encoder, &underlying, offset);
  }
  static void Decode(Decoder* decoder, ::test::enum_::MyEmptyFlexibleEnum* value, size_t offset) {
    uint32_t underlying = {};
    ::fidl::Decode(decoder, &underlying, offset);
    *value = static_cast<::test::enum_::MyEmptyFlexibleEnum>(underlying);
  }
};

inline zx_status_t Clone(::test::enum_::MyEmptyFlexibleEnum value,
                         ::test::enum_::MyEmptyFlexibleEnum* result) {
  return ::test::enum_::Clone(value, result);
}
template <>
struct Equality<::test::enum_::MyEmptyFlexibleEnum> {
  bool operator()(const ::test::enum_::MyEmptyFlexibleEnum& _lhs, const ::test::enum_::MyEmptyFlexibleEnum& _rhs) const {
    return _lhs == _rhs;
  }
};

//
// Proxies and stubs declarations
//
}  // namespace fidl
