1 //===-- History.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 #ifndef lldb_History_h_
11 #define lldb_History_h_
12 
13 // C Includes
14 #include <stdint.h>
15 
16 // C++ Includes
17 #include <stack>
18 #include <string>
19 
20 // Other libraries and framework includes
21 // Project includes
22 #include "lldb/lldb-public.h"
23 #include "lldb/Host/Mutex.h"
24 
25 namespace lldb_private {
26 
27 //----------------------------------------------------------------------
28 /// @class HistorySource History.h "lldb/Core/History.h"
29 /// @brief A class that defines history events.
30 //----------------------------------------------------------------------
31 
32 class HistorySource
33 {
34 public:
35     typedef const void * HistoryEvent;
36 
HistorySource()37     HistorySource () :
38         m_mutex (Mutex::eMutexTypeRecursive),
39         m_events ()
40     {
41     }
42 
43     virtual
~HistorySource()44     ~HistorySource()
45     {
46     }
47 
48     // Create a new history event. Subclasses should use any data or members
49     // in the subclass of this class to produce a history event and push it
50     // onto the end of the history stack.
51 
52     virtual HistoryEvent
53     CreateHistoryEvent () = 0;
54 
55     virtual void
56     DeleteHistoryEvent (HistoryEvent event) = 0;
57 
58     virtual void
59     DumpHistoryEvent (Stream &strm, HistoryEvent event) = 0;
60 
61     virtual size_t
62     GetHistoryEventCount() = 0;
63 
64     virtual HistoryEvent
65     GetHistoryEventAtIndex (uint32_t idx) = 0;
66 
67     virtual HistoryEvent
68     GetCurrentHistoryEvent () = 0;
69 
70     // Return 0 when lhs == rhs, 1 if lhs > rhs, or -1 if lhs < rhs.
71     virtual int
72     CompareHistoryEvents (const HistoryEvent lhs,
73                           const HistoryEvent rhs) = 0;
74 
75     virtual bool
76     IsCurrentHistoryEvent (const HistoryEvent event) = 0;
77 
78 private:
79     typedef std::stack<HistoryEvent> collection;
80 
81     Mutex m_mutex;
82     collection m_events;
83 
84     DISALLOW_COPY_AND_ASSIGN (HistorySource);
85 
86 };
87 
88 //----------------------------------------------------------------------
89 /// @class HistorySourceUInt History.h "lldb/Core/History.h"
90 /// @brief A class that defines history events that are represented by
91 /// unsigned integers.
92 ///
93 /// Any history event that is defined by a unique monotonically
94 /// increasing unsigned integer
95 //----------------------------------------------------------------------
96 
97 class HistorySourceUInt : public HistorySource
98 {
99     HistorySourceUInt (const char *id_name, uintptr_t start_value = 0u) :
HistorySource()100         HistorySource(),
101         m_name (id_name),
102         m_curr_id (start_value)
103     {
104     }
105 
106     virtual
~HistorySourceUInt()107     ~HistorySourceUInt()
108     {
109     }
110 
111     // Create a new history event. Subclasses should use any data or members
112     // in the subclass of this class to produce a history event and push it
113     // onto the end of the history stack.
114 
115     virtual HistoryEvent
CreateHistoryEvent()116     CreateHistoryEvent ()
117     {
118         ++m_curr_id;
119         return (HistoryEvent)m_curr_id;
120     }
121 
122     virtual void
DeleteHistoryEvent(HistoryEvent event)123     DeleteHistoryEvent (HistoryEvent event)
124     {
125         // Nothing to delete, the event contains the integer
126     }
127 
128     virtual void
129     DumpHistoryEvent (Stream &strm, HistoryEvent event);
130 
131     virtual size_t
GetHistoryEventCount()132     GetHistoryEventCount()
133     {
134         return m_curr_id;
135     }
136 
137     virtual HistoryEvent
GetHistoryEventAtIndex(uint32_t idx)138     GetHistoryEventAtIndex (uint32_t idx)
139     {
140         return (HistoryEvent)((uintptr_t)idx);
141     }
142 
143     virtual HistoryEvent
GetCurrentHistoryEvent()144     GetCurrentHistoryEvent ()
145     {
146         return (HistoryEvent)m_curr_id;
147     }
148 
149     // Return 0 when lhs == rhs, 1 if lhs > rhs, or -1 if lhs < rhs.
150     virtual int
CompareHistoryEvents(const HistoryEvent lhs,const HistoryEvent rhs)151     CompareHistoryEvents (const HistoryEvent lhs,
152                           const HistoryEvent rhs)
153     {
154         uintptr_t lhs_uint = (uintptr_t)lhs;
155         uintptr_t rhs_uint = (uintptr_t)rhs;
156         if (lhs_uint < rhs_uint)
157             return -1;
158         if (lhs_uint > rhs_uint)
159             return +1;
160         return 0;
161     }
162 
163     virtual bool
IsCurrentHistoryEvent(const HistoryEvent event)164     IsCurrentHistoryEvent (const HistoryEvent event)
165     {
166         return (uintptr_t)event == m_curr_id;
167     }
168 
169 protected:
170     std::string m_name; // The name of the history unsigned integer
171     uintptr_t m_curr_id; // The current value of the history unsigned unteger
172 };
173 
174 
175 } // namespace lldb_private
176 
177 #endif	// lldb_History_h_
178