From f00e53d398b1ea30fe718fd5606db8218c97c2d9 Mon Sep 17 00:00:00 2001 From: Lars Date: Tue, 3 Jun 2025 17:05:28 -0700 Subject: [PATCH] unique_ptr --- src/client/clientmap.cpp | 6 +++--- src/map.cpp | 26 ++++++++++++-------------- src/map.h | 6 +++--- src/servermap.cpp | 10 +++++----- 4 files changed, 23 insertions(+), 25 deletions(-) diff --git a/src/client/clientmap.cpp b/src/client/clientmap.cpp index face1861a..0ff9b42a2 100644 --- a/src/client/clientmap.cpp +++ b/src/client/clientmap.cpp @@ -399,7 +399,7 @@ void ClientMap::updateDrawList() // Loop through all blocks for (const auto &entry : m_blocks) { - MapBlock *block = entry.second; + MapBlock *block = entry.second.get(); MapBlockMesh *mesh = block->mesh; // Calculate the coordinates for range and frustum culling @@ -699,7 +699,7 @@ void ClientMap::touchMapBlocks() u32 blocks_in_range_with_mesh = 0; for (const auto &entry : m_blocks) { - MapBlock *block = entry.second; + MapBlock *block = entry.second.get(); MapBlockMesh *mesh = block->mesh; // Calculate the coordinates for range and frustum culling @@ -1484,7 +1484,7 @@ void ClientMap::updateDrawListShadow(v3f shadow_light_pos, v3f shadow_light_dir, u32 blocks_in_range_with_mesh = 0; for (const auto &entry : m_blocks) { - MapBlock *block = entry.second; + MapBlock *block = entry.second.get(); MapBlockMesh *mesh = block->mesh; if (!mesh) { // Ignore if mesh doesn't exist diff --git a/src/map.cpp b/src/map.cpp index 1b3e800da..7a12286f3 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -32,9 +32,7 @@ Map::~Map() /* Free all MapBlocks */ - for (auto &entry : m_blocks) { - delete entry.second; - } + m_blocks.clear(); } void Map::addEventReceiver(MapEventReceiver *event_receiver) @@ -54,19 +52,20 @@ void Map::dispatchEvent(const MapEditEvent &event) } } -MapBlock* Map::createBlankBlockNoInsert(v3s16 p) +std::unique_ptr Map::createBlankBlockNoInsert(v3s16 p) { if (blockpos_over_max_limit(v3s16(p))) throw InvalidPositionException("createBlankBlockNoInsert(): pos over max mapgen limit"); - return new MapBlock(p, m_gamedef); + return std::make_unique(p, m_gamedef); } MapBlock *Map::createBlankBlock(v3s16 p) { - MapBlock *block = createBlankBlockNoInsert(p); + std::unique_ptr block_u = createBlankBlockNoInsert(p); + MapBlock *block = block_u.get(); - m_blocks[p] = block; + m_blocks[p] = std::move(block_u); return block; } @@ -82,7 +81,7 @@ std::unique_ptr Map::detachBlock(MapBlock *block) // Remove from container auto it = m_blocks.find(block->getPos()); assert(it != m_blocks.end()); - std::unique_ptr ret(it->second); + std::unique_ptr ret = std::move(it->second); assert(ret.get() == block); m_blocks.erase(it); @@ -92,7 +91,7 @@ std::unique_ptr Map::detachBlock(MapBlock *block) return ret; } -void Map::insertBlock(MapBlock *block) +void Map::insertBlock(std::unique_ptr block) { v3s16 pos = block->getPos(); @@ -102,13 +101,13 @@ void Map::insertBlock(MapBlock *block) } // Insert into container - m_blocks[pos] = block; + m_blocks[pos] = std::move(block); } MapBlock *Map::getBlockNoCreateNoEx(v3s16 p3d) { auto it = m_blocks.find(p3d); - return it != m_blocks.end() ? it->second : nullptr; + return it != m_blocks.end() ? it->second.get() : nullptr; } MapBlock *Map::getBlockNoCreate(v3s16 p3d) @@ -310,7 +309,7 @@ void Map::timerUpdate(float dtime, float unload_timeout, s32 max_loaded_blocks, // If there is no practical limit, we spare creation of mapblock_queue if (max_loaded_blocks < 0) { for (auto it = m_blocks.begin(); it != m_blocks.end();) { - MapBlock *block = it->second; + MapBlock *block = it->second.get(); block->incrementUsageTimer(dtime); if (block->refGet() == 0 @@ -330,7 +329,6 @@ void Map::timerUpdate(float dtime, float unload_timeout, s32 max_loaded_blocks, // Delete directly from container it = m_blocks.erase(it); - delete block; if (unloaded_blocks) unloaded_blocks->push_back(p); @@ -344,7 +342,7 @@ void Map::timerUpdate(float dtime, float unload_timeout, s32 max_loaded_blocks, } else { std::priority_queue mapblock_queue; for (auto &entry : m_blocks) { - MapBlock *block = entry.second; + MapBlock *block = entry.second.get(); block->incrementUsageTimer(dtime); mapblock_queue.push(TimeOrderedMapBlock(block)); } diff --git a/src/map.h b/src/map.h index a9517122c..54e35430b 100644 --- a/src/map.h +++ b/src/map.h @@ -118,9 +118,9 @@ public: // Returns NULL if not found MapBlock * getBlockNoCreateNoEx(v3s16 p); - MapBlock* createBlankBlockNoInsert(v3s16 p); + std::unique_ptr createBlankBlockNoInsert(v3s16 p); MapBlock *createBlankBlock(v3s16 p); - void insertBlock(MapBlock *block); + void insertBlock(std::unique_ptr block); void deleteBlockImmediate(MapBlock *block); // Remove a block from the map without deleting it @@ -274,7 +274,7 @@ protected: std::set m_event_receivers; - std::unordered_map m_blocks; + std::unordered_map> m_blocks; // This stores the properties of the nodes on the map. const NodeDefManager *m_nodedef; diff --git a/src/servermap.cpp b/src/servermap.cpp index 22f6a8ac7..9828f4827 100644 --- a/src/servermap.cpp +++ b/src/servermap.cpp @@ -449,7 +449,7 @@ void ServerMap::save(ModifiedState save_level) bool save_started = false; for (auto &entry : m_blocks) { - MapBlock *block = entry.second; + MapBlock *block = entry.second.get(); block_count_all++; if(block->getModified() >= (u32)save_level) { @@ -498,7 +498,7 @@ void ServerMap::listAllLoadableBlocks(std::vector &dst) void ServerMap::listAllLoadedBlocks(std::vector &dst) { for (auto &entry : m_blocks) { - MapBlock *block = entry.second; + MapBlock *block = entry.second.get(); v3s16 p = block->getPos(); dst.push_back(p); } @@ -600,11 +600,11 @@ MapBlock *ServerMap::loadBlock(const std::string &blob, v3s16 p3d, bool save_aft bool created_new = false; try { - MapBlock* block_created_new = nullptr; + std::unique_ptr block_created_new; block = getBlockNoCreateNoEx(p3d); if (!block) { block_created_new = createBlankBlockNoInsert(p3d); - block = block_created_new; + block = block_created_new.get(); } { @@ -614,7 +614,7 @@ MapBlock *ServerMap::loadBlock(const std::string &blob, v3s16 p3d, bool save_aft // If it's a new block, insert it to the map if (block_created_new) { - insertBlock(block_created_new); + insertBlock(std::move(block_created_new)); created_new = true; } } catch (SerializationError &e) {