Skip to content

Commit b9ea8ad

Browse files
committed
Modified "ApplyTextInsertingCommands" to directly manipulate the passed std::string instead of creating a copy
1 parent 4bfc9bc commit b9ea8ad

File tree

5 files changed

+26
-25
lines changed

5 files changed

+26
-25
lines changed

src/game_interpreter.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1793,7 +1793,9 @@ std::string Game_Interpreter::CommandString(lcf::rpg::EventCommand const& com) {
17931793
#endif
17941794
return ToString(com.string);
17951795
}
1796-
return PendingMessage::ApplyTextInsertingCommands(ToString(com.string), Player::escape_char, Game_Message::CommandCodeInserter);
1796+
std::string command_string = ToString(com.string);
1797+
PendingMessage::ApplyTextInsertingCommands(command_string, Player::escape_char, Game_Message::CommandCodeInserter);
1798+
return command_string;
17971799
}
17981800

17991801

src/game_message.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,8 @@ static std::optional<std::string> CommandCodeInserterNoRecurse(char ch, const ch
164164
std::string str = ToString(Main_Data::game_strings->Get(value));
165165

166166
// \t[] is evaluated but command codes inside it are not evaluated again
167-
return PendingMessage::ApplyTextInsertingCommands(str, escape_char, PendingMessage::DefaultCommandInserter);
167+
PendingMessage::ApplyTextInsertingCommands(str, escape_char, PendingMessage::DefaultCommandInserter);
168+
return str;
168169
}
169170

170171
return PendingMessage::DefaultCommandInserter(ch, iter, end, escape_char);
@@ -179,7 +180,8 @@ std::optional<std::string> Game_Message::CommandCodeInserter(char ch, const char
179180
std::string str = ToString(Main_Data::game_strings->Get(value));
180181

181182
// Command codes in \t[] are evaluated once.
182-
return PendingMessage::ApplyTextInsertingCommands(str, escape_char, CommandCodeInserterNoRecurse);
183+
PendingMessage::ApplyTextInsertingCommands(str, escape_char, CommandCodeInserterNoRecurse);
184+
return str;
183185
}
184186

185187
return PendingMessage::DefaultCommandInserter(ch, iter, end, escape_char);

src/game_strings.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,9 @@ std::string Game_Strings::Extract(StringView string, bool as_hex) {
322322
cmd_fn = ManiacsCommandInserter;
323323
}
324324

325-
return PendingMessage::ApplyTextInsertingCommands(ToString(string), Player::escape_char, cmd_fn);
325+
std::string str = ToString(string);
326+
PendingMessage::ApplyTextInsertingCommands(str, Player::escape_char, cmd_fn);
327+
return str;
326328
}
327329

328330
std::optional<std::string> Game_Strings::ManiacsCommandInserter(char ch, const char** iter, const char* end, uint32_t escape_char) {

src/pending_message.cpp

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ PendingMessage::PendingMessage(PendingMessage::CommandInserter cmd_fn) :
4444

4545
int PendingMessage::PushLineImpl(std::string msg) {
4646
RemoveControlChars(msg);
47-
msg = ApplyTextInsertingCommands(std::move(msg), Player::escape_char, command_inserter);
47+
ApplyTextInsertingCommands(msg, Player::escape_char, command_inserter);
4848
texts.push_back(std::move(msg));
4949
return texts.size();
5050
}
@@ -94,17 +94,15 @@ void PendingMessage::SetChoiceResetColors(bool value) {
9494
choice_reset_color = value;
9595
}
9696

97-
std::string PendingMessage::ApplyTextInsertingCommands(std::string input, uint32_t escape_char, const CommandInserter& cmd_fn) {
97+
void PendingMessage::ApplyTextInsertingCommands(std::string& input, uint32_t escape_char, const CommandInserter& cmd_fn) {
9898
if (input.empty()) {
99-
return input;
99+
return;
100100
}
101101

102-
std::string output;
103-
104102
const char* iter = input.data();
105-
const auto end = input.data() + input.size();
103+
auto end = input.data() + input.size();
106104

107-
const char* start_copy = iter;
105+
const char* start_replace = nullptr;
108106
while (iter != end) {
109107
auto ret = Utils::UTF8Next(iter, end);
110108
if (ret.ch != escape_char) {
@@ -117,8 +115,7 @@ std::string PendingMessage::ApplyTextInsertingCommands(std::string input, uint32
117115
break;
118116
}
119117

120-
output.append(start_copy, iter - start_copy);
121-
start_copy = iter;
118+
start_replace = iter;
122119

123120
iter = ret.next;
124121
if (iter == end) {
@@ -130,19 +127,17 @@ std::string PendingMessage::ApplyTextInsertingCommands(std::string input, uint32
130127

131128
auto fn_res = cmd_fn(ch, &iter, end, escape_char);
132129
if (fn_res) {
133-
output.append(*fn_res);
134-
start_copy = iter;
135-
}
136-
}
130+
size_t repl_pos = start_replace - input.data();
131+
size_t repl_len = iter - start_replace;
132+
size_t insert_len = fn_res->size();
137133

138-
if (start_copy == input.data()) {
139-
// Fast path - no substitutions occured, so just move the input into the return value.
140-
output = std::move(input);
141-
} else {
142-
output.append(start_copy, end - start_copy);
143-
}
134+
input.replace(repl_pos, repl_len, fn_res->data(), insert_len);
144135

145-
return output;
136+
iter = input.data() + repl_pos + insert_len;
137+
end = input.data() + input.size();
138+
start_replace = nullptr;
139+
}
140+
}
146141
}
147142

148143
std::optional<std::string> PendingMessage::DefaultCommandInserter(char ch, const char** iter, const char* end, uint32_t escape_char) {

src/pending_message.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class PendingMessage {
6868

6969
void SetIsEventMessage(bool value) { is_event_message = value; }
7070
bool IsEventMessage() const { return is_event_message; }
71-
static std::string ApplyTextInsertingCommands(std::string input, uint32_t escape_char, const CommandInserter& cmd_fn);
71+
static void ApplyTextInsertingCommands(std::string& input, uint32_t escape_char, const CommandInserter& cmd_fn);
7272

7373
private:
7474
int PushLineImpl(std::string msg);

0 commit comments

Comments
 (0)