mirror of
https://github.com/HarbourMasters/Shipwright
synced 2026-08-12 12:18:32 -04:00
Optimize CustomMessageManager.cpp (#6915)
Reduce copies. Fix Capitalize & GetAllMessages only modifying unused copies
This commit is contained in:
@@ -80,8 +80,8 @@ CustomMessage::CustomMessage(std::string english_, std::string german_, std::str
|
||||
messages[LANGUAGE_ENG] = std::move(english_);
|
||||
messages[LANGUAGE_GER] = std::move(german_);
|
||||
messages[LANGUAGE_FRA] = std::move(french_);
|
||||
colors = colors_;
|
||||
capital = capital_;
|
||||
colors = std::move(colors_);
|
||||
capital = std::move(capital_);
|
||||
type = type_;
|
||||
position = position_;
|
||||
}
|
||||
@@ -94,8 +94,8 @@ CustomMessage::CustomMessage(std::string english_, TextBoxType type_, TextBoxPos
|
||||
CustomMessage::CustomMessage(std::string english_, std::vector<std::string> colors_, std::vector<bool> capital_,
|
||||
TextBoxType type_, TextBoxPosition position_) {
|
||||
messages[LANGUAGE_ENG] = std::move(english_);
|
||||
colors = colors_;
|
||||
capital = capital_;
|
||||
colors = std::move(colors_);
|
||||
capital = std::move(capital_);
|
||||
type = type_;
|
||||
position = position_;
|
||||
}
|
||||
@@ -167,7 +167,7 @@ const std::string CustomMessage::GetForLanguage(uint8_t language, MessageFormat
|
||||
|
||||
const std::vector<std::string> CustomMessage::GetAllMessages(MessageFormat format) const {
|
||||
std::vector<std::string> output = messages;
|
||||
for (auto str : output) {
|
||||
for (auto& str : output) {
|
||||
ProcessMessageFormat(str, format);
|
||||
}
|
||||
return output;
|
||||
@@ -190,14 +190,14 @@ const std::vector<bool>& CustomMessage::GetCapital() const {
|
||||
}
|
||||
|
||||
void CustomMessage::SetCapital(std::vector<bool> capital_) {
|
||||
capital = capital_;
|
||||
capital = std::move(capital_);
|
||||
}
|
||||
const std::vector<std::string>& CustomMessage::GetColors() const {
|
||||
return colors;
|
||||
}
|
||||
|
||||
void CustomMessage::SetColors(std::vector<std::string> colors_) {
|
||||
colors = colors_;
|
||||
colors = std::move(colors_);
|
||||
}
|
||||
|
||||
const TextBoxType& CustomMessage::GetTextBoxType() const {
|
||||
@@ -218,8 +218,8 @@ void CustomMessage::SetTextBoxPosition(TextBoxPosition boxPos) {
|
||||
|
||||
CustomMessage CustomMessage::operator+(const CustomMessage& right) const {
|
||||
std::vector<std::string> newColors = colors;
|
||||
std::vector<std::string> rColors = right.GetColors();
|
||||
for (auto color : rColors) {
|
||||
const std::vector<std::string>& rColors = right.GetColors();
|
||||
for (const auto& color : rColors) {
|
||||
newColors.push_back(color);
|
||||
}
|
||||
std::vector<bool> newCapital = capital;
|
||||
@@ -253,7 +253,7 @@ bool CustomMessage::operator==(const CustomMessage& operand) const {
|
||||
}
|
||||
|
||||
bool CustomMessage::operator==(const std::string& operand) const {
|
||||
for (auto str : messages) {
|
||||
for (const auto& str : messages) {
|
||||
if (str == operand) {
|
||||
return true;
|
||||
}
|
||||
@@ -686,14 +686,16 @@ void CustomMessage::SetSingularPlural() {
|
||||
}
|
||||
|
||||
void CustomMessage::Capitalize() {
|
||||
for (std::string str : messages) {
|
||||
(str)[0] = std::toupper((str)[0]);
|
||||
for (std::string& str : messages) {
|
||||
if (!str.empty()) {
|
||||
str[0] = std::toupper(str[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CustomMessage::ReplaceSpecialCharacters(std::string& str) const {
|
||||
// add special characters
|
||||
for (auto specialCharacterPair : textBoxSpecialCharacters) {
|
||||
for (const auto& specialCharacterPair : textBoxSpecialCharacters) {
|
||||
size_t start_pos = 0;
|
||||
std::string textBoxSpecialCharacterString = ""s;
|
||||
textBoxSpecialCharacterString += specialCharacterPair.second;
|
||||
@@ -707,7 +709,7 @@ void CustomMessage::ReplaceSpecialCharacters(std::string& str) const {
|
||||
const char* Interface_ReplaceSpecialCharacters(char text[]) {
|
||||
std::string textString(text);
|
||||
|
||||
for (auto specialCharacterPair : textBoxSpecialCharacters) {
|
||||
for (const auto& specialCharacterPair : textBoxSpecialCharacters) {
|
||||
size_t start_pos = 0;
|
||||
std::string textBoxSpecialCharacterString = ""s;
|
||||
textBoxSpecialCharacterString += specialCharacterPair.second;
|
||||
@@ -723,7 +725,7 @@ const char* Interface_ReplaceSpecialCharacters(char text[]) {
|
||||
}
|
||||
|
||||
void CustomMessage::EncodeColors(std::string& str) const {
|
||||
for (std::string color : colors) {
|
||||
for (const std::string& color : colors) {
|
||||
if (const size_t firstHashtag = str.find('#'); firstHashtag != std::string::npos) {
|
||||
str.replace(firstHashtag, 1, colorToPercent.at(color));
|
||||
if (const size_t secondHashtag = str.find('#', firstHashtag + 1); secondHashtag != std::string::npos) {
|
||||
@@ -804,33 +806,33 @@ std::string CustomMessage::TWO_WAY_CHOICE() {
|
||||
return "\x1B"s;
|
||||
}
|
||||
|
||||
bool CustomMessageManager::InsertCustomMessage(std::string tableID, uint16_t textID, CustomMessage messages) {
|
||||
bool CustomMessageManager::InsertCustomMessage(const std::string& tableID, uint16_t textID, CustomMessage messages) {
|
||||
auto foundMessageTable = messageTables.find(tableID);
|
||||
if (foundMessageTable == messageTables.end()) {
|
||||
return false;
|
||||
}
|
||||
auto& messageTable = foundMessageTable->second;
|
||||
auto messageInsertResult = messageTable.emplace(textID, messages);
|
||||
auto messageInsertResult = messageTable.emplace(textID, std::move(messages));
|
||||
return messageInsertResult.second;
|
||||
}
|
||||
|
||||
bool CustomMessageManager::CreateGetItemMessage(std::string tableID, uint16_t giid, ItemID iid,
|
||||
bool CustomMessageManager::CreateGetItemMessage(const std::string& tableID, uint16_t giid, ItemID iid,
|
||||
CustomMessage messageEntry) {
|
||||
messageEntry.Format(iid);
|
||||
const uint16_t textID = giid;
|
||||
return InsertCustomMessage(tableID, textID, messageEntry);
|
||||
return InsertCustomMessage(tableID, textID, std::move(messageEntry));
|
||||
}
|
||||
|
||||
bool CustomMessageManager::CreateMessage(std::string tableID, uint16_t textID, CustomMessage messageEntry) {
|
||||
return InsertCustomMessage(tableID, textID, messageEntry);
|
||||
bool CustomMessageManager::CreateMessage(const std::string& tableID, uint16_t textID, CustomMessage messageEntry) {
|
||||
return InsertCustomMessage(tableID, textID, std::move(messageEntry));
|
||||
}
|
||||
|
||||
CustomMessage CustomMessageManager::RetrieveMessage(std::string tableID, uint16_t textID, MessageFormat format) {
|
||||
CustomMessage CustomMessageManager::RetrieveMessage(const std::string& tableID, uint16_t textID, MessageFormat format) {
|
||||
std::unordered_map<std::string, CustomMessageTable>::const_iterator foundMessageTable = messageTables.find(tableID);
|
||||
if (foundMessageTable == messageTables.end()) {
|
||||
throw(MessageNotFoundException(tableID, textID));
|
||||
}
|
||||
CustomMessageTable messageTable = foundMessageTable->second;
|
||||
const CustomMessageTable& messageTable = foundMessageTable->second;
|
||||
std::unordered_map<uint16_t, CustomMessage>::const_iterator foundMessage = messageTable.find(textID);
|
||||
if (foundMessage == messageTable.end()) {
|
||||
throw(MessageNotFoundException(tableID, textID));
|
||||
@@ -850,7 +852,7 @@ CustomMessage CustomMessageManager::RetrieveMessage(std::string tableID, uint16_
|
||||
return message;
|
||||
}
|
||||
|
||||
bool CustomMessageManager::ClearMessageTable(std::string tableID) {
|
||||
bool CustomMessageManager::ClearMessageTable(const std::string& tableID) {
|
||||
auto foundMessageTable = messageTables.find(tableID);
|
||||
if (foundMessageTable == messageTables.end()) {
|
||||
return false;
|
||||
@@ -860,7 +862,6 @@ bool CustomMessageManager::ClearMessageTable(std::string tableID) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CustomMessageManager::AddCustomMessageTable(std::string tableID) {
|
||||
CustomMessageTable newMessageTable;
|
||||
return messageTables.emplace(tableID, newMessageTable).second;
|
||||
bool CustomMessageManager::AddCustomMessageTable(const std::string& tableID) {
|
||||
return messageTables.try_emplace(tableID).second;
|
||||
}
|
||||
|
||||
@@ -247,7 +247,7 @@ class CustomMessageManager {
|
||||
private:
|
||||
std::unordered_map<std::string, CustomMessageTable> messageTables;
|
||||
|
||||
bool InsertCustomMessage(std::string tableID, uint16_t textID, CustomMessage message);
|
||||
bool InsertCustomMessage(const std::string& tableID, uint16_t textID, CustomMessage message);
|
||||
|
||||
public:
|
||||
static CustomMessageManager* Instance;
|
||||
@@ -266,7 +266,7 @@ class CustomMessageManager {
|
||||
* @return true if adding the custom message succeeds, or
|
||||
* @return false if it does not.
|
||||
*/
|
||||
bool CreateGetItemMessage(std::string tableID, uint16_t giid, ItemID iid, CustomMessage message);
|
||||
bool CreateGetItemMessage(const std::string& tableID, uint16_t giid, ItemID iid, CustomMessage message);
|
||||
|
||||
/**
|
||||
* @brief Formats the provided Custom Message Entry and inserts it into the table with the provided tableID,
|
||||
@@ -278,7 +278,7 @@ class CustomMessageManager {
|
||||
* @return true if adding the custom message succeeds, or
|
||||
* @return false if it does not.
|
||||
*/
|
||||
bool CreateMessage(std::string tableID, uint16_t textID, CustomMessage message);
|
||||
bool CreateMessage(const std::string& tableID, uint16_t textID, CustomMessage message);
|
||||
|
||||
/**
|
||||
* @brief Retrieves a message from the table with id tableID with the provided textID.
|
||||
@@ -292,7 +292,7 @@ class CustomMessageManager {
|
||||
* @param format the type of formatting to apply to the retrieved message
|
||||
* @return CustomMessage
|
||||
*/
|
||||
CustomMessage RetrieveMessage(std::string tableID, uint16_t textID, MessageFormat format = MF_RAW);
|
||||
CustomMessage RetrieveMessage(const std::string& tableID, uint16_t textID, MessageFormat format = MF_RAW);
|
||||
|
||||
/**
|
||||
* @brief Empties out the message table identified by tableID.
|
||||
@@ -301,7 +301,7 @@ class CustomMessageManager {
|
||||
* @return true if it was cleared successfully, or
|
||||
* @return false if the table did not exist
|
||||
*/
|
||||
bool ClearMessageTable(std::string tableID);
|
||||
bool ClearMessageTable(const std::string& tableID);
|
||||
|
||||
/**
|
||||
* @brief Creates an empty CustomMessageTable accessible at the provided tableID
|
||||
@@ -311,7 +311,7 @@ class CustomMessageManager {
|
||||
* @return false if not (i.e. because a table with that ID
|
||||
* already exists.)
|
||||
*/
|
||||
bool AddCustomMessageTable(std::string tableID);
|
||||
bool AddCustomMessageTable(const std::string& tableID);
|
||||
};
|
||||
|
||||
class MessageNotFoundException : public std::exception {
|
||||
|
||||
@@ -10,6 +10,7 @@ enum GameInteractionEffectQueryResult { Possible = 0x00, TemporarilyNotPossible
|
||||
|
||||
class GameInteractionEffectBase {
|
||||
public:
|
||||
virtual ~GameInteractionEffectBase() = default;
|
||||
virtual GameInteractionEffectQueryResult CanBeApplied() = 0;
|
||||
GameInteractionEffectQueryResult Apply();
|
||||
|
||||
|
||||
@@ -456,7 +456,7 @@ void Context::WriteHintJson(nlohmann::ordered_json& spoilerFileJson) {
|
||||
}
|
||||
|
||||
nlohmann::json getValueForMessage(std::unordered_map<std::string, nlohmann::json> map, CustomMessage message) {
|
||||
std::vector<std::string> strings = message.GetAllMessages();
|
||||
std::vector<std::string> strings = message.GetAllMessages(MF_CLEAN);
|
||||
for (uint8_t language = 0; language < LANGUAGE_MAX; language++) {
|
||||
if (map.contains(strings[language])) {
|
||||
return strings[language];
|
||||
|
||||
@@ -216,10 +216,10 @@ std::unordered_map<RandomizerHint, StaticHintInfo> StaticData::staticHintInfoMap
|
||||
};
|
||||
|
||||
std::unordered_map<std::string, uint32_t>
|
||||
StaticData::PopulateTranslationMap(std::unordered_map<uint32_t, CustomMessage> input) {
|
||||
StaticData::PopulateTranslationMap(const std::unordered_map<uint32_t, CustomMessage>& input) {
|
||||
std::unordered_map<std::string, uint32_t> output = {};
|
||||
for (const auto& [key, message] : input) {
|
||||
std::vector<std::string> strings = message.GetAllMessages();
|
||||
std::vector<std::string> strings = message.GetAllMessages(MF_CLEAN);
|
||||
for (std::string string : strings) {
|
||||
if (output.contains(string)) {
|
||||
if (output[string] != key) {
|
||||
@@ -235,10 +235,10 @@ StaticData::PopulateTranslationMap(std::unordered_map<uint32_t, CustomMessage> i
|
||||
}
|
||||
|
||||
std::unordered_map<std::string, uint32_t>
|
||||
StaticData::PopulateTranslationMap(std::unordered_map<uint32_t, RandomizerHintTextKey> input) {
|
||||
StaticData::PopulateTranslationMap(const std::unordered_map<uint32_t, RandomizerHintTextKey>& input) {
|
||||
std::unordered_map<std::string, uint32_t> output = {};
|
||||
for (const auto& [key, text] : input) {
|
||||
std::vector<std::string> strings = hintTextTable[text].GetClear().GetAllMessages();
|
||||
std::vector<std::string> strings = hintTextTable[text].GetClear().GetAllMessages(MF_CLEAN);
|
||||
for (std::string string : strings) {
|
||||
if (output.contains(string)) {
|
||||
if (output[string] != key) {
|
||||
|
||||
@@ -37,9 +37,9 @@ class StaticData {
|
||||
static Location* GetLocation(RandomizerCheck locKey);
|
||||
static std::array<Rando::Location, RC_MAX>& GetLocationTable();
|
||||
static std::unordered_map<std::string, uint32_t>
|
||||
PopulateTranslationMap(std::unordered_map<uint32_t, CustomMessage> input);
|
||||
PopulateTranslationMap(const std::unordered_map<uint32_t, CustomMessage>& input);
|
||||
static std::unordered_map<std::string, uint32_t>
|
||||
PopulateTranslationMap(std::unordered_map<uint32_t, RandomizerHintTextKey> input);
|
||||
PopulateTranslationMap(const std::unordered_map<uint32_t, RandomizerHintTextKey>& input);
|
||||
static std::multimap<std::tuple<s16, s16, s32>, RandomizerCheck> CheckFromActorMultimap;
|
||||
static std::vector<RandomizerCheck> GetAllDungeonLocations();
|
||||
static std::vector<RandomizerCheck> dungeonRewardLocations;
|
||||
|
||||
@@ -77,7 +77,7 @@ void Trials::ParseJson(nlohmann::json spoilerFileJson) {
|
||||
for (auto& trial : mTrials) {
|
||||
trial.SetAsSkipped();
|
||||
|
||||
for (auto nameInLang : trial.GetName().GetAllMessages()) {
|
||||
for (auto nameInLang : trial.GetName().GetAllMessages(MF_CLEAN)) {
|
||||
if (std::find(trialsJson.begin(), trialsJson.end(), nameInLang) != trialsJson.end()) {
|
||||
trial.SetAsRequired();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user