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