Fixed bug in erase()

This commit is contained in:
John Wellbelove 2016-12-30 11:56:08 +00:00
parent 0112c57235
commit 6c4a29b498
8 changed files with 80 additions and 0 deletions

View File

@ -872,6 +872,7 @@ namespace etl
if (icurrent != bucket.end())
{
bucket.erase_after(iprevious);
pnodepool->release(*icurrent);
count = 1;
}
@ -899,6 +900,7 @@ namespace etl
}
bucket.erase_after(iprevious);
pnodepool->release(*icurrent);
return inext;
}
@ -940,8 +942,17 @@ namespace etl
}
// Erase the range.
local_iterator irelease = iprevious;
++irelease;
ibucket->erase_after(iprevious, iend);
while (irelease != iend)
{
pnodepool->release(*irelease);
++irelease;
}
// At the end of this bucket?
if (iend == ibucket->end())
{

View File

@ -758,6 +758,7 @@ namespace etl
if (icurrent->key_value_pair.first == key)
{
bucket.erase_after(iprevious);
pnodepool->release(*icurrent);
++count;
icurrent = iprevious;
}
@ -793,6 +794,7 @@ namespace etl
}
bucket.erase_after(iprevious);
pnodepool->release(*icurrent);
return inext;
}
@ -834,8 +836,17 @@ namespace etl
}
// Erase the range.
local_iterator irelease = iprevious;
++irelease;
ibucket->erase_after(iprevious, iend);
while (irelease != iend)
{
pnodepool->release(*irelease);
++irelease;
}
// At the end of this bucket?
if (iend == ibucket->end())
{

View File

@ -750,6 +750,7 @@ namespace etl
if (icurrent->key == key)
{
bucket.erase_after(iprevious);
pnodepool->release(*icurrent);
++count;
icurrent = iprevious;
}
@ -785,6 +786,7 @@ namespace etl
}
bucket.erase_after(iprevious);
pnodepool->release(*icurrent);
return inext;
}
@ -826,8 +828,17 @@ namespace etl
}
// Erase the range.
local_iterator irelease = iprevious;
++irelease;
ibucket->erase_after(iprevious, iend);
while (irelease != iend)
{
pnodepool->release(*irelease);
++irelease;
}
// At the end of this bucket?
if (iend == ibucket->end())
{

View File

@ -758,6 +758,7 @@ namespace etl
if (icurrent != bucket.end())
{
bucket.erase_after(iprevious);
pnodepool->release(*icurrent);
count = 1;
}
@ -785,6 +786,7 @@ namespace etl
}
bucket.erase_after(iprevious);
pnodepool->release(*icurrent);
return inext;
}
@ -826,8 +828,17 @@ namespace etl
}
// Erase the range.
local_iterator irelease = iprevious;
++irelease;
ibucket->erase_after(iprevious, iend);
while (irelease != iend)
{
pnodepool->release(*irelease);
++irelease;
}
// At the end of this bucket?
if (iend == ibucket->end())
{

View File

@ -435,6 +435,10 @@ namespace
DataNDC::iterator idata = data.find(K5);
CHECK(idata == data.end());
// Test that erase really does erase from the pool.
CHECK(!data.full());
CHECK(!data.empty());
}
//*************************************************************************
@ -462,6 +466,11 @@ namespace
DataNDC::iterator idata_end = data.find(K8);
idata = data.erase(idata, idata_end); // Erase K5, K6, K7
CHECK_EQUAL(initial_data.size() - 3, data.size());
CHECK(!data.full());
CHECK(!data.empty());
CHECK(idata == data.find(K8));
idata = data.find(K0);

View File

@ -396,6 +396,10 @@ namespace
CHECK(idata == data.end());
CHECK(inext == iafter);
// Test that erase really does erase from the pool.
CHECK(!data.full());
CHECK(!data.empty());
}
//*************************************************************************
@ -407,6 +411,11 @@ namespace
DataNDC::iterator idata_end = data.find(K8);
idata = data.erase(idata, idata_end); // Erase K5, K6, K7
CHECK_EQUAL(initial_data.size() - 3, data.size());
CHECK(!data.full());
CHECK(!data.empty());
CHECK(idata == data.find(K8));
idata = data.find(K0);

View File

@ -321,6 +321,10 @@ namespace
CHECK(idata == data.end());
CHECK(inext == iafter);
// Test that erase really does erase from the pool.
CHECK(!data.full());
CHECK(!data.empty());
}
//*************************************************************************
@ -336,6 +340,11 @@ namespace
test.assign(data.begin(), data.end());
idata = data.erase(idata, idata_end); // Erase N5, N6, N7
CHECK_EQUAL(initial_data.size() - 3, data.size());
CHECK(!data.full());
CHECK(!data.empty());
CHECK(idata == data.find(N8));
test.assign(data.begin(), data.end());

View File

@ -301,6 +301,10 @@ namespace
CHECK(idata == data.end());
CHECK(inext == iafter);
// Test that erase really does erase from the pool.
CHECK(!data.full());
CHECK(!data.empty());
}
//*************************************************************************
@ -316,6 +320,11 @@ namespace
test.assign(data.begin(), data.end());
idata = data.erase(idata, idata_end); // Erase N5, N6, N7
CHECK_EQUAL(initial_data.size() - 3, data.size());
CHECK(!data.full());
CHECK(!data.empty());
CHECK(idata == data.find(N8));
test.assign(data.begin(), data.end());