Add RemoveIfKeepValid algorithm and fix bug with countries delete.

This commit is contained in:
vng 2011-10-17 21:34:09 +03:00 committed by Alex Zolotarev
parent ee9b58aa11
commit a1d59a2e67
3 changed files with 82 additions and 2 deletions

View file

@ -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, ());
}
}

View file

@ -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)
{

View file

@ -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());
}
}