1254721Semaste//===-- History.h -----------------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#ifndef lldb_History_h_
11254721Semaste#define lldb_History_h_
12254721Semaste
13254721Semaste// C Includes
14254721Semaste#include <stdint.h>
15254721Semaste
16254721Semaste// C++ Includes
17254721Semaste#include <stack>
18254721Semaste#include <string>
19254721Semaste
20254721Semaste// Other libraries and framework includes
21254721Semaste// Project includes
22254721Semaste#include "lldb/lldb-public.h"
23254721Semaste#include "lldb/Host/Mutex.h"
24254721Semaste
25254721Semastenamespace lldb_private {
26254721Semaste
27254721Semaste//----------------------------------------------------------------------
28254721Semaste/// @class HistorySource History.h "lldb/Core/History.h"
29254721Semaste/// @brief A class that defines history events.
30254721Semaste//----------------------------------------------------------------------
31254721Semaste
32254721Semasteclass HistorySource
33254721Semaste{
34254721Semastepublic:
35254721Semaste    typedef const void * HistoryEvent;
36254721Semaste
37254721Semaste    HistorySource () :
38254721Semaste        m_mutex (Mutex::eMutexTypeRecursive),
39254721Semaste        m_events ()
40254721Semaste    {
41254721Semaste    }
42254721Semaste
43254721Semaste    virtual
44254721Semaste    ~HistorySource()
45254721Semaste    {
46254721Semaste    }
47254721Semaste
48254721Semaste    // Create a new history event. Subclasses should use any data or members
49254721Semaste    // in the subclass of this class to produce a history event and push it
50254721Semaste    // onto the end of the history stack.
51254721Semaste
52254721Semaste    virtual HistoryEvent
53254721Semaste    CreateHistoryEvent () = 0;
54254721Semaste
55254721Semaste    virtual void
56254721Semaste    DeleteHistoryEvent (HistoryEvent event) = 0;
57254721Semaste
58254721Semaste    virtual void
59254721Semaste    DumpHistoryEvent (Stream &strm, HistoryEvent event) = 0;
60254721Semaste
61254721Semaste    virtual size_t
62254721Semaste    GetHistoryEventCount() = 0;
63254721Semaste
64254721Semaste    virtual HistoryEvent
65254721Semaste    GetHistoryEventAtIndex (uint32_t idx) = 0;
66254721Semaste
67254721Semaste    virtual HistoryEvent
68254721Semaste    GetCurrentHistoryEvent () = 0;
69254721Semaste
70254721Semaste    // Return 0 when lhs == rhs, 1 if lhs > rhs, or -1 if lhs < rhs.
71254721Semaste    virtual int
72254721Semaste    CompareHistoryEvents (const HistoryEvent lhs,
73254721Semaste                          const HistoryEvent rhs) = 0;
74254721Semaste
75254721Semaste    virtual bool
76254721Semaste    IsCurrentHistoryEvent (const HistoryEvent event) = 0;
77254721Semaste
78254721Semasteprivate:
79254721Semaste    typedef std::stack<HistoryEvent> collection;
80254721Semaste
81254721Semaste    Mutex m_mutex;
82254721Semaste    collection m_events;
83254721Semaste
84254721Semaste    DISALLOW_COPY_AND_ASSIGN (HistorySource);
85254721Semaste
86254721Semaste};
87254721Semaste
88254721Semaste//----------------------------------------------------------------------
89254721Semaste/// @class HistorySourceUInt History.h "lldb/Core/History.h"
90254721Semaste/// @brief A class that defines history events that are represented by
91254721Semaste/// unsigned integers.
92254721Semaste///
93254721Semaste/// Any history event that is defined by a unique monotonically
94254721Semaste/// increasing unsigned integer
95254721Semaste//----------------------------------------------------------------------
96254721Semaste
97254721Semasteclass HistorySourceUInt : public HistorySource
98254721Semaste{
99254721Semaste    HistorySourceUInt (const char *id_name, uintptr_t start_value = 0u) :
100254721Semaste        HistorySource(),
101254721Semaste        m_name (id_name),
102254721Semaste        m_curr_id (start_value)
103254721Semaste    {
104254721Semaste    }
105254721Semaste
106254721Semaste    virtual
107254721Semaste    ~HistorySourceUInt()
108254721Semaste    {
109254721Semaste    }
110254721Semaste
111254721Semaste    // Create a new history event. Subclasses should use any data or members
112254721Semaste    // in the subclass of this class to produce a history event and push it
113254721Semaste    // onto the end of the history stack.
114254721Semaste
115254721Semaste    virtual HistoryEvent
116254721Semaste    CreateHistoryEvent ()
117254721Semaste    {
118254721Semaste        ++m_curr_id;
119254721Semaste        return (HistoryEvent)m_curr_id;
120254721Semaste    }
121254721Semaste
122254721Semaste    virtual void
123254721Semaste    DeleteHistoryEvent (HistoryEvent event)
124254721Semaste    {
125254721Semaste        // Nothing to delete, the event contains the integer
126254721Semaste    }
127254721Semaste
128254721Semaste    virtual void
129254721Semaste    DumpHistoryEvent (Stream &strm, HistoryEvent event);
130254721Semaste
131254721Semaste    virtual size_t
132254721Semaste    GetHistoryEventCount()
133254721Semaste    {
134254721Semaste        return m_curr_id;
135254721Semaste    }
136254721Semaste
137254721Semaste    virtual HistoryEvent
138254721Semaste    GetHistoryEventAtIndex (uint32_t idx)
139254721Semaste    {
140254721Semaste        return (HistoryEvent)((uintptr_t)idx);
141254721Semaste    }
142254721Semaste
143254721Semaste    virtual HistoryEvent
144254721Semaste    GetCurrentHistoryEvent ()
145254721Semaste    {
146254721Semaste        return (HistoryEvent)m_curr_id;
147254721Semaste    }
148254721Semaste
149254721Semaste    // Return 0 when lhs == rhs, 1 if lhs > rhs, or -1 if lhs < rhs.
150254721Semaste    virtual int
151254721Semaste    CompareHistoryEvents (const HistoryEvent lhs,
152254721Semaste                          const HistoryEvent rhs)
153254721Semaste    {
154254721Semaste        uintptr_t lhs_uint = (uintptr_t)lhs;
155254721Semaste        uintptr_t rhs_uint = (uintptr_t)rhs;
156254721Semaste        if (lhs_uint < rhs_uint)
157254721Semaste            return -1;
158254721Semaste        if (lhs_uint > rhs_uint)
159254721Semaste            return +1;
160254721Semaste        return 0;
161254721Semaste    }
162254721Semaste
163254721Semaste    virtual bool
164254721Semaste    IsCurrentHistoryEvent (const HistoryEvent event)
165254721Semaste    {
166254721Semaste        return (uintptr_t)event == m_curr_id;
167254721Semaste    }
168254721Semaste
169254721Semasteprotected:
170254721Semaste    std::string m_name; // The name of the history unsigned integer
171254721Semaste    uintptr_t m_curr_id; // The current value of the history unsigned unteger
172254721Semaste};
173254721Semaste
174254721Semaste
175254721Semaste} // namespace lldb_private
176254721Semaste
177254721Semaste#endif	// lldb_History_h_
178