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
 |