Reduce and prevent unnecessary random-access to List

Random-access access to `List` when iterating is `O(n^2)` (`O(n)` when
accessing a single element)

* Removed subscript operator, in favor of a more explicit `get`
* Added conversion from `Iterator` to `ConstIterator`
* Remade existing operations into other solutions when applicable
This commit is contained in:
A Thousand Ships 2024-04-15 15:18:34 +02:00
parent 7ebc866418
commit 955d5affa8
No known key found for this signature in database
GPG key ID: 2033189A662F8BD7
103 changed files with 877 additions and 849 deletions

View file

@ -75,8 +75,8 @@ void VersionControlEditorPlugin::_notification(int p_what) {
void VersionControlEditorPlugin::_populate_available_vcs_names() {
set_up_choice->clear();
for (int i = 0; i < available_plugins.size(); i++) {
set_up_choice->add_item(available_plugins[i]);
for (const StringName &available_plugin : available_plugins) {
set_up_choice->add_item(available_plugin);
}
}
@ -193,10 +193,11 @@ void VersionControlEditorPlugin::_refresh_branch_list() {
String current_branch = EditorVCSInterface::get_singleton()->get_current_branch_name();
for (int i = 0; i < branch_list.size(); i++) {
branch_select->add_icon_item(EditorNode::get_singleton()->get_editor_theme()->get_icon(SNAME("VcsBranches"), EditorStringName(EditorIcons)), branch_list[i], i);
int i = 0;
for (List<String>::ConstIterator itr = branch_list.begin(); itr != branch_list.end(); ++itr, ++i) {
branch_select->add_icon_item(EditorNode::get_singleton()->get_editor_theme()->get_icon(SNAME("VcsBranches"), EditorStringName(EditorIcons)), *itr, i);
if (branch_list[i] == current_branch) {
if (*itr == current_branch) {
branch_select->select(i);
}
}
@ -253,11 +254,12 @@ void VersionControlEditorPlugin::_refresh_remote_list() {
remote_select->set_disabled(remotes.is_empty());
for (int i = 0; i < remotes.size(); i++) {
remote_select->add_icon_item(EditorNode::get_singleton()->get_editor_theme()->get_icon(SNAME("ArrowUp"), EditorStringName(EditorIcons)), remotes[i], i);
remote_select->set_item_metadata(i, remotes[i]);
int i = 0;
for (List<String>::ConstIterator itr = remotes.begin(); itr != remotes.end(); ++itr, ++i) {
remote_select->add_icon_item(EditorNode::get_singleton()->get_editor_theme()->get_icon(SNAME("ArrowUp"), EditorStringName(EditorIcons)), *itr, i);
remote_select->set_item_metadata(i, *itr);
if (remotes[i] == current_remote) {
if (*itr == current_remote) {
remote_select->select(i);
}
}
@ -589,9 +591,7 @@ void VersionControlEditorPlugin::_display_diff(int p_idx) {
diff->pop();
}
for (int i = 0; i < diff_content.size(); i++) {
EditorVCSInterface::DiffFile diff_file = diff_content[i];
for (const EditorVCSInterface::DiffFile &diff_file : diff_content) {
diff->push_font(EditorNode::get_singleton()->get_editor_theme()->get_font(SNAME("doc_bold"), EditorStringName(EditorFonts)));
diff->push_color(EditorNode::get_singleton()->get_editor_theme()->get_color(SNAME("accent_color"), EditorStringName(Editor)));
diff->add_text(TTR("File:") + " " + diff_file.new_file);
@ -599,9 +599,7 @@ void VersionControlEditorPlugin::_display_diff(int p_idx) {
diff->pop();
diff->push_font(EditorNode::get_singleton()->get_editor_theme()->get_font(SNAME("status_source"), EditorStringName(EditorFonts)));
for (int j = 0; j < diff_file.diff_hunks.size(); j++) {
EditorVCSInterface::DiffHunk hunk = diff_file.diff_hunks[j];
for (EditorVCSInterface::DiffHunk hunk : diff_file.diff_hunks) {
String old_start = String::num_int64(hunk.old_start);
String new_start = String::num_int64(hunk.new_start);
String old_lines = String::num_int64(hunk.old_lines);
@ -628,10 +626,9 @@ void VersionControlEditorPlugin::_display_diff(int p_idx) {
}
void VersionControlEditorPlugin::_display_diff_split_view(List<EditorVCSInterface::DiffLine> &p_diff_content) {
List<EditorVCSInterface::DiffLine> parsed_diff;
LocalVector<EditorVCSInterface::DiffLine> parsed_diff;
for (int i = 0; i < p_diff_content.size(); i++) {
EditorVCSInterface::DiffLine diff_line = p_diff_content[i];
for (EditorVCSInterface::DiffLine diff_line : p_diff_content) {
String line = diff_line.content.strip_edges(false, true);
if (diff_line.new_line_no >= 0 && diff_line.old_line_no >= 0) {
@ -643,12 +640,12 @@ void VersionControlEditorPlugin::_display_diff_split_view(List<EditorVCSInterfac
diff_line.old_text = line;
parsed_diff.push_back(diff_line);
} else if (diff_line.old_line_no == -1) {
int j = parsed_diff.size() - 1;
int32_t j = parsed_diff.size() - 1;
while (j >= 0 && parsed_diff[j].new_line_no == -1) {
j--;
}
if (j == parsed_diff.size() - 1) {
if (j == (int32_t)parsed_diff.size() - 1) {
// no lines are modified
diff_line.new_text = line;
diff_line.old_text = "";
@ -677,7 +674,7 @@ void VersionControlEditorPlugin::_display_diff_split_view(List<EditorVCSInterfac
diff->set_table_column_expand(2, true);
diff->set_table_column_expand(5, true);
for (int i = 0; i < parsed_diff.size(); i++) {
for (uint32_t i = 0; i < parsed_diff.size(); i++) {
EditorVCSInterface::DiffLine diff_line = parsed_diff[i];
bool has_change = diff_line.status != " ";
@ -757,8 +754,7 @@ void VersionControlEditorPlugin::_display_diff_unified_view(List<EditorVCSInterf
[cell]status[/cell]
[cell]code[/cell]
*/
for (int i = 0; i < p_diff_content.size(); i++) {
EditorVCSInterface::DiffLine diff_line = p_diff_content[i];
for (const EditorVCSInterface::DiffLine &diff_line : p_diff_content) {
String line = diff_line.content.strip_edges(false, true);
Color color;