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:
@ -147,17 +147,16 @@ void EditorDebuggerTree::update_scene_tree(const SceneDebuggerTree *p_tree, int
|
||||
|
||||
// Nodes are in a flatten list, depth first. Use a stack of parents, avoid recursion.
|
||||
List<Pair<TreeItem *, int>> parents;
|
||||
for (int i = 0; i < p_tree->nodes.size(); i++) {
|
||||
for (const SceneDebuggerTree::RemoteNode &node : p_tree->nodes) {
|
||||
TreeItem *parent = nullptr;
|
||||
if (parents.size()) { // Find last parent.
|
||||
Pair<TreeItem *, int> &p = parents[0];
|
||||
Pair<TreeItem *, int> &p = parents.front()->get();
|
||||
parent = p.first;
|
||||
if (!(--p.second)) { // If no child left, remove it.
|
||||
parents.pop_front();
|
||||
}
|
||||
}
|
||||
// Add this node.
|
||||
const SceneDebuggerTree::RemoteNode &node = p_tree->nodes[i];
|
||||
TreeItem *item = create_item(parent);
|
||||
item->set_text(0, node.name);
|
||||
if (node.scene_file_path.is_empty()) {
|
||||
@ -244,8 +243,8 @@ void EditorDebuggerTree::update_scene_tree(const SceneDebuggerTree *p_tree, int
|
||||
item = parent;
|
||||
parent = item->get_parent();
|
||||
// Check if parent expects more children.
|
||||
for (int j = 0; j < parents.size(); j++) {
|
||||
if (parents[j].first == item) {
|
||||
for (const Pair<TreeItem *, int> &pair : parents) {
|
||||
if (pair.first == item) {
|
||||
parent = nullptr;
|
||||
break; // Might have more children.
|
||||
}
|
||||
@ -326,8 +325,8 @@ void EditorDebuggerTree::_item_menu_id_pressed(int p_option) {
|
||||
Ref<PackedScene> sd = memnew(PackedScene);
|
||||
ResourceSaver::get_recognized_extensions(sd, &extensions);
|
||||
file_dialog->clear_filters();
|
||||
for (int i = 0; i < extensions.size(); i++) {
|
||||
file_dialog->add_filter("*." + extensions[i], extensions[i].to_upper());
|
||||
for (const String &extension : extensions) {
|
||||
file_dialog->add_filter("*." + extension, extension.to_upper());
|
||||
}
|
||||
|
||||
String filename = get_selected_path().get_file() + "." + extensions.front()->get().to_lower();
|
||||
|
||||
Reference in New Issue
Block a user