forked from organicmaps/organicmaps
Add RemoveIfKeepValid algorithm and fix bug with countries delete.
This commit is contained in:
parent
ee9b58aa11
commit
a1d59a2e67
3 changed files with 82 additions and 2 deletions
|
@ -2,7 +2,7 @@
|
|||
#include "../macros.hpp"
|
||||
#include "../stl_add.hpp"
|
||||
|
||||
UNIT_TEST(IsSorted)
|
||||
UNIT_TEST(STLAdd_IsSorted)
|
||||
{
|
||||
TEST(IsSorted(static_cast<int*>(0), static_cast<int*>(0)), ());
|
||||
int v1[] = { 1, 3, 5 };
|
||||
|
@ -13,3 +13,57 @@ UNIT_TEST(IsSorted)
|
|||
TEST(IsSorted(&v1[0], &v1[0] + 1), ());
|
||||
TEST(IsSorted(&v1[0], &v1[0] + 2), ());
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
struct EqualZero
|
||||
{
|
||||
bool operator() (int x) { return (x == 0); }
|
||||
};
|
||||
|
||||
template <class ContT> void CheckNoZero(ContT & c, typename ContT::iterator i)
|
||||
{
|
||||
c.erase(i, c.end());
|
||||
TEST(find_if(c.begin(), c.end(), EqualZero()) == c.end(), ());
|
||||
}
|
||||
}
|
||||
|
||||
UNIT_TEST(STLAdd_RemoveIfKeepValid)
|
||||
{
|
||||
{
|
||||
vector<int> v;
|
||||
TEST(RemoveIfKeepValid(v.begin(), v.end(), EqualZero()) == v.end(), ());
|
||||
|
||||
v.push_back(1);
|
||||
TEST(RemoveIfKeepValid(v.begin(), v.end(), EqualZero()) == v.end(), ());
|
||||
|
||||
v.push_back(1);
|
||||
TEST(RemoveIfKeepValid(v.begin(), v.end(), EqualZero()) == v.end(), ());
|
||||
}
|
||||
|
||||
{
|
||||
vector<int> v;
|
||||
v.push_back(0);
|
||||
TEST(RemoveIfKeepValid(v.begin(), v.end(), EqualZero()) == v.begin(), ());
|
||||
|
||||
v.push_back(0);
|
||||
TEST(RemoveIfKeepValid(v.begin(), v.end(), EqualZero()) == v.begin(), ());
|
||||
|
||||
v.push_back(1);
|
||||
CheckNoZero(v, RemoveIfKeepValid(v.begin(), v.end(), EqualZero()));
|
||||
TEST_EQUAL(v.size(), 1, ());
|
||||
|
||||
v.push_back(1);
|
||||
v.push_back(0);
|
||||
v.push_back(0);
|
||||
CheckNoZero(v, RemoveIfKeepValid(v.begin(), v.end(), EqualZero()));
|
||||
TEST_EQUAL(v.size(), 2, ());
|
||||
|
||||
v.push_back(0);
|
||||
v.push_back(0);
|
||||
v.push_back(1);
|
||||
v.push_back(1);
|
||||
CheckNoZero(v, RemoveIfKeepValid(v.begin(), v.end(), EqualZero()));
|
||||
TEST_EQUAL(v.size(), 4, ());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -68,6 +68,30 @@ inline bool IsSortedAndUnique(IterT beg, IterT end, CompareT comp)
|
|||
return true;
|
||||
}
|
||||
|
||||
template <class IterT, class CompareT>
|
||||
IterT RemoveIfKeepValid(IterT beg, IterT end, CompareT comp)
|
||||
{
|
||||
while (beg != end)
|
||||
{
|
||||
if (comp(*beg))
|
||||
{
|
||||
while (beg != --end)
|
||||
{
|
||||
if (!comp(*end))
|
||||
{
|
||||
swap(*beg, *end);
|
||||
++beg;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
++beg;
|
||||
}
|
||||
|
||||
return end;
|
||||
}
|
||||
|
||||
|
||||
template <class IterT> inline bool IsSorted(IterT beg, IterT end)
|
||||
{
|
||||
|
|
|
@ -2,10 +2,12 @@
|
|||
|
||||
#include "../base/logging.hpp"
|
||||
#include "../base/macros.hpp"
|
||||
#include "../base/stl_add.hpp"
|
||||
|
||||
#include "../std/algorithm.hpp"
|
||||
#include "../std/memcpy.hpp"
|
||||
|
||||
|
||||
namespace
|
||||
{
|
||||
struct MwmIdIsEqualTo
|
||||
|
@ -133,7 +135,7 @@ void MwmSet::Remove(string const & fileName)
|
|||
m_name[id].clear();
|
||||
|
||||
// Update the cache.
|
||||
ClearCacheImpl(remove_if(m_cache.begin(), m_cache.end(), MwmIdIsEqualTo(id)), m_cache.end());
|
||||
ClearCacheImpl(RemoveIfKeepValid(m_cache.begin(), m_cache.end(), MwmIdIsEqualTo(id)), m_cache.end());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue