/***************************************************************** | | Maps Test Program 1 | | (c) 2005-2006 Gilles Boccon-Gibod | Author: Gilles Boccon-Gibod (bok@bok.net) | ****************************************************************/ /*---------------------------------------------------------------------- | includes +---------------------------------------------------------------------*/ #include #include #include #include "Neptune.h" #include "NptDebug.h" /*---------------------------------------------------------------------- | globals +---------------------------------------------------------------------*/ static unsigned int A_Count = 0; /*---------------------------------------------------------------------- | types +---------------------------------------------------------------------*/ class A { public: A() : _a(0), _b(0), _c(&_a) { A_Count++; } A(int a, char b) : _a(a), _b(b), _c(&_a) { A_Count++; } A(const A& other) : _a(other._a), _b(other._b), _c(&_a) { A_Count++; } ~A() { A_Count--; } bool Check() { return _c == &_a; } bool operator==(const A& other) const { return _a == other._a && _b == other._b; } int _a; char _b; int* _c; }; #define CHECK(x) { \ if (!(x)) { \ printf("TEST FAILED line %d\n", __LINE__); \ return 1; \ } \ } /*---------------------------------------------------------------------- | TestPerformance +---------------------------------------------------------------------*/ static void TestPerformance() { for (unsigned int i=1; i<10000; i += 1000) { NPT_TimeStamp before; NPT_System::GetCurrentTimeStamp(before); for (unsigned int j=0; j<10; j++) { NPT_Map map; for (unsigned int k=0; k map; for (unsigned int k=0; k map; for (unsigned int k=0; k a_map; A* a = NULL; CHECK(a_map.GetEntryCount() == 0); CHECK(a_map.HasKey("hello") == false); CHECK(!a_map.HasValue(A(1,2))); CHECK(NPT_FAILED(a_map.Get("bla", a))); CHECK(a == NULL); a_map.Put("hello", A(1,2)); CHECK(a_map.GetEntryCount() == 1); CHECK(NPT_SUCCEEDED(a_map.Get("hello", a))); CHECK(*a == A(1,2)); CHECK(a_map.HasKey("hello")); CHECK(a_map.HasValue(A(1,2))); CHECK(a_map["hello"] == A(1,2)); CHECK(a_map["bla"] == A()); CHECK(a_map.GetEntryCount() == 2); a_map["bla"] = A(3,4); CHECK(a_map["bla"] == A(3,4)); CHECK(a_map.GetEntryCount() == 2); NPT_Map b_map; b_map["hello"] = A(1,2); b_map["bla"] = A(3,4); CHECK(a_map == b_map); NPT_Map c_map = a_map; CHECK(c_map["hello"] == a_map["hello"]); CHECK(c_map["bla"] == a_map["bla"]); CHECK(NPT_SUCCEEDED(a_map.Put("bla", A(5,6)))); CHECK(NPT_SUCCEEDED(a_map.Get("bla", a))); CHECK(*a == A(5,6)); CHECK(NPT_FAILED(a_map.Get("youyou", a))); b_map.Clear(); CHECK(b_map.GetEntryCount() == 0); a_map["youyou"] = A(6,7); CHECK(NPT_FAILED(a_map.Erase("coucou"))); CHECK(NPT_SUCCEEDED(a_map.Erase("bla"))); CHECK(!a_map.HasKey("bla")); CHECK(!(a_map == c_map)); CHECK(c_map != a_map); c_map = a_map; NPT_Map d_map(c_map); CHECK(d_map == c_map); NPT_Map i_map; i_map[5] = 6; i_map[6] = 7; i_map[9] = 0; CHECK(i_map[0] == 0 || i_map[0] != 0); // unknown value (will cause a valgrind warning) CHECK(i_map.GetEntryCount() == 4); NPT_Map a1_map; NPT_Map a2_map; a1_map["hello"] = A(1,2); a1_map["bla"] = A(2,3); a1_map["youyou"]= A(3,4); a2_map["bla"] = A(2,3); a2_map["youyou"]= A(3,4); a2_map["hello"] = A(1,2); CHECK(a1_map == a2_map); a1_map["foo"] = A(0,0); CHECK(a1_map != a2_map); a2_map["foo"] = A(0,0); CHECK(a1_map == a2_map); a2_map["foo"] = A(7,8); CHECK(a1_map != a2_map); a2_map["foo"] = A(0,0); a1_map["bir"] = A(0,0); a2_map["bar"] = A(0,0); CHECK(a1_map.GetEntryCount() == a2_map.GetEntryCount()); CHECK(a1_map != a2_map); CHECK(!(a1_map == a2_map)); NPT_Map p_map; p_map["1"] = new NPT_String("hello"); p_map["2"] = new NPT_String("good bye"); p_map.GetEntries().Apply(NPT_MapEntryValueDeleter::Entry>()); return 0; } struct Hasher { NPT_UInt32 operator()(const NPT_String& /*key*/) const { return 0; } }; /*---------------------------------------------------------------------- | TestHashMap +---------------------------------------------------------------------*/ static int TestHashMap() { NPT_HashMap a_map; A* a = NULL; CHECK(a_map.GetEntryCount() == 0); CHECK(a_map.HasKey("hello") == false); CHECK(!a_map.HasValue(A(1,2))); CHECK(NPT_FAILED(a_map.Get("bla", a))); CHECK(a == NULL); a_map.Put("hello", A(1,2)); CHECK(a_map.GetEntryCount() == 1); CHECK(NPT_SUCCEEDED(a_map.Get("hello", a))); CHECK(*a == A(1,2)); CHECK(a_map.HasKey("hello")); CHECK(a_map.HasValue(A(1,2))); CHECK(a_map["hello"] == A(1,2)); CHECK(a_map["bla"] == A()); CHECK(a_map.GetEntryCount() == 2); a_map["bla"] = A(3,4); CHECK(a_map["bla"] == A(3,4)); CHECK(a_map.GetEntryCount() == 2); NPT_HashMap b_map; b_map["hello"] = A(1,2); b_map["bla"] = A(3,4); CHECK(a_map == b_map); NPT_HashMap c_map = a_map; CHECK(c_map["hello"] == a_map["hello"]); CHECK(c_map["bla"] == a_map["bla"]); CHECK(NPT_SUCCEEDED(a_map.Put("bla", A(5,6)))); CHECK(NPT_SUCCEEDED(a_map.Get("bla", a))); CHECK(*a == A(5,6)); CHECK(NPT_FAILED(a_map.Get("youyou", a))); b_map.Clear(); CHECK(b_map.GetEntryCount() == 0); a_map["youyou"] = A(6,7); CHECK(NPT_FAILED(a_map.Erase("coucou"))); CHECK(NPT_SUCCEEDED(a_map.Erase("bla"))); CHECK(!a_map.HasKey("bla")); CHECK(!(a_map == c_map)); CHECK(c_map != a_map); c_map = a_map; NPT_HashMap d_map(c_map); CHECK(d_map == c_map); NPT_HashMap i_map; i_map[5] = 6; i_map[6] = 7; i_map[9] = 0; CHECK(i_map[0] == 0 || i_map[0] != 0); // unknown value (will cause a valgrind warning) CHECK(i_map.GetEntryCount() == 4); NPT_HashMap a1_map; NPT_HashMap a2_map; a1_map["hello"] = A(1,2); a1_map["bla"] = A(2,3); a1_map["youyou"]= A(3,4); a2_map["bla"] = A(2,3); a2_map["youyou"]= A(3,4); a2_map["hello"] = A(1,2); CHECK(a1_map == a2_map); a1_map["foo"] = A(0,0); CHECK(a1_map != a2_map); a2_map["foo"] = A(0,0); CHECK(a1_map == a2_map); a2_map["foo"] = A(7,8); CHECK(a1_map != a2_map); a2_map["foo"] = A(0,0); a1_map["bir"] = A(0,0); a2_map["bar"] = A(0,0); CHECK(a1_map.GetEntryCount() == a2_map.GetEntryCount()); CHECK(a1_map != a2_map); CHECK(!(a1_map == a2_map)); NPT_HashMap smap; for (unsigned int i=0; i<24; i++) { NPT_String s = NPT_String::Format("blabla%d", i); smap[s] = "1234"; CHECK(smap[s] == "1234"); } for (unsigned int i=0; i<24; i++) { NPT_String s = NPT_String::Format("blabla%d", i); CHECK(smap[s] == "1234"); } for (unsigned int i=0; i<24; i++) { NPT_String s = NPT_String::Format("blabla%d", i); CHECK(NPT_SUCCEEDED(smap.Erase(s))); CHECK(!smap.HasKey(s)); } CHECK(smap.GetEntryCount() == 0); Hasher hasher; NPT_HashMap zmap(hasher); for (unsigned int i=0; i<1024; i++) { NPT_String s = NPT_String::Format("blabla%d", i); zmap[s] = 1234; CHECK(zmap[s] == 1234); } for (unsigned int i=0; i<1024; i++) { NPT_String s = NPT_String::Format("blabla%d", i); CHECK(zmap[s] == 1234); } for (unsigned int i=0; i<1024; i++) { NPT_String s = NPT_String::Format("blabla%d", i); CHECK(NPT_SUCCEEDED(zmap.Erase(s))); CHECK(!zmap.HasKey(s)); } CHECK(zmap.GetEntryCount() == 0); NPT_HashMap imap; for (int i=0; i<1024; i++) { NPT_String s = NPT_String::Format("blabla%d", i); imap[s] = i; CHECK(imap[s] == i); } unsigned int zz = 1024; for (NPT_HashMap::Iterator it = imap.GetEntries(); it; ++it) { CHECK(imap.HasKey((*it).GetKey())); CHECK(imap.HasValue((*it).GetValue())); --zz; } CHECK(zz==0); NPT_HashMap p_map; p_map["1"] = new NPT_String("hello"); p_map["2"] = new NPT_String("good bye"); p_map.Apply(NPT_MapEntryValueDeleter::Entry>()); return 0; } /*---------------------------------------------------------------------- | main +---------------------------------------------------------------------*/ int main(int /*argc*/, char** /*argv*/) { int result; result = TestMap(); if (result) return result; result = TestHashMap(); if (result) return result; TestPerformance(); return 0; }