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 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 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) : 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 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