//===-- 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() {}

  /// 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
