mirror of
https://github.com/minetest/minetest.git
synced 2024-11-23 16:13:46 +01:00
Clean up VectorAreaStore
This commit is contained in:
parent
2e74e9ee20
commit
5641da43d6
@ -183,7 +183,7 @@ void AreaStore::getAreasForPos(std::vector<Area *> *result, v3s16 pos)
|
|||||||
bool VectorAreaStore::insertArea(Area *a)
|
bool VectorAreaStore::insertArea(Area *a)
|
||||||
{
|
{
|
||||||
a->id = getNextId();
|
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));
|
areas_map.insert(std::make_pair(a->id, *a));
|
||||||
if (!res.second)
|
if (!res.second)
|
||||||
// ID is not unique
|
// ID is not unique
|
||||||
@ -193,35 +193,27 @@ bool VectorAreaStore::insertArea(Area *a)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VectorAreaStore::reserve(size_t count)
|
|
||||||
{
|
|
||||||
m_areas.reserve(count);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool VectorAreaStore::removeArea(u32 id)
|
bool VectorAreaStore::removeArea(u32 id)
|
||||||
{
|
{
|
||||||
std::map<u32, Area>::iterator itr = areas_map.find(id);
|
AreaMap::iterator it = areas_map.find(id);
|
||||||
if (itr != areas_map.end()) {
|
if (it == areas_map.end())
|
||||||
size_t msiz = m_areas.size();
|
return false;
|
||||||
for (size_t i = 0; i < msiz; i++) {
|
Area *a = &it->second;
|
||||||
Area * b = m_areas[i];
|
for (std::vector<Area *>::iterator v_it = m_areas.begin();
|
||||||
if (b->id == id) {
|
v_it != m_areas.end(); ++v_it) {
|
||||||
areas_map.erase(itr);
|
if (*v_it == a) {
|
||||||
m_areas.erase(m_areas.begin() + i);
|
m_areas.erase(v_it);
|
||||||
invalidateCache();
|
break;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// 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)
|
void VectorAreaStore::getAreasForPosImpl(std::vector<Area *> *result, v3s16 pos)
|
||||||
{
|
{
|
||||||
size_t msiz = m_areas.size();
|
for (size_t i = 0; i < m_areas.size(); ++i) {
|
||||||
for (size_t i = 0; i < msiz; i++) {
|
|
||||||
Area *b = m_areas[i];
|
Area *b = m_areas[i];
|
||||||
if (AST_CONTAINS_PT(b, pos)) {
|
if (AST_CONTAINS_PT(b, pos)) {
|
||||||
result->push_back(b);
|
result->push_back(b);
|
||||||
@ -232,9 +224,8 @@ void VectorAreaStore::getAreasForPosImpl(std::vector<Area *> *result, v3s16 pos)
|
|||||||
void VectorAreaStore::getAreasInArea(std::vector<Area *> *result,
|
void VectorAreaStore::getAreasInArea(std::vector<Area *> *result,
|
||||||
v3s16 minedge, v3s16 maxedge, bool accept_overlap)
|
v3s16 minedge, v3s16 maxedge, bool accept_overlap)
|
||||||
{
|
{
|
||||||
size_t msiz = m_areas.size();
|
for (size_t i = 0; i < m_areas.size(); ++i) {
|
||||||
for (size_t i = 0; i < msiz; i++) {
|
Area *b = m_areas[i];
|
||||||
Area * b = m_areas[i];
|
|
||||||
if (accept_overlap ? AST_AREAS_OVERLAP(minedge, maxedge, b) :
|
if (accept_overlap ? AST_AREAS_OVERLAP(minedge, maxedge, b) :
|
||||||
AST_CONTAINS_AREA(minedge, maxedge, b)) {
|
AST_CONTAINS_AREA(minedge, maxedge, b)) {
|
||||||
result->push_back(b);
|
result->push_back(b);
|
||||||
@ -243,11 +234,10 @@ void VectorAreaStore::getAreasInArea(std::vector<Area *> *result,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#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 < m_areas.size(); ++i) {
|
||||||
for (size_t i = 0; i < msiz; i++) {
|
if (callback(m_areas[i], arg)) {
|
||||||
if (callback(args, m_areas[i])) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -59,8 +59,10 @@ protected:
|
|||||||
virtual void getAreasForPosImpl(std::vector<Area *> *result, v3s16 pos) = 0;
|
virtual void getAreasForPosImpl(std::vector<Area *> *result, v3s16 pos) = 0;
|
||||||
u32 getNextId() { return m_next_id++; }
|
u32 getNextId() { return m_next_id++; }
|
||||||
|
|
||||||
// TODO change to unordered_map when we can
|
// Note: This can't be an unordered_map, since all
|
||||||
std::map<u32, Area> areas_map;
|
// references would be invalidated on rehash.
|
||||||
|
typedef std::map<u32, Area> AreaMap;
|
||||||
|
AreaMap areas_map;
|
||||||
public:
|
public:
|
||||||
// Updates the area's ID
|
// Updates the area's ID
|
||||||
virtual bool insertArea(Area *a) = 0;
|
virtual bool insertArea(Area *a) = 0;
|
||||||
@ -111,8 +113,8 @@ class VectorAreaStore : public AreaStore {
|
|||||||
protected:
|
protected:
|
||||||
virtual void getAreasForPosImpl(std::vector<Area *> *result, v3s16 pos);
|
virtual void getAreasForPosImpl(std::vector<Area *> *result, v3s16 pos);
|
||||||
public:
|
public:
|
||||||
|
virtual void reserve(size_t count) { m_areas.reserve(count); }
|
||||||
virtual bool insertArea(Area *a);
|
virtual bool insertArea(Area *a);
|
||||||
virtual void reserve(size_t count);
|
|
||||||
virtual bool removeArea(u32 id);
|
virtual bool removeArea(u32 id);
|
||||||
virtual void getAreasInArea(std::vector<Area *> *result,
|
virtual void getAreasInArea(std::vector<Area *> *result,
|
||||||
v3s16 minedge, v3s16 maxedge, bool accept_overlap);
|
v3s16 minedge, v3s16 maxedge, bool accept_overlap);
|
||||||
|
Loading…
Reference in New Issue
Block a user