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

#pragma once

#include <lib/fidl/llcpp/internal/display_error.h>
#include <lib/fidl/llcpp/traits.h>
#include <lib/stdcompat/optional.h>

#include <cinttypes>

namespace test_bits {
// |StrictBits| 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 StrictBits final {
 public:
  constexpr StrictBits() = default;

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

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

  // Constructs an instance of |StrictBits| 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<StrictBits> TryFrom(uint64_t value) {
    if (value & ~kMask.value_) {
      return std::nullopt;
    }
    return StrictBits(value & StrictBits::kMask.value_);
  }

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

 private:
  uint64_t value_ = 0;
};
constexpr const ::test_bits::StrictBits StrictBits::kSmallest =
    ::test_bits::StrictBits(1u);
constexpr const ::test_bits::StrictBits StrictBits::kBiggest =
    ::test_bits::StrictBits(9223372036854775808u);
constexpr const ::test_bits::StrictBits StrictBits::kMask =
    ::test_bits::StrictBits(9223372036854775809u);

constexpr inline ::test_bits::StrictBits StrictBits::operator~() const {
  return ::test_bits::StrictBits(
      static_cast<uint64_t>(~this->value_ & kMask.value_));
}

constexpr inline ::test_bits::StrictBits StrictBits::operator|(
    const ::test_bits::StrictBits& other) const {
  return ::test_bits::StrictBits(
      static_cast<uint64_t>(this->value_ | other.value_));
}

constexpr inline ::test_bits::StrictBits StrictBits::operator&(
    const ::test_bits::StrictBits& other) const {
  return ::test_bits::StrictBits(
      static_cast<uint64_t>(this->value_ & other.value_));
}

constexpr inline ::test_bits::StrictBits StrictBits::operator^(
    const ::test_bits::StrictBits& other) const {
  return ::test_bits::StrictBits(
      static_cast<uint64_t>(this->value_ ^ other.value_));
}

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

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

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

// |MyBits| 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 MyBits final {
 public:
  constexpr MyBits() = default;

  // Constructs an instance of |MyBits| from an underlying primitive value,
  // preserving any bit member not defined in the FIDL schema.
  explicit constexpr MyBits(uint32_t value) : value_(value) {}
  const static MyBits kMyFirstBit;
  const static MyBits kMyOtherBit;
  const static MyBits kMask_;
  const static MyBits 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 MyBits& other) const {
    return value_ == other.value_;
  }
  constexpr inline bool operator!=(const MyBits& other) const {
    return value_ != other.value_;
  }
  constexpr inline MyBits operator~() const;
  constexpr inline MyBits operator|(const MyBits& other) const;
  constexpr inline MyBits operator&(const MyBits& other) const;
  constexpr inline MyBits operator^(const MyBits& other) const;
  constexpr inline void operator|=(const MyBits& other);
  constexpr inline void operator&=(const MyBits& other);
  constexpr inline void operator^=(const MyBits& other);

  // Constructs an instance of |MyBits| 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<MyBits> TryFrom(uint32_t value) {
    if (value & ~kMask.value_) {
      return std::nullopt;
    }
    return MyBits(value & MyBits::kMask.value_);
  }

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

 private:
  uint32_t value_ = 0;
};
constexpr const ::test_bits::MyBits MyBits::kMyFirstBit =
    ::test_bits::MyBits(1u);
constexpr const ::test_bits::MyBits MyBits::kMyOtherBit =
    ::test_bits::MyBits(2u);
constexpr const ::test_bits::MyBits MyBits::kMask_ = ::test_bits::MyBits(4u);
constexpr const ::test_bits::MyBits MyBits::kMask = ::test_bits::MyBits(7u);

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

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

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

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

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

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

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

// |FlexibleBits| is flexible, hence may contain unknown members not
// defined in the FIDL schema.
class FlexibleBits final {
 public:
  constexpr FlexibleBits() = default;

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

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

  // Constructs an instance of |FlexibleBits| 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<FlexibleBits> TryFrom(uint64_t value) {
    if (value & ~kMask.value_) {
      return std::nullopt;
    }
    return FlexibleBits(value & FlexibleBits::kMask.value_);
  }

  // Constructs an instance of |FlexibleBits| from an underlying primitive
  // value, clearing any bit member not defined in the FIDL schema.
  constexpr inline static FlexibleBits TruncatingUnknown(uint64_t value) {
    return FlexibleBits(value & FlexibleBits::kMask.value_);
  }
  constexpr inline FlexibleBits unknown_bits() const {
    return *this & FlexibleBits(~kMask.value_);
  }
  constexpr inline bool has_unknown_bits() const {
    return static_cast<bool>(unknown_bits());
  }

 private:
  uint64_t value_ = 0;
};
constexpr const ::test_bits::FlexibleBits FlexibleBits::kSmallest =
    ::test_bits::FlexibleBits(1u);
constexpr const ::test_bits::FlexibleBits FlexibleBits::kBiggest =
    ::test_bits::FlexibleBits(9223372036854775808u);
constexpr const ::test_bits::FlexibleBits FlexibleBits::kMask =
    ::test_bits::FlexibleBits(9223372036854775809u);

constexpr inline ::test_bits::FlexibleBits FlexibleBits::operator~() const {
  return ::test_bits::FlexibleBits(
      static_cast<uint64_t>(~this->value_ & kMask.value_));
}

constexpr inline ::test_bits::FlexibleBits FlexibleBits::operator|(
    const ::test_bits::FlexibleBits& other) const {
  return ::test_bits::FlexibleBits(
      static_cast<uint64_t>(this->value_ | other.value_));
}

constexpr inline ::test_bits::FlexibleBits FlexibleBits::operator&(
    const ::test_bits::FlexibleBits& other) const {
  return ::test_bits::FlexibleBits(
      static_cast<uint64_t>(this->value_ & other.value_));
}

constexpr inline ::test_bits::FlexibleBits FlexibleBits::operator^(
    const ::test_bits::FlexibleBits& other) const {
  return ::test_bits::FlexibleBits(
      static_cast<uint64_t>(this->value_ ^ other.value_));
}

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

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

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

}  // namespace test_bits
namespace fidl {

template <>
struct IsFidlType<::test_bits::StrictBits> : public std::true_type {};
template <>
struct ContainsHandle<::test_bits::StrictBits> : public std::false_type {};
static_assert(std::is_standard_layout_v<::test_bits::StrictBits>);
static_assert(sizeof(::test_bits::StrictBits) == sizeof(uint64_t));

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

template <>
struct IsFidlType<::test_bits::FlexibleBits> : public std::true_type {};
template <>
struct ContainsHandle<::test_bits::FlexibleBits> : public std::false_type {};
static_assert(std::is_standard_layout_v<::test_bits::FlexibleBits>);
static_assert(sizeof(::test_bits::FlexibleBits) == sizeof(uint64_t));

}  // namespace fidl
