1//===-- UserID.h ------------------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10
11#ifndef liblldb_UserID_h_
12#define liblldb_UserID_h_
13
14#include "lldb/lldb-private.h"
15
16namespace lldb_private {
17
18//----------------------------------------------------------------------
19/// @class UserID UserID.h "lldb/Core/UserID.h"
20/// @brief A mix in class that contains a generic user ID.
21///
22/// UserID is desinged as a mix in class that can contain an integer
23/// based unique identifier for a varietly of objects in lldb.
24///
25/// The value for this identifier is chosen by each parser plug-in. A
26/// value should be chosen that makes sense for each kind of object
27/// should and allows quick access to further and more in depth parsing.
28///
29/// Symbol table entries can use this to store the original symbol table
30/// index, functions can use it to store the symbol table index or the
31/// DWARF offset.
32//----------------------------------------------------------------------
33struct UserID
34{
35    //------------------------------------------------------------------
36    /// Construct with optional user ID.
37    //------------------------------------------------------------------
38    UserID (lldb::user_id_t uid = LLDB_INVALID_UID) : m_uid(uid) {}
39
40    //------------------------------------------------------------------
41    /// Destructor.
42    //------------------------------------------------------------------
43    ~UserID ()
44    {
45    }
46
47    //------------------------------------------------------------------
48    /// Clears the object state.
49    ///
50    /// Clears the object contents back to a default invalid state.
51    //------------------------------------------------------------------
52    void
53    Clear () { m_uid = LLDB_INVALID_UID; }
54
55    //------------------------------------------------------------------
56    /// Get accessor for the user ID.
57    ///
58    /// @return
59    ///     The user ID.
60    //------------------------------------------------------------------
61    lldb::user_id_t
62    GetID () const { return m_uid; }
63
64    //------------------------------------------------------------------
65    /// Set accessor for the user ID.
66    ///
67    /// @param[in] uid
68    ///     The new user ID.
69    //------------------------------------------------------------------
70    void
71    SetID (lldb::user_id_t uid) { m_uid = uid; }
72
73    //------------------------------------------------------------------
74    /// Unary predicate function object that can search for a matching
75    /// user ID.
76    ///
77    /// Function object that can be used on any class that inherits
78    /// from UserID:
79    /// \code
80    /// iterator pos;
81    /// pos = std::find_if (coll.begin(), coll.end(), UserID::IDMatches(blockID));
82    /// \endcode
83    //------------------------------------------------------------------
84    class IDMatches
85    {
86    public:
87        //--------------------------------------------------------------
88        /// Construct with the user ID to look for.
89        //--------------------------------------------------------------
90        IDMatches (lldb::user_id_t uid) : m_uid(uid) {}
91
92        //--------------------------------------------------------------
93        /// Unary predicate function object callback.
94        //--------------------------------------------------------------
95        bool
96        operator () (const UserID& rhs) const { return m_uid == rhs.GetID(); }
97
98    private:
99        //--------------------------------------------------------------
100        // Member variables.
101        //--------------------------------------------------------------
102        const lldb::user_id_t m_uid; ///< The user ID we are looking for
103    };
104
105
106protected:
107    //------------------------------------------------------------------
108    // Member variables.
109    //------------------------------------------------------------------
110    lldb::user_id_t m_uid; ///< The user ID that uniquely identifies an object.
111};
112
113inline bool operator== (const UserID& lhs, const UserID& rhs)
114{
115  return lhs.GetID() == rhs.GetID();
116}
117
118inline bool operator!= (const UserID& lhs, const UserID& rhs)
119{
120  return lhs.GetID() != rhs.GetID();
121}
122
123//--------------------------------------------------------------
124/// Stream the UserID object to a Stream.
125//--------------------------------------------------------------
126Stream& operator << (Stream& strm, const UserID& uid);
127
128} // namespace lldb_private
129
130#endif  // liblldb_UserID_h_
131