//===-- UserID.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_USERID_H
#define LLDB_UTILITY_USERID_H

#include "lldb/lldb-defines.h"
#include "lldb/lldb-types.h"

namespace lldb_private {
class Stream;

/// \class UserID UserID.h "lldb/Core/UserID.h"
/// A mix in class that contains a generic user ID.
///
/// UserID is designed as a mix in class that can contain an integer based
/// unique identifier for a variety of objects in lldb.
///
/// The value for this identifier is chosen by each parser plug-in. A value
/// should be chosen that makes sense for each kind of object and should allow
/// quick access to further and more in depth parsing.
///
/// Symbol table entries can use this to store the original symbol table
/// index, functions can use it to store the symbol table index or the
/// DWARF offset.
struct UserID {
  /// Construct with optional user ID.
  UserID(lldb::user_id_t uid = LLDB_INVALID_UID) : m_uid(uid) {}

  /// Destructor.
  ~UserID() = default;

  /// Clears the object state.
  ///
  /// Clears the object contents back to a default invalid state.
  void Clear() { m_uid = LLDB_INVALID_UID; }

  /// Get accessor for the user ID.
  ///
  /// \return
  ///     The user ID.
  lldb::user_id_t GetID() const { return m_uid; }

  /// Set accessor for the user ID.
  ///
  /// \param[in] uid
  ///     The new user ID.
  void SetID(lldb::user_id_t uid) { m_uid = uid; }

  /// Unary predicate function object that can search for a matching user ID.
  ///
  /// Function object that can be used on any class that inherits from UserID:
  /// \code
  /// iterator pos;
  /// pos = std::find_if (coll.begin(), coll.end(), UserID::IDMatches(blockID));
  /// \endcode
  class IDMatches {
  public:
    /// Construct with the user ID to look for.
    IDMatches(lldb::user_id_t uid) : m_uid(uid) {}

    /// Unary predicate function object callback.
    bool operator()(const UserID &rhs) const { return m_uid == rhs.GetID(); }

  private:
    // Member variables.
    const lldb::user_id_t m_uid; ///< The user ID we are looking for
  };

protected:
  // Member variables.
  lldb::user_id_t m_uid; ///< The user ID that uniquely identifies an object.
};

inline bool operator==(const UserID &lhs, const UserID &rhs) {
  return lhs.GetID() == rhs.GetID();
}

inline bool operator!=(const UserID &lhs, const UserID &rhs) {
  return lhs.GetID() != rhs.GetID();
}

/// Stream the UserID object to a Stream.
Stream &operator<<(Stream &strm, const UserID &uid);

} // namespace lldb_private

#endif // LLDB_UTILITY_USERID_H
