Clean up VectorAreaStore
authorShadowNinja <shadowninja@minetest.net>
Fri, 30 Oct 2015 04:04:10 +0000 (00:04 -0400)
committerShadowNinja <shadowninja@minetest.net>
Mon, 7 Mar 2016 21:33:20 +0000 (16:33 -0500)
src/util/areastore.cpp
src/util/areastore.h

index cf972586c495731b21d417824891c2f43ce2349d..568492383d9efb636507ae3f7aef13673ab77ccf 100644 (file)
@@ -183,7 +183,7 @@ void AreaStore::getAreasForPos(std::vector<Area *> *result, v3s16 pos)
 bool VectorAreaStore::insertArea(Area *a)
 {
        a->id = getNextId();
-       std::pair<std::map<u32, Area>::iterator, bool> res =
+       std::pair<AreaMap::iterator, bool> res =
                        areas_map.insert(std::make_pair(a->id, *a));
        if (!res.second)
                // ID is not unique
@@ -193,35 +193,27 @@ bool VectorAreaStore::insertArea(Area *a)
        return true;
 }
 
-void VectorAreaStore::reserve(size_t count)
-{
-       m_areas.reserve(count);
-}
-
 bool VectorAreaStore::removeArea(u32 id)
 {
-       std::map<u32, Area>::iterator itr = areas_map.find(id);
-       if (itr != areas_map.end()) {
-               size_t msiz = m_areas.size();
-               for (size_t i = 0; i < msiz; i++) {
-                       Area * b = m_areas[i];
-                       if (b->id == id) {
-                               areas_map.erase(itr);
-                               m_areas.erase(m_areas.begin() + i);
-                               invalidateCache();
-                               return true;
-                       }
+       AreaMap::iterator it = areas_map.find(id);
+       if (it == areas_map.end())
+               return false;
+       Area *a = &it->second;
+       for (std::vector<Area *>::iterator v_it = m_areas.begin();
+                       v_it != m_areas.end(); ++v_it) {
+               if (*v_it == a) {
+                       m_areas.erase(v_it);
+                       break;
                }
-               // we should never get here, it means we did find it in map,
-               // but not in the vector
        }
-       return false;
+       areas_map.erase(it);
+       invalidateCache();
+       return true;
 }
 
 void VectorAreaStore::getAreasForPosImpl(std::vector<Area *> *result, v3s16 pos)
 {
-       size_t msiz = m_areas.size();
-       for (size_t i = 0; i < msiz; i++) {
+       for (size_t i = 0; i < m_areas.size(); ++i) {
                Area *b = m_areas[i];
                if (AST_CONTAINS_PT(b, pos)) {
                        result->push_back(b);
@@ -232,9 +224,8 @@ void VectorAreaStore::getAreasForPosImpl(std::vector<Area *> *result, v3s16 pos)
 void VectorAreaStore::getAreasInArea(std::vector<Area *> *result,
                v3s16 minedge, v3s16 maxedge, bool accept_overlap)
 {
-       size_t msiz = m_areas.size();
-       for (size_t i = 0; i < msiz; i++) {
-               Area * b = m_areas[i];
+       for (size_t i = 0; i < m_areas.size(); ++i) {
+               Area *b = m_areas[i];
                if (accept_overlap ? AST_AREAS_OVERLAP(minedge, maxedge, b) :
                                AST_CONTAINS_AREA(minedge, maxedge, b)) {
                        result->push_back(b);
@@ -243,11 +234,10 @@ void VectorAreaStore::getAreasInArea(std::vector<Area *> *result,
 }
 
 #if 0
-bool VectorAreaStore::forEach(bool (*callback)(void *args, Area *a), void *args) const
+bool SimpleAreaStore::forEach(bool (*callback)(void *args, Area *a), void *args) const
 {
-       size_t msiz = m_areas.size();
-       for (size_t i = 0; i < msiz; i++) {
-               if (callback(args, m_areas[i])) {
+       for (size_t i = 0; i < m_areas.size(); ++i) {
+               if (callback(m_areas[i], arg)) {
                        return true;
                }
        }
index dee1f8bab4f6e3274d327a7a0efe77d536c40339..da7876396d7977e1c12335c90e52fa62fb315e2c 100644 (file)
@@ -59,8 +59,10 @@ protected:
        virtual void getAreasForPosImpl(std::vector<Area *> *result, v3s16 pos) = 0;
        u32 getNextId() { return m_next_id++; }
 
-       // TODO change to unordered_map when we can
-       std::map<u32, Area> areas_map;
+       // Note: This can't be an unordered_map, since all
+       // references would be invalidated on rehash.
+       typedef std::map<u32, Area> AreaMap;
+       AreaMap areas_map;
 public:
        // Updates the area's ID
        virtual bool insertArea(Area *a) = 0;
@@ -111,8 +113,8 @@ class VectorAreaStore : public AreaStore {
 protected:
        virtual void getAreasForPosImpl(std::vector<Area *> *result, v3s16 pos);
 public:
+       virtual void reserve(size_t count) { m_areas.reserve(count); }
        virtual bool insertArea(Area *a);
-       virtual void reserve(size_t count);
        virtual bool removeArea(u32 id);
        virtual void getAreasInArea(std::vector<Area *> *result,
                v3s16 minedge, v3s16 maxedge, bool accept_overlap);