Merge pull request #116552 from Ivorforce/rb-move

Add move semantics to `RBMap` and `RBSet`. Make their copy constructors explicit.
This commit is contained in:
Thaddeus Crews 2026-02-20 14:34:23 -06:00
commit 2829092a2a
No known key found for this signature in database
GPG key ID: 8C6E5FEB5FC03CCC
6 changed files with 49 additions and 7 deletions

View file

@ -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<KeyValue<K, V>> p_init) {
for (const KeyValue<K, V> &E : p_init) {
insert(E.key, E.value);

View file

@ -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<T> p_init) {
for (const T &E : p_init) {
insert(E);

View file

@ -256,7 +256,7 @@ void EditorNode::disambiguate_filenames(const Vector<String> 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<int> iset = index_sets[i];
RBSet<int> iset(index_sets[i]);
while (iset.size() > 1) {
// Append the parent folder to each scene name.
for (const int &E : iset) {

View file

@ -101,7 +101,7 @@ public:
public:
Ref<TileSetAtlasSource> get_edited_tile_set_atlas_source() const { return tile_set_atlas_source; }
RBSet<TileSelection> get_edited_tiles() const { return tiles; }
RBSet<TileSelection> get_edited_tiles() const { return RBSet<TileSelection>(tiles); }
// Update the proxied object.
void edit(Ref<TileSetAtlasSource> p_tile_set_atlas_source, const RBSet<TileSelection> &p_tiles = RBSet<TileSelection>());

View file

@ -2382,7 +2382,7 @@ HashMap<Vector2i, TileSet::TerrainsPattern> TileMapLayer::terrain_fill_constrain
}
// Copy the constraints set.
RBSet<TerrainConstraint> constraints = p_constraints;
RBSet<TerrainConstraint> constraints(p_constraints);
// Output map.
HashMap<Vector2i, TileSet::TerrainsPattern> output;

View file

@ -1399,7 +1399,7 @@ RBSet<TileSet::TerrainsPattern> TileSet::get_terrains_pattern_set(int p_terrain_
RBSet<TileMapCell> 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<TileMapCell>());
_update_terrains_cache();
return per_terrain_pattern_tiles[p_terrain_set][p_terrain_tile_pattern];
return RBSet<TileMapCell>(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<TileMapCell> set = per_terrain_pattern_tiles[p_terrain_set][p_terrain_tile_pattern];
RBSet<TileMapCell> set(per_terrain_pattern_tiles[p_terrain_set][p_terrain_tile_pattern]);
for (const TileMapCell &E : set) {
if (E.source_id >= 0) {
Ref<TileSetSource> source = sources[E.source_id];