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
25namespace lldb_private {
26
27//----------------------------------------------------------------------
28/// @class HistorySource History.h "lldb/Core/History.h"
29/// @brief A class that defines history events.
30//----------------------------------------------------------------------
31
32class HistorySource
33{
34public:
35    typedef const void * HistoryEvent;
36
37    HistorySource () :
38        m_mutex (Mutex::eMutexTypeRecursive),
39        m_events ()
40    {
41    }
42
43    virtual
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
78private:
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
97class HistorySourceUInt : public HistorySource
98{
99    HistorySourceUInt (const char *id_name, uintptr_t start_value = 0u) :
100        HistorySource(),
101        m_name (id_name),
102        m_curr_id (start_value)
103    {
104    }
105
106    virtual
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
116    CreateHistoryEvent ()
117    {
118        ++m_curr_id;
119        return (HistoryEvent)m_curr_id;
120    }
121
122    virtual void
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
132    GetHistoryEventCount()
133    {
134        return m_curr_id;
135    }
136
137    virtual HistoryEvent
138    GetHistoryEventAtIndex (uint32_t idx)
139    {
140        return (HistoryEvent)((uintptr_t)idx);
141    }
142
143    virtual HistoryEvent
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
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
164    IsCurrentHistoryEvent (const HistoryEvent event)
165    {
166        return (uintptr_t)event == m_curr_id;
167    }
168
169protected:
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