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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.exampleusing/cpp/common_types.h>
#include <lib/fidl/cpp/wire/internal/display_error.h>
#include <lib/fidl/cpp/wire/traits.h>
#include <lib/stdcompat/optional.h>

#include <cinttypes>
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"

namespace test_placementofattributes {

// |ExampleBits| is strict, hence is guaranteed to only contain
// members defined in the FIDL schema when receiving it in a message.
// Sending unknown members will fail at runtime.
class ExampleBits final {
 public:
  constexpr ExampleBits() = default;

  // Constructs an instance of |ExampleBits| from an underlying primitive value,
  // preserving any bit member not defined in the FIDL schema.
  explicit constexpr ExampleBits(uint32_t value) : value_(value) {}
  const static ExampleBits kMember;
  const static ExampleBits kMask;

  explicit constexpr inline operator uint32_t() const { return value_; }
  explicit constexpr inline operator bool() const { return static_cast<bool>(value_); }
  constexpr inline bool operator==(const ExampleBits& other) const { return value_ == other.value_; }
  constexpr inline bool operator!=(const ExampleBits& other) const { return value_ != other.value_; }
  constexpr inline ExampleBits operator~() const;
  constexpr inline ExampleBits operator|(const ExampleBits& other) const;
  constexpr inline ExampleBits operator&(const ExampleBits& other) const;
  constexpr inline ExampleBits operator^(const ExampleBits& other) const;
  constexpr inline ExampleBits operator-(const ExampleBits& other) const;
  constexpr inline void operator|=(const ExampleBits& other);
  constexpr inline void operator&=(const ExampleBits& other);
  constexpr inline void operator^=(const ExampleBits& other);
  constexpr inline void operator-=(const ExampleBits& other);

  // Constructs an instance of |ExampleBits| from an underlying primitive value
  // if the primitive does not contain any unknown members not defined in the
  // FIDL schema. Otherwise, returns |std::nullopt|.
  constexpr inline static std::optional<ExampleBits> TryFrom(uint32_t value) {
    if (value & ~kMask.value_) {
      return std::nullopt;
    }
    return ExampleBits(value & ExampleBits::kMask.value_);
  }

  // Constructs an instance of |ExampleBits| from an underlying primitive value,
  // clearing any bit member not defined in the FIDL schema.
  constexpr inline static ExampleBits TruncatingUnknown(uint32_t value) {
    return ExampleBits(value & ExampleBits::kMask.value_);
  }

 private:
  uint32_t value_ = 0;
};
constexpr const ::test_placementofattributes::ExampleBits ExampleBits::kMember =
    ::test_placementofattributes::ExampleBits(1u);
constexpr const ::test_placementofattributes::ExampleBits ExampleBits::kMask = ::test_placementofattributes::ExampleBits(1u);

constexpr inline ::test_placementofattributes::ExampleBits ExampleBits::operator~() const {
  return ::test_placementofattributes::ExampleBits(static_cast<uint32_t>(~this->value_ & kMask.value_));
}

constexpr inline ::test_placementofattributes::ExampleBits ExampleBits::operator|(
    const ::test_placementofattributes::ExampleBits& other) const {
  return ::test_placementofattributes::ExampleBits(static_cast<uint32_t>(this->value_ | other.value_));
}

constexpr inline ::test_placementofattributes::ExampleBits ExampleBits::operator&(
    const ::test_placementofattributes::ExampleBits& other) const {
  return ::test_placementofattributes::ExampleBits(static_cast<uint32_t>(this->value_ & other.value_));
}

constexpr inline ::test_placementofattributes::ExampleBits ExampleBits::operator^(
    const ::test_placementofattributes::ExampleBits& other) const {
  return ::test_placementofattributes::ExampleBits(static_cast<uint32_t>(this->value_ ^ other.value_));
}

constexpr inline ::test_placementofattributes::ExampleBits ExampleBits::operator-(
    const ::test_placementofattributes::ExampleBits& other) const {
  return ::test_placementofattributes::ExampleBits(static_cast<uint32_t>(this->value_ & ~other.value_));
}

constexpr inline void ExampleBits::operator|=(
    const ::test_placementofattributes::ExampleBits& other) {
  this->value_ |= other.value_;
}

constexpr inline void ExampleBits::operator&=(
    const ::test_placementofattributes::ExampleBits& other) {
  this->value_ &= other.value_;
}

constexpr inline void ExampleBits::operator^=(
    const ::test_placementofattributes::ExampleBits& other) {
  this->value_ ^= other.value_;
}

constexpr inline void ExampleBits::operator-=(
    const ::test_placementofattributes::ExampleBits& other) {
  this->value_ &= ~other.value_;
}

enum class ExampleEnum : uint32_t {

  kMember = 1u,
};

}  // namespace test_placementofattributes

template <>
struct fidl::internal::DisplayError<::test_placementofattributes::ExampleEnum> {
  static size_t Format(const ::test_placementofattributes::ExampleEnum& value, char* destination, size_t capacity);
};

namespace fidl {

constexpr inline auto ToUnderlying(::test_placementofattributes::ExampleEnum value) -> uint32_t {
  return static_cast<uint32_t>(value);
}

template <>
struct IsFidlType<::test_placementofattributes::ExampleBits> : public std::true_type {};
template <>
struct ContainsHandle<::test_placementofattributes::ExampleBits> : public std::false_type {};
static_assert(std::is_standard_layout_v<::test_placementofattributes::ExampleBits>);
static_assert(sizeof(::test_placementofattributes::ExampleBits) == sizeof(uint32_t));

template <>
struct IsFidlType<::test_placementofattributes::ExampleEnum> : public std::true_type {};
template <>
struct ContainsHandle<::test_placementofattributes::ExampleEnum> : public std::false_type {};

#pragma clang diagnostic pop

}  // namespace fidl
