소스 검색

map: FIXED !

undefined
Guillaume Bittoun Sam Hocevar <sam@hocevar.net> 10 년 전
부모
커밋
7251024de5
2개의 변경된 파일240개의 추가작업 그리고 237개의 파일을 삭제
  1. +11
    -3
      src/lol/base/avl_tree.h
  2. +229
    -234
      src/t/base/map.cpp

+ 11
- 3
src/lol/base/avl_tree.h 파일 보기

@@ -257,12 +257,13 @@ protected:
int i = -1 + (key < m_key) + 2 * (m_key < key); int i = -1 + (key < m_key) + 2 * (m_key < key);


bool erased = false; bool erased = false;
bool suicide = false;


if (i < 0) if (i < 0)
{ {
erase_self(); erase_self();
delete this;
erased = true; erased = true;
suicide = true;
} }
else if (m_child[i] && m_child[i]->erase(key)) else if (m_child[i] && m_child[i]->erase(key))
{ {
@@ -270,6 +271,9 @@ protected:
erased = true; erased = true;
} }


if (suicide)
delete this;

return erased; return erased;
} }


@@ -391,8 +395,12 @@ protected:
save->m_parent_slot = &this->m_child[i]; save->m_parent_slot = &this->m_child[i];
} }


replacement->m_child[0]->update_balance(); if (replacement->m_child[0])
replacement->m_child[1]->update_balance(); replacement->m_child[0]->update_balance();

if (replacement->m_child[1])
replacement->m_child[1]->update_balance();

replacement->update_balance(); replacement->update_balance();
} }
} }


+ 229
- 234
src/t/base/map.cpp 파일 보기

@@ -23,91 +23,91 @@ lolunit_declare_fixture(MapTest)


void TearDown() {} void TearDown() {}


// lolunit_declare_test(MapDeclare) lolunit_declare_test(MapDeclare)
// { {
// map<uint8_t, uint8_t> m1; map<uint8_t, uint8_t> m1;
// map<int, int> m2; map<int, int> m2;
// map<float, float> m3; map<float, float> m3;
// map<char const *, char const *> m4; map<char const *, char const *> m4;
// } }
lolunit_declare_test(MapSet)
// lolunit_declare_test(MapSet) {
// { map<int, int> m;
// map<int, int> m; for (int i = 0; i < 1000; i++)
m[i] = -1;
// for (int i = 0; i < 1000; i++) for (int i = 0; i < 1000; i++)
// m[i] = -1; m[i] = i;
for (int i = 0; i < 1000; i++)
// for (int i = 0; i < 1000; i++) lolunit_assert_equal(m[i], i);
// m[i] = i; }
lolunit_declare_test(MapHasKey)
// for (int i = 0; i < 1000; i++) {
// lolunit_assert_equal(m[i], i); map<int, int> m;
// } m[0] = 1;
m[2] = 2;
// lolunit_declare_test(MapHasKey) lolunit_assert(m.has_key(0));
// { lolunit_assert(!m.has_key(1));
// map<int, int> m; lolunit_assert(m.has_key(2));
}
// m[0] = 1; lolunit_declare_test(MapRemove)
// m[2] = 2; {
map<uint64_t, uint64_t> m;
// lolunit_assert(m.has_key(0)); array<uint64_t> a;
// lolunit_assert(!m.has_key(1)); for (int i = 0; i < 20; i++)
// lolunit_assert(m.has_key(2)); {
// } a << i;
m[i] = -1;
// lolunit_declare_test(MapRemove) }
// { for (int i = 0; i < a.Count(); i++)
// map<uint64_t, uint64_t> m; m[i] = i;
// array<uint64_t> a; a.Shuffle();
for (int i = 0; i < a.Count(); i++)
// for (int i = 0; i < 20; i++) m.remove(a[i]);
// { }
// a << i; lolunit_declare_test(MapRemoveString)
// m[i] = -1; {
// } map<String, uint64_t> m;
// for (int i = 0; i < a.Count(); i++) array<String> a;
// m[i] = i; for (int i = 0; i < 20; i++)
// a.Shuffle(); {
// for (int i = 0; i < a.Count(); i++) a << String::Printf("test_str_%i", i);
// m.remove(a[i]); m[a.Last()] = -1;
// } }
for (int i = 0; i < a.Count(); i++)
// lolunit_declare_test(MapRemoveString) m[a[i]] = i;
// { a.Shuffle();
// map<String, uint64_t> m; for (int i = 0; i < a.Count(); i++)
// array<String> a; m.remove(a[i]);
}
// for (int i = 0; i < 20; i++) lolunit_declare_test(MapRemoveBug)
// { {
// a << String::Printf("test_str_%i", i); map<uint64_t, uint64_t> m;
// m[a.Last()] = -1; for (int i = 0; i < 20; i++)
// } m[i] = i;
// for (int i = 0; i < a.Count(); i++) m.remove(12);
// m[a[i]] = i; m.remove(0);
// a.Shuffle(); m.remove(17);
// for (int i = 0; i < a.Count(); i++) m.remove(2);
// m.remove(a[i]); m.remove(9);
// } m.remove(4);
m.remove(15);
// lolunit_declare_test(MapRemoveBug) m.remove(10);
// { lolunit_assert_equal(m[8], 8);
// map<uint64_t, uint64_t> m; }
// for (int i = 0; i < 20; i++)
// m[i] = i;
// m.remove(12);
// m.remove(0);
// m.remove(17);
// m.remove(2);
// m.remove(9);
// m.remove(4);
// m.remove(15);
// m.remove(10);
// lolunit_assert_equal(m[8], 8);
// }


