diff options
author | Morgan Deters <mdeters@gmail.com> | 2010-07-08 04:33:10 +0000 |
---|---|---|
committer | Morgan Deters <mdeters@gmail.com> | 2010-07-08 04:33:10 +0000 |
commit | 8a0dcb9cb4bbf83f03b31343eaa6437ae829f1c9 (patch) | |
tree | bd25ae92f252eaaea317f543e515ccdbbfc57f05 /test/unit | |
parent | 586c8f2d51d790942fd82598a2bf532f2b5ebc9a (diff) |
context work to support cdmaps with elements allocated in context memory
Diffstat (limited to 'test/unit')
-rw-r--r-- | test/unit/context/cdmap_black.h | 144 |
1 files changed, 142 insertions, 2 deletions
diff --git a/test/unit/context/cdmap_black.h b/test/unit/context/cdmap_black.h index b4370e93c..7b8953dc0 100644 --- a/test/unit/context/cdmap_black.h +++ b/test/unit/context/cdmap_black.h @@ -19,6 +19,7 @@ #include <cxxtest/TestSuite.h> #include "context/cdmap.h" +#include "context/cdlist.h" using namespace std; using namespace CVC4; @@ -693,7 +694,6 @@ public: TS_ASSERT(map[5] == 6); TS_ASSERT(map[9] == 8); TS_ASSERT(map[1] == 2); - std::cout << "map[23] is " << map[23] << std::endl; TS_ASSERT(map[23] == 472); d_context->pop(); @@ -739,7 +739,6 @@ public: } void testObliterateInsertedAtContextLevelZero() { - cout << "\nobliteratCL0\n"; CDMap<int, int> map(d_context); map.insert(3, 4); @@ -917,4 +916,145 @@ public: TS_ASSERT(map.find(23) == map.end()); TS_ASSERT(map[3] == 4); } + + struct int_hasher { + size_t operator()(int i) const { return i; } + }; + + struct myint { + int x; + myint(int i) : x(i) {} + ~myint() { std::cout << "dtor " << x << std::endl; } + myint& operator=(int i) { x = i; return *this; } + bool operator==(int i) const { return x == i; } + }; + + void testMapOfLists() { + try{ + //Debug.on("gc"); + //Debug.on("context"); + + CDMap<int, CDList<myint>*, int_hasher> map(d_context); + + CDList<myint> *list1, *list2, *list3, *list4; + + TS_ASSERT(map.find(1) == map.end()); + TS_ASSERT(map.find(2) == map.end()); + TS_ASSERT(map.find(3) == map.end()); + TS_ASSERT(map.find(4) == map.end()); + + { + d_context->push(); + + int* x = (int*) d_context->getCMM()->newData(sizeof(int)); + + list1 = new(d_context->getCMM()) CDList<myint>(true, d_context); + list2 = new(d_context->getCMM()) CDList<myint>(true, d_context); + list3 = new(d_context->getCMM()) CDList<myint>(true, d_context); + list4 = new(d_context->getCMM()) CDList<myint>(true, d_context); + + list1->push_back(1); + list2->push_back(2); + list3->push_back(3); + list4->push_back(4); + + map.insertDataFromContextMemory(1, list1); + map.insertDataFromContextMemory(2, list2); + + { + d_context->push(); + + list1->push_back(10); + list2->push_back(20); + list3->push_back(30); + list4->push_back(40); + + map.insertDataFromContextMemory(3, list3); + map.insertDataFromContextMemory(4, list4); + + x = (int*) d_context->getCMM()->newData(sizeof(int)); + + TS_ASSERT(map.find(1) != map.end()); + TS_ASSERT(map.find(2) != map.end()); + TS_ASSERT(map.find(3) != map.end()); + TS_ASSERT(map.find(4) != map.end()); + + TS_ASSERT(map[1] == list1); + TS_ASSERT(map[2] == list2); + TS_ASSERT(map[3] == list3); + TS_ASSERT(map[4] == list4); + + TS_ASSERT((*list1)[0] == 1); + TS_ASSERT((*list2)[0] == 2); + TS_ASSERT((*list3)[0] == 3); + TS_ASSERT((*list4)[0] == 4); + + TS_ASSERT((*list1)[1] == 10); + TS_ASSERT((*list2)[1] == 20); + TS_ASSERT((*list3)[1] == 30); + TS_ASSERT((*list4)[1] == 40); + + TS_ASSERT(list1->size() == 2); + TS_ASSERT(list2->size() == 2); + TS_ASSERT(list3->size() == 2); + TS_ASSERT(list4->size() == 2); + + d_context->pop(); + } + + TS_ASSERT(map.find(1) != map.end()); + TS_ASSERT(map.find(2) != map.end()); + TS_ASSERT(map.find(3) == map.end()); + TS_ASSERT(map.find(4) == map.end()); + + TS_ASSERT(map[1] == list1); + TS_ASSERT(map[2] == list2); + + TS_ASSERT((*list1)[0] == 1); + TS_ASSERT((*list2)[0] == 2); + TS_ASSERT((*list3)[0] == 3); + TS_ASSERT((*list4)[0] == 4); + + TS_ASSERT(list1->size() == 1); + TS_ASSERT(list2->size() == 1); + TS_ASSERT(list3->size() == 1); + TS_ASSERT(list4->size() == 1); + + d_context->pop(); + } + + { + d_context->push(); + + // This re-uses context memory used above. the map.clear() + // triggers an emptyTrash() which fails if the CDOmaps are put + // in the trash. (We use insertDataFromContextMemory() above to + // keep them out of the trash.) + cout << "allocating\n"; + int* x = (int*) d_context->getCMM()->newData(sizeof(int)); + cout << "x == " << x << std::endl; + for(int i = 0; i < 1000; ++i) { + *(int*)d_context->getCMM()->newData(sizeof(int)) = 512; + } + x = (int*) d_context->getCMM()->newData(sizeof(int)); + cout << "x == " << x << std::endl; + + TS_ASSERT(map.find(1) == map.end()); + TS_ASSERT(map.find(2) == map.end()); + TS_ASSERT(map.find(3) == map.end()); + TS_ASSERT(map.find(4) == map.end()); + + map.clear(); + + TS_ASSERT(map.find(1) == map.end()); + TS_ASSERT(map.find(2) == map.end()); + TS_ASSERT(map.find(3) == map.end()); + TS_ASSERT(map.find(4) == map.end()); + + d_context->pop(); + } + + TS_ASSERT(d_context->getLevel() == 0); + } catch(Exception& e) { cout << e << std::endl; throw e; } + } }; |