Merge pull request #1710 from hrydgard/optimize-event-breakpoints
Replace std::map with std::array for graphics event breakpoints
This commit is contained in:
		@@ -75,7 +75,7 @@ QVariant BreakPointModel::data(const QModelIndex& index, int role) const
 | 
			
		||||
    case Role_IsEnabled:
 | 
			
		||||
    {
 | 
			
		||||
        auto context = context_weak.lock();
 | 
			
		||||
        return context && context->breakpoints[event].enabled;
 | 
			
		||||
        return context && context->breakpoints[(int)event].enabled;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
@@ -110,7 +110,7 @@ bool BreakPointModel::setData(const QModelIndex& index, const QVariant& value, i
 | 
			
		||||
        if (!context)
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        context->breakpoints[event].enabled = value == Qt::Checked;
 | 
			
		||||
        context->breakpoints[(int)event].enabled = value == Qt::Checked;
 | 
			
		||||
        QModelIndex changed_index = createIndex(index.row(), 0);
 | 
			
		||||
        emit dataChanged(changed_index, changed_index);
 | 
			
		||||
        return true;
 | 
			
		||||
 
 | 
			
		||||
@@ -40,10 +40,7 @@ using nihstro::DVLPHeader;
 | 
			
		||||
 | 
			
		||||
namespace Pica {
 | 
			
		||||
 | 
			
		||||
void DebugContext::OnEvent(Event event, void* data) {
 | 
			
		||||
    if (!breakpoints[event].enabled)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
void DebugContext::DoOnEvent(Event event, void* data) {
 | 
			
		||||
    {
 | 
			
		||||
        std::unique_lock<std::mutex> lock(breakpoint_mutex);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -114,7 +114,15 @@ public:
 | 
			
		||||
     * @param event Event which has happened
 | 
			
		||||
     * @param data Optional data pointer (pass nullptr if unused). Needs to remain valid until Resume() is called.
 | 
			
		||||
     */
 | 
			
		||||
    void OnEvent(Event event, void* data);
 | 
			
		||||
    void OnEvent(Event event, void* data) {
 | 
			
		||||
        // This check is left in the header to allow the compiler to inline it.
 | 
			
		||||
        if (!breakpoints[(int)event].enabled)
 | 
			
		||||
            return;
 | 
			
		||||
        // For the rest of event handling, call a separate function.
 | 
			
		||||
        DoOnEvent(event, data);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void DoOnEvent(Event event, void *data);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Resume from the current breakpoint.
 | 
			
		||||
@@ -126,12 +134,14 @@ public:
 | 
			
		||||
     * Delete all set breakpoints and resume emulation.
 | 
			
		||||
     */
 | 
			
		||||
    void ClearBreakpoints() {
 | 
			
		||||
        breakpoints.clear();
 | 
			
		||||
        for (auto &bp : breakpoints) {
 | 
			
		||||
            bp.enabled = false;
 | 
			
		||||
        }
 | 
			
		||||
        Resume();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // TODO: Evaluate if access to these members should be hidden behind a public interface.
 | 
			
		||||
    std::map<Event, BreakPoint> breakpoints;
 | 
			
		||||
    std::array<BreakPoint, (int)Event::NumEvents> breakpoints;
 | 
			
		||||
    Event active_breakpoint;
 | 
			
		||||
    bool at_breakpoint = false;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user