lolunit_declare_test(MapRandomAddRemove) lolunit_declare_test(MapRandomAddRemove)
{ {
@@ -123,11 +123,8 @@ lolunit_declare_fixture(MapTest)
presence[i] = 0; presence[i] = 0;
} }


for (int i = 0 ; i < 198 ; ++i) for (int i = 0 ; i < 10000 ; ++i)
{ {
// debug output
// std::cout << "i " << i << ", a " << (int)a << ", b " << (int)b << std::endl;

m[a] = b; m[a] = b;
m.remove(b); m.remove(b);


@@ -144,8 +141,6 @@ lolunit_declare_fixture(MapTest)
unsigned char v; unsigned char v;
if (presence[j]) if (presence[j])
{ {
// debug output
// std::cout << "j " << j << " v " << (int)v << std::endl;
lolunit_assert(m.try_get(j, v)); lolunit_assert(m.try_get(j, v));
lolunit_assert_equal(value[j], v); lolunit_assert_equal(value[j], v);
} }
@@ -157,149 +152,149 @@ lolunit_declare_fixture(MapTest)
} }
} }


// lolunit_declare_test(StringMap) lolunit_declare_test(StringMap)
// { {
// map<char const *, int> m; map<char const *, int> m;
m["foo"] = 42;
// m["foo"] = 42; m["bar"] = 12;
// m["bar"] = 12; m["baz"] = 2;
// m["baz"] = 2; int foo = m["foo"];
int bar = m["bar"];
// int foo = m["foo"]; int baz = m["baz"];
// int bar = m["bar"]; lolunit_assert_equal(42, foo);
// int baz = m["baz"]; lolunit_assert_equal(12, bar);
lolunit_assert_equal(2, baz);
// lolunit_assert_equal(42, foo); //Big stress test
// lolunit_assert_equal(12, bar); array<String> bones = { "RootNode",
// lolunit_assert_equal(2, baz); "Cyberano_Ns:Root_$AssimpFbx$_Translation",
"Cyberano_Ns:Box004_$AssimpFbx$_PreRotation",
// //Big stress test "Cyberano_Ns:Root_$AssimpFbx$_PreRotation",
// array<String> bones = { "RootNode", "Cyberano_Ns:Box004",
// "Cyberano_Ns:Root_$AssimpFbx$_Translation", "Cyberano_Ns:Root_$AssimpFbx$_Rotation",
// "Cyberano_Ns:Box004_$AssimpFbx$_PreRotation", "Cyberano_Ns:Root",
// "Cyberano_Ns:Root_$AssimpFbx$_PreRotation", "Cyberano_Ns:Hips",
// "Cyberano_Ns:Box004", "Cyberano_Ns:Spine",
// "Cyberano_Ns:Root_$AssimpFbx$_Rotation", "Cyberano_Ns:RightUpLeg",
// "Cyberano_Ns:Root", "Cyberano_Ns:LeftUpLeg",
// "Cyberano_Ns:Hips", "Cyberano_Ns:BeltSheath1",
// "Cyberano_Ns:Spine", "Cyberano_Ns:RightCoat",
// "Cyberano_Ns:RightUpLeg", "Cyberano_Ns:LeftCoat",
// "Cyberano_Ns:LeftUpLeg", "Cyberano_Ns:Spine1",
// "Cyberano_Ns:BeltSheath1", "Cyberano_Ns:RightLeg",
// "Cyberano_Ns:RightCoat", "Cyberano_Ns:RightUpLegRoll",
// "Cyberano_Ns:LeftCoat", "Cyberano_Ns:LeftUpLegRoll",
// "Cyberano_Ns:Spine1", "Cyberano_Ns:LeftLeg",
// "Cyberano_Ns:RightLeg", "Cyberano_Ns:Sheath",
// "Cyberano_Ns:RightUpLegRoll", "Cyberano_Ns:BeltSheath2",
// "Cyberano_Ns:LeftUpLegRoll", "Cyberano_Ns:BeltSheath3",
// "Cyberano_Ns:LeftLeg", "Cyberano_Ns:Spine2",
// "Cyberano_Ns:Sheath", "Cyberano_Ns:FrontBelt1",
// "Cyberano_Ns:BeltSheath2", "Cyberano_Ns:BackBelt1",
// "Cyberano_Ns:BeltSheath3", "Cyberano_Ns:RightFoot",
// "Cyberano_Ns:Spine2", "Cyberano_Ns:RightLegRoll",
// "Cyberano_Ns:FrontBelt1", "Cyberano_Ns:LeftLegRoll",
// "Cyberano_Ns:BackBelt1", "Cyberano_Ns:LeftFoot",
// "Cyberano_Ns:RightFoot", "Cyberano_Ns:Sword",
// "Cyberano_Ns:RightLegRoll", "Cyberano_Ns:Neck",
// "Cyberano_Ns:LeftLegRoll", "Cyberano_Ns:RightShoulder",
// "Cyberano_Ns:LeftFoot", "Cyberano_Ns:LeftShoulder",
// "Cyberano_Ns:Sword", "Cyberano_Ns:Cloth",
// "Cyberano_Ns:Neck", "Cyberano_Ns:FrontBelt2",
// "Cyberano_Ns:RightShoulder", "Cyberano_Ns:RightToeBase",
// "Cyberano_Ns:LeftShoulder", "Cyberano_Ns:LeftToeBase",
// "Cyberano_Ns:Cloth", "Cyberano_Ns:Head",
// "Cyberano_Ns:FrontBelt2", "Cyberano_Ns:RightArm",
// "Cyberano_Ns:RightToeBase", "Cyberano_Ns:RightSpaulder1",
// "Cyberano_Ns:LeftToeBase", "Cyberano_Ns:RightSpaulder2",
// "Cyberano_Ns:Head", "Cyberano_Ns:LeftArm",
// "Cyberano_Ns:RightArm", "Cyberano_Ns:LeftSpaulder1",
// "Cyberano_Ns:RightSpaulder1", "Cyberano_Ns:LeftCloth01",
// "Cyberano_Ns:RightSpaulder2", "Cyberano_Ns:MiddleCloth01",
// "Cyberano_Ns:LeftArm", "Cyberano_Ns:RightCloth01",
// "Cyberano_Ns:LeftSpaulder1", "Cyberano_Ns:FrontBelt3",
// "Cyberano_Ns:LeftCloth01", "Cyberano_Ns:RightoeEnd",
// "Cyberano_Ns:MiddleCloth01", "Cyberano_Ns:LeftoeEnd",
// "Cyberano_Ns:RightCloth01", "Cyberano_Ns:HeadEnd",
// "Cyberano_Ns:FrontBelt3", "Cyberano_Ns:Cap",
// "Cyberano_Ns:RightoeEnd", "Cyberano_Ns:RightForeArm",
// "Cyberano_Ns:LeftoeEnd", "Cyberano_Ns:RightArmRoll",
// "Cyberano_Ns:HeadEnd", "Cyberano_Ns:LeftForeArm",
// "Cyberano_Ns:Cap", "Cyberano_Ns:LeftArmRoll",
// "Cyberano_Ns:RightForeArm", "Cyberano_Ns:LeftCloth02",
// "Cyberano_Ns:RightArmRoll", "Cyberano_Ns:MiddleCloth02",
// "Cyberano_Ns:LeftForeArm", "Cyberano_Ns:RightCloth02",
// "Cyberano_Ns:LeftArmRoll", "Cyberano_Ns:Feather01",
// "Cyberano_Ns:LeftCloth02", "Cyberano_Ns:RightHand",
// "Cyberano_Ns:MiddleCloth02", "Cyberano_Ns:RightForeArmRoll",
// "Cyberano_Ns:RightCloth02", "Cyberano_Ns:LeftHand",
// "Cyberano_Ns:Feather01", "Cyberano_Ns:LeftForeArmRoll",
// "Cyberano_Ns:RightHand", "Cyberano_Ns:LeftCloth03",
// "Cyberano_Ns:RightForeArmRoll", "Cyberano_Ns:MiddleCloth03",
// "Cyberano_Ns:LeftHand", "Cyberano_Ns:RightCloth03",
// "Cyberano_Ns:LeftForeArmRoll", "Cyberano_Ns:Feather02",
// "Cyberano_Ns:LeftCloth03", "Cyberano_Ns:RightThumb1",
// "Cyberano_Ns:MiddleCloth03", "Cyberano_Ns:RightIndex1",
// "Cyberano_Ns:RightCloth03", "Cyberano_Ns:RightMiddle1",
// "Cyberano_Ns:Feather02", "Cyberano_Ns:RightRing1",
// "Cyberano_Ns:RightThumb1", "Cyberano_Ns:RightCuff",
// "Cyberano_Ns:RightIndex1", "Cyberano_Ns:LeftThumb1",
// "Cyberano_Ns:RightMiddle1", "Cyberano_Ns:LeftIndex1",
// "Cyberano_Ns:RightRing1", "Cyberano_Ns:LeftMiddle1",
// "Cyberano_Ns:RightCuff", "Cyberano_Ns:LeftRing1",
// "Cyberano_Ns:LeftThumb1", "Cyberano_Ns:LeftCloth04",
// "Cyberano_Ns:LeftIndex1", "Cyberano_Ns:MiddleCloth04",
// "Cyberano_Ns:LeftMiddle1", "Cyberano_Ns:RightCloth04",
// "Cyberano_Ns:LeftRing1", "Cyberano_Ns:Feather03",
// "Cyberano_Ns:LeftCloth04", "Cyberano_Ns:RightThumb2",
// "Cyberano_Ns:MiddleCloth04", "Cyberano_Ns:RightIndex2",
// "Cyberano_Ns:RightCloth04", "Cyberano_Ns:RightMiddle2",
// "Cyberano_Ns:Feather03", "Cyberano_Ns:RightRing2",
// "Cyberano_Ns:RightThumb2", "Cyberano_Ns:LeftThumb2",
// "Cyberano_Ns:RightIndex2", "Cyberano_Ns:LeftIndex2",
// "Cyberano_Ns:RightMiddle2", "Cyberano_Ns:LeftMiddle2",
// "Cyberano_Ns:RightRing2", "Cyberano_Ns:LeftRing2",
// "Cyberano_Ns:LeftThumb2", "Cyberano_Ns:Feather04",
// "Cyberano_Ns:LeftIndex2", "Cyberano_Ns:RightThumb3",
// "Cyberano_Ns:LeftMiddle2", "Cyberano_Ns:RightIndex3",
// "Cyberano_Ns:LeftRing2", "Cyberano_Ns:RightMiddle3",
// "Cyberano_Ns:Feather04", "Cyberano_Ns:RightRing3",
// "Cyberano_Ns:RightThumb3", "Cyberano_Ns:LeftThumb3",
// "Cyberano_Ns:RightIndex3", "Cyberano_Ns:LeftIndex3",
// "Cyberano_Ns:RightMiddle3", "Cyberano_Ns:LeftMiddle3",
// "Cyberano_Ns:RightRing3", "Cyberano_Ns:LeftRing3",
// "Cyberano_Ns:LeftThumb3", "Cyberano_Ns:Feather05",
// "Cyberano_Ns:LeftIndex3", "Cyberano_Ns:RightThumb4",
// "Cyberano_Ns:LeftMiddle3", "Cyberano_Ns:RightIndex4",
// "Cyberano_Ns:LeftRing3", "Cyberano_Ns:RightMiddle4",
// "Cyberano_Ns:Feather05", "Cyberano_Ns:RightRing4",
// "Cyberano_Ns:RightThumb4", "Cyberano_Ns:LeftThumb4",
// "Cyberano_Ns:RightIndex4", "Cyberano_Ns:LeftIndex4",
// "Cyberano_Ns:RightMiddle4", "Cyberano_Ns:LeftMiddle4",
// "Cyberano_Ns:RightRing4", "Cyberano_Ns:LeftRing4",
// "Cyberano_Ns:LeftThumb4", "Cyberano_Ns:Feather06",
// "Cyberano_Ns:LeftIndex4", "Cyberano_Ns:Feather07",
// "Cyberano_Ns:LeftMiddle4", "Cyberano_Ns:Feather08",
// "Cyberano_Ns:LeftRing4", "Cyberano_Ns:Feather09",
// "Cyberano_Ns:Feather06", "Cyberano_Ns:Feather10",
// "Cyberano_Ns:Feather07", "Cyberano_Ns:Feather11",
// "Cyberano_Ns:Feather08", "Cyberano_Ns:Feather12",
// "Cyberano_Ns:Feather09", "Cyberano_Ns:Feather13",
// "Cyberano_Ns:Feather10", "Cyberano_Ns:Feather14",
// "Cyberano_Ns:Feather11", "Cyberano_Ns:Feather15",
// "Cyberano_Ns:Feather12", "Cyberano_Ns:Feather16",
// "Cyberano_Ns:Feather13", "Cyberano_Ns:Feather17" };
// "Cyberano_Ns:Feather14", map<String, int> bones_map;
// "Cyberano_Ns:Feather15", for (int i = 0; i < bones.Count(); ++i)
// "Cyberano_Ns:Feather16", bones_map[bones[i]] = i;
// "Cyberano_Ns:Feather17" }; for (int i = 0; i < bones.Count(); ++i)
lolunit_assert_equal(bones_map[bones[i]], i);
// map<String, int> bones_map; }
// for (int i = 0; i < bones.Count(); ++i)
// bones_map[bones[i]] = i;
// for (int i = 0; i < bones.Count(); ++i)
// lolunit_assert_equal(bones_map[bones[i]], i);
// }
}; };


} /* namespace lol */ } /* namespace lol */


||||||
x
 
000:0
불러오는 중...
취소
저장