forked from dolphin-emu/dolphin
		
	
		
			
	
	
		
			119 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			119 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								// Copyright 2018 Dolphin Emulator Project
							 | 
						||
| 
								 | 
							
								// Licensed under GPLv2+
							 | 
						||
| 
								 | 
							
								// Refer to the license.txt file included.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "Common/Debug/Watches.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <algorithm>
							 | 
						||
| 
								 | 
							
								#include <sstream>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Common::Debug
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								Watch::Watch(u32 address_, const std::string& name_, Watch::State is_enabled_)
							 | 
						||
| 
								 | 
							
								    : address(address_), name(name_), is_enabled(is_enabled_)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								std::size_t Watches::SetWatch(u32 address, const std::string& name)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  const std::size_t size = m_watches.size();
							 | 
						||
| 
								 | 
							
								  for (std::size_t index = 0; index < size; index++)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    if (m_watches.at(index).address == address)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      UpdateWatch(index, address, name);
							 | 
						||
| 
								 | 
							
								      return index;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  m_watches.emplace_back(address, name, Watch::State::Enabled);
							 | 
						||
| 
								 | 
							
								  return size;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const Watch& Watches::GetWatch(std::size_t index) const
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  return m_watches.at(index);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const std::vector<Watch>& Watches::GetWatches() const
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  return m_watches;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Watches::UnsetWatch(u32 address)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  m_watches.erase(std::remove_if(m_watches.begin(), m_watches.end(),
							 | 
						||
| 
								 | 
							
								                                 [address](const auto& watch) { return watch.address == address; }),
							 | 
						||
| 
								 | 
							
								                  m_watches.end());
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Watches::UpdateWatch(std::size_t index, u32 address, const std::string& name)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  m_watches[index].address = address;
							 | 
						||
| 
								 | 
							
								  m_watches[index].name = name;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Watches::UpdateWatchAddress(std::size_t index, u32 address)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  m_watches[index].address = address;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Watches::UpdateWatchName(std::size_t index, const std::string& name)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  m_watches[index].name = name;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Watches::EnableWatch(std::size_t index)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  m_watches[index].is_enabled = Watch::State::Enabled;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Watches::DisableWatch(std::size_t index)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  m_watches[index].is_enabled = Watch::State::Disabled;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bool Watches::HasEnabledWatch(u32 address) const
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  return std::any_of(m_watches.begin(), m_watches.end(), [address](const auto& watch) {
							 | 
						||
| 
								 | 
							
								    return watch.address == address && watch.is_enabled == Watch::State::Enabled;
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Watches::RemoveWatch(std::size_t index)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  m_watches.erase(m_watches.begin() + index);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Watches::LoadFromStrings(const std::vector<std::string>& watches)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  for (const std::string& watch : watches)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    std::stringstream ss;
							 | 
						||
| 
								 | 
							
								    u32 address;
							 | 
						||
| 
								 | 
							
								    std::string name;
							 | 
						||
| 
								 | 
							
								    ss << std::hex << watch;
							 | 
						||
| 
								 | 
							
								    ss >> address;
							 | 
						||
| 
								 | 
							
								    ss >> std::ws;
							 | 
						||
| 
								 | 
							
								    std::getline(ss, name);
							 | 
						||
| 
								 | 
							
								    SetWatch(address, name);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								std::vector<std::string> Watches::SaveToStrings() const
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  std::vector<std::string> watches;
							 | 
						||
| 
								 | 
							
								  for (const auto& watch : m_watches)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    std::stringstream ss;
							 | 
						||
| 
								 | 
							
								    ss << std::hex << watch.address << " " << watch.name;
							 | 
						||
| 
								 | 
							
								    watches.push_back(ss.str());
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return watches;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Watches::Clear()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  m_watches.clear();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								}  // namespace Common::Debug
							 |