//===-- Flags.h -------------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_UTILITY_FLAGS_H
#define LLDB_UTILITY_FLAGS_H

#include <cstddef>
#include <cstdint>

namespace lldb_private {

/// \class Flags Flags.h "lldb/Utility/Flags.h"
/// A class to manage flags.
///
/// The Flags class managed flag bits and allows testing and modification of
/// individual or multiple flag bits.
class Flags {
public:
  /// The value type for flags is a 32 bit unsigned integer type.
  typedef uint32_t ValueType;

  /// Construct with initial flag bit values.
  ///
  /// Constructs this object with \a mask as the initial value for all of the
  /// flags.
  ///
  /// \param[in] mask
  ///     The initial value for all flags.
  Flags(ValueType flags = 0) : m_flags(flags) {}

  /// Copy constructor.
  ///
  /// Construct and copy the flags from \a rhs.
  ///
  /// \param[in] rhs
  ///     A const Flags object reference to copy.
  Flags(const Flags &rhs) : m_flags(rhs.m_flags) {}

  /// Destructor.
  ~Flags() {}

  /// Get accessor for all flags.
  ///
  /// \return
  ///     Returns all of the flags as a Flags::ValueType.
  ValueType Get() const { return m_flags; }

  /// Return the number of flags that can be represented in this object.
  ///
  /// \return
  ///     The maximum number bits in this flag object.
  size_t GetBitSize() const { return sizeof(ValueType) * 8; }

  /// Set accessor for all flags.
  ///
  /// \param[in] flags
  ///     The bits with which to replace all of the current flags.
  void Reset(ValueType flags) { m_flags = flags; }

  /// Clear one or more flags.
  ///
  /// \param[in] mask
  ///     A bitfield containing one or more flags.
  ///
  /// \return
  ///     The new flags after clearing all bits from \a mask.
  ValueType Clear(ValueType mask = ~(ValueType)0) {
    m_flags &= ~mask;
    return m_flags;
  }

  /// Set one or more flags by logical OR'ing \a mask with the current flags.
  ///
  /// \param[in] mask
  ///     A bitfield containing one or more flags.
  ///
  /// \return
  ///     The new flags after setting all bits from \a mask.
  ValueType Set(ValueType mask) {
    m_flags |= mask;
    return m_flags;
  }

  /// Test if all bits in \a mask are 1 in the current flags
  ///
  /// \return
  ///     \b true if all flags in \a mask are 1, \b false
  ///     otherwise.
  bool AllSet(ValueType mask) const { return (m_flags & mask) == mask; }

  /// Test one or more flags.
  ///
  /// \return
  ///     \b true if any flags in \a mask are 1, \b false
  ///     otherwise.
  bool AnySet(ValueType mask) const { return (m_flags & mask) != 0; }

  /// Test a single flag bit.
  ///
  /// \return
  ///     \b true if \a bit is set, \b false otherwise.
  bool Test(ValueType bit) const { return (m_flags & bit) != 0; }

  /// Test if all bits in \a mask are clear.
  ///
  /// \return
  ///     \b true if \b all flags in \a mask are clear, \b false
  ///     otherwise.
  bool AllClear(ValueType mask) const { return (m_flags & mask) == 0; }

  bool AnyClear(ValueType mask) const { return (m_flags & mask) != mask; }

  /// Test a single flag bit to see if it is clear (zero).
  ///
  /// \return
  ///     \b true if \a bit is 0, \b false otherwise.
  bool IsClear(ValueType bit) const { return (m_flags & bit) == 0; }

  /// Get the number of zero bits in \a m_flags.
  ///
  /// \return
  ///     The number of bits that are set to 0 in the current flags.
  size_t ClearCount() const {
    size_t count = 0;
    for (ValueType shift = 0; shift < sizeof(ValueType) * 8; ++shift) {
      if ((m_flags & (1u << shift)) == 0)
        ++count;
    }
    return count;
  }

  /// Get the number of one bits in \a m_flags.
  ///
  /// \return
  ///     The number of bits that are set to 1 in the current flags.
  size_t SetCount() const {
    size_t count = 0;
    for (ValueType mask = m_flags; mask; mask >>= 1) {
      if (mask & 1u)
        ++count;
    }
    return count;
  }

protected:
  ValueType m_flags; ///< The flags.
};

} // namespace lldb_private

#endif // liblldb_Flags_h_
