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