diff --git a/core/templates/rb_map.h b/core/templates/rb_map.h index 7c207928af..105b5283e3 100644 --- a/core/templates/rb_map.h +++ b/core/templates/rb_map.h @@ -757,13 +757,34 @@ public: } void operator=(const RBMap &p_map) { + if (this == &p_map) { + return; + } + _copy_from(p_map); } - RBMap(const RBMap &p_map) { + void operator=(RBMap &&p_map) { + if (this == &p_map) { + return; + } + + SWAP(_data._root, p_map._data._root); + SWAP(_data.size_cache, p_map._data.size_cache); + } + + explicit RBMap(const RBMap &p_map) { _copy_from(p_map); } + RBMap(RBMap &&p_map) { + _data._root = p_map._data._root; + _data.size_cache = p_map._data.size_cache; + + p_map._data._root = nullptr; + p_map._data.size_cache = 0; + } + RBMap(std::initializer_list> p_init) { for (const KeyValue &E : p_init) { insert(E.key, E.value); diff --git a/core/templates/rb_set.h b/core/templates/rb_set.h index e0a3cf54dc..98c879cc45 100644 --- a/core/templates/rb_set.h +++ b/core/templates/rb_set.h @@ -694,13 +694,34 @@ public: } void operator=(const RBSet &p_set) { + if (this == &p_set) { + return; + } + _copy_from(p_set); } - RBSet(const RBSet &p_set) { + void operator=(RBSet &&p_set) { + if (this == &p_set) { + return; + } + + SWAP(_data._root, p_set._data._root); + SWAP(_data.size_cache, p_set._data.size_cache); + } + + explicit RBSet(const RBSet &p_set) { _copy_from(p_set); } + RBSet(RBSet &&p_set) { + _data._root = p_set._data._root; + _data.size_cache = p_set._data.size_cache; + + p_set._data._root = nullptr; + p_set._data.size_cache = 0; + } + RBSet(std::initializer_list p_init) { for (const T &E : p_init) { insert(E); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index efa7b904f5..a06e50ac63 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -256,7 +256,7 @@ void EditorNode::disambiguate_filenames(const Vector p_full_paths, Vecto // For each index set with a size > 1, we need to disambiguate. for (int i = 0; i < index_sets.size(); i++) { - RBSet iset = index_sets[i]; + RBSet iset(index_sets[i]); while (iset.size() > 1) { // Append the parent folder to each scene name. for (const int &E : iset) { diff --git a/editor/scene/2d/tiles/tile_set_atlas_source_editor.h b/editor/scene/2d/tiles/tile_set_atlas_source_editor.h index 2407e287b4..d6fa75068f 100644 --- a/editor/scene/2d/tiles/tile_set_atlas_source_editor.h +++ b/editor/scene/2d/tiles/tile_set_atlas_source_editor.h @@ -101,7 +101,7 @@ public: public: Ref get_edited_tile_set_atlas_source() const { return tile_set_atlas_source; } - RBSet get_edited_tiles() const { return tiles; } + RBSet get_edited_tiles() const { return RBSet(tiles); } // Update the proxied object. void edit(Ref p_tile_set_atlas_source, const RBSet &p_tiles = RBSet()); diff --git a/scene/2d/tile_map_layer.cpp b/scene/2d/tile_map_layer.cpp index 10bac836f3..6185d482ae 100644 --- a/scene/2d/tile_map_layer.cpp +++ b/scene/2d/tile_map_layer.cpp @@ -2382,7 +2382,7 @@ HashMap TileMapLayer::terrain_fill_constrain } // Copy the constraints set. - RBSet constraints = p_constraints; + RBSet constraints(p_constraints); // Output map. HashMap output; diff --git a/scene/resources/2d/tile_set.cpp b/scene/resources/2d/tile_set.cpp index 029d6d7035..c69e1bc478 100644 --- a/scene/resources/2d/tile_set.cpp +++ b/scene/resources/2d/tile_set.cpp @@ -1399,7 +1399,7 @@ RBSet TileSet::get_terrains_pattern_set(int p_terrain_ RBSet TileSet::get_tiles_for_terrains_pattern(int p_terrain_set, TerrainsPattern p_terrain_tile_pattern) { ERR_FAIL_INDEX_V(p_terrain_set, terrain_sets.size(), RBSet()); _update_terrains_cache(); - return per_terrain_pattern_tiles[p_terrain_set][p_terrain_tile_pattern]; + return RBSet(per_terrain_pattern_tiles[p_terrain_set][p_terrain_tile_pattern]); } TileMapCell TileSet::get_random_tile_from_terrains_pattern(int p_terrain_set, TileSet::TerrainsPattern p_terrain_tile_pattern) { @@ -1408,7 +1408,7 @@ TileMapCell TileSet::get_random_tile_from_terrains_pattern(int p_terrain_set, Ti // Count the sum of probabilities. double sum = 0.0; - RBSet set = per_terrain_pattern_tiles[p_terrain_set][p_terrain_tile_pattern]; + RBSet set(per_terrain_pattern_tiles[p_terrain_set][p_terrain_tile_pattern]); for (const TileMapCell &E : set) { if (E.source_id >= 0) { Ref source = sources[E.source_id];