diff --git a/Source/Core/Core/DSP/DSPAssembler.cpp b/Source/Core/Core/DSP/DSPAssembler.cpp index 5926bf9895e5..549e7df8f27c 100644 --- a/Source/Core/Core/DSP/DSPAssembler.cpp +++ b/Source/Core/Core/DSP/DSPAssembler.cpp @@ -200,9 +200,9 @@ s32 DSPAssembler::ParseValue(const char* str) else // Everything else is a label. { // Lookup label - u16 value; - if (m_labels.GetLabelValue(ptr, &value)) - return value; + if (const std::optional value = m_labels.GetLabelValue(ptr)) + return *value; + if (m_cur_pass == 2) ShowError(AssemblerError::UnknownLabel, str); } diff --git a/Source/Core/Core/DSP/LabelMap.cpp b/Source/Core/Core/DSP/LabelMap.cpp index e2e157ba7944..5ff74b2e5892 100644 --- a/Source/Core/Core/DSP/LabelMap.cpp +++ b/Source/Core/Core/DSP/LabelMap.cpp @@ -4,6 +4,7 @@ #include "Core/DSP/LabelMap.h" +#include #include #include @@ -11,9 +12,20 @@ namespace DSP { -LabelMap::LabelMap() +struct LabelMap::Label { -} + Label(std::string lbl, s32 address, LabelType ltype) + : name(std::move(lbl)), addr(address), type(ltype) + { + } + std::string name; + s32 addr; + LabelType type; +}; + +LabelMap::LabelMap() = default; + +LabelMap::~LabelMap() = default; void LabelMap::RegisterDefaults() { @@ -30,40 +42,38 @@ void LabelMap::RegisterDefaults() } } -void LabelMap::RegisterLabel(const std::string& label, u16 lval, LabelType type) +void LabelMap::RegisterLabel(std::string label, u16 lval, LabelType type) { - u16 old_value; - if (GetLabelValue(label, &old_value) && old_value != lval) + const std::optional old_value = GetLabelValue(label); + if (old_value && old_value != lval) { printf("WARNING: Redefined label %s to %04x - old value %04x\n", label.c_str(), lval, - old_value); + *old_value); DeleteLabel(label); } - labels.emplace_back(label, lval, type); + labels.emplace_back(std::move(label), lval, type); } -void LabelMap::DeleteLabel(const std::string& label) +void LabelMap::DeleteLabel(std::string_view label) { - for (std::vector::iterator iter = labels.begin(); iter != labels.end(); ++iter) - { - if (!label.compare(iter->name)) - { - labels.erase(iter); - return; - } - } + const auto iter = std::find_if(labels.cbegin(), labels.cend(), + [&label](const auto& entry) { return entry.name == label; }); + + if (iter == labels.cend()) + return; + + labels.erase(iter); } -bool LabelMap::GetLabelValue(const std::string& name, u16* value, LabelType type) const +std::optional LabelMap::GetLabelValue(const std::string& name, LabelType type) const { - for (auto& label : labels) + for (const auto& label : labels) { - if (!name.compare(label.name)) + if (name == label.name) { - if (type & label.type) + if ((type & label.type) != 0) { - *value = label.addr; - return true; + return label.addr; } else { @@ -71,7 +81,8 @@ bool LabelMap::GetLabelValue(const std::string& name, u16* value, LabelType type } } } - return false; + + return std::nullopt; } void LabelMap::Clear() diff --git a/Source/Core/Core/DSP/LabelMap.h b/Source/Core/Core/DSP/LabelMap.h index d3252a6feb70..2061a7ba5539 100644 --- a/Source/Core/Core/DSP/LabelMap.h +++ b/Source/Core/Core/DSP/LabelMap.h @@ -4,7 +4,9 @@ #pragma once +#include #include +#include #include #include "Common/CommonTypes.h" @@ -21,25 +23,18 @@ enum LabelType class LabelMap { - struct label_t - { - label_t(const std::string& lbl, s32 address, LabelType ltype) - : name(lbl), addr(address), type(ltype) - { - } - std::string name; - s32 addr; - LabelType type; - }; - std::vector labels; - public: LabelMap(); - ~LabelMap() {} + ~LabelMap(); + void RegisterDefaults(); - void RegisterLabel(const std::string& label, u16 lval, LabelType type = LABEL_VALUE); - void DeleteLabel(const std::string& label); - bool GetLabelValue(const std::string& label, u16* value, LabelType type = LABEL_ANY) const; + void RegisterLabel(std::string label, u16 lval, LabelType type = LABEL_VALUE); + void DeleteLabel(std::string_view label); + std::optional GetLabelValue(const std::string& label, LabelType type = LABEL_ANY) const; void Clear(); + +private: + struct Label; + std::vector