mirror of
https://github.com/aria2/aria2.git
synced 2025-04-06 22:17:38 +03:00
Use std::deque instead of std::list in IndexedList
We choose faster iteration over rare slower deletion in the middle.
This commit is contained in:
parent
643e7222b0
commit
561f0b3e29
5 changed files with 205 additions and 84 deletions
|
@ -22,6 +22,7 @@ class IndexedListTest:public CppUnit::TestFixture {
|
|||
CPPUNIT_TEST(testMove);
|
||||
CPPUNIT_TEST(testGet);
|
||||
CPPUNIT_TEST(testInsert);
|
||||
CPPUNIT_TEST(testInsert_keyFunc);
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
public:
|
||||
void setUp()
|
||||
|
@ -34,6 +35,7 @@ public:
|
|||
void testMove();
|
||||
void testGet();
|
||||
void testInsert();
|
||||
void testInsert_keyFunc();
|
||||
};
|
||||
|
||||
CPPUNIT_TEST_SUITE_REGISTRATION( IndexedListTest );
|
||||
|
@ -203,9 +205,57 @@ void IndexedListTest::testGet()
|
|||
list.push_back(1, &b);
|
||||
CPPUNIT_ASSERT_EQUAL((int*)0, list.get(1000));
|
||||
CPPUNIT_ASSERT_EQUAL(&a, list.get(123));
|
||||
}
|
||||
|
||||
CPPUNIT_ASSERT(list.begin() == list.find(123));
|
||||
CPPUNIT_ASSERT(list.end() == list.find(124));
|
||||
namespace {
|
||||
struct KeyFunc {
|
||||
int n;
|
||||
KeyFunc(int n):n(n) {}
|
||||
int operator()(const SharedHandle<std::string>& x)
|
||||
{
|
||||
return n++;
|
||||
}
|
||||
};
|
||||
} // namespace
|
||||
|
||||
void IndexedListTest::testInsert_keyFunc()
|
||||
{
|
||||
SharedHandle<std::string> s[] = {
|
||||
SharedHandle<std::string>(new std::string("a")),
|
||||
SharedHandle<std::string>(new std::string("b")),
|
||||
SharedHandle<std::string>(new std::string("c")),
|
||||
SharedHandle<std::string>(new std::string("d"))
|
||||
};
|
||||
size_t slen = sizeof(s)/sizeof(s[0]);
|
||||
IndexedList<int, SharedHandle<std::string> > list;
|
||||
list.insert(list.begin(), KeyFunc(0), vbegin(s), vend(s));
|
||||
CPPUNIT_ASSERT_EQUAL((size_t)slen, list.size());
|
||||
for(size_t i = 0; i < slen; ++i) {
|
||||
CPPUNIT_ASSERT_EQUAL(*s[i], *list.get(i));
|
||||
}
|
||||
list.insert(list.begin()+2, KeyFunc(slen), vbegin(s), vend(s));
|
||||
CPPUNIT_ASSERT_EQUAL((size_t)slen*2, list.size());
|
||||
for(size_t i = slen; i < slen*2; ++i) {
|
||||
CPPUNIT_ASSERT_EQUAL(*s[i - slen], *list.get(i));
|
||||
}
|
||||
IndexedList<int, SharedHandle<std::string> >::SeqType::iterator itr;
|
||||
itr = list.begin();
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("a"), *(*itr++).second);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("b"), *(*itr++).second);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("a"), *(*itr++).second);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("b"), *(*itr++).second);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("c"), *(*itr++).second);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("d"), *(*itr++).second);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("c"), *(*itr++).second);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("d"), *(*itr++).second);
|
||||
|
||||
list.insert(list.begin(), KeyFunc(2*slen-1), vbegin(s), vend(s));
|
||||
CPPUNIT_ASSERT_EQUAL((size_t)slen*3-1, list.size());
|
||||
itr = list.begin();
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("b"), *(*itr++).second);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("c"), *(*itr++).second);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("d"), *(*itr++).second);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("a"), *(*itr++).second);
|
||||
}
|
||||
|
||||
void IndexedListTest::testInsert()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